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

	FILE_START

define({CALL_SLOW_PATH_ONLY_HELPER},{
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SWITCH_TO_C_STACK
	SAVE_ALL_REGS
	FASTCALL_C_WITH_VMTHREAD(old_slow_$1,1)
	test _rax,_rax
	je SHORT_JMP LABEL(L_done_$1)
	jmp _rax
LABEL(L_done_$1):
	RESTORE_ALL_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	mov _rax,uword ptr J9TR_VMThread_returnValue[_rbp]
})

define({CALL_SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE},{
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SWITCH_TO_C_STACK
	SAVE_ALL_REGS
	FASTCALL_C_WITH_VMTHREAD(old_slow_$1,1)
	test _rax,_rax
	je SHORT_JMP LABEL(L_done_$1)
	jmp _rax
LABEL(L_done_$1):
	RESTORE_ALL_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
})

define({CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE},{
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SWITCH_TO_C_STACK
	SAVE_ALL_REGS
	FASTCALL_C_WITH_VMTHREAD(old_slow_$1,1)
	RESTORE_ALL_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
})

define({CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION},{
	CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE($1)
	mov _rax,uword ptr J9TR_VMThread_returnValue[_rbp]
})

define({SLOW_PATH_ONLY_HELPER},{
	FASTCALL_EXTERN(old_slow_$1,1)
	BEGIN_HELPER($1)
	CALL_SLOW_PATH_ONLY_HELPER($1,$2)
	END_HELPER($1,$2)
})

define({SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE},{
	FASTCALL_EXTERN(old_slow_$1,1)
	BEGIN_HELPER($1)
	CALL_SLOW_PATH_ONLY_HELPER_NO_RETURN_VALUE($1,$2)
	END_HELPER($1,$2)
})

define({TRAP_HANDLER},{
	FASTCALL_EXTERN(old_slow_$1,1)
	BEGIN_HELPER($1)
	SWITCH_TO_C_STACK
	SAVE_ALL_REGS
	FASTCALL_C_WITH_VMTHREAD(old_slow_$1,1)
	jmp _rax
	END_HELPER($1,$2)
})

define({PICBUILDER_FAST_PATH_ONLY_HELPER},{FAST_PATH_ONLY_HELPER($1,$2)})

define({PICBUILDER_SLOW_PATH_ONLY_HELPER},{SLOW_PATH_ONLY_HELPER($1,$2)})

define({EXCEPTION_THROW_HELPER},{SLOW_PATH_ONLY_HELPER($1,$2)})

define({SLOW_PATH_ONLY_HELPER_NO_EXCEPTION},{
	FASTCALL_EXTERN(old_slow_$1,1)
	BEGIN_HELPER($1)
	CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION($1,$2)
	END_HELPER($1,$2)
})

define({SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE},{
	FASTCALL_EXTERN(old_slow_$1,1)
	BEGIN_HELPER($1)
	CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE($1,$2)
	END_HELPER($1,$2)
})

define({FAST_PATH_ONLY_HELPER},{
	FASTCALL_EXTERN(old_fast_$1,1)
	BEGIN_HELPER($1)
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SWITCH_TO_C_STACK
	SAVE_C_VOLATILE_REGS
	FASTCALL_C_WITH_VMTHREAD(old_fast_$1,1)
	RESTORE_C_VOLATILE_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	mov _rax,uword ptr J9TR_VMThread_returnValue[_rbp]
	END_HELPER($1,$2)
})

define({FAST_PATH_ONLY_HELPER_NO_RETURN_VALUE},{
	FASTCALL_EXTERN(old_fast_$1,1)
	BEGIN_HELPER($1)
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SWITCH_TO_C_STACK
	SAVE_C_VOLATILE_REGS
	FASTCALL_C_WITH_VMTHREAD(old_fast_$1,1)
	RESTORE_C_VOLATILE_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	END_HELPER($1,$2)
})

