Interface CompareIntBinOpGen<T extends JitIntTestOp>
- Type Parameters:
T
- the class of p-code op node in the use-def graph
- All Known Implementing Classes:
IntEqualOpGen
,IntLessEqualOpGen
,IntLessOpGen
,IntNotEqualOpGen
,IntSLessEqualOpGen
,IntSLessOpGen
-
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 JitType
afterLeft
(JitCodeGenerator gen, T op, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv) Emit code between reading the left and right operandsdefault JitType
generateBinOpRunCode
(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv) Emit code for the binary operatordefault void
generateIntJump
(org.objectweb.asm.Label lblTrue, org.objectweb.asm.MethodVisitor rv) Emits bytecode for the JVM int casedefault void
generateLongJump
(org.objectweb.asm.Label lblTrue, org.objectweb.asm.MethodVisitor rv) Emits bytecode for the JVM long caseint
The JVM opcode to perform the conditional jump for signed integers.int
ifOpcode()
The JVM opcode to perform the conditional jump for unsigned or long integers.boolean
isSigned()
Whether the comparison of p-code integers is signedMethods inherited from interface ghidra.pcode.emu.jit.gen.op.BinOpGen
generateRunCode
Methods inherited from interface ghidra.pcode.emu.jit.gen.op.OpGen
generateInitCode
-
Method Details
-
isSigned
boolean isSigned()Whether the comparison of p-code integers is signedIf 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.- Returns:
- true if signed, false if not
-
icmpOpcode
int icmpOpcode()The JVM opcode to perform the conditional jump for signed integers.- Returns:
- the opcode
-
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 therun
method
-
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 therun
method
-
ifOpcode
int ifOpcode()The JVM opcode to perform the conditional jump for unsigned or long integers. This is emitted after the application ofOpcodes.LCMP
or 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:BinOpGen
Emit 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:
afterLeft
in 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
-
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:
generateBinOpRunCode
in 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
-