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
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.
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 TypeMethodDescriptiondefault 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 therun
method.lookup
(T op) Lookup the generator for a given p-code op use-def node
-
Method Details
-
lookup
Lookup the generator for a given p-code op use-def node- Type Parameters:
T
- the class of the op- Parameters:
op
- theJitOp
whose generator to look up- Returns:
- the generator
-
generateInitCode
Emit bytecode into the class constructor.- Parameters:
gen
- the code generatorop
- the p-code op (use-def node) to translateiv
- the visitor for the class constructor
-
generateRunCode
void generateRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, org.objectweb.asm.MethodVisitor rv) Emit bytecode into therun
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)
, andTypeConversions
appropriately.- Parameters:
gen
- the code generatorop
- the p-code op (use-def node) to translateblock
- the basic block containing the p-code oprv
- the visitor for therun
method.
-