define({OLD_DUAL_MODE_HELPER},{
	FASTCALL_EXTERN(old_fast_$1,1)
	BEGIN_HELPER($1)
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SWITCH_TO_C_STACK
	SAVE_C_VOLATILE_REGS
	FASTCALL_C_WITH_VMTHREAD(old_fast_$1,1)
	test _rax,_rax
	je LABEL(L_done_$1)
	SAVE_C_NONVOLATILE_REGS
	FASTCALL_INDIRECT_WITH_VMTHREAD(_rax)
	test _rax,_rax
	je SHORT_JMP LABEL(L_slow_$1)
	jmp _rax
LABEL(L_slow_$1):
	RESTORE_C_NONVOLATILE_REGS
LABEL(L_done_$1):
	RESTORE_C_VOLATILE_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	mov _rax,uword ptr J9TR_VMThread_returnValue[_rbp]
	END_HELPER($1,$2)
})

define({OLD_DUAL_MODE_HELPER_NO_RETURN_VALUE},{
	FASTCALL_EXTERN(old_fast_$1,1)
	BEGIN_HELPER($1)
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SWITCH_TO_C_STACK
	SAVE_C_VOLATILE_REGS
	FASTCALL_C_WITH_VMTHREAD(old_fast_$1,1)
	test _rax,_rax
	je LABEL(L_done_$1)
	SAVE_C_NONVOLATILE_REGS
	FASTCALL_INDIRECT_WITH_VMTHREAD(_rax)
	test _rax,_rax
	je SHORT_JMP LABEL(L_slow_$1)
	jmp _rax
LABEL(L_slow_$1):
	RESTORE_C_NONVOLATILE_REGS
LABEL(L_done_$1):
	RESTORE_C_VOLATILE_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	END_HELPER($1,$2)
})

define({NEW_DUAL_MODE_HELPER},{
	FASTCALL_EXTERN(fast_$1,$2+1)
	BEGIN_HELPER($1)
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	call FASTCALL_SYMBOL(fast_$1,$2+1)
	test _rax,_rax
	jne SHORT_JMP LABEL(L_slow_$1)
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	mov _rax,uword ptr J9TR_VMThread_returnValue[_rbp]
	ret
LABEL(L_slow_$1):
	SWITCH_TO_C_STACK
	SAVE_C_NONVOLATILE_REGS
	FASTCALL_INDIRECT_WITH_VMTHREAD(_rax)
	test _rax,_rax
	jne SHORT_JMP LABEL(L_exception_$1)
	RESTORE_C_NONVOLATILE_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	mov _rax,uword ptr J9TR_VMThread_returnValue[_rbp]
	ret
LABEL(L_exception_$1):
	jmp _rax
	END_PROC($1)
})

define({NEW_DUAL_MODE_HELPER_NO_RETURN_VALUE},{
	FASTCALL_EXTERN(fast_$1,$2+1)
	BEGIN_HELPER($1)
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	call FASTCALL_SYMBOL(fast_$1,$2+1)
	test _rax,_rax
	jne SHORT_JMP LABEL(L_slow_$1)
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	ret
LABEL(L_slow_$1):
	SWITCH_TO_C_STACK
	SAVE_C_NONVOLATILE_REGS
	FASTCALL_INDIRECT_WITH_VMTHREAD(_rax)
	test _rax,_rax
	jne SHORT_JMP LABEL(L_exception_$1)
	RESTORE_C_NONVOLATILE_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	ret
LABEL(L_exception_$1):
	jmp _rax
	END_PROC($1)
})

