Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/codert_vm/znathelp.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(zhelpers.m4)

    FILE_START(znathelp)

define({CALL_SLOW_PATH_ONLY_HELPER},{
    SAVE_ALL_REGS($1)
    ST_GPR r14,J9TR_VMThread_jitReturnAddress(J9VMTHREAD)
    ST_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    CALL_C_WITH_VMTHREAD($1, old_slow_$1)
    LHI_GPR r0,0
    CLR_GPR CRINT,r0
    je LABEL_NAME(CONCAT(L_DONE_,SYM_COUNT))
    br CRINT
PLACE_LABEL(CONCAT(L_DONE_,SYM_COUNT))
    L_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    ST_GPR J9SP,JIT_GPR_SAVE_SLOT(J9SP)
    L_GPR r2,J9TR_VMThread_returnValue(J9VMTHREAD)
    ST_GPR r2,JIT_GPR_SAVE_SLOT(2)
    RESTORE_ALL_REGS_AND_SWITCH_TO_JAVA_STACK($1)
})

define({CALL_SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE},{
    SAVE_ALL_REGS($1)
    ST_GPR r14,J9TR_VMThread_jitReturnAddress(J9VMTHREAD)
    ST_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    CALL_C_WITH_VMTHREAD($1, old_slow_$1)
    LHI_GPR r0,0
    CLR_GPR CRINT,r0
    je LABEL_NAME(CONCAT(L_DONE_,SYM_COUNT))
    br CRINT
PLACE_LABEL(CONCAT(L_DONE_,SYM_COUNT))
    L_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    ST_GPR J9SP,JIT_GPR_SAVE_SLOT(J9SP)
    RESTORE_ALL_REGS_AND_SWITCH_TO_JAVA_STACK($1)
})

define({CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION},{
    SAVE_ALL_REGS($1)
    ST_GPR r14,J9TR_VMThread_jitReturnAddress(J9VMTHREAD)
    ST_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    CALL_C_WITH_VMTHREAD($1, old_slow_$1)
    L_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    ST_GPR J9SP,JIT_GPR_SAVE_SLOT(J9SP)
    L_GPR r2,J9TR_VMThread_returnValue(J9VMTHREAD)
    ST_GPR r2,JIT_GPR_SAVE_SLOT(2)
    RESTORE_ALL_REGS_AND_SWITCH_TO_JAVA_STACK($1)
})

define({CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE},{
    SAVE_ALL_REGS($1)
    ST_GPR r14,J9TR_VMThread_jitReturnAddress(J9VMTHREAD)
    ST_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    CALL_C_WITH_VMTHREAD($1, old_slow_$1)
    L_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    ST_GPR J9SP,JIT_GPR_SAVE_SLOT(J9SP)
    RESTORE_ALL_REGS_AND_SWITCH_TO_JAVA_STACK($1)
})

define({SLOW_PATH_ONLY_HELPER},{
BEGIN_HELPER($1)
    CALL_SLOW_PATH_ONLY_HELPER($1)
    br r14
END_CURRENT
})

define({SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE},{
BEGIN_HELPER($1)
    CALL_SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE($1)
    br r14
END_CURRENT
})

define({SLOW_PATH_ONLY_HELPER_NO_EXCEPTION},{
BEGIN_HELPER($1)
    CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION($1)
    br r14
END_CURRENT
})

define({SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE},{
BEGIN_HELPER($1)
    CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE($1)
    br r14
END_CURRENT
})

define({TRAP_HANDLER},{
BEGIN_FUNC($1)
ifdef({J9ZOS390},{
    L_GPR r7,J9TR_VMThread_tempSlot(J9VMTHREAD)
})
    STM_GPR r0,LAST_REG,JIT_GPR_SAVE_SLOT(0)
    SWAP_SSP_VALUE
    SAVE_HIWORD_REGS
    LOAD_CAA
    SAVE_ALL_REGS($1)
    ST_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    CALL_C_WITH_VMTHREAD($1, old_slow_$1)
    br CRINT
END_CURRENT
})

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({FAST_PATH_ONLY_HELPER},{
BEGIN_HELPER($1)
    SAVE_C_VOLATILE_REGS($1)
    ST_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    CALL_C_WITH_VMTHREAD($1, old_fast_$1)
    L_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    RESTORE_C_VOLATILE_REGS($1)
    L_GPR r2,J9TR_VMThread_returnValue(J9VMTHREAD)
    ST_GPR r2,JIT_GPR_SAVE_SLOT(2)
END_HELPER
})

