Skip to content

Commit e874f93

Browse files
committed
WIP [mips] Fixing PR for r5900: fix sizes and extension type for various instructions
1 parent 218208b commit e874f93

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

arch/mips/il.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)