| 189 | } |
| 190 | |
| 191 | ExprId GetConditionForInstruction(LowLevelILFunction& il, Instruction& instr, size_t registerSize) |
| 192 | { |
| 193 | switch (instr.operation) |
| 194 | { |
| 195 | case MIPS_BEQ: |
| 196 | case MIPS_BEQL: |
| 197 | return il.CompareEqual(registerSize, ReadILOperand(il, instr, 1, registerSize), ReadILOperand(il, instr, 2, registerSize)); |
| 198 | case MIPS_BNE: |
| 199 | case MIPS_BNEL: |
| 200 | return il.CompareNotEqual(registerSize, ReadILOperand(il, instr, 1, registerSize), ReadILOperand(il, instr, 2, registerSize)); |
| 201 | case MIPS_BEQZ: |
| 202 | return il.CompareEqual(registerSize, ReadILOperand(il, instr, 1, registerSize), il.Const(registerSize, 0)); |
| 203 | case MIPS_BNEZ: |
| 204 | return il.CompareNotEqual(registerSize, ReadILOperand(il, instr, 1, registerSize), il.Const(registerSize, 0)); |
| 205 | case MIPS_BGEZ: |
| 206 | case MIPS_BGEZL: |
| 207 | case MIPS_BGEZAL: |
| 208 | return il.CompareSignedGreaterEqual(registerSize, ReadILOperand(il, instr, 1, registerSize), il.Const(registerSize, 0)); |
| 209 | case MIPS_BGTZ: |
| 210 | case MIPS_BGTZL: |
| 211 | return il.CompareSignedGreaterThan(registerSize, ReadILOperand(il, instr, 1, registerSize), il.Const(registerSize, 0)); |
| 212 | case MIPS_BLEZ: |
| 213 | case MIPS_BLEZL: |
| 214 | return il.CompareSignedLessEqual(registerSize, ReadILOperand(il, instr, 1, registerSize), il.Const(registerSize, 0)); |
| 215 | case MIPS_BLTZ: |
| 216 | case MIPS_BLTZL: |
| 217 | case MIPS_BLTZAL: |
| 218 | return il.CompareSignedLessThan(registerSize, ReadILOperand(il, instr, 1, registerSize), il.Const(registerSize, 0)); |
| 219 | case MIPS_BC1F: |
| 220 | case MIPS_BC1FL: |
| 221 | if (instr.operands[0].operandClass == FLAG) |
| 222 | return il.Not(0, il.Flag(instr.operands[0].reg)); |
| 223 | return il.Not(0, il.Flag(FPCCREG_FCC0)); |
| 224 | case MIPS_BC1T: |
| 225 | case MIPS_BC1TL: |
| 226 | if (instr.operands[0].operandClass == FLAG) |
| 227 | return il.Flag(instr.operands[0].reg); |
| 228 | return il.Flag(FPCCREG_FCC0); |
| 229 | case CNMIPS_BBIT0: |
| 230 | return il.CompareEqual(registerSize, |
| 231 | il.And(registerSize, |
| 232 | ReadILOperand(il, instr, 1, registerSize), |
| 233 | il.Const(registerSize, 1 << instr.operands[1].immediate) |
| 234 | ), |
| 235 | il.Const(registerSize, 0) |
| 236 | ); |
| 237 | case CNMIPS_BBIT032: |
| 238 | return il.CompareEqual(registerSize, |
| 239 | il.And(registerSize, |
| 240 | ReadILOperand(il, instr, 1, registerSize), |
| 241 | il.Const(registerSize, ((uint64_t)1) << (instr.operands[1].immediate + 32)) |
| 242 | ), |
| 243 | il.Const(registerSize, 0) |
| 244 | ); |
| 245 | case CNMIPS_BBIT1: |
| 246 | return il.CompareNotEqual(registerSize, |
| 247 | il.And(registerSize, |
| 248 | ReadILOperand(il, instr, 1, registerSize), |
no test coverage detected