Interface CompareIntBinOpGen<T extends JitIntTestOp>
- Type Parameters:
T- the class of p-code op node in the use-def graph
- All Superinterfaces:
BinOpGen<T>,IntBinOpGen<T>,org.objectweb.asm.Opcodes,OpGen<T>
- All Known Implementing Classes:
IntEqualOpGen,IntLessEqualOpGen,IntLessOpGen,IntNotEqualOpGen,IntSLessEqualOpGen,IntSLessOpGen
-
Nested Class Summary
Nested classes/interfaces inherited from interface ghidra.pcode.emu.jit.gen.op.BinOpGen
BinOpGen.TakeOut -
Field Summary
Fields inherited from interface org.objectweb.asm.Opcodes
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V9 -
Method Summary
Modifier and TypeMethodDescriptiondefault JitTypeafterLeft(JitCodeGenerator gen, T op, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv) Emit code between reading the left and right operandsdefault JitTypegenerateBinOpRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv) Emit code for the binary operatordefault voidgenerateIntCmp(String methodName, org.objectweb.asm.MethodVisitor rv) default voidgenerateIntJump(org.objectweb.asm.Label lblTrue, org.objectweb.asm.MethodVisitor rv) Emits bytecode for the JVM int casedefault voidgenerateLongJump(org.objectweb.asm.Label lblTrue, org.objectweb.asm.MethodVisitor rv) Emits bytecode for the JVM long casedefault JitTypegenerateMpIntCmp(JitCodeGenerator gen, JitType.MpIntJitType type, org.objectweb.asm.Label lblTrue, org.objectweb.asm.MethodVisitor mv) intThe JVM opcode to perform the conditional jump for signed integers.intifOpcode()The JVM opcode to perform the conditional jump for unsigned or long integers.booleanisSigned()Whether this operator is signedMethods inherited from interface ghidra.pcode.emu.jit.gen.op.BinOpGen
ext, generateRunCode, rExtMethods inherited from interface ghidra.pcode.emu.jit.gen.op.OpGen
generateInitCode
-
Method Details
-
isSigned
boolean isSigned()Whether this operator is signedIn many cases, the operator itself is not affected by the signedness of the operands; however, if size adjustments to the operands are needed, this can determine how those operands are extended.
If the comparison is unsigned, we will emit invocations of
Integer.compareUnsigned(int, int)orLong.compareUnsigned(long, long), followed by a conditional jump corresponding to this p-code comparison op. If the comparison is signed, and the type fits in a JVM int, we emit the conditional jump of ints directly implementing this p-code comparison op. If the type requires a JVM long, we first emit anlcmp, followed by the same opcode that would be used in the unsigned case.- Specified by:
isSignedin interfaceBinOpGen<T extends JitIntTestOp>- Returns:
- true if signed, false if not
-
icmpOpcode
int icmpOpcode()The JVM opcode to perform the conditional jump for signed integers.- Returns:
- the opcode
-
generateIntCmp
-
generateIntJump
default void generateIntJump(org.objectweb.asm.Label lblTrue, org.objectweb.asm.MethodVisitor rv) Emits bytecode for the JVM int case- Parameters:
lblTrue- the target bytecode label for the true caserv- the visitor for therunmethod
-
generateLongJump
default void generateLongJump(org.objectweb.asm.Label lblTrue, org.objectweb.asm.MethodVisitor rv) Emits bytecode for the JVM long case- Parameters:
lblTrue- the target bytecode label for the true caserv- the visitor for therunmethod
-
ifOpcode
int ifOpcode()The JVM opcode to perform the conditional jump for unsigned or long integers.This is emitted after the application of
Opcodes.LCMPor the comparator method.- Returns:
- the opcode
-
afterLeft
default JitType afterLeft(JitCodeGenerator gen, T op, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv) Description copied from interface:BinOpGenEmit code between reading the left and right operandsThis is invoked immediately after emitting code to push the left operand onto the stack, giving the implementation an opportunity to perform any manipulations of that operand necessary to set up the operation, before code to push the right operand is emitted.
- Specified by:
afterLeftin interfaceBinOpGen<T extends JitIntTestOp>- Parameters:
gen- the code generatorop- the operatorlType- the actual type of the left operandrType- the actual type of the right operandrv- the method visitor- Returns:
- the new actual type of the left operand
-
generateMpIntCmp
default JitType generateMpIntCmp(JitCodeGenerator gen, JitType.MpIntJitType type, org.objectweb.asm.Label lblTrue, org.objectweb.asm.MethodVisitor mv) -
generateBinOpRunCode
default JitType generateBinOpRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv) Emit code for the binary operatorAt this point both operands are on the stack. After this returns, code to write the result from the stack into the destination operand will be emitted.
This reduces the implementation to a flag for signedness, the opcode for the conditional jump on integer operands, and the opcode for a conditional jump after the comparison of longs. The JVM, does not provide conditional jumps on long operands, so we must first compare the longs, pushing an int onto the stack, and then conditionally jumping on that. This pattern is similar for unsigned comparison of integers.
- Specified by:
generateBinOpRunCodein interfaceBinOpGen<T extends JitIntTestOp>- Parameters:
gen- the code generatorop- the operatorblock- the block containing the operatorlType- the actual type of the left operandrType- the actual type of the right operandrv- the method visitor- Returns:
- the actual type of the result
-