Interface CompareIntBinOpGen<T extends JitIntTestOp>

Type Parameters:
T - the class of p-code op node in the use-def graph
All Superinterfaces:
BinOpGen<T>, org.objectweb.asm.Opcodes, OpGen<T>
All Known Implementing Classes:
IntEqualOpGen, IntLessEqualOpGen, IntLessOpGen, IntNotEqualOpGen, IntSLessEqualOpGen, IntSLessOpGen

public interface CompareIntBinOpGen<T extends JitIntTestOp> extends BinOpGen<T>
An extension for integer comparison operators
  • 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 Type
    Method
    Description
    default JitType
    afterLeft(JitCodeGenerator gen, T op, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv)
    Emit code between reading the left and right operands
    default JitType
    generateBinOpRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv)
    Emit code for the binary operator
    default void
    generateIntJump(org.objectweb.asm.Label lblTrue, org.objectweb.asm.MethodVisitor rv)
    Emits bytecode for the JVM int case
    default void
    generateLongJump(org.objectweb.asm.Label lblTrue, org.objectweb.asm.MethodVisitor rv)
    Emits bytecode for the JVM long case
    int
    The JVM opcode to perform the conditional jump for signed integers.
    int
    The JVM opcode to perform the conditional jump for unsigned or long integers.
    boolean
    Whether the comparison of p-code integers is signed

    Methods 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 signed

      If the comparison is unsigned, we will emit invocations of Integer.compareUnsigned(int, int) or Long.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 an lcmp, 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 case
      rv - the visitor for the run 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 case
      rv - the visitor for the run method
    • ifOpcode

      int ifOpcode()
      The JVM opcode to perform the conditional jump for unsigned or long integers. This is emitted after the application of Opcodes.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 operands

      This 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 interface BinOpGen<T extends JitIntTestOp>
      Parameters:
      gen - the code generator
      op - the operator
      lType - the actual type of the left operand
      rType - the actual type of the right operand
      rv - 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 operator

      At 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 interface BinOpGen<T extends JitIntTestOp>
      Parameters:
      gen - the code generator
      op - the operator
      block - the block containing the operator
      lType - the actual type of the left operand
      rType - the actual type of the right operand
      rv - the method visitor
      Returns:
      the actual type of the result