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

# Interface UnOpGen<T extends JitUnOp>

Type Parameters:
  `T` - the class of p-code op node in the use-def graph

All Superinterfaces:
  `org.objectweb.asm.Opcodes`, `OpGen<T>`

All Known Subinterfaces:
  `FloatUnOpGen<T>`, `IntUnOpGen<T>`

All Known Implementing Classes:
  `BoolNegateOpGen`, `CopyOpGen`, `FloatAbsOpGen`, `FloatCeilOpGen`, `FloatFloat2FloatOpGen`, `FloatFloorOpGen`, `FloatInt2FloatOpGen`, `FloatNaNOpGen`, `FloatNegOpGen`, `FloatRoundOpGen`, `FloatSqrtOpGen`, `FloatTruncOpGen`, `Int2CompOpGen`, `IntNegateOpGen`, `IntSExtOpGen`, `IntZExtOpGen`, `LzCountOpGen`, `PopCountOpGen`

public interface UnOpGen<T extends JitUnOp> extends OpGen<T>
An extension that provides conveniences and common implementations for unary p-code 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 TypeConversions.Ext`
  `ext()`
  When loading and storing variables, the kind of extension to apply
  `default void`
  `generateRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, org.objectweb.asm.MethodVisitor rv)`
  Emit bytecode into the `run` method.
  `JitType`
  `generateUnOpRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, JitType uType, org.objectweb.asm.MethodVisitor rv)`
  Emit code for the unary operator
  `boolean`
  `isSigned()`
  Whether this operator is signed

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

    Returns:
      true for signed, false if not

  - ### ext

    default TypeConversions.Ext ext()
    When loading and storing variables, the kind of extension to apply
    Returns:
      the extension kind

  - ### generateUnOpRunCode

    JitType generateUnOpRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, JitType uType, org.objectweb.asm.MethodVisitor rv)
    Emit code for the unary operator

    At this point the operand is on the stack. After this returns, code to write the result from the stack into the destination operand will be emitted.

    Parameters:
      `gen` - the code generator
      `op` - the operator
      `block` - the block containing the operator
      `uType` - the actual type of the operand
      `rv` - the method visitor
    Returns:
      the actual type of the result

  - ### generateRunCode

    default void generateRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, org.objectweb.asm.MethodVisitor rv)
    Emit bytecode into the `run` method.

    This method must emit the code needed to load any input operands, convert them to the appropriate type, perform the actual operation, and then if applicable, store the output operand. The implementations should delegate to `JitCodeGenerator.generateValReadCode(JitVal, JitTypeBehavior, Ext)`, `JitCodeGenerator.generateVarWriteCode(JitVar, JitType, Ext)`, and `TypeConversions` appropriately.

    This default implementation emits code to load the operand, invokes `gen-unop`, and finally emits code to write the destination operand.

    Specified by:
      `generateRunCode` in interface `OpGen<T extends JitUnOp>`
    Parameters:
      `gen` - the code generator
      `op` - the p-code op (use-def node) to translate
      `block` - the basic block containing the p-code op
      `rv` - the visitor for the `run` method.