From 1cc1e2e3cda0f59c217ab77d247899cd15148400 Mon Sep 17 00:00:00 2001
From: jdh8d <jdh8d@git.zephyr-software.com>
Date: Fri, 11 Dec 2015 20:09:32 +0000
Subject: [PATCH] Fixes for dealing with scalefactor 0-4 instead of 1,2,4,8

Former-commit-id: 3ae0a9ef1cafdc3ee7cc3d7c4d46ff5f9f08cf02
---
 include/interfaces/irdb/STARSOp.h     | 14 ++++++++++++--
 src/interfaces/irdb/STARS_IRDB_Op.cpp | 11 +++++++----
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/include/interfaces/irdb/STARSOp.h b/include/interfaces/irdb/STARSOp.h
index 6b47a1ab..8702b70f 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 85f798e6..b0bcef79 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;
 }
-- 
GitLab