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

# Interface ShiftIntBinOpGen<T extends JitIntBinOp>

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:
  `IntLeftOpGen`, `IntRightOpGen`, `IntSRightOpGen`

public interface ShiftIntBinOpGen<T extends JitIntBinOp> extends IntBinOpGen<T>
An extension for integer shift operators

This is just going to invoke one of the `JitCompiledPassage.intLeft(int, int)`, `JitCompiledPassage.intRight(int, int)`, `JitCompiledPassage.intSRight(int, int)`, etc. methods, depending on the operand types.

- ## 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`
  `generateBinOpRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv)`
  Emit code for the binary operator
  `default JitType.MpIntJitType`
  `generateShiftMpMp(JitAllocationModel am, int leftLegCount, int rightLegCount, JitType.MpIntJitType outType, org.objectweb.asm.MethodVisitor mv)`
  `default JitType.MpIntJitType`
  `generateShiftMpPrimitive(JitAllocationModel am, int legCount, JitType.SimpleJitType rType, JitType.MpIntJitType outType, String mdesc, org.objectweb.asm.MethodVisitor mv)`
  `default JitType.SimpleJitType`
  `generateShiftPrimitiveMp(JitAllocationModel am, JitType.SimpleJitType lType, int legCount, String mdesc, org.objectweb.asm.MethodVisitor mv)`
  `String`
  `methodName()`
  The name of the static method in `JitCompiledPassage` to invoke
  `default TypeConversions.Ext`
  `rExt()`
  When loading the right operand, the kind of extension to apply

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

  `afterLeft, ext, generateRunCode, isSigned`

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

  `generateInitCode`

- ## Method Details

  - ### rExt

    default TypeConversions.Ext rExt()
    When loading the right operand, the kind of extension to apply

    The shift amount is always treated unsigned.

    Specified by:
      `rExt` in interface `BinOpGen<T extends JitIntBinOp>`
    Returns:
      the extension kind

  - ### methodName

    String methodName()
    The name of the static method in `JitCompiledPassage` to invoke
    Returns:
      the name

  - ### generateShiftMpPrimitive

    default JitType.MpIntJitType generateShiftMpPrimitive(JitAllocationModel am, int legCount, JitType.SimpleJitType rType, JitType.MpIntJitType outType, String mdesc, org.objectweb.asm.MethodVisitor mv)

  - ### generateShiftPrimitiveMp

    default JitType.SimpleJitType generateShiftPrimitiveMp(JitAllocationModel am, JitType.SimpleJitType lType, int legCount, String mdesc, org.objectweb.asm.MethodVisitor mv)

  - ### generateShiftMpMp

    default JitType.MpIntJitType generateShiftMpMp(JitAllocationModel am, int leftLegCount, int rightLegCount, JitType.MpIntJitType outType, 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 just the name of the method to invoke. This will select the JVM signature of the method based on the p-code operand types.

    Specified by:
      `generateBinOpRunCode` in interface `BinOpGen<T extends JitIntBinOp>`
    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