Path: blob/master/runtime/codert_vm/pnathelp.m4
5986 views
dnl Copyright (c) 2017, 2021 IBM Corp. and others dnl dnl This program and the accompanying materials are made available under dnl the terms of the Eclipse Public License 2.0 which accompanies this dnl distribution and is available at https://www.eclipse.org/legal/epl-2.0/ dnl or the Apache License, Version 2.0 which accompanies this distribution and dnl is available at https://www.apache.org/licenses/LICENSE-2.0. dnl dnl This Source Code may also be made available under the following dnl Secondary Licenses when the conditions for such availability set dnl forth in the Eclipse Public License, v. 2.0 are satisfied: GNU dnl General Public License, version 2 with the GNU Classpath dnl Exception [1] and GNU General Public License, version 2 with the dnl OpenJDK Assembly Exception [2]. dnl dnl [1] https://www.gnu.org/software/classpath/license.html dnl [2] http://openjdk.java.net/legal/assembly-exception.html dnl dnl SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception include(phelpers.m4) START_FILE("pnathelp.s") define({CSECT_NAME},{pnathelp}) define({BEGIN_HELPER},{ START_PROC($1) staddr r0,JIT_GPR_SAVE_SLOT(0) SAVE_LR SAVE_JIT_GOT_REGISTERS INIT_JIT_TOC }) define({END_HELPER},{ laddr r0,JIT_GPR_SAVE_SLOT(0) blr END_PROC($1) }) define({CALL_SLOW_PATH_ONLY_HELPER},{ CALL_SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE($1) laddr r3,J9TR_VMThread_returnValue(J9VMTHREAD) }) define({CALL_SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE},{ SWITCH_TO_C_STACK SAVE_ALL_REGS laddr r0,JIT_LR_SAVE_SLOT staddr r0,J9TR_VMThread_jitReturnAddress(J9VMTHREAD) CALL_C_WITH_VMTHREAD(old_slow_$1) cmpliaddr r3,0 beq .L_done_$1 mtctr r3 bctr .L_done_$1: RESTORE_ALL_REGS RESTORE_JIT_GOT_REGISTERS RESTORE_LR SWITCH_TO_JAVA_STACK }) define({CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE},{ SWITCH_TO_C_STACK SAVE_ALL_REGS laddr r0,JIT_LR_SAVE_SLOT staddr r0,J9TR_VMThread_jitReturnAddress(J9VMTHREAD) CALL_C_WITH_VMTHREAD(old_slow_$1) RESTORE_ALL_REGS RESTORE_JIT_GOT_REGISTERS RESTORE_LR SWITCH_TO_JAVA_STACK }) define({CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION},{ CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE($1) laddr r3,J9TR_VMThread_returnValue(J9VMTHREAD) }) define({SLOW_PATH_ONLY_HELPER},{ DECLARE_EXTERN(old_slow_$1) BEGIN_HELPER($1) CALL_SLOW_PATH_ONLY_HELPER($1) END_HELPER($1) }) define({SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE},{ DECLARE_EXTERN(old_slow_$1) BEGIN_HELPER($1) CALL_SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE($1) END_HELPER($1) }) define({TRAP_HANDLER},{SLOW_PATH_ONLY_HELPER($1)}) define({PICBUILDER_FAST_PATH_ONLY_HELPER},{FAST_PATH_ONLY_HELPER($1)}) define({PICBUILDER_SLOW_PATH_ONLY_HELPER},{SLOW_PATH_ONLY_HELPER($1)}) define({EXCEPTION_THROW_HELPER},{SLOW_PATH_ONLY_HELPER($1)}) define({SLOW_PATH_ONLY_HELPER_NO_EXCEPTION},{ DECLARE_EXTERN(old_slow_$1) BEGIN_HELPER($1) CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION($1) END_HELPER($1) }) define({SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE},{ DECLARE_EXTERN(old_slow_$1) BEGIN_HELPER($1) CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE($1) END_HELPER($1) }) define({FAST_PATH_ONLY_HELPER},{ DECLARE_EXTERN(old_fast_$1) BEGIN_HELPER($1) SWITCH_TO_C_STACK SAVE_C_VOLATILE_REGS CALL_C_WITH_VMTHREAD(old_fast_$1) RESTORE_C_VOLATILE_REGS RESTORE_JIT_GOT_REGISTERS RESTORE_LR SWITCH_TO_JAVA_STACK laddr r3,J9TR_VMThread_returnValue(J9VMTHREAD) END_HELPER($1) }) define({FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE},{ DECLARE_EXTERN(old_fast_$1) BEGIN_HELPER($1) SWITCH_TO_C_STACK SAVE_C_VOLATILE_REGS CALL_C_WITH_VMTHREAD(old_fast_$1) RESTORE_C_VOLATILE_REGS RESTORE_JIT_GOT_REGISTERS RESTORE_LR SWITCH_TO_JAVA_STACK END_HELPER($1) }) define({OLD_DUAL_MODE_HELPER},{ DECLARE_EXTERN(old_fast_$1) BEGIN_HELPER($1) SWITCH_TO_C_STACK SAVE_C_VOLATILE_REGS CALL_C_WITH_VMTHREAD(old_fast_$1) cmpliaddr r3,0 beq .L_done_$1 laddr r0,JIT_LR_SAVE_SLOT staddr r0,J9TR_VMThread_jitReturnAddress(J9VMTHREAD) SAVE_C_NONVOLATILE_REGS mr FUNC_PTR,r3 mr r3,J9VMTHREAD CALL_INDIRECT cmpliaddr r3,0 beq .L_old_slow_$1 mtctr r3 bctr .L_old_slow_$1: RESTORE_C_NONVOLATILE_REGS .L_done_$1: RESTORE_C_VOLATILE_REGS RESTORE_JIT_GOT_REGISTERS RESTORE_LR SWITCH_TO_JAVA_STACK laddr r3,J9TR_VMThread_returnValue(J9VMTHREAD) END_HELPER($1) }) define({OLD_DUAL_MODE_HELPER_NO_RETURN_VALUE},{ DECLARE_EXTERN(old_fast_$1) BEGIN_HELPER($1) SWITCH_TO_C_STACK SAVE_C_VOLATILE_REGS CALL_C_WITH_VMTHREAD(old_fast_$1) cmpliaddr r3,0 beq .L_done_$1 laddr r0,JIT_LR_SAVE_SLOT staddr r0,J9TR_VMThread_jitReturnAddress(J9VMTHREAD) SAVE_C_NONVOLATILE_REGS mr FUNC_PTR,r3 mr r3,J9VMTHREAD CALL_INDIRECT cmpliaddr r3,0 beq .L_old_slow_$1 mtctr r3 bctr .L_old_slow_$1: RESTORE_C_NONVOLATILE_REGS .L_done_$1: RESTORE_C_VOLATILE_REGS RESTORE_JIT_GOT_REGISTERS RESTORE_LR SWITCH_TO_JAVA_STACK END_HELPER($1) }) define({NEW_DUAL_MODE_HELPER},{ DECLARE_EXTERN(fast_$1) START_PROC($1) SAVE_LR SAVE_JIT_GOT_REGISTERS INIT_JIT_TOC CALL_DIRECT(fast_$1) cmpliaddr r3,0 beq .L_done_$1 laddr r0,JIT_LR_SAVE_SLOT staddr r0,J9TR_VMThread_jitReturnAddress(J9VMTHREAD) SWITCH_TO_C_STACK SAVE_C_NONVOLATILE_REGS mr FUNC_PTR,r3 mr r3,J9VMTHREAD CALL_INDIRECT cmpliaddr r3,0 beq .L_old_slow_$1 mtctr r3 bctr .L_old_slow_$1: RESTORE_C_NONVOLATILE_REGS SWITCH_TO_JAVA_STACK .L_done_$1: RESTORE_JIT_GOT_REGISTERS RESTORE_LR laddr r3,J9TR_VMThread_returnValue(J9VMTHREAD) blr END_PROC($1) }) define({NEW_DUAL_MODE_HELPER_NO_RETURN_VALUE},{ DECLARE_EXTERN(fast_$1) START_PROC($1) SAVE_LR SAVE_JIT_GOT_REGISTERS INIT_JIT_TOC CALL_DIRECT(fast_$1) cmpliaddr r3,0 beq .L_done_$1 laddr r0,JIT_LR_SAVE_SLOT staddr r0,J9TR_VMThread_jitReturnAddress(J9VMTHREAD) SWITCH_TO_C_STACK SAVE_C_NONVOLATILE_REGS mr FUNC_PTR,r3 mr r3,J9VMTHREAD CALL_INDIRECT cmpliaddr r3,0 beq .L_old_slow_$1 mtctr r3 bctr .L_old_slow_$1: RESTORE_C_NONVOLATILE_REGS SWITCH_TO_JAVA_STACK .L_done_$1: RESTORE_JIT_GOT_REGISTERS RESTORE_LR blr END_PROC($1) }) define({PICBUILDER_DUAL_MODE_HELPER},{OLD_DUAL_MODE_HELPER($1)}) ifdef({ASM_J9VM_JIT_NEW_DUAL_HELPERS},{ define({DUAL_MODE_HELPER},{NEW_DUAL_MODE_HELPER($1,$2)}) define({DUAL_MODE_HELPER_NO_RETURN_VALUE},{NEW_DUAL_MODE_HELPER_NO_RETURN_VALUE($1,$2)}) },{ dnl ASM_J9VM_JIT_NEW_DUAL_HELPERS define({DUAL_MODE_HELPER},{OLD_DUAL_MODE_HELPER($1,$2)}) define({DUAL_MODE_HELPER_NO_RETURN_VALUE},{OLD_DUAL_MODE_HELPER_NO_RETURN_VALUE($1,$2)}) }) dnl ASM_J9VM_JIT_NEW_DUAL_HELPERS define({BEGIN_RETURN_POINT},{ START_PROC($1) }) define({END_RETURN_POINT},{ BRANCH_VIA_VMTHREAD(J9TR_VMThread_floatTemp1) END_PROC($1) }) define({CINTERP},{ li r3,$1 li r4,$2 b FUNC_LABEL(cInterpreterFromJIT) }) define({UNUSED},{ START_PROC($1) li r31,-1 staddr r0,0(r31) END_PROC($1) }) dnl Helpers that are at a method invocation point. dnl dnl See definition of SAVE_C_VOLATILE_REGS in phelpers.m4 dnl for details. undefine({MUST_PRESERVE_FPR}) undefine({MUST_PRESERVE_VR}) PICBUILDER_DUAL_MODE_HELPER(jitLookupInterfaceMethod,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveInterfaceMethod,2) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveSpecialMethod,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveStaticMethod,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveVirtualMethod,2) SLOW_PATH_ONLY_HELPER(jitInduceOSRAtCurrentPC,0) SLOW_PATH_ONLY_HELPER(jitInduceOSRAtCurrentPCAndRecompile,0) SLOW_PATH_ONLY_HELPER(jitRetranslateMethod,3) dnl jitStackOverflow is special case in that the frame size argument dnl is implicit (in the register file) rather than being passed as dnl an argument in the usual way. SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitStackOverflow,0) dnl Helpers that are not at a method invocation point. dnl dnl See definition of SAVE_C_VOLATILE_REGS in phelpers.m4 dnl for details. define({MUST_PRESERVE_FPR}) ifdef({ASM_J9VM_ENV_DATA64},{define({MUST_PRESERVE_VR})}) dnl Runtime helpers DUAL_MODE_HELPER(jitNewValue,1) DUAL_MODE_HELPER(jitNewValueNoZeroInit,1) DUAL_MODE_HELPER(jitNewObject,1) DUAL_MODE_HELPER(jitNewObjectNoZeroInit,1) DUAL_MODE_HELPER(jitANewArray,2) DUAL_MODE_HELPER(jitANewArrayNoZeroInit,2) DUAL_MODE_HELPER(jitNewArray,2) DUAL_MODE_HELPER(jitNewArrayNoZeroInit,2) SLOW_PATH_ONLY_HELPER(jitAMultiNewArray,3) SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitCheckAsyncMessages,0) DUAL_MODE_HELPER_NO_RETURN_VALUE(jitCheckCast,2) DUAL_MODE_HELPER_NO_RETURN_VALUE(jitCheckCastForArrayStore,2) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitCheckIfFinalizeObject,1) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitCollapseJNIReferenceFrame,0) FAST_PATH_ONLY_HELPER(jitInstanceOf,2) DUAL_MODE_HELPER_NO_RETURN_VALUE(jitMethodMonitorEntry,1) DUAL_MODE_HELPER_NO_RETURN_VALUE(jitMonitorEntry,1) DUAL_MODE_HELPER_NO_RETURN_VALUE(jitMethodMonitorExit,1) DUAL_MODE_HELPER_NO_RETURN_VALUE(jitMonitorExit,1) SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitReportMethodEnter,2) SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitReportStaticMethodEnter,1) SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitReportMethodExit,2) DUAL_MODE_HELPER_NO_RETURN_VALUE(jitTypeCheckArrayStore,2) DUAL_MODE_HELPER_NO_RETURN_VALUE(jitTypeCheckArrayStoreWithNullCheck,2) FAST_PATH_ONLY_HELPER(jitObjectHashCode,1) SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitReportFinalFieldModified,1) SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitReportInstanceFieldRead,2) SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitReportInstanceFieldWrite,3) SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitReportStaticFieldRead,1) SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitReportStaticFieldWrite,2) FAST_PATH_ONLY_HELPER(jitAcmpeqHelper,2) FAST_PATH_ONLY_HELPER(jitAcmpneHelper,2) OLD_DUAL_MODE_HELPER(jitGetFlattenableField,2) OLD_DUAL_MODE_HELPER(jitCloneValueType, 1) OLD_DUAL_MODE_HELPER(jitWithFlattenableField,3) OLD_DUAL_MODE_HELPER_NO_RETURN_VALUE(jitPutFlattenableField,3) OLD_DUAL_MODE_HELPER(jitGetFlattenableStaticField,2) OLD_DUAL_MODE_HELPER_NO_RETURN_VALUE(jitPutFlattenableStaticField,3) OLD_DUAL_MODE_HELPER(jitLoadFlattenableArrayElement,2) OLD_DUAL_MODE_HELPER_NO_RETURN_VALUE(jitStoreFlattenableArrayElement,3) SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitResolveFlattenableField,3) FAST_PATH_ONLY_HELPER(jitLookupDynamicInterfaceMethod,3) OLD_DUAL_MODE_HELPER(jitLookupDynamicPublicInterfaceMethod,3) dnl Trap handlers TRAP_HANDLER(jitHandleArrayIndexOutOfBoundsTrap,0) TRAP_HANDLER(jitHandleIntegerDivideByZeroTrap,0) TRAP_HANDLER(jitHandleNullPointerExceptionTrap,0) TRAP_HANDLER(jitHandleInternalErrorTrap,0) dnl Only called from PicBuilder PICBUILDER_FAST_PATH_ONLY_HELPER(jitMethodIsNative,1) PICBUILDER_FAST_PATH_ONLY_HELPER(jitMethodIsSync,1) PICBUILDER_FAST_PATH_ONLY_HELPER(jitResolvedFieldIsVolatile,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveString,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveClass,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveClassFromStaticField,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveField,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveFieldSetter,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveStaticField,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveStaticFieldSetter,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveMethodType,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveMethodHandle,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveInvokeDynamic,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveConstantDynamic,3) PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveHandleMethod,3) dnl Direct call field resolve helpers SLOW_PATH_ONLY_HELPER(jitResolveFieldDirect,2) SLOW_PATH_ONLY_HELPER(jitResolveFieldSetterDirect,2) SLOW_PATH_ONLY_HELPER(jitResolveStaticFieldDirect,2) SLOW_PATH_ONLY_HELPER(jitResolveStaticFieldSetterDirect,2) dnl Recompilation helpers SLOW_PATH_ONLY_HELPER(jitRetranslateCaller,2) SLOW_PATH_ONLY_HELPER(jitRetranslateCallerWithPreparation,3) dnl Exception throw helpers EXCEPTION_THROW_HELPER(jitThrowCurrentException,0) EXCEPTION_THROW_HELPER(jitThrowException,1) EXCEPTION_THROW_HELPER(jitThrowUnreportedException,1) EXCEPTION_THROW_HELPER(jitThrowAbstractMethodError,0) EXCEPTION_THROW_HELPER(jitThrowArithmeticException,0) EXCEPTION_THROW_HELPER(jitThrowArrayIndexOutOfBounds,0) EXCEPTION_THROW_HELPER(jitThrowArrayStoreException,0) EXCEPTION_THROW_HELPER(jitThrowArrayStoreExceptionWithIP,0) EXCEPTION_THROW_HELPER(jitThrowExceptionInInitializerError,0) EXCEPTION_THROW_HELPER(jitThrowIllegalAccessError,0) EXCEPTION_THROW_HELPER(jitThrowIncompatibleClassChangeError,0) EXCEPTION_THROW_HELPER(jitThrowInstantiationException,0) EXCEPTION_THROW_HELPER(jitThrowNullPointerException,0) EXCEPTION_THROW_HELPER(jitThrowWrongMethodTypeException,0) EXCEPTION_THROW_HELPER(jitThrowIncompatibleReceiver,2) dnl Write barrier helpers FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitWriteBarrierBatchStore,1) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitWriteBarrierBatchStoreWithRange,3) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitWriteBarrierJ9ClassBatchStore,1) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitWriteBarrierJ9ClassStore,2) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitWriteBarrierStore,2) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitWriteBarrierStoreGenerational,2) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitWriteBarrierStoreGenerationalAndConcurrentMark,2) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitWriteBarrierClassStoreMetronome,3) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitWriteBarrierStoreMetronome,3) dnl Misc SLOW_PATH_ONLY_HELPER(jitNewInstanceImplAccessCheck,3) SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE(jitCallCFunction,3) SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE(jitCallJitAddPicToPatchOnClassUnload,2) UNUSED(jitNewDerivedPackedObject) UNUSED(jitNewDerivedPackedArray) UNUSED(jitPackedResolveField) UNUSED(jitPackedResolveFieldSetter) UNUSED(jitNewPackedArray) UNUSED(jitResolvePackedArrayFieldLength) UNUSED(jitResolveIsPackedFieldNested) UNUSED(jitNewObjectNoTenantInit) UNUSED(jitPostJNICallOffloadCheck) UNUSED(jitPreJNICallOffloadCheck) UNUSED(jitFindFieldSignatureClass) UNUSED(j2iInvokeWithArguments) dnl Switch from the C stack to the java stack and jump via tempSlot START_PROC(jitRunOnJavaStack) SWITCH_TO_JAVA_STACK BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitRunOnJavaStack) dnl When the VM access helpers are called, the java SP is already stored in the J9VMThread DECLARE_EXTERN(fast_jitAcquireVMAccess) DECLARE_EXTERN(fast_jitReleaseVMAccess) BEGIN_HELPER(jitAcquireVMAccess) SAVE_ALL_REGS mr r3,J9VMTHREAD CALL_DIRECT(fast_jitAcquireVMAccess) RESTORE_ALL_REGS RESTORE_JIT_GOT_REGISTERS RESTORE_LR END_HELPER(jitAcquireVMAccess) BEGIN_HELPER(jitReleaseVMAccess) SAVE_ALL_REGS mr r3,J9VMTHREAD CALL_DIRECT(fast_jitReleaseVMAccess) RESTORE_ALL_REGS RESTORE_JIT_GOT_REGISTERS RESTORE_LR END_HELPER(jitReleaseVMAccess) START_PROC(cInterpreterFromJIT) staddr r3,J9TR_VMThread_returnValue(J9VMTHREAD) staddr r4,J9TR_VMThread_returnValue2(J9VMTHREAD) laddr r3,J9TR_VMThread_javaVM(J9VMTHREAD) laddr r0,J9TR_JavaVM_cInterpreter(r3) mtctr r0 bctr END_PROC(cInterpreterFromJIT) BEGIN_RETURN_POINT(jitExitInterpreter0) END_RETURN_POINT(jitExitInterpreter0) BEGIN_RETURN_POINT(jitExitInterpreter1) lwz r3,J9TR_VMThread_returnValue(J9VMTHREAD) END_RETURN_POINT(jitExitInterpreter1) BEGIN_RETURN_POINT(jitExitInterpreterF) lfs fp0,J9TR_VMThread_returnValue(J9VMTHREAD) END_RETURN_POINT(jitExitInterpreterF) BEGIN_RETURN_POINT(jitExitInterpreterD) lfd fp0,J9TR_VMThread_returnValue(J9VMTHREAD) END_RETURN_POINT(jitExitInterpreterD) DECLARE_EXTERN(old_slow_jitInterpretNewInstanceMethod) DECLARE_EXTERN(old_slow_jitTranslateNewInstanceMethod) dnl Non-standard - Called via an invoke - arguments are reversed on stack and doesn't return to caller right away BEGIN_HELPER(jitInterpretNewInstanceMethod) CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE(jitInterpretNewInstanceMethod) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitInterpretNewInstanceMethod) dnl Non-standard - Called via an invoke - arguments are reversed on stack and doesn't return to caller right away BEGIN_HELPER(jitTranslateNewInstanceMethod) CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE(jitTranslateNewInstanceMethod) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitTranslateNewInstanceMethod) START_PROC(returnFromJITConstructor0) SWITCH_TO_C_STACK CINTERP(J9TR_bcloop_return_from_jit_ctor, 0) END_PROC(returnFromJITConstructor0) START_PROC(returnFromJIT0) SWITCH_TO_C_STACK CINTERP(J9TR_bcloop_return_from_jit, 0) END_PROC(returnFromJIT0) START_PROC(returnFromJIT1) stw r3,J9TR_VMThread_floatTemp1(J9VMTHREAD) SWITCH_TO_C_STACK CINTERP(J9TR_bcloop_return_from_jit, 1) END_PROC(returnFromJIT1) START_PROC(returnFromJITF) stfs fp0,J9TR_VMThread_floatTemp1(J9VMTHREAD) SWITCH_TO_C_STACK CINTERP(J9TR_bcloop_return_from_jit, 1) END_PROC(returnFromJITF) START_PROC(returnFromJITD) stfd fp0,J9TR_VMThread_floatTemp1(J9VMTHREAD) SWITCH_TO_C_STACK CINTERP(J9TR_bcloop_return_from_jit, 2) END_PROC(returnFromJITD) dnl j2iInvokeExact dnl All arguments (including the MethodHandle) are on stack dnl Return address is in LR dnl JIT preserved registers are live dnl r3 contains the method to run START_PROC(j2iInvokeExact) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS SAVE_LR mr r4,r3 li r3,J9TR_bcloop_j2i_invoke_exact b FUNC_LABEL(cInterpreterFromJIT) END_PROC(j2iInvokeExact) dnl j2iTransition dnl All arguments are on stack dnl Return address is in LR dnl JIT preserved registers are live dnl r3 contains the method to run START_PROC(j2iTransition) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS SAVE_LR mr r4,r3 li r3,J9TR_bcloop_j2i_transition b FUNC_LABEL(cInterpreterFromJIT) END_PROC(j2iTransition) dnl j2iVirtual dnl All arguments are on stack dnl Return address is in LR dnl JIT preserved registers are live dnl r3 contains the receiver dnl r12 contains the vTable index START_PROC(j2iVirtual) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS SAVE_LR staddr r12,J9TR_VMThread_tempSlot(J9VMTHREAD) mr r4,r3 li r3,J9TR_bcloop_j2i_virtual b FUNC_LABEL(cInterpreterFromJIT) END_PROC(j2iVirtual) DECLARE_EXTERN(old_slow_icallVMprJavaSendPatchupVirtual) dnl icallVMprJavaSendPatchupVirtual dnl Arguments are in registers/stack per JIT linkage dnl Return address is in LR dnl JIT preserved registers are live dnl r3 contains the receiver dnl r12 contains the vTable index BEGIN_HELPER(icallVMprJavaSendPatchupVirtual) staddr r3,J9TR_VMThread_returnValue2(J9VMTHREAD) staddr r12,J9TR_VMThread_tempSlot(J9VMTHREAD) CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE(icallVMprJavaSendPatchupVirtual) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(icallVMprJavaSendPatchupVirtual) START_PROC(icallVMprJavaSendNativeStatic) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendNativeStatic) START_PROC(icallVMprJavaSendStatic0) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStatic0) START_PROC(icallVMprJavaSendStatic1) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStatic1) START_PROC(icallVMprJavaSendStaticJ) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStaticJ) START_PROC(icallVMprJavaSendStaticF) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStaticF) START_PROC(icallVMprJavaSendStaticD) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStaticD) START_PROC(icallVMprJavaSendStaticL) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStaticL) START_PROC(icallVMprJavaSendStaticSync0) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStaticSync0) START_PROC(icallVMprJavaSendStaticSync1) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStaticSync1) START_PROC(icallVMprJavaSendStaticSyncJ) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStaticSyncJ) START_PROC(icallVMprJavaSendStaticSyncF) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStaticSyncF) START_PROC(icallVMprJavaSendStaticSyncD) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStaticSyncD) START_PROC(icallVMprJavaSendStaticSyncL) b FUNC_LABEL(j2iTransition) END_PROC(icallVMprJavaSendStaticSyncL) START_PROC(icallVMprJavaSendNativeVirtual) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendNativeVirtual) START_PROC(icallVMprJavaSendVirtual0) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtual0) START_PROC(icallVMprJavaSendVirtual1) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtual1) START_PROC(icallVMprJavaSendVirtualJ) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtualJ) START_PROC(icallVMprJavaSendVirtualF) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtualF) START_PROC(icallVMprJavaSendVirtualD) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtualD) START_PROC(icallVMprJavaSendVirtualL) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtualL) START_PROC(icallVMprJavaSendVirtualSync0) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtualSync0) START_PROC(icallVMprJavaSendVirtualSync1) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtualSync1) START_PROC(icallVMprJavaSendVirtualSyncJ) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtualSyncJ) START_PROC(icallVMprJavaSendVirtualSyncF) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtualSyncF) START_PROC(icallVMprJavaSendVirtualSyncD) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtualSyncD) START_PROC(icallVMprJavaSendVirtualSyncL) b FUNC_LABEL(j2iVirtual) END_PROC(icallVMprJavaSendVirtualSyncL) START_PROC(icallVMprJavaSendInvokeExact0) b FUNC_LABEL(j2iInvokeExact) END_PROC(icallVMprJavaSendInvokeExact0) START_PROC(icallVMprJavaSendInvokeExact1) b FUNC_LABEL(j2iInvokeExact) END_PROC(icallVMprJavaSendInvokeExact1) START_PROC(icallVMprJavaSendInvokeExactD) b FUNC_LABEL(j2iInvokeExact) END_PROC(icallVMprJavaSendInvokeExactD) START_PROC(icallVMprJavaSendInvokeExactF) b FUNC_LABEL(j2iInvokeExact) END_PROC(icallVMprJavaSendInvokeExactF) START_PROC(icallVMprJavaSendInvokeExactJ) b FUNC_LABEL(j2iInvokeExact) END_PROC(icallVMprJavaSendInvokeExactJ) START_PROC(icallVMprJavaSendInvokeExactL) b FUNC_LABEL(j2iInvokeExact) END_PROC(icallVMprJavaSendInvokeExactL) DECLARE_EXTERN(c_jitDecompileOnReturn) DECLARE_EXTERN(c_jitReportExceptionCatch) DECLARE_EXTERN(c_jitDecompileAtExceptionCatch) DECLARE_EXTERN(c_jitDecompileAtCurrentPC) DECLARE_EXTERN(c_jitDecompileBeforeReportMethodEnter) DECLARE_EXTERN(c_jitDecompileBeforeMethodMonitorEnter) DECLARE_EXTERN(c_jitDecompileAfterAllocation) DECLARE_EXTERN(c_jitDecompileAfterMonitorEnter) START_PROC(jitDecompileOnReturn0) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS INIT_JIT_TOC li r0,0 staddr r0,J9TR_VMThread_tempSlot(J9VMTHREAD) CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileOnReturn0) START_PROC(jitDecompileOnReturn1) stw r3,J9TR_VMThread_returnValue(J9VMTHREAD) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS INIT_JIT_TOC li r0,1 staddr r0,J9TR_VMThread_tempSlot(J9VMTHREAD) CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileOnReturn1) START_PROC(jitDecompileOnReturnF) stfs fp0,J9TR_VMThread_returnValue(J9VMTHREAD) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS INIT_JIT_TOC li r0,1 staddr r0,J9TR_VMThread_tempSlot(J9VMTHREAD) CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileOnReturnF) START_PROC(jitDecompileOnReturnD) stfd fp0,J9TR_VMThread_returnValue(J9VMTHREAD) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS INIT_JIT_TOC li r0,2 staddr r0,J9TR_VMThread_tempSlot(J9VMTHREAD) CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileOnReturnD) START_PROC(jitReportExceptionCatch) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS INIT_JIT_TOC CALL_C_WITH_VMTHREAD(c_jitReportExceptionCatch) RESTORE_PRESERVED_REGS SWITCH_TO_JAVA_STACK BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitReportExceptionCatch) START_PROC(jitDecompileAtExceptionCatch) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS INIT_JIT_TOC CALL_C_WITH_VMTHREAD(c_jitDecompileAtExceptionCatch) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileAtExceptionCatch) START_PROC(jitDecompileAtCurrentPC) SWITCH_TO_C_STACK INIT_JIT_TOC CALL_C_WITH_VMTHREAD(c_jitDecompileAtCurrentPC) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileAtCurrentPC) START_PROC(jitDecompileBeforeReportMethodEnter) SWITCH_TO_C_STACK INIT_JIT_TOC CALL_C_WITH_VMTHREAD(c_jitDecompileBeforeReportMethodEnter) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileBeforeReportMethodEnter) START_PROC(jitDecompileBeforeMethodMonitorEnter) SWITCH_TO_C_STACK INIT_JIT_TOC CALL_C_WITH_VMTHREAD(c_jitDecompileBeforeMethodMonitorEnter) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileBeforeMethodMonitorEnter) START_PROC(jitDecompileAfterAllocation) SWITCH_TO_C_STACK INIT_JIT_TOC CALL_C_WITH_VMTHREAD(c_jitDecompileAfterAllocation) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileAfterAllocation) START_PROC(jitDecompileAfterMonitorEnter) SWITCH_TO_C_STACK INIT_JIT_TOC CALL_C_WITH_VMTHREAD(c_jitDecompileAfterMonitorEnter) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileAfterMonitorEnter) START_PROC(executeCurrentBytecodeFromJIT) CINTERP(J9TR_bcloop_execute_bytecode, 0) END_PROC(executeCurrentBytecodeFromJIT) START_PROC(handlePopFramesFromJIT) CINTERP(J9TR_bcloop_handle_pop_frames, 0) END_PROC(handlePopFramesFromJIT) START_PROC(throwCurrentExceptionFromJIT) CINTERP(J9TR_bcloop_throw_current_exception, 0) END_PROC(throwCurrentExceptionFromJIT) START_PROC(enterMethodMonitorFromJIT) laddr r4,J9TR_VMThread_floatTemp1(J9VMTHREAD) li r3,J9TR_bcloop_enter_method_monitor b FUNC_LABEL(cInterpreterFromJIT) END_PROC(enterMethodMonitorFromJIT) START_PROC(reportMethodEnterFromJIT) laddr r4,J9TR_VMThread_floatTemp1(J9VMTHREAD) li r3,J9TR_bcloop_report_method_enter b FUNC_LABEL(cInterpreterFromJIT) END_PROC(reportMethodEnterFromJIT) START_PROC(jitFillOSRBufferReturn) SWITCH_TO_C_STACK CINTERP(J9TR_bcloop_exit_interpreter, 0) END_PROC(jitFillOSRBufferReturn) dnl Expects r3 to already contain the vmThread. dnl Expects r4 to already contain the address being loaded from. START_PROC(jitSoftwareReadBarrier) ifdef({OMR_GC_CONCURRENT_SCAVENGER},{ staddr r0,JIT_GPR_SAVE_SLOT(0) SAVE_LR SAVE_JIT_GOT_REGISTERS INIT_JIT_TOC SWITCH_TO_C_STACK SAVE_C_VOLATILE_REGS laddr r5,J9TR_VMThread_javaVM(J9VMTHREAD) laddr r5,J9TR_JavaVM_memoryManagerFunctions(r5) laddr FUNC_PTR,J9TR_J9MemoryManagerFunctions_J9ReadBarrier(r5) CALL_INDIRECT RESTORE_C_VOLATILE_REGS RESTORE_JIT_GOT_REGISTERS RESTORE_LR SWITCH_TO_JAVA_STACK laddr r0,JIT_GPR_SAVE_SLOT(0) blr },{ dnl jitSoftwareReadBarrier is not supported if OMR_GC_CONCURRENT_SCAVENGER is not set trap }) END_PROC(jitSoftwareReadBarrier) dnl Expects r3 to already contain vmThread. dnl Expects r4 to already contain srcObj. dnl Expects r5 to already contain dstObj. dnl Expects r6 to already contain srcAddr. dnl Expects r7 to already contain dstAddr. dnl Expects r8 to already contain length. START_PROC(jitReferenceArrayCopy) staddr r0,JIT_GPR_SAVE_SLOT(0) SAVE_LR SAVE_JIT_GOT_REGISTERS INIT_JIT_TOC SWITCH_TO_C_STACK SAVE_ALL_REGS laddr r9,J9TR_VMThread_javaVM(J9VMTHREAD) laddr r9,J9TR_JavaVM_memoryManagerFunctions(r9) laddr FUNC_PTR,J9TR_J9MemoryManagerFunctions_referenceArrayCopy(r9) CALL_INDIRECT staddr r3,J9TR_VMThread_returnValue(J9VMTHREAD) RESTORE_ALL_REGS RESTORE_JIT_GOT_REGISTERS RESTORE_LR SWITCH_TO_JAVA_STACK laddr r0,JIT_GPR_SAVE_SLOT(0) laddr r3,J9TR_VMThread_returnValue(J9VMTHREAD) blr END_PROC(jitReferenceArrayCopy) ifdef({ASM_J9VM_ENV_DATA64},{ BEGIN_RETURN_POINT(jitExitInterpreterJ) ld r3,J9TR_VMThread_returnValue(J9VMTHREAD) END_RETURN_POINT(jitExitInterpreterJ) START_PROC(returnFromJITJ) std r3,J9TR_VMThread_floatTemp1(J9VMTHREAD) SWITCH_TO_C_STACK CINTERP(J9TR_bcloop_return_from_jit, 2) END_PROC(returnFromJITJ) START_PROC(jitDecompileOnReturnJ) std r3,J9TR_VMThread_returnValue(J9VMTHREAD) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS INIT_JIT_TOC li r0,2 staddr r0,J9TR_VMThread_tempSlot(J9VMTHREAD) CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileOnReturnJ) START_PROC(returnFromJITL) std r3,J9TR_VMThread_floatTemp1(J9VMTHREAD) SWITCH_TO_C_STACK CINTERP(J9TR_bcloop_return_from_jit, 1) END_PROC(returnFromJITL) START_PROC(jitDecompileOnReturnL) std r3,J9TR_VMThread_returnValue(J9VMTHREAD) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS INIT_JIT_TOC li r0,1 staddr r0,J9TR_VMThread_tempSlot(J9VMTHREAD) CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileOnReturnL) },{ BEGIN_RETURN_POINT(jitExitInterpreterJ) lwz r3,J9TR_VMThread_returnValue(J9VMTHREAD) lwz r4,J9TR_VMThread_returnValue2(J9VMTHREAD) END_RETURN_POINT(jitExitInterpreterJ) START_PROC(returnFromJITJ) stw r3,J9TR_VMThread_floatTemp1(J9VMTHREAD) stw r4,J9TR_VMThread_floatTemp2(J9VMTHREAD) SWITCH_TO_C_STACK CINTERP(J9TR_bcloop_return_from_jit, 2) END_PROC(returnFromJITJ) START_PROC(jitDecompileOnReturnJ) stw r3,J9TR_VMThread_returnValue(J9VMTHREAD) stw r4,J9TR_VMThread_returnValue2(J9VMTHREAD) SWITCH_TO_C_STACK SAVE_PRESERVED_REGS INIT_JIT_TOC li r0,2 staddr r0,J9TR_VMThread_tempSlot(J9VMTHREAD) CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn) BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot) END_PROC(jitDecompileOnReturnJ) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitVolatileReadLong) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitVolatileWriteLong) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitVolatileReadDouble) FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitVolatileWriteDouble) })