Interface BinOpGen<T extends JitBinOp>
- 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:
BitwiseBinOpGen<T>,CompareFloatOpGen<T>,CompareIntBinOpGen<T>,FloatBinOpGen<T>,IntBinOpGen<T>,ShiftIntBinOpGen<T>
- All Known Implementing Classes:
BoolAndOpGen,BoolOrOpGen,BoolXorOpGen,FloatAddOpGen,FloatDivOpGen,FloatEqualOpGen,FloatLessEqualOpGen,FloatLessOpGen,FloatMultOpGen,FloatNotEqualOpGen,FloatSubOpGen,IntAddOpGen,IntAndOpGen,IntCarryOpGen,IntDivOpGen,IntEqualOpGen,IntLeftOpGen,IntLessEqualOpGen,IntLessOpGen,IntMultOpGen,IntNotEqualOpGen,IntOrOpGen,IntRemOpGen,IntRightOpGen,IntSBorrowOpGen,IntSCarryOpGen,IntSDivOpGen,IntSLessEqualOpGen,IntSLessOpGen,IntSRemOpGen,IntSRightOpGen,IntSubOpGen,IntXorOpGen
-
Nested Class Summary
Nested ClassesModifier and TypeInterfaceDescriptionstatic enumA choice of static method parameter to take as operator output -
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 JitTypeafterLeft(JitCodeGenerator gen, T op, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv) Emit code between reading the left and right operandsdefault TypeConversions.Extext()When loading and storing variables, the kind of extension to applygenerateBinOpRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv) Emit code for the binary operatorstatic voidgenerateMpDelegationToStaticMethod(JitCodeGenerator gen, JitType.MpIntJitType type, String methodName, org.objectweb.asm.MethodVisitor mv, int overProvisionLeft, BinOpGen.TakeOut takeOut) Emit bytecode that implements an mp-int binary operator via delegation to a static method onJitCompiledPassage.default voidgenerateRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, org.objectweb.asm.MethodVisitor rv) Emit bytecode into therunmethod.booleanisSigned()Whether this operator is signeddefault TypeConversions.ExtrExt()When loading the right operand, the kind of extension to applyMethods inherited from interface ghidra.pcode.emu.jit.gen.op.OpGen
generateInitCode
-
Method Details
-
generateMpDelegationToStaticMethod
static void generateMpDelegationToStaticMethod(JitCodeGenerator gen, JitType.MpIntJitType type, String methodName, org.objectweb.asm.MethodVisitor mv, int overProvisionLeft, BinOpGen.TakeOut takeOut) Emit bytecode that implements an mp-int binary operator via delegation to a static method onJitCompiledPassage. The method must have the signature:void method(int[] out, int[] inL, int[] inR);
This method presumes that the left operand's legs are at the top of the stack, least-significant leg on top, followed by the right operand legs, also least-significant leg on top. This will allocate the output array, move the operands into their respective input arrays, invoke the method, and then place the result legs on the stack, least-significant leg on top.
- Parameters:
gen- the code generatortype- the type of the operandsmethodName- the name of the method inJitCompiledPassageto invokemv- the method visitoroverProvisionLeft- the number of extra ints to allocate for the left operand's array. This is to facilitate Knuth's division algorithm, which may require an extra leading leg in the dividend after normalization.takeOut- indicates which operand of the static method to actually take for the output. This is to facilitate the remainder operator, because Knuth's algorithm leaves the remainder where there dividend was.
-
isSigned
boolean isSigned()Whether this operator is signedIn 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
When loading and storing variables, the kind of extension to apply- Returns:
- the extension kind
-
rExt
When loading the right operand, the kind of extension to apply- Returns:
- the extension kind
-
afterLeft
default JitType afterLeft(JitCodeGenerator gen, T op, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv) Emit code between reading the left and right operandsThis 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.
- Parameters:
gen- the code generatorop- the operatorlType- the actual type of the left operandrType- the actual type of the right operandrv- the method visitor- Returns:
- the new actual type of the left operand
-
generateBinOpRunCode
JitType generateBinOpRunCode(JitCodeGenerator gen, T op, JitControlFlowModel.JitBlock block, JitType lType, JitType rType, org.objectweb.asm.MethodVisitor rv) Emit code for the binary operatorAt 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.
- Parameters:
gen- the code generatorop- the operatorblock- the block containing the operatorlType- the actual type of the left operandrType- the actual type of the right operandrv- 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 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.This default implementation emits code to load the left operand, invokes the
after-lefthook point, emits code to load the right operand, invokesgenerate-binop, and finally emits code to write the destination operand.- Specified by:
generateRunCodein interfaceOpGen<T extends JitBinOp>- 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.
-