Implement genProfilingEnterCallback genProfilingLeaveCallback on Arm64 (dotnet/corecl...
[platform/upstream/coreclr.git] / src / vm / arm64 / asmhelpers.S
index 46b6b19..91aaa5b 100644 (file)
@@ -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