Interface OpGen<T extends JitOp>

Type Parameters:
T - the class of p-code op node in the use-def graph
All Superinterfaces:
org.objectweb.asm.Opcodes
All Known Subinterfaces:
BinOpGen<T>, BitwiseBinOpGen<T>, CompareFloatOpGen<T>, CompareIntBinOpGen<T>, ShiftIntBinOpGen<T>, UnOpGen<T>
All Known Implementing Classes:
BoolAndOpGen, BoolNegateOpGen, BoolOrOpGen, BoolXorOpGen, BranchIndOpGen, BranchOpGen, CallOtherMissingOpGen, CallOtherOpGen, CatenateOpGen, CBranchOpGen, CopyOpGen, FloatAbsOpGen, FloatAddOpGen, FloatCeilOpGen, FloatDivOpGen, FloatEqualOpGen, FloatFloat2FloatOpGen, FloatFloorOpGen, FloatInt2FloatOpGen, FloatLessEqualOpGen, FloatLessOpGen, FloatMultOpGen, FloatNaNOpGen, FloatNegOpGen, FloatNotEqualOpGen, FloatRoundOpGen, FloatSqrtOpGen, FloatSubOpGen, FloatTruncOpGen, Int2CompOpGen, IntAddOpGen, IntAndOpGen, IntCarryOpGen, IntDivOpGen, IntEqualOpGen, IntLeftOpGen, IntLessEqualOpGen, IntLessOpGen, IntMultOpGen, IntNegateOpGen, IntNotEqualOpGen, IntOrOpGen, IntRemOpGen, IntRightOpGen, IntSBorrowOpGen, IntSCarryOpGen, IntSDivOpGen, IntSExtOpGen, IntSLessEqualOpGen, IntSLessOpGen, IntSRemOpGen, IntSRightOpGen, IntSubOpGen, IntXorOpGen, IntZExtOpGen, LoadOpGen, LzCountOpGen, NopOpGen, PhiOpGen, PopCountOpGen, StoreOpGen, SubPieceOpGen, SynthSubPieceOpGen, UnimplementedOpGen

public interface OpGen<T extends JitOp> extends org.objectweb.asm.Opcodes
The bytecode generator for a specific p-code op

The JitCodeGenerator selects the correct generator for each PcodeOp using JitDataFlowModel.getJitOp(PcodeOp) and lookup(JitOp). The following table lists each p-code op, its use-def class, its generator class, and a brief strategy for its bytecode implementation.

