From 66539a1fe7caeba29bf4cc5bd214728f91837e3a Mon Sep 17 00:00:00 2001 From: Zhigang Gong Date: Tue, 18 Feb 2014 17:41:05 +0800 Subject: [PATCH] GBE: fixed the incorrect max_dst_num and max_src_num. Some I64 instructions are using more than 11 dst registers, this patch change the max src number to 16. And add a assertion to check if we run into this type of issue again. Signed-off-by: Zhigang Gong Reviewed-by: "Yang, Rong R" --- backend/src/backend/gen_insn_selection.cpp | 1 + backend/src/backend/gen_insn_selection.hpp | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp index 697ed1a..53038b2 100644 --- a/backend/src/backend/gen_insn_selection.cpp +++ b/backend/src/backend/gen_insn_selection.cpp @@ -647,6 +647,7 @@ namespace gbe uint32_t dstNum, uint32_t srcNum) { + GBE_ASSERT(dstNum <= SelectionInstruction::MAX_DST_NUM && srcNum <= SelectionInstruction::MAX_SRC_NUM); GBE_ASSERT(this->block != NULL); SelectionInstruction *insn = this->create(opcode, dstNum, srcNum); if (this->bwdCodeGeneration) diff --git a/backend/src/backend/gen_insn_selection.hpp b/backend/src/backend/gen_insn_selection.hpp index cb80d7c..7cbe271 100644 --- a/backend/src/backend/gen_insn_selection.hpp +++ b/backend/src/backend/gen_insn_selection.hpp @@ -85,10 +85,10 @@ namespace gbe const GenRegister &dst(uint32_t dstID) const { return regs[dstID]; } /*! Damn C++ */ const GenRegister &src(uint32_t srcID) const { return regs[dstNum+srcID]; } - /*! No more than 17 sources (used by typed writes on simd8 mode.) */ - enum { MAX_SRC_NUM = 17 }; - /*! No more than 11 destinations (used by samples and untyped reads) */ - enum { MAX_DST_NUM = 11 }; + /*! No more than 9 sources (used by typed writes on simd8 mode.) */ + enum { MAX_SRC_NUM = 9 }; + /*! No more than 16 destinations (15 used by I64DIV/I64REM) */ + enum { MAX_DST_NUM = 16 }; /*! State of the instruction (extra fields neeed for the encoding) */ GenInstructionState state; union { @@ -127,9 +127,9 @@ namespace gbe /*! Gen opcode */ uint8_t opcode; /*! Number of destinations */ - uint8_t dstNum:4; + uint8_t dstNum:5; /*! Number of sources */ - uint8_t srcNum:5; + uint8_t srcNum:4; /*! To store various indices */ uint16_t index; /*! Variable sized. Destinations and sources go here */ -- 2.7.4