ifdef({ASM_J9VM_ENV_DATA64},{

dnl All arguments are register-based.

define({NEW_DUAL_MODE_ALLOCATION_HELPER},{
	FASTCALL_EXTERN(fast_$1,$2+1)
	BEGIN_HELPER($1)
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SWITCH_TO_C_STACK
	call FASTCALL_SYMBOL(fast_$1,$2+1)
	test _rax,_rax
	jne SHORT_JMP LABEL(L_slow_$1)
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	mov _rax,uword ptr J9TR_VMThread_returnValue[_rbp]
	ret
LABEL(L_slow_$1):
	SAVE_C_NONVOLATILE_REGS
	FASTCALL_INDIRECT_WITH_VMTHREAD(_rax)
	test _rax,_rax
	jne SHORT_JMP LABEL(L_exception_$1)
	RESTORE_C_NONVOLATILE_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	mov _rax,uword ptr J9TR_VMThread_returnValue[_rbp]
	ret
LABEL(L_exception_$1):
	jmp _rax
	END_PROC($1)
})

},{	dnl ASM_J9VM_ENV_DATA64

dnl Arguments are mixed register/stack (fastcall).
dnl First two args can stay in their registers.
dnl If there is a third arg, pop it from the java
dnl stack and push it to the C stack before the call
dnl (the call will remove it from the C stack).
dnl
dnl No allocation helper has more than 2 args
dnl after the current thread arg.

define({NEW_DUAL_MODE_ALLOCATION_HELPER},{
	FASTCALL_EXTERN(fast_$1,$2+1)
	BEGIN_HELPER($1)
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	ifelse($2,0,,$2,1,,$2,2,{pop eax},{ERROR more than 2 args})
	SWITCH_TO_C_STACK
	ifelse($2,0,,$2,1,,$2,2,{push eax})
	call FASTCALL_SYMBOL(fast_$1,$2+1)
	test _rax,_rax
	jne SHORT_JMP LABEL(L_slow_$1)
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	mov _rax,uword ptr J9TR_VMThread_returnValue[_rbp]
	ret
LABEL(L_slow_$1):
	SAVE_C_NONVOLATILE_REGS
	FASTCALL_INDIRECT_WITH_VMTHREAD(_rax)
	test _rax,_rax
	jne SHORT_JMP LABEL(L_exception_$1)
	RESTORE_C_NONVOLATILE_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	mov _rax,uword ptr J9TR_VMThread_returnValue[_rbp]
	ret
LABEL(L_exception_$1):
	jmp _rax
	END_PROC($1)
})

})	dnl ASM_J9VM_ENV_DATA64


define({PICBUILDER_DUAL_MODE_HELPER},{OLD_DUAL_MODE_HELPER($1,$2)})

ifdef({ASM_J9VM_JIT_NEW_DUAL_HELPERS},{

define({DUAL_MODE_ALLOCATION_HELPER},{NEW_DUAL_MODE_ALLOCATION_HELPER($1,$2)})
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_ALLOCATION_HELPER},{OLD_DUAL_MODE_HELPER($1,$2)})
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},{
	push uword ptr J9TR_VMThread_floatTemp1[_rbp]
	ret
	END_PROC($1)
})

define({UNUSED},{
START_PROC($1)
	mov _rax,-1
	mov uword ptr [_rax],_rax
END_PROC($1)
})

define({CINTERP},{
	mov _rax,uword ptr J9TR_VMThread_javaVM[_rbp]
	jmp uword ptr J9TR_JavaVM_cInterpreter[_rax]
})

dnl Helpers that are at a method invocation point.
dnl
dnl See definition of SAVE_C_VOLATILE_REGS in xhelpers.m4
dnl for details.

define({METHOD_INVOCATION})

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 xhelpers.m4
dnl for details.

undefine({METHOD_INVOCATION})

dnl Runtime helpers

DUAL_MODE_ALLOCATION_HELPER(jitNewValue,1)
DUAL_MODE_ALLOCATION_HELPER(jitNewValueNoZeroInit,1)
DUAL_MODE_ALLOCATION_HELPER(jitNewObject,1)
DUAL_MODE_ALLOCATION_HELPER(jitNewObjectNoZeroInit,1)
DUAL_MODE_ALLOCATION_HELPER(jitANewArray,2)
DUAL_MODE_HELPER(jitANewArrayNoZeroInit,2)
DUAL_MODE_ALLOCATION_HELPER(jitNewArray,2)
DUAL_MODE_ALLOCATION_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

