summaryrefslogtreecommitdiff
path: root/src/vm/arm64/asmhelpers.S
diff options
context:
space:
mode:
authorMikhail Kurinnoi <m.kurinnoi@samsung.com>2020-07-23 11:37:35 +0300
committerAlexander Soldatov/AI Compiler Lab /SRR/Staff Engineer/Samsung Electronics <soldatov.a@samsung.com>2020-07-27 16:37:47 +0300
commitdbfc7071dd4aa23481e1932ed3b006101709880c (patch)
tree285f50f76a2bbe366825793d8601e545e36acdd5 /src/vm/arm64/asmhelpers.S
parent0ec7ff39ff14638b7d7d2ffe36b823c62f705ea2 (diff)
downloadcoreclr-dbfc7071dd4aa23481e1932ed3b006101709880c.tar.gz
coreclr-dbfc7071dd4aa23481e1932ed3b006101709880c.tar.bz2
coreclr-dbfc7071dd4aa23481e1932ed3b006101709880c.zip
Implement genProfilingEnterCallback genProfilingLeaveCallback on Arm64 (dotnet/coreclr#26460)submit/tizen/20200731.014213accepted/tizen/unified/20200731.145700
* Split genProfilingEnterCallback and genProfilingLeaveCallback into architecture specific versions * Remove redundant genStackLevel save/restore logic on Arm, Arm64, Amd64 * Implement JIT_ProfilerEnterLeaveTailcallStub in assembly * Define RBM_PROFILER_{ENTER,LEAVE,TAILCALL}_TRASH for TARGET_ARM64 * Define REG_PROFILER_{ENTER,LEAVE}_ARG_FUNC_ID and RBM_PROFILER_{ENTER,LEAVE}_ARG_CALLER_SP * Simplify r0Trashed logic in src/jit/codegenarm.cpp * Remove wrong comment in src/jit/codegenarm.cpp * On Arm genPrologPadForReJit does nothing so remove it in src/jit/codegenarm.cpp * Implement LinearScan::BuildNode for GT_PROF_HOOK and GT_RETURN in src/jit/lsraarm64.cpp * Shouldn't a call to CORINFO_HELP_PROF_FCN_TAILCALL be marked as a No-GC? * Implement genProfilingEnterCallback genProfilingLeaveCallback in src/jit/codegenarm64.cpp * Implement NYI profiler methods in src/vm/arm64/profiler.cpp * Implement ProfileEnterNaked ProfileLeaveNaked ProfileTailcallNaked in src/vm/arm64/asmhelpers.S * Implement profiler helpers on win-arm64 * Remove logic for !FINAL_FRAME_LAYOUT in codegenarm64.cpp * Remove unused macro in src\jit\target.h * genProfilingLeaveCallback ignores helper on arm in src\jit\codegenarm.cpp * Refactor genProfilingLeaveCallback in src\jit\codegenarm.cpp Commit migrated from https://github.com/dotnet/coreclr/commit/d88bc184d054fe8e4915964330ca65378d59ef27
Diffstat (limited to 'src/vm/arm64/asmhelpers.S')
-rw-r--r--src/vm/arm64/asmhelpers.S54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/vm/arm64/asmhelpers.S b/src/vm/arm64/asmhelpers.S
index 46b6b191e3..91aaa5b054 100644
--- a/src/vm/arm64/asmhelpers.S
+++ b/src/vm/arm64/asmhelpers.S
@@ -1380,3 +1380,57 @@ LEAF_ENTRY JIT_Stelem_DoWrite, _TEXT
// single or multi-proc code based on the current CPU
b C_FUNC(JIT_WriteBarrier)
LEAF_END JIT_Stelem_DoWrite, _TEXT
+
+#ifdef PROFILING_SUPPORTED
+
+// ------------------------------------------------------------------
+LEAF_ENTRY JIT_ProfilerEnterLeaveTailcallStub, _TEXT
+ ret lr
+LEAF_END JIT_ProfilerEnterLeaveTailcallStub, _TEXT
+
+// ------------------------------------------------------------------
+#define PROFILE_ENTER 1
+#define PROFILE_LEAVE 2
+#define PROFILE_TAILCALL 4
+#define SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA 256
+
+// ------------------------------------------------------------------
+.macro GenerateProfileHelper helper, flags
+NESTED_ENTRY \helper\()Naked, _TEXT, NoHandler
+ // 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_INDEXED 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_INDEXED fp, lr, SIZEOF__PROFILE_PLATFORM_SPECIFIC_DATA
+ EPILOG_RETURN
+
+NESTED_END \helper\()Naked, _TEXT
+.endmacro
+
+GenerateProfileHelper ProfileEnter, PROFILE_ENTER
+GenerateProfileHelper ProfileLeave, PROFILE_LEAVE
+GenerateProfileHelper ProfileTailcall, PROFILE_TAILCALL
+
+#endif