diff --git a/include/interfaces/irdb/STARSOp.h b/include/interfaces/irdb/STARSOp.h index 6b47a1ab049d02d7edaa42cc15de45e81eb992ee..8702b70f31198b320ba53f38bc6cd7ddcf160b85 100644 --- a/include/interfaces/irdb/STARSOp.h +++ b/include/interfaces/irdb/STARSOp.h @@ -65,7 +65,7 @@ class STARS_IRDB_op_t : public STARS_op_t case op_Mem: return operand.mem.disp; case op_Imm: return operand.imm.imm; case op_Addr: return operand.addr.addr; - default: assert(0); + default: return STARS_BADADDR; } } @@ -137,7 +137,17 @@ class STARS_IRDB_op_t : public STARS_op_t virtual void SetOpGlobalIndex(std::size_t index) { global_index=index; } // Set STARS SSA name index. - virtual void SetReg(uint16_t NewReg) { assert(OpType==op_Reg); operand.reg.RegNum=(STARS_RegNo)NewReg; } + virtual void SetReg(uint16_t NewReg) + { + switch(OpType) + { + case op_Reg: + operand.reg.RegNum=(STARS_RegNo)NewReg; + case op_Mem: + operand.mem.base=(STARS_RegNo)NewReg; + } + return; + } virtual void SetAddr(STARS_ea_t NewAddr) { assert(OpType==op_Mem); operand.mem.disp=NewAddr; } virtual void SetSIB(char value); diff --git a/src/interfaces/irdb/STARS_IRDB_Op.cpp b/src/interfaces/irdb/STARS_IRDB_Op.cpp index 85f798e6da3c0a77b8893b952855374c32baf24f..b0bcef79a313e754099f2c0d60573bca9da41eae 100644 --- a/src/interfaces/irdb/STARS_IRDB_Op.cpp +++ b/src/interfaces/irdb/STARS_IRDB_Op.cpp @@ -13,7 +13,7 @@ using namespace std; static int log2int(unsigned int index) { - assert(index>0); + assert(index>=0); int targetlevel = 0; while (index >>= 1) ++targetlevel; return targetlevel; @@ -166,7 +166,6 @@ no operands for eflags or mxcsr? operand.mem.base=(STARS_RegNo)log2int_or_err(the_arg.Memory.BaseRegister); operand.mem.index=(STARS_RegNo)log2int_or_err(the_arg.Memory.IndexRegister); operand.mem.scale=the_arg.Memory.Scale; - assert(operand.mem.scale==the_arg.Memory.Scale); operand.mem.disp=the_arg.Memory.Displacement; // if there's no base reg, and an index reg with scale==1, @@ -181,7 +180,10 @@ no operands for eflags or mxcsr? // if the scale >0, we have a sib byte. if(operand.mem.scale > 0) + { operand.mem.hasSIB=1; + operand.mem.scale=log2int(operand.mem.scale); + } // if there's both a base and an index, then there's a sib byte. if(operand.mem.base != STARS_x86_R_none && operand.mem.index != STARS_x86_R_none) operand.mem.hasSIB=1; @@ -240,6 +242,7 @@ no operands for eflags or mxcsr? + } bool STARS_IRDB_op_t::operator<(const STARS_op_t &rOp_param) const @@ -294,7 +297,7 @@ char STARS_IRDB_op_t::GetSIB(void) const char ret=0; ret|=((int)operand.mem.base&0x7)<<0; ret|=((int)operand.mem.index&0x7)<<3; - ret|=(log2int((int)operand.mem.scale)&0x3)<<6; + ret|=(((int)operand.mem.scale)&0x3)<<6; return ret; } // Get x86 SIB byte (dense encoding of base reg, index reg, and scale factor) @@ -313,7 +316,7 @@ void STARS_IRDB_op_t::SetSIB(char value) (*(int*)&operand.mem.index)|=(value>>3)&0x7; // set scale - operand.mem.scale= (STARS_RegNo)1<<((value>>6)&0x3); + operand.mem.scale= (STARS_RegNo)((value>>6)&0x3); if(operand.mem.index==STARS_x86_R_sp) operand.mem.scale=(STARS_RegNo)0; }