define({FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE},{
BEGIN_HELPER($1)
    SAVE_C_VOLATILE_REGS($1)
    ST_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    CALL_C_WITH_VMTHREAD($1, old_fast_$1)
    L_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    RESTORE_C_VOLATILE_REGS($1)
END_HELPER
})

define({OLD_DUAL_MODE_HELPER},{
BEGIN_HELPER($1)
    SAVE_C_VOLATILE_REGS($1)
    ST_GPR r14,J9TR_VMThread_jitReturnAddress(J9VMTHREAD)
    ST_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    CALL_C_WITH_VMTHREAD($1, old_fast_$1)
    LHI_GPR r0,0
    CLR_GPR CRINT,r0
    je LABEL_NAME(CONCAT(L_DONE_,SYM_COUNT))
    SAVE_C_NONVOLATILE_REGS
    LR_GPR CRA,CRINT
    LR_GPR CARG1,J9VMTHREAD
    CALL_INDIRECT(CRA)
    LHI_GPR r0,0
    CLR_GPR CRINT,r0
    je LABEL_NAME(CONCAT(L_SLOW_,SYM_COUNT))
    br CRINT
PLACE_LABEL(CONCAT(L_SLOW_,SYM_COUNT))
    RESTORE_C_NONVOLATILE_REGS
PLACE_LABEL(CONCAT(L_DONE_,SYM_COUNT))
    L_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    RESTORE_C_VOLATILE_REGS($1)
    L_GPR r2,J9TR_VMThread_returnValue(J9VMTHREAD)
    ST_GPR r2,JIT_GPR_SAVE_SLOT(2)
END_HELPER
})

define({OLD_DUAL_MODE_HELPER_NO_RETURN_VALUE},{
BEGIN_HELPER($1)
    SAVE_C_VOLATILE_REGS($1)
    ST_GPR r14,J9TR_VMThread_jitReturnAddress(J9VMTHREAD)
    ST_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    CALL_C_WITH_VMTHREAD($1, old_fast_$1)
    LHI_GPR r0,0
    CLR_GPR CRINT,r0
    je LABEL_NAME(CONCAT(L_DONE_,SYM_COUNT))
    SAVE_C_NONVOLATILE_REGS
    LR_GPR CRA,CRINT
    LR_GPR CARG1,J9VMTHREAD
    CALL_INDIRECT(CRA)
    LHI_GPR r0,0
    CLR_GPR CRINT,r0
    je LABEL_NAME(CONCAT(L_SLOW_,SYM_COUNT))
    br CRINT
PLACE_LABEL(CONCAT(L_SLOW_,SYM_COUNT))
    RESTORE_C_NONVOLATILE_REGS
PLACE_LABEL(CONCAT(L_DONE_,SYM_COUNT))
    L_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    RESTORE_C_VOLATILE_REGS($1)
END_HELPER
})

define({NEW_DUAL_MODE_HELPER},{
BEGIN_FUNC($1)
    RELOAD_SSP
    LOAD_CAA
    ST_GPR r14,JIT_GPR_SAVE_SLOT(14)
    ST_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    CALL_C($1, fast_$1)
    LHI_GPR r0,0
    CLR_GPR CRINT,r0
    je LABEL_NAME(CONCAT(L_DONE_,SYM_COUNT))
    L_GPR r14,JIT_GPR_SAVE_SLOT(14)
    ST_GPR r14,J9TR_VMThread_jitReturnAddress(J9VMTHREAD)
    SAVE_C_NONVOLATILE_GPRS
    SAVE_C_NONVOLATILE_REGS
    LR_GPR CRA,CRINT
    LR_GPR CARG1,J9VMTHREAD
    CALL_INDIRECT(CRA)
    LHI_GPR r0,0
    CLR_GPR CRINT,r0
    je LABEL_NAME(CONCAT(L_SLOW_,SYM_COUNT))
    br CRINT
PLACE_LABEL(CONCAT(L_SLOW_,SYM_COUNT))
    RESTORE_C_NONVOLATILE_REGS
    RESTORE_C_NONVOLATILE_GPRS
PLACE_LABEL(CONCAT(L_DONE_,SYM_COUNT))
    STORE_SSP
    L_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    L_GPR r14,JIT_GPR_SAVE_SLOT(14)
    L_GPR r2,J9TR_VMThread_returnValue(J9VMTHREAD)
    br r14
END_CURRENT
})

