@@ -1159,43 +1159,47 @@ bool GetLowLevelILForInstruction(Architecture* arch, uint64_t addr, LowLevelILFu
11591159 break ;
11601160 }
11611161 case MIPS_ADDU:
1162+ extendType = ZeroExtend;
11621163 case MIPS_ADD:
11631164 case MIPS_ADDI:
11641165 if (op2.reg == REG_ZERO)
1165- il.AddInstruction (SetRegisterOrNop (il, 4 , registerSize (op1), op1.reg , ReadILOperand (il, instr, 3 , registerSize (op3), 4 )));
1166+ il.AddInstruction (SetRegisterOrNop (il, 4 , registerSize (op1), op1.reg , ReadILOperand (il, instr, 3 , registerSize (op3), 4 ), extendType ));
11661167 else
11671168 il.AddInstruction (
11681169 SetRegisterOrNop (il, 4 , registerSize (op1), op1.reg ,
11691170 il.Add (4 ,
11701171 ReadILOperand (il, instr, 2 , registerSize (op2), 4 ),
1171- ReadILOperand (il, instr, 3 , registerSize (op3), 4 ))));
1172+ ReadILOperand (il, instr, 3 , registerSize (op3), 4 )), extendType ));
11721173 break ;
11731174 case MIPS_DADDU:
11741175 case MIPS_DADDIU:
1176+ extendType = ZeroExtend;
11751177 case MIPS_DADD:
11761178 case MIPS_DADDI:
11771179 if (op2.reg == REG_ZERO)
1178- il.AddInstruction (SetRegisterOrNop (il, 8 , registerSize (op1), op1.reg , ReadILOperand (il, instr, 3 , registerSize (op3))));
1180+ il.AddInstruction (SetRegisterOrNop (il, 8 , registerSize (op1), op1.reg , ReadILOperand (il, instr, 3 , registerSize (op3)), extendType ));
11791181 else
11801182 il.AddInstruction (
11811183 SetRegisterOrNop (il, 8 , registerSize (op1), op1.reg ,
11821184 il.Add (8 ,
11831185 ReadILOperand (il, instr, 2 , registerSize (op2)),
1184- ReadILOperand (il, instr, 3 , registerSize (op3)))));
1186+ ReadILOperand (il, instr, 3 , registerSize (op3))), extendType ));
11851187 break ;
11861188 case MIPS_SUBU:
1189+ extendType = ZeroExtend;
11871190 case MIPS_SUB:
11881191 il.AddInstruction (SetRegisterOrNop (il, 4 , registerSize (op1), op1.reg ,
11891192 il.Sub (4 ,
11901193 ReadILOperand (il, instr, 2 , registerSize (op2), 4 ),
1191- ReadILOperand (il, instr, 3 , registerSize (op3), 4 ))));
1194+ ReadILOperand (il, instr, 3 , registerSize (op3), 4 )), extendType ));
11921195 break ;
11931196 case MIPS_DSUBU:
1197+ extendType = ZeroExtend;
11941198 case MIPS_DSUB:
11951199 il.AddInstruction (SetRegisterOrNop (il, 8 , registerSize (op1), op1.reg ,
11961200 il.Sub (8 ,
11971201 ReadILOperand (il, instr, 2 , registerSize (op2), 8 ),
1198- ReadILOperand (il, instr, 3 , registerSize (op3), 8 ))));
1202+ ReadILOperand (il, instr, 3 , registerSize (op3), 8 )), extendType ));
11991203 break ;
12001204 case MIPS_AND:
12011205 il.AddInstruction (SetRegisterOrNop (il, registerSize (op2), registerSize (op1), op1.reg ,
@@ -2031,20 +2035,22 @@ bool GetLowLevelILForInstruction(Architecture* arch, uint64_t addr, LowLevelILFu
20312035 il.AddInstruction (SetRegisterOrNop (il, 4 , registerSize (op1), op1.reg , il.ArithShiftRight (4 , ReadILOperand (il, instr, 2 , registerSize (op2)), il.And (4 , ReadILOperand (il, instr, 3 , registerSize (op3)), il.Const (4 , 0x1f )))));
20322036 break ;
20332037 case MIPS_SLT:
2034- il.AddInstruction (SetRegisterOrNop (il, 1 , registerSize (op1), op1.reg , il.BoolToInt (1 ,
2038+ il.AddInstruction (SetRegisterOrNop (il, registerSize (op1) , registerSize (op1), op1.reg , il.BoolToInt (registerSize (op1) ,
20352039 il.CompareSignedLessThan (registerSize (op2), ReadILOperand (il, instr, 2 , registerSize (op2)), ReadILOperand (il, instr, 3 , registerSize (op3))))));
20362040 break ;
20372041 case MIPS_SLTI:
2038- il.AddInstruction (SetRegisterOrNop (il, 1 , registerSize (op1), op1.reg , il.BoolToInt (1 ,
2039- il.CompareSignedLessThan (registerSize (op2), ReadILOperand (il, instr, 2 , registerSize (op2)), il.Const (2 , op3.immediate )))));
2042+ il.AddInstruction (SetRegisterOrNop (il, registerSize (op1) , registerSize (op1), op1.reg , il.BoolToInt (registerSize (op1) ,
2043+ il.CompareSignedLessThan (registerSize (op2), ReadILOperand (il, instr, 2 , registerSize (op2)), il.Const (registerSize (op2) , op3.immediate )))));
20402044 break ;
20412045 case MIPS_SLTIU:
2042- il.AddInstruction (SetRegisterOrNop (il, 1 , registerSize (op1), op1.reg , il.BoolToInt (1 ,
2043- il.CompareUnsignedLessThan (registerSize (op2), ReadILOperand (il, instr, 2 , registerSize (op2)), il.Const (2 , op3.immediate )))));
2046+ il.AddInstruction (SetRegisterOrNop (il, registerSize (op1), registerSize (op1), op1.reg , il.BoolToInt (registerSize (op1),
2047+ il.CompareUnsignedLessThan (registerSize (op2), ReadILOperand (il, instr, 2 , registerSize (op2)),
2048+ il.Const (registerSize (op2), op3.immediate ))), ZeroExtend));
20442049 break ;
20452050 case MIPS_SLTU:
2046- il.AddInstruction (SetRegisterOrNop (il, 1 , registerSize (op1), op1.reg , il.BoolToInt (1 ,
2047- il.CompareUnsignedLessThan (registerSize (op2), ReadILOperand (il, instr, 2 , registerSize (op2)), ReadILOperand (il, instr, 3 , registerSize (op3))))));
2051+ il.AddInstruction (SetRegisterOrNop (il, registerSize (op1), registerSize (op1), op1.reg , il.BoolToInt (registerSize (op1),
2052+ il.CompareUnsignedLessThan (registerSize (op2), ReadILOperand (il, instr, 2 , registerSize (op2)),
2053+ ReadILOperand (il, instr, 3 , registerSize (op3)))), ZeroExtend));
20482054 break ;
20492055 case MIPS_SLL:
20502056 // SLL is unique in that the input doesn't have to be sign extended, and the
@@ -2066,15 +2072,15 @@ bool GetLowLevelILForInstruction(Architecture* arch, uint64_t addr, LowLevelILFu
20662072 il.ShiftLeft (registerSize (op1),
20672073 il.SignExtend (registerSize (op1),
20682074 il.LowPart (4 , ReadILOperand (il, instr, 2 , registerSize (op2)))),
2069- ReadILOperand (il, instr, 3 , 1 ))));
2075+ ReadILOperand (il, instr, 3 , registerSize (op2) ))));
20702076 }
20712077 }
20722078 else
20732079 {
20742080 il.AddInstruction (SetRegisterOrNop (il, 4 , registerSize (op1), op1.reg ,
20752081 il.ShiftLeft (4 ,
20762082 ReadILOperand (il, instr, 2 , registerSize (op2)),
2077- ReadILOperand (il, instr, 3 , 1 ))));
2083+ ReadILOperand (il, instr, 3 , registerSize (op2) ))));
20782084 }
20792085 break ;
20802086 case MIPS_SLLV:
@@ -2225,7 +2231,7 @@ bool GetLowLevelILForInstruction(Architecture* arch, uint64_t addr, LowLevelILFu
22252231 SignExtendHiLo (il, 4 );
22262232 auto rd = op1.reg ;
22272233 if (rd != REG_ZERO)
2228- il.AddInstruction (SetRegisterOrNop (il, 4 , 8 , rd, il.Register (get_register_width (lo, version), lo)));
2234+ il.AddInstruction (SetRegisterOrNop (il, 4 , 8 , rd, il.Register (get_register_width (lo, version), lo), ZeroExtend ));
22292235 }
22302236 else {
22312237 DEFINE_HILO1 (MIPS_MADDU1);
0 commit comments