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>,FloatBinOpGen<T>,FloatUnOpGen<T>,IntBinOpGen<T>,IntUnOpGen<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 voidgenerateInitCode(JitCodeGenerator gen, T op, org.objectweb.asm.MethodVisitor iv) Emit bytecode into the class constructor.static voidgenerateMpLegsFromArray(int legCount, org.objectweb.asm.MethodVisitor mv) Emit bytecode to push all legs from an array onto the stackstatic voidgenerateMpLegsFromTemp(JitAllocationModel.JvmTempAlloc temp, int legCount, org.objectweb.asm.MethodVisitor mv) Emit bytecode to move all legs from a temporary allocation onto the stackstatic voidgenerateMpLegsIntoArray(JitAllocationModel.JvmTempAlloc temp, int arrSize, int legCount, org.objectweb.asm.MethodVisitor mv) Emit bytecode to copy all legs from a temporary allocation into an arraystatic voidgenerateMpLegsIntoTemp(JitAllocationModel.JvmTempAlloc temp, int legCount, org.objectweb.asm.MethodVisitor mv) Emit bytecode to move all legs from the stack into a temporary allocationvoidgenerateRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, org.objectweb.asm.MethodVisitor rv) Emit bytecode into therunmethod.static voidgenerateSyserrInts(JitCodeGenerator gen, int count, org.objectweb.asm.MethodVisitor mv) 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- theJitOpwhose generator to look up- Returns:
- the generator
-
generateMpLegsIntoTemp
static void generateMpLegsIntoTemp(JitAllocationModel.JvmTempAlloc temp, int legCount, org.objectweb.asm.MethodVisitor mv) Emit bytecode to move all legs from the stack into a temporary allocationThis consumes
legCountlegs from the stack. Nothing else is pushed to the stack. The legs are placed in ascending indices as popped from the stack, i.e., in little-endian order.- Parameters:
temp- the allocation of temporary legslegCount- the number of legs to movemv- the method visitor
-
generateMpLegsFromTemp
static void generateMpLegsFromTemp(JitAllocationModel.JvmTempAlloc temp, int legCount, org.objectweb.asm.MethodVisitor mv) Emit bytecode to move all legs from a temporary allocation onto the stackThis consumes nothing. It places
legCountlegs onto the stack, pushed in descending order, i.e., such that they would be popped in little-endian order.- Parameters:
temp- the allocation of temporary legslegCount- the number of lets to movemv- the method visitor
-
generateMpLegsIntoArray
static void generateMpLegsIntoArray(JitAllocationModel.JvmTempAlloc temp, int arrSize, int legCount, org.objectweb.asm.MethodVisitor mv) Emit bytecode to copy all legs from a temporary allocation into an arrayThis does not consume anything from the stack. Upon return, the new array is pushed onto the stack. The legs are positioned in the array in the same order as in the locals. When used with
generateMpLegsIntoTemp(JvmTempAlloc, int, MethodVisitor), this is little-endian order.- Parameters:
temp- the allocation of temporary legsarrSize- the size of the array, possibly over-provisionedlegCount- the number of legs to movemv- the method visitor
-
generateMpLegsFromArray
static void generateMpLegsFromArray(int legCount, org.objectweb.asm.MethodVisitor mv) Emit bytecode to push all legs from an array onto the stackThis consumes the array at the top of the stack, and pushes its legs onto the stack in the reverse order as they are positioned in the array. If the legs are in little-endian order, as is convention, this method will push the legs to the stack with the least-significant leg on top.
- Parameters:
legCount- the number of legs in the arraymv- the method visitor
-
generateSyserrInts
-
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 therunmethod.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), andTypeConversionsappropriately.- 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 therunmethod.
-