define({NEW_DUAL_MODE_HELPER_NO_RETURN_VALUE},{
BEGIN_FUNC($1)
    RELOAD_SSP
    LOAD_CAA
    ST_GPR r14,JIT_GPR_SAVE_SLOT(14)
    ST_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    CALL_C($1, fast_$1)
    LHI_GPR r0,0
    CLR_GPR CRINT,r0
    je LABEL_NAME(CONCAT(L_DONE_,SYM_COUNT))
    L_GPR r14,JIT_GPR_SAVE_SLOT(14)
    ST_GPR r14,J9TR_VMThread_jitReturnAddress(J9VMTHREAD)
    SAVE_C_NONVOLATILE_GPRS
    SAVE_C_NONVOLATILE_REGS
    LR_GPR CRA,CRINT
    LR_GPR CARG1,J9VMTHREAD
    CALL_INDIRECT(CRA)
    LHI_GPR r0,0
    CLR_GPR CRINT,r0
    je LABEL_NAME(CONCAT(L_SLOW_,SYM_COUNT))
    br CRINT
PLACE_LABEL(CONCAT(L_SLOW_,SYM_COUNT))
    RESTORE_C_NONVOLATILE_REGS
    RESTORE_C_NONVOLATILE_GPRS
PLACE_LABEL(CONCAT(L_DONE_,SYM_COUNT))
    STORE_SSP
    L_GPR J9SP,J9TR_VMThread_sp(J9VMTHREAD)
    L_GPR r14,JIT_GPR_SAVE_SLOT(14)
    br r14
END_CURRENT
})

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},{
BEGIN_FUNC($1)
})

define({END_RETURN_POINT},{
    BRANCH_VIA_VMTHREAD(J9TR_VMThread_floatTemp1)
END_CURRENT
})

define({CINTERP},{
    LHI_GPR r8,$1
    LHI_GPR r9,$2
    J LABEL_NAME(L_CINTERP)
})

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)

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)

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_DUAL_MODE_HELPER(jitLookupInterfaceMethod,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(jitResolveInterfaceMethod,2)
PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveSpecialMethod,3)
PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveStaticMethod,3)
PICBUILDER_SLOW_PATH_ONLY_HELPER(jitResolveVirtualMethod,2)
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)
SLOW_PATH_ONLY_HELPER(jitRetranslateMethod,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(jitInduceOSRAtCurrentPC,0)
SLOW_PATH_ONLY_HELPER(jitInduceOSRAtCurrentPCAndRecompile,0)
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(jitFindFieldSignatureClass)
UNUSED(j2iInvokeWithArguments)

dnl Switch from the C stack to the java stack and jump via tempSlot

BEGIN_FUNC(jitRunOnJavaStack)
    SWITCH_TO_JAVA_STACK
    BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot)
END_CURRENT

dnl CARG2 is expected to contain reference field address
BEGIN_HELPER(jitSoftwareReadBarrier)
    SAVE_ALL_REGS(jitSoftwareReadBarrier)

    LR_GPR CARG1,J9VMTHREAD
    L_GPR CRA,J9TR_VMThread_javaVM(J9VMTHREAD)
    L_GPR CRA,J9TR_JavaVM_memoryManagerFunctions(CRA)
    L_GPR CRA,J9TR_J9MemoryManagerFunctions_J9ReadBarrier(CRA)
    CALL_INDIRECT(CRA)

    RESTORE_ALL_REGS_AND_SWITCH_TO_JAVA_STACK(jitSoftwareReadBarrier)
    br r14