define({JIT_WRITE_BARRIER_WRAPPER},{
	FASTCALL_EXTERN(fast_$1,$2+1)
	BEGIN_HELPER($1)
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SWITCH_TO_C_STACK
	SAVE_C_VOLATILE_REGS
	mov PARM_REG(1),_rbp
	mov PARM_REG(2),uword ptr J9TR_VMThread_floatTemp1[_rbp]
	ifelse($2, 2, {
		ifdef({ASM_J9VM_ENV_DATA64},{
			mov PARM_REG(3),uword ptr J9TR_VMThread_floatTemp2[_rbp]
		}, {
			push uword ptr J9TR_VMThread_floatTemp2[_rbp]
		})
	})
	call FASTCALL_SYMBOL(fast_$1,$2+1)
	RESTORE_C_VOLATILE_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	dnl parms are passed via fields of VM thread instead of register or stack
	dnl therefore, the helper's parm count is 0
	END_HELPER($1,0)
})

JIT_WRITE_BARRIER_WRAPPER(jitWriteBarrierBatchStore,1)
UNUSED(jitWriteBarrierBatchStoreWithRange,3)
UNUSED(jitWriteBarrierJ9ClassBatchStore,1)
UNUSED(jitWriteBarrierJ9ClassStore,2)
JIT_WRITE_BARRIER_WRAPPER(jitWriteBarrierStore,2)
JIT_WRITE_BARRIER_WRAPPER(jitWriteBarrierStoreGenerational,2)
JIT_WRITE_BARRIER_WRAPPER(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)

START_PROC(jitThrowClassCastException)
	FASTCALL_EXTERN(impl_jitClassCastException,1)
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	pop uword ptr J9TR_VMThread_floatTemp1[_rbp]
	pop uword ptr J9TR_VMThread_floatTemp2[_rbp]
	SWITCH_TO_C_STACK
	SAVE_ALL_REGS
	FASTCALL_C_WITH_VMTHREAD(impl_jitClassCastException)
	jmp _rax
END_PROC(jitThrowClassCastException)

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

START_PROC(jitRunOnJavaStack)
	SWITCH_TO_JAVA_STACK
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitRunOnJavaStack)

	FASTCALL_EXTERN(fast_jitAcquireVMAccess,1)

dnl Non-standard - _RSP points to C stack when this is called
BEGIN_HELPER(jitAcquireVMAccess)
dnl Ensure _rsp is pointing to the C interpreter stack frame
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SAVE_ALL_REGS
	FASTCALL_C_WITH_VMTHREAD(fast_jitAcquireVMAccess)
	RESTORE_ALL_REGS
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
END_HELPER(jitAcquireVMAccess,0)

ifdef({OMIT},{
dnl currently declared by JIT, but could move here

	FASTCALL_EXTERN(fast_jitReleaseVMAccess)

dnl Non-standard - _RSP points to C stack when this is called
dnl Extra JNI arguments may be pushed on the stack, so the code
dnl below is incorrect.
BEGIN_HELPER(jitReleaseVMAccess)
dnl Ensure _rsp is pointing to the C interpreter stack frame
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SAVE_ALL_REGS
	FASTCALL_C_WITH_VMTHREAD(fast_jitReleaseVMAccess)
	RESTORE_ALL_REGS
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
END_HELPER(jitReleaseVMAccess,0)
})

	FASTCALL_EXTERN(old_slow_jitInterpretNewInstanceMethod,1)
	FASTCALL_EXTERN(old_slow_jitTranslateNewInstanceMethod,1)

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)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_HELPER(jitInterpretNewInstanceMethod,0)

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)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_HELPER(jitTranslateNewInstanceMethod,0)

BEGIN_RETURN_POINT(jitExitInterpreter0)
END_RETURN_POINT(jitExitInterpreter0)

BEGIN_RETURN_POINT(jitExitInterpreter1)
	mov eax,dword ptr J9TR_VMThread_returnValue[_rbp]
END_RETURN_POINT(jitExitInterpreter1)

BEGIN_RETURN_POINT(jitExitInterpreterF)
	movss xmm0,dword ptr J9TR_VMThread_returnValue[_rbp]
END_RETURN_POINT(jitExitInterpreterF)

BEGIN_RETURN_POINT(jitExitInterpreterD)
	movq xmm0,qword ptr J9TR_VMThread_returnValue[_rbp]