P-code Op Use-Def Type Generator Type Bytecodes / Methods
Misc Data
unimplemented JitUnimplementedOp UnimplementedOpGen new, athrow
copy JitCopyOp CopyOpGen none; defers to VarGen
load JitLoadOp LoadOpGen JitCompiledPassage.readIntLE4(byte[], int), etc.
store JitStoreOp StoreOpGen JitCompiledPassage.writeIntLE4(int, byte[], int), etc.
Control Flow
branch,
call
JitBranchOp BranchOpGen goto, areturn
cbranch JitCBranchOp CBranchOpGen ifeq, ifne, goto, areturn
branchind,
callind,
return
JitBranchIndOp BranchIndOpGen areturn
callother JitCallOtherOp,
JitCallOtherDefOp,
JitCallOtherMissingOp,
JitNopOp
CallOtherOpGen,
CallOtherMissingOpGen,
NopOpGen
See JitDataFlowUseropLibrary:
Integer Comparison
int_equal JitIntEqualOp IntEqualOpGen if_icmpeq, ifeq
int_notequal JitIntNotEqualOp IntNotEqualOpGen if_icmpne, ifne
int_sless JitIntSLessOp IntSLessOpGen if_icmplt, iflt
int_slessequal JitIntSLessEqualOp IntSLessEqualOpGen if_icmple, ifle
int_less JitIntLessOp IntLessOpGen Integer.compareUnsigned(int, int), iflt, etc.
int_lessequal JitIntLessEqualOp IntLessEqualOpGen Integer.compareUnsigned(int, int), ifle, etc.
Integer Arithmetic
int_zext JitIntZExtOp IntZExtOpGen none; defers to VarGen and TypeConversions
int_sext JitIntSExtOp IntSExtOpGen ishl, ishr, etc.
int_add JitIntAddOp IntAddOpGen iadd, ladd
int_sub JitIntSubOp IntSubOpGen isub, lsub
int_carry JitIntCarryOp IntCarryOpGen Integer.compareUnsigned(int, int), iadd, ishr, etc.
int_scarry JitIntSCarryOp IntSCarryOpGen JitCompiledPassage.sCarryIntRaw(int, int), ishr, etc.
int_sborrow JitIntSBorrowOp IntSBorrowOpGen JitCompiledPassage.sBorrowIntRaw(int, int), ishr, etc.
int_2comp JitInt2CompOp Int2CompOpGen ineg, lneg
int_negate JitIntNegateOp IntNegateOpGen iconst_m1, ixor, etc.
int_xor JitIntXorOp IntXorOpGen ixor, lxor
int_and JitIntAndOp IntAndOpGen iand, land
int_or JitIntOrOp IntOrOpGen ior, lor
int_left JitIntLeftOp IntLeftOpGen JitCompiledPassage.intLeft(int, int), etc.
int_right JitIntRightOp IntRightOpGen JitCompiledPassage.intRight(int, int), etc.
int_sright JitIntSRightOp IntSRightOpGen JitCompiledPassage.intSRight(int, int), etc.
int_mult JitIntMultOp IntMultOpGen imul, lmul
int_div JitIntDivOp IntDivOpGen Integer.divideUnsigned(int, int), etc.
int_sdiv JitIntSDivOp IntSDivOpGen idiv, ldiv
int_rem JitIntRemOp IntRemOpGen Integer.remainderUnsigned(int, int), etc.
int_srem JitIntSRemOp IntSRemOpGen irem, lrem
Boolean Logic
bool_negate JitBoolNegateOp BoolNegateOpGen Conditional jumps to ldc 0 or 1
bool_xor JitBoolXorOp BoolXorOpGen Conditional jumps to ldc 0 or 1
bool_and JitBoolAndOp BoolAndOpGen Conditional jumps to ldc 0 or 1
bool_or JitBoolOrOp BoolOrOpGen Conditional jumps to ldc 0 or 1
Float Comparison
float_equal JitFloatEqualOp FloatEqualOpGen fcmpl, dcmpl, ifeq
float_notequal JitFloatNotEqualOp FloatNotEqualOpGen fcmpl, dcmpl, ifne
float_less JitFloatLessOp FloatLessOpGen fcmpg, dcmpg, iflt
float_lessequal JitFloatLessEqualOp FloatLessEqualOpGen fcmpg, dcmpg, ifle
float_nan JitFloatNaNOp FloatNaNOpGen Float.isNaN(float), Double.isNaN(double)
Float Arithmetic
float_add JitFloatAddOp FloatAddOpGen fadd, dadd
float_div JitFloatDivOp FloatDivOpGen fdiv, ddiv
float_mult JitFloatMultOp FloatMultOpGen fmul, dmul
float_sub JitFloatSubOp FloatSubOpGen fsub, dsub
float_neg JitFloatNegOp FloatNegOpGen fneg, dneg
float_abs JitFloatAbsOp FloatAbsOpGen Math.abs(float), Math.abs(double)
float_sqrt JitFloatSqrtOp FloatSqrtOpGen Math.sqrt(double)
float_int2float JitFloatInt2FloatOp FloatInt2FloatOpGen i2f, i2d, l2f, l2d
float_float2float JitFloatFloat2FloatOp FloatFloat2FloatOpGen f2d, d2f
float_trunc JitFloatTruncOp FloatTruncOpGen f2i, f2l, d2i, d2l
float_ceil JitFloatCeilOp FloatCeilOpGen Math.ceil(double)
float_floor JitFloatFloorOp FloatFloorOpGen Math.floor(double)
float_round JitFloatRoundOp FloatRoundOpGen +0.5 then Math.floor(double)
Miscellaneous
subpiece JitSubPieceOp SubPieceOpGen iushr, lushr
popcount JitPopCountOp PopCountOpGen Integer.bitCount(int), etc.
lzcount JitLzCountOp LzCountOpGen Integer.numberOfLeadingZeros(int), etc.
Synthetic
(none) JitCatenateOp CatenateOpGen
(none) JitSynthSubPieceOp SynthSubPieceOpGen
(none) JitPhiOp PhiOpGen

There are other p-code ops. Some are only used in "high" p-code, and so we need not implement them here. Others are used in abstract virtual machines, e.g., PcodeOp.NEW or are just not yet implemented, e.g., PcodeOp.SEGMENTOP.

The mapping from PcodeOp opcode to JitOp is done in, e.g., JitOp.binOp(PcodeOp, JitOutVar, JitVal, JitVal), and the mapping from JitOp to OpGen is done in lookup(JitOp).

The synthetic use-def nodes do not correspond to any p-code op. They are synthesized based on access patterns to the JitDataFlowState. Their generators do not emit any bytecode. See JitVarScopeModel regarding coalescing and allocating variables.

  • 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 void
    generateInitCode(JitCodeGenerator gen, T op, org.objectweb.asm.MethodVisitor iv)
    Emit bytecode into the class constructor.
    void
    generateRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, org.objectweb.asm.MethodVisitor rv)
    Emit bytecode into the run method.
    static <T extends JitOp>
    OpGen<T>
    lookup(T op)
    Lookup the generator for a given p-code op use-def node
  • Method Details

    • lookup

      static <T extends JitOp> OpGen<T> lookup(T op)
      Lookup the generator for a given p-code op use-def node
      Type Parameters:
      T - the class of the op
      Parameters:
      op - the JitOp whose generator to look up
      Returns:
      the generator
    • generateInitCode

      default void generateInitCode(JitCodeGenerator gen, T op, org.objectweb.asm.MethodVisitor iv)
      Emit bytecode into the class constructor.
      Parameters:
      gen - the code generator
      op - the p-code op (use-def node) to translate
      iv - the visitor for the class constructor
    • generateRunCode

      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), JitCodeGenerator.generateVarWriteCode(JitVar, JitType), and TypeConversions appropriately.

      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.