END_CURRENT

dnl When the offload helpers are called,
dnl the java SP is already stored in the J9VMThread.

BEGIN_HELPER(jitPreJNICallOffloadCheck)
ifdef({ASM_J9VM_PORT_ZOS_CEEHDLRSUPPORT},{
    std fpr8,JIT_FPR_SAVE_OFFSET(8)(CSP)
    std fpr9,JIT_FPR_SAVE_OFFSET(9)(CSP)
    std fpr10,JIT_FPR_SAVE_OFFSET(10)(CSP)
    std fpr11,JIT_FPR_SAVE_OFFSET(11)(CSP)
    std fpr12,JIT_FPR_SAVE_OFFSET(12)(CSP)
    std fpr13,JIT_FPR_SAVE_OFFSET(13)(CSP)
    std fpr14,JIT_FPR_SAVE_OFFSET(14)(CSP)
    std fpr15,JIT_FPR_SAVE_OFFSET(15)(CSP)
    stfpc CEEHDLR_FPC_SAVE_OFFSET(CSP)
})
    SAVE_ALL_REGS(jitPreJNICallOffloadCheck)
    LR_GPR CARG1,J9VMTHREAD
    LOAD_LABEL_CONSTANT($1, fast_jitPreJNICallOffloadCheck, CARG2)
    CALL_INDIRECT(CARG2)
    RESTORE_ALL_REGS_AND_SWITCH_TO_JAVA_STACK(jitPreJNICallOffloadCheck)
    br r14
END_CURRENT

BEGIN_HELPER(jitPostJNICallOffloadCheck)
    SAVE_ALL_REGS(jitPostJNICallOffloadCheck)
    LR_GPR CARG1,J9VMTHREAD
    LOAD_LABEL_CONSTANT($1, fast_jitPostJNICallOffloadCheck, CARG2)
    CALL_INDIRECT(CARG2)
    RESTORE_ALL_REGS_AND_SWITCH_TO_JAVA_STACK(jitPostJNICallOffloadCheck)
    br r14
END_CURRENT

dnl When the VM access helpers are called,
dnl the java SP is already stored in the J9VMThread.

BEGIN_HELPER(jitAcquireVMAccess)
    SAVE_ALL_REGS(jitAcquireVMAccess)
    LR_GPR CARG1,J9VMTHREAD
    LOAD_LABEL_CONSTANT(jitAcquireVMAccess, fast_jitAcquireVMAccess, CARG2)
    CALL_INDIRECT(CARG2)
    RESTORE_ALL_REGS_AND_SWITCH_TO_JAVA_STACK(jitAcquireVMAccess)
    br r14
END_CURRENT

BEGIN_HELPER(jitReleaseVMAccess)
    SAVE_ALL_REGS(jitReleaseVMAccess)
    LR_GPR CARG1,J9VMTHREAD
    LOAD_LABEL_CONSTANT(jitReleaseVMAccess, fast_jitReleaseVMAccess, CARG2)
    CALL_INDIRECT(CARG2)
    RESTORE_ALL_REGS_AND_SWITCH_TO_JAVA_STACK(jitReleaseVMAccess)
    br r14
END_CURRENT

BEGIN_FUNC(cInterpreterFromJIT)
PLACE_LABEL(L_CINTERP)
    ST_GPR r8,J9TR_VMThread_returnValue(J9VMTHREAD)
    ST_GPR r9,J9TR_VMThread_returnValue2(J9VMTHREAD)
    L_GPR r14,J9TR_VMThread_javaVM(J9VMTHREAD)
    L_GPR r14,J9TR_JavaVM_cInterpreter(r14)
    br r14
END_CURRENT

BEGIN_RETURN_POINT(jitExitInterpreter0)
END_RETURN_POINT

BEGIN_RETURN_POINT(jitExitInterpreter1)
    L32_GPR r2,J9TR_VMThread_returnValue(J9VMTHREAD)
END_RETURN_POINT

BEGIN_RETURN_POINT(jitExitInterpreterF)
    le fpr0,J9TR_VMThread_returnValue(J9VMTHREAD)
END_RETURN_POINT