END_RETURN_POINT(jitExitInterpreterD)

START_PROC(returnFromJITConstructor0)
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_return_from_jit_ctor
	SWITCH_TO_C_STACK
	CINTERP
END_PROC(returnFromJITConstructor0)

START_PROC(returnFromJIT0)
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_return_from_jit
	mov uword ptr J9TR_VMThread_returnValue2[_rbp],0
	SWITCH_TO_C_STACK
	CINTERP
END_PROC(returnFromJIT0)

START_PROC(returnFromJIT1)
	mov dword ptr J9TR_VMThread_floatTemp1[_rbp],eax
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_return_from_jit
	mov uword ptr J9TR_VMThread_returnValue2[_rbp],1
	SWITCH_TO_C_STACK
	CINTERP
END_PROC(returnFromJIT1)

START_PROC(returnFromJITF)
	movd dword ptr J9TR_VMThread_floatTemp1[_rbp],xmm0
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_return_from_jit
	mov uword ptr J9TR_VMThread_returnValue2[_rbp],1
	SWITCH_TO_C_STACK
	CINTERP
END_PROC(returnFromJITF)

START_PROC(returnFromJITD)
	movq qword ptr J9TR_VMThread_floatTemp1[_rbp],xmm0
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_return_from_jit
	mov uword ptr J9TR_VMThread_returnValue2[_rbp],2
	SWITCH_TO_C_STACK
	CINTERP
END_PROC(returnFromJITD)

dnl j2iInvokeExact
dnl All arguments (including the MethodHandle) are on stack, with the return address pushed on top.
dnl JIT preserved registers are live
dnl _RAX contains the MethodHandle

START_PROC(j2iInvokeExact)
	mov uword ptr J9TR_VMThread_returnValue2[_rbp],_rax
	SWITCH_TO_C_STACK
	SAVE_PRESERVED_REGS
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_j2i_invoke_exact
	CINTERP
END_PROC(j2iInvokeExact)

dnl j2iTransition
dnl All arguments are on stack, with the return address pushed on top.
dnl JIT preserved registers are live
dnl _RDI contains the method to run

START_PROC(j2iTransition)
	SWITCH_TO_C_STACK
	SAVE_PRESERVED_REGS
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_j2i_transition
	mov uword ptr J9TR_VMThread_returnValue2[_rbp],_rdi
	CINTERP
END_PROC(j2iTransition)

dnl j2iVirtual
dnl All arguments are on stack, with the return address pushed on top.
dnl JIT preserved registers are live
dnl _RAX contains the receiver
dnl On 32-bit, EDX contains the vTableIndex for interface sends
dnl On 64-bit, R8  contains the vTableIndex for interface sends

START_PROC(j2iVirtual)
	SWITCH_TO_C_STACK
	STORE_VIRTUAL_REGISTERS
	SAVE_PRESERVED_REGS
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_j2i_virtual
	CINTERP
END_PROC(j2iVirtual)

START_PROC(icallVMprJavaSendNativeStatic)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendNativeStatic)

START_PROC(icallVMprJavaSendStatic0)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStatic0)

START_PROC(icallVMprJavaSendStatic1)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStatic1)

START_PROC(icallVMprJavaSendStaticJ)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStaticJ)

START_PROC(icallVMprJavaSendStaticF)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStaticF)

START_PROC(icallVMprJavaSendStaticD)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStaticD)

START_PROC(icallVMprJavaSendStaticSync0)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStaticSync0)

START_PROC(icallVMprJavaSendStaticSync1)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStaticSync1)

START_PROC(icallVMprJavaSendStaticSyncJ)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStaticSyncJ)

START_PROC(icallVMprJavaSendStaticSyncF)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStaticSyncF)

START_PROC(icallVMprJavaSendStaticSyncD)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStaticSyncD)

START_PROC(icallVMprJavaSendNativeVirtual)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendNativeVirtual)

START_PROC(icallVMprJavaSendVirtual0)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtual0)

START_PROC(icallVMprJavaSendVirtual1)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtual1)

