MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / GetConditionForInstruction

Function GetConditionForInstruction

arch/mips/il.cpp:191–266  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

189}
190
191ExprId 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),

Callers 2

Calls 12

ReadILOperandFunction · 0.70
CompareEqualMethod · 0.45
CompareNotEqualMethod · 0.45
ConstMethod · 0.45
CompareSignedLessThanMethod · 0.45
NotMethod · 0.45
FlagMethod · 0.45
AndMethod · 0.45
UnimplementedMethod · 0.45

Tested by

no test coverage detected