BEGIN_RETURN_POINT(jitExitInterpreterD)
    ld fpr0,J9TR_VMThread_returnValue(J9VMTHREAD)
END_RETURN_POINT

dnl Non-standard - Called via an invoke
dnl Arguments are reversed on stack and doesn't
dnl 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_CURRENT

dnl Non-standard - Called via an invoke
dnl Arguments are reversed on stack and doesn't
dnl 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_CURRENT

BEGIN_FUNC(returnFromJITConstructor0)
    SWITCH_TO_C_STACK
    CINTERP(J9TR_bcloop_return_from_jit_ctor, 0)
END_CURRENT

BEGIN_FUNC(returnFromJIT0)
    SWITCH_TO_C_STACK
    CINTERP(J9TR_bcloop_return_from_jit, 0)
END_CURRENT

BEGIN_FUNC(returnFromJIT1)
    SWITCH_TO_C_STACK
    st r2,J9TR_VMThread_floatTemp1(J9VMTHREAD)
    CINTERP(J9TR_bcloop_return_from_jit, 1)
END_CURRENT

BEGIN_FUNC(returnFromJITF)
    SWITCH_TO_C_STACK
    ste fpr0,J9TR_VMThread_floatTemp1(J9VMTHREAD)
    CINTERP(J9TR_bcloop_return_from_jit, 1)
END_CURRENT

BEGIN_FUNC(returnFromJITD)
    SWITCH_TO_C_STACK
    std fpr0,J9TR_VMThread_floatTemp1(J9VMTHREAD)
    CINTERP(J9TR_bcloop_return_from_jit, 2)
END_CURRENT

dnl j2iInvokeExact
dnl All arguments (including the MethodHandle) are on stack
dnl Return address is in r14
dnl JIT preserved registers are live
dnl r1 contains the method to run

BEGIN_FUNC(j2iInvokeExact)
PLACE_LABEL(L_J2IINVOKEEXACT)
    SWITCH_TO_C_STACK_AND_SAVE_PRESERVED_REGS
    SAVE_LR
    LR_GPR r9,r1
    LHI_GPR r8,J9TR_bcloop_j2i_invoke_exact
    J LABEL_NAME(L_CINTERP)
END_CURRENT

dnl j2iTransition
dnl All arguments are on stack
dnl Return address is in r14
dnl JIT preserved registers are live
dnl r1 contains the method to run

BEGIN_FUNC(j2iTransition)
PLACE_LABEL(L_J2ITRANSITION)
    SWITCH_TO_C_STACK_AND_SAVE_PRESERVED_REGS
    SAVE_LR
    LR_GPR r9,r1
    LHI_GPR r8,J9TR_bcloop_j2i_transition
    J LABEL_NAME(L_CINTERP)
END_CURRENT

dnl j2iVirtual
dnl All arguments are on stack
dnl Return address is in r14
dnl JIT preserved registers are live
dnl r1 contains the receiver
dnl r0 contains the vTable index

BEGIN_FUNC(j2iVirtual)
PLACE_LABEL(L_J2IVIRTUAL)
    SWITCH_TO_C_STACK_AND_SAVE_PRESERVED_REGS
    SAVE_LR
    ST_GPR r0,J9TR_VMThread_tempSlot(J9VMTHREAD)
    LR_GPR r9,r1
    LHI_GPR r8,J9TR_bcloop_j2i_virtual
    J LABEL_NAME(L_CINTERP)
END_CURRENT

dnl icallVMprJavaSendPatchupVirtual
dnl Arguments are in registers/stack per JIT linkage
dnl Return address is in r14
dnl JIT preserved registers are live
dnl r1 contains the receiver
dnl r0 contains the vTable index