START_PROC(icallVMprJavaSendVirtualJ)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtualJ)

START_PROC(icallVMprJavaSendVirtualF)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtualF)

START_PROC(icallVMprJavaSendVirtualD)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtualD)

START_PROC(icallVMprJavaSendVirtualSync0)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtualSync0)

START_PROC(icallVMprJavaSendVirtualSync1)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtualSync1)

START_PROC(icallVMprJavaSendVirtualSyncJ)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtualSyncJ)

START_PROC(icallVMprJavaSendVirtualSyncF)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtualSyncF)

START_PROC(icallVMprJavaSendVirtualSyncD)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtualSyncD)

START_PROC(icallVMprJavaSendInvokeExact0)
	jmp GLOBAL_SYMBOL(j2iInvokeExact)
END_PROC(icallVMprJavaSendInvokeExact0)

START_PROC(icallVMprJavaSendInvokeExact1)
	jmp GLOBAL_SYMBOL(j2iInvokeExact)
END_PROC(icallVMprJavaSendInvokeExact1)

START_PROC(icallVMprJavaSendInvokeExactD)
	jmp GLOBAL_SYMBOL(j2iInvokeExact)
END_PROC(icallVMprJavaSendInvokeExactD)

START_PROC(icallVMprJavaSendInvokeExactF)
	jmp GLOBAL_SYMBOL(j2iInvokeExact)
END_PROC(icallVMprJavaSendInvokeExactF)

START_PROC(icallVMprJavaSendInvokeExactJ)
	jmp GLOBAL_SYMBOL(j2iInvokeExact)
END_PROC(icallVMprJavaSendInvokeExactJ)

START_PROC(icallVMprJavaSendInvokeExactL)
	jmp GLOBAL_SYMBOL(j2iInvokeExact)
END_PROC(icallVMprJavaSendInvokeExactL)

START_PROC(icallVMprJavaSendStaticL)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStaticL)

START_PROC(icallVMprJavaSendStaticSyncL)
	jmp GLOBAL_SYMBOL(j2iTransition)
END_PROC(icallVMprJavaSendStaticSyncL)

START_PROC(icallVMprJavaSendVirtualL)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtualL)

START_PROC(icallVMprJavaSendVirtualSyncL)
	jmp GLOBAL_SYMBOL(j2iVirtual)
END_PROC(icallVMprJavaSendVirtualSyncL)

	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)
	mov uword ptr J9TR_VMThread_tempSlot[_rbp],0
	SWITCH_TO_C_STACK
	SAVE_PRESERVED_REGS
	CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileOnReturn0)

START_PROC(jitDecompileOnReturn1)
	mov dword ptr J9TR_VMThread_returnValue[_rbp],eax
	mov uword ptr J9TR_VMThread_tempSlot[_rbp],1
	SWITCH_TO_C_STACK
	SAVE_PRESERVED_REGS
	CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileOnReturn1)

START_PROC(jitDecompileOnReturnF)
	movd dword ptr J9TR_VMThread_returnValue[_rbp],xmm0
	mov uword ptr J9TR_VMThread_tempSlot[_rbp],1
	SWITCH_TO_C_STACK
	SAVE_PRESERVED_REGS
	CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileOnReturnF)

START_PROC(jitDecompileOnReturnD)
	movq qword ptr J9TR_VMThread_returnValue[_rbp],xmm0
	mov uword ptr J9TR_VMThread_tempSlot[_rbp],2
	SWITCH_TO_C_STACK
	SAVE_PRESERVED_REGS
	CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileOnReturnD)

START_PROC(jitReportExceptionCatch)
	SWITCH_TO_C_STACK
	SAVE_PRESERVED_REGS
	CALL_C_WITH_VMTHREAD(c_jitReportExceptionCatch)
	RESTORE_PRESERVED_REGS
	SWITCH_TO_JAVA_STACK
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitReportExceptionCatch)

START_PROC(jitDecompileAtExceptionCatch)
	SWITCH_TO_C_STACK
	SAVE_PRESERVED_REGS
	CALL_C_WITH_VMTHREAD(c_jitDecompileAtExceptionCatch)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileAtExceptionCatch)

