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

# Interface BitwiseBinOpGen<T extends JitBinOp>

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:
  `BoolAndOpGen`, `BoolOrOpGen`, `BoolXorOpGen`, `IntAndOpGen`, `IntOrOpGen`, `IntXorOpGen`

public interface BitwiseBinOpGen<T extends JitBinOp> extends IntBinOpGen<T>
An extension for bitwise binary 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`
  `generateMpIntBinOp(JitCodeGenerator gen, JitType.MpIntJitType type, org.objectweb.asm.MethodVisitor mv)`
  The implementation for multi-precision ints.
  `int`
  `intOpcode()`
  The JVM opcode to implement this operator with int operands on the stack.
  `default boolean`
  `isSigned()`
  Whether this operator is signed
  `int`
  `longOpcode()`
  The JVM opcode to implement this operator with long operands on the stack.

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

    default boolean isSigned()
    Description copied from interface: `BinOpGen`
    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.

    Specified by:
      `isSigned` in interface `BinOpGen<T extends JitBinOp>`
    Returns:
      true for signed, false if not

  - ### intOpcode

    int intOpcode()
    The JVM opcode to implement this operator with int operands on the stack.
    Returns:
      the opcode

  - ### longOpcode

    int longOpcode()
    The JVM opcode to implement this operator with long operands on the stack.
    Returns:
      the opcode

  - ### generateMpIntBinOp

    default void generateMpIntBinOp(JitCodeGenerator gen, JitType.MpIntJitType type, org.objectweb.asm.MethodVisitor mv)
    The implementation for multi-precision ints.
    Parameters:
      `gen` - the code generator
      `type` - the type of each operand, including the reuslt
      `mv` - the visitor for the `run` method

  - ### 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 JitBinOp>`
    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 implementation reduces the need to just the JVM opcode. We simply ensure both operands have the same size and JVM type, select and emit the correct opcode, and return the type of the result.

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