diff options
Diffstat (limited to 'src/vm/arm64/asmhelpers.asm')
-rw-r--r-- | src/vm/arm64/asmhelpers.asm | 66 |
1 files changed, 64 insertions, 2 deletions
diff --git a/src/vm/arm64/asmhelpers.asm b/src/vm/arm64/asmhelpers.asm index c9700dbfc1..c1f8429489 100644 --- a/src/vm/arm64/asmhelpers.asm +++ b/src/vm/arm64/asmhelpers.asm @@ -1600,7 +1600,69 @@ DoWrite ; Branch to the write barrier (which is already correctly overwritten with ; single or multi-proc code based on the current CPU b JIT_WriteBarrier - LEAF_END - + LEAF_END + +#ifdef PROFILING_SUPPORTED + +; ------------------------------------------------------------------ +; void JIT_ProfilerEnterLeaveTailcallStub(UINT_PTR ProfilerHandle) + LEAF_ENTRY JIT_ProfilerEnterLeaveTailcallStub + ret lr + LEAF_END + + #define PROFILE_ENTER 1 + #define PROFILE_LEAVE 2 + #define PROFILE_TAILCALL 4 + #define SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA 256 + +; ------------------------------------------------------------------ + MACRO + GenerateProfileHelper $helper, $flags + + LCLS __HelperNakedFuncName +__HelperNakedFuncName SETS "$helper":CC:"Naked" + IMPORT $helper + + NESTED_ENTRY $__HelperNakedFuncName + ; On entry: + ; x10 = functionIDOrClientID + ; x11 = profiledSp + ; x12 = throwable + ; + ; On exit: + ; Values of x0-x8, q0-q7, fp are preserved. + ; Values of other volatile registers are not preserved. + + PROLOG_SAVE_REG_PAIR fp, lr, -SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA! ; Allocate space and save Fp, Pc. + SAVE_ARGUMENT_REGISTERS sp, 16 ; Save x8 and argument registers (x0-x7). + str xzr, [sp, #88] ; Clear functionId. + SAVE_FLOAT_ARGUMENT_REGISTERS sp, 96 ; Save floating-point/SIMD registers (q0-q7). + add x12, fp, SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA ; Compute probeSp - initial value of Sp on entry to the helper. + stp x12, x11, [sp, #224] ; Save probeSp, profiledSp. + str xzr, [sp, #240] ; Clear hiddenArg. + mov w12, $flags + stp w12, wzr, [sp, #248] ; Save flags and clear unused field. + + mov x0, x10 + mov x1, sp + bl $helper + + RESTORE_ARGUMENT_REGISTERS sp, 16 ; Restore x8 and argument registers. + RESTORE_FLOAT_ARGUMENT_REGISTERS sp, 96 ; Restore floating-point/SIMD registers. + + EPILOG_RESTORE_REG_PAIR fp, lr, SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA! + EPILOG_RETURN + + NESTED_END +0 + + MEND + + GenerateProfileHelper ProfileEnter, PROFILE_ENTER + GenerateProfileHelper ProfileLeave, PROFILE_LEAVE + GenerateProfileHelper ProfileTailcall, PROFILE_TAILCALL + +#endif + ; Must be at very end of file END |