START_PROC(jitDecompileAtCurrentPC)
	SWITCH_TO_C_STACK
	CALL_C_WITH_VMTHREAD(c_jitDecompileAtCurrentPC)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileAtCurrentPC)

START_PROC(jitDecompileBeforeReportMethodEnter)
	SWITCH_TO_C_STACK
	CALL_C_WITH_VMTHREAD(c_jitDecompileBeforeReportMethodEnter)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileBeforeReportMethodEnter)

START_PROC(jitDecompileBeforeMethodMonitorEnter)
	SWITCH_TO_C_STACK
	CALL_C_WITH_VMTHREAD(c_jitDecompileBeforeMethodMonitorEnter)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileBeforeMethodMonitorEnter)

START_PROC(jitDecompileAfterAllocation)
	SWITCH_TO_C_STACK
	CALL_C_WITH_VMTHREAD(c_jitDecompileAfterAllocation)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileAfterAllocation)

START_PROC(jitDecompileAfterMonitorEnter)
	SWITCH_TO_C_STACK
	CALL_C_WITH_VMTHREAD(c_jitDecompileAfterMonitorEnter)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileAfterMonitorEnter)

START_PROC(executeCurrentBytecodeFromJIT)
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_execute_bytecode
	CINTERP
END_PROC(executeCurrentBytecodeFromJIT)

START_PROC(handlePopFramesFromJIT)
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_handle_pop_frames
	CINTERP
END_PROC(handlePopFramesFromJIT)

START_PROC(throwCurrentExceptionFromJIT)
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_throw_current_exception
	CINTERP
END_PROC(throwCurrentExceptionFromJIT)

START_PROC(enterMethodMonitorFromJIT)
	mov _rax,uword ptr J9TR_VMThread_floatTemp1[_rbp]
	mov uword ptr J9TR_VMThread_returnValue2[_rbp],_rax
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_enter_method_monitor
	CINTERP
END_PROC(enterMethodMonitorFromJIT)

START_PROC(reportMethodEnterFromJIT)
	mov _rax,uword ptr J9TR_VMThread_floatTemp1[_rbp]
	mov uword ptr J9TR_VMThread_returnValue2[_rbp],_rax
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_report_method_enter
	CINTERP
END_PROC(reportMethodEnterFromJIT)

START_PROC(jitFillOSRBufferReturn)
	SWITCH_TO_C_STACK
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_exit_interpreter
	CINTERP
END_PROC(jitFillOSRBufferReturn)

