Package ghidra.pcode.emu.jit.gen.op

# 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`

public interface CompareIntBinOpGen<T extends JitIntTestOp> extends IntBinOpGen<T>
An extension for integer comparison operators

- ## 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 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`
  `generateIntCmp(String methodName, org.objectweb.asm.MethodVisitor rv)`
  `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
  `default JitType`
  `generateMpIntCmp(JitCodeGenerator gen, JitType.MpIntJitType type, org.objectweb.asm.Label lblTrue, org.objectweb.asm.MethodVisitor mv)`
  `int`
  `icmpOpcode()`
  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 this operator is signed

  ### Methods inherited from interface ghidra.pcode.emu.jit.gen.op.BinOpGen

  `ext, generateRunCode, rExt`

  ### Methods inherited from interface ghidra.pcode.emu.jit.gen.op.OpGen

  `generateInitCode`

- ## Method Details

  - ### isSigned

    boolean isSigned()
    Whether this operator is signed

    In 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)` 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.

    Specified by:
      `isSigned` in interface `BinOpGen<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

    default void generateIntCmp(String methodName, org.objectweb.asm.MethodVisitor rv)

  - ### 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

  - ### 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 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