BEGIN_HELPER(icallVMprJavaSendPatchupVirtual)
    ST_GPR r1,J9TR_VMThread_returnValue2(J9VMTHREAD)
    ST_GPR r0,J9TR_VMThread_tempSlot(J9VMTHREAD)
    CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE(icallVMprJavaSendPatchupVirtual)
    BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendNativeStatic)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStatic0)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStatic1)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStaticJ)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStaticF)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStaticD)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStaticL)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStaticSync0)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStaticSync1)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStaticSyncJ)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStaticSyncF)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStaticSyncD)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendStaticSyncL)
    J LABEL_NAME(L_J2ITRANSITION)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendNativeVirtual)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtual0)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtual1)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtualJ)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtualF)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtualD)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtualL)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtualSync0)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtualSync1)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtualSyncJ)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtualSyncF)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtualSyncD)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendVirtualSyncL)
    J LABEL_NAME(L_J2IVIRTUAL)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendInvokeExact0)
    J LABEL_NAME(L_J2IINVOKEEXACT)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendInvokeExact1)
    J LABEL_NAME(L_J2IINVOKEEXACT)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendInvokeExactD)
    J LABEL_NAME(L_J2IINVOKEEXACT)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendInvokeExactF)
    J LABEL_NAME(L_J2IINVOKEEXACT)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendInvokeExactJ)
    J LABEL_NAME(L_J2IINVOKEEXACT)
END_CURRENT

BEGIN_FUNC(icallVMprJavaSendInvokeExactL)
    J LABEL_NAME(L_J2IINVOKEEXACT)
END_CURRENT

define({JIT_CALL_DECOMPILER},{
    CALL_C_WITH_VMTHREAD($1, $2)
    BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot)
})

define({BEGIN_DECOMPILE_ON_RETURN},{
BEGIN_FUNC($1)
    SWITCH_TO_C_STACK_AND_SAVE_PRESERVED_REGS
    LHI_GPR r0,$2
    ST_GPR r0,J9TR_VMThread_tempSlot(J9VMTHREAD)
})
define({END_DECOMPILE_ON_RETURN},{
    JIT_CALL_DECOMPILER($1, c_jitDecompileOnReturn)
END_CURRENT
})

BEGIN_DECOMPILE_ON_RETURN(jitDecompileOnReturn0, 0)
END_DECOMPILE_ON_RETURN

BEGIN_DECOMPILE_ON_RETURN(jitDecompileOnReturn1, 1)
    st r2,J9TR_VMThread_returnValue(J9VMTHREAD)
END_DECOMPILE_ON_RETURN

BEGIN_DECOMPILE_ON_RETURN(jitDecompileOnReturnF, 1)
    ste fpr0,J9TR_VMThread_returnValue(J9VMTHREAD)
END_DECOMPILE_ON_RETURN

BEGIN_DECOMPILE_ON_RETURN(jitDecompileOnReturnD, 2)
    std fpr0,J9TR_VMThread_returnValue(J9VMTHREAD)
END_DECOMPILE_ON_RETURN

BEGIN_FUNC(jitReportExceptionCatch)
    SWITCH_TO_C_STACK_AND_SAVE_PRESERVED_REGS
    CALL_C_WITH_VMTHREAD(jitReportExceptionCatch, c_jitReportExceptionCatch)
    RESTORE_PRESERVED_REGS_AND_SWITCH_TO_JAVA_STACK
    BRANCH_VIA_VMTHREAD(J9TR_VMThread_tempSlot)
END_CURRENT

BEGIN_FUNC(jitDecompileAtExceptionCatch)
    SWITCH_TO_C_STACK_AND_SAVE_PRESERVED_REGS
    JIT_CALL_DECOMPILER(jitDecompileAtExceptionCatch, c_jitDecompileAtExceptionCatch)
END_CURRENT

BEGIN_FUNC(jitDecompileAtCurrentPC)
    SWITCH_TO_C_STACK
    JIT_CALL_DECOMPILER(jitDecompileAtCurrentPC, c_jitDecompileAtCurrentPC)
END_CURRENT

BEGIN_FUNC(jitDecompileBeforeReportMethodEnter)
    SWITCH_TO_C_STACK
    JIT_CALL_DECOMPILER(jitDecompileBeforeReportMethodEnter, c_jitDecompileBeforeReportMethodEnter)
END_CURRENT

BEGIN_FUNC(jitDecompileBeforeMethodMonitorEnter)
    SWITCH_TO_C_STACK
    JIT_CALL_DECOMPILER(jitDecompileBeforeMethodMonitorEnter, c_jitDecompileBeforeMethodMonitorEnter)