ifdef({ASM_J9VM_ENV_DATA64},{

BEGIN_RETURN_POINT(jitExitInterpreterJ)
	mov rax,qword ptr J9TR_VMThread_returnValue[_rbp]
END_RETURN_POINT(jitExitInterpreterJ)

START_PROC(returnFromJITJ)
	mov J9TR_VMThread_floatTemp1[_rbp],rax
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_return_from_jit
	mov uword ptr J9TR_VMThread_returnValue2[_rbp],2
	SWITCH_TO_C_STACK
	CINTERP
END_PROC(returnFromJITJ)

START_PROC(returnFromJITL)
	mov uword ptr J9TR_VMThread_floatTemp1[_rbp],rax
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_return_from_jit
	mov uword ptr J9TR_VMThread_returnValue2[_rbp],1
	SWITCH_TO_C_STACK
	CINTERP
END_PROC(returnFromJITL)

dnl icallVMprJavaSendPatchupVirtual
dnl see j2iVirtual for calling convention details

	DECLARE_EXTERN(old_slow_icallVMprJavaSendPatchupVirtual)

START_PROC(icallVMprJavaSendPatchupVirtual)
	STORE_VIRTUAL_REGISTERS
	CALL_SLOW_PATH_ONLY_HELPER_NO_EXCEPTION_NO_RETURN_VALUE(icallVMprJavaSendPatchupVirtual)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(icallVMprJavaSendPatchupVirtual)

START_PROC(jitDecompileOnReturnJ)
	mov qword ptr J9TR_VMThread_returnValue[_rbp],rax
	mov uword ptr J9TR_VMThread_tempSlot[_rbp],2
	SWITCH_TO_C_STACK
	SAVE_PRESERVED_REGS
	CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileOnReturnJ)

START_PROC(jitDecompileOnReturnL)
	mov uword ptr J9TR_VMThread_returnValue[_rbp],rax
	mov uword ptr J9TR_VMThread_tempSlot[_rbp],1
	SWITCH_TO_C_STACK
	SAVE_PRESERVED_REGS
	CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileOnReturnL)

},{	dnl ASM_J9VM_ENV_DATA64

BEGIN_RETURN_POINT(jitExitInterpreterJ)
	mov eax,dword ptr J9TR_VMThread_returnValue[_rbp]
	mov edx,dword ptr J9TR_VMThread_returnValue2[_rbp]
END_RETURN_POINT(jitExitInterpreterJ)

START_PROC(returnFromJITJ)
	mov uword ptr J9TR_VMThread_floatTemp1[_rbp],eax
	mov uword ptr J9TR_VMThread_floatTemp2[_rbp],edx
	mov uword ptr J9TR_VMThread_returnValue[_rbp],J9TR_bcloop_return_from_jit
	mov uword ptr J9TR_VMThread_returnValue2[_rbp],2
	SWITCH_TO_C_STACK
	CINTERP
END_PROC(returnFromJITJ)

START_PROC(jitDecompileOnReturnJ)
	mov dword ptr J9TR_VMThread_returnValue[_rbp],eax
	mov dword ptr J9TR_VMThread_returnValue2[_rbp],edx
	mov uword ptr J9TR_VMThread_tempSlot[_rbp],2
	SWITCH_TO_C_STACK
	SAVE_PRESERVED_REGS
	CALL_C_WITH_VMTHREAD(c_jitDecompileOnReturn)
	jmp uword ptr J9TR_VMThread_tempSlot[_rbp]
END_PROC(jitDecompileOnReturnJ)

})	dnl ASM_J9VM_ENV_DATA64

START_PROC(jitSoftwareReadBarrier)
ifdef({OMR_GC_CONCURRENT_SCAVENGER},{
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SWITCH_TO_C_STACK
	SAVE_C_VOLATILE_REGS
	dnl currentThread->javaVM->memoryManagerFunctions->J9ReadBarrier(currentThread,(fj9object_t*)currentThread->floatTemp1);
	mov _rax,uword ptr J9TR_VMThread_javaVM[_rbp]
	mov PARM_REG(2),uword ptr J9TR_VMThread_floatTemp1[_rbp]
	mov _rax,uword ptr J9TR_JavaVM_memoryManagerFunctions[_rax]
	mov PARM_REG(1),_rbp
	call uword ptr J9TR_J9MemoryManagerFunctions_J9ReadBarrier[_rax]
	RESTORE_C_VOLATILE_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	ret
},{ dnl OMR_GC_CONCURRENT_SCAVENGER
	dnl not supported
	int 3
})	dnl OMR_GC_CONCURRENT_SCAVENGER
END_PROC(jitSoftwareReadBarrier)

	FASTCALL_EXTERN(impl_jitReferenceArrayCopy,2)
START_PROC(jitReferenceArrayCopy)
	pop uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	SWITCH_TO_C_STACK
	SAVE_C_VOLATILE_REGS
	mov uword ptr J9TR_VMThread_floatTemp3[_rbp],_rsi
	mov uword ptr J9TR_VMThread_floatTemp4[_rbp],_rdi
	mov PARM_REG(2),_rcx
	mov PARM_REG(1),_rbp
	call FASTCALL_SYMBOL(impl_jitReferenceArrayCopy,2)
	dnl set ZF if succeed
	test _rax,_rax
	RESTORE_C_VOLATILE_REGS
	SWITCH_TO_JAVA_STACK
	push uword ptr J9TR_VMThread_jitReturnAddress[_rbp]
	ret
END_PROC(jitReferenceArrayCopy)

	FILE_END