END_CURRENT

BEGIN_FUNC(jitDecompileAfterAllocation)
    SWITCH_TO_C_STACK
    JIT_CALL_DECOMPILER(jitDecompileAfterAllocation, c_jitDecompileAfterAllocation)
END_CURRENT

BEGIN_FUNC(jitDecompileAfterMonitorEnter)
    SWITCH_TO_C_STACK
    JIT_CALL_DECOMPILER(jitDecompileAfterMonitorEnter, c_jitDecompileAfterMonitorEnter)
END_CURRENT

BEGIN_FUNC(handlePopFramesFromJIT)
    CINTERP(J9TR_bcloop_handle_pop_frames, 0)
END_CURRENT

BEGIN_FUNC(throwCurrentExceptionFromJIT)
    CINTERP(J9TR_bcloop_throw_current_exception, 0)
END_CURRENT

BEGIN_FUNC(executeCurrentBytecodeFromJIT)
    CINTERP(J9TR_bcloop_execute_bytecode, 0)
END_CURRENT

BEGIN_FUNC(enterMethodMonitorFromJIT)
    L_GPR r9,J9TR_VMThread_floatTemp1(J9VMTHREAD)
    LHI_GPR r8,J9TR_bcloop_enter_method_monitor
    J LABEL_NAME(L_CINTERP)
END_CURRENT

BEGIN_FUNC(reportMethodEnterFromJIT)
    L_GPR r9,J9TR_VMThread_floatTemp1(J9VMTHREAD)
    LHI_GPR r8,J9TR_bcloop_report_method_enter
    J LABEL_NAME(L_CINTERP)
END_CURRENT

BEGIN_FUNC(jitFillOSRBufferReturn)
    SWITCH_TO_C_STACK
    CINTERP(J9TR_bcloop_exit_interpreter, 0)
END_CURRENT

ifdef({ASM_J9VM_ENV_DATA64},{

BEGIN_RETURN_POINT(jitExitInterpreterJ)
    lg r2,J9TR_VMThread_returnValue(J9VMTHREAD)
END_RETURN_POINT

BEGIN_FUNC(returnFromJITJ)
    SWITCH_TO_C_STACK
    stg r2,J9TR_VMThread_floatTemp1(J9VMTHREAD)
    CINTERP(J9TR_bcloop_return_from_jit, 2)
END_CURRENT

BEGIN_DECOMPILE_ON_RETURN(jitDecompileOnReturnJ, 2)
    stg r2,J9TR_VMThread_returnValue(J9VMTHREAD)
END_DECOMPILE_ON_RETURN

BEGIN_FUNC(returnFromJITL)
    SWITCH_TO_C_STACK
    stg r2,J9TR_VMThread_floatTemp1(J9VMTHREAD)
    CINTERP(J9TR_bcloop_return_from_jit, 1)
END_CURRENT

BEGIN_DECOMPILE_ON_RETURN(jitDecompileOnReturnL, 1)
    stg r2,J9TR_VMThread_returnValue(J9VMTHREAD)
END_DECOMPILE_ON_RETURN

},{

BEGIN_RETURN_POINT(jitExitInterpreterJ)
    l r2,J9TR_VMThread_returnValue(J9VMTHREAD)
    l r3,J9TR_VMThread_returnValue2(J9VMTHREAD)
END_RETURN_POINT

BEGIN_FUNC(returnFromJITJ)
    SWITCH_TO_C_STACK
    st r2,J9TR_VMThread_floatTemp1(J9VMTHREAD)
    st r3,J9TR_VMThread_floatTemp2(J9VMTHREAD)
    CINTERP(J9TR_bcloop_return_from_jit, 2)
END_CURRENT

BEGIN_DECOMPILE_ON_RETURN(jitDecompileOnReturnJ, 2)
    st r2,J9TR_VMThread_returnValue(J9VMTHREAD)
    st r3,J9TR_VMThread_returnValue2(J9VMTHREAD)
END_DECOMPILE_ON_RETURN

FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitVolatileReadLong)
FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE(jitVolatileWriteLong)

})

    FILE_END