Fix arm32 naked functions registers push/pop logic.
authorMikhail Kurinnoi <m.kurinnoi@samsung.com>
Mon, 30 Nov 2020 09:12:59 +0000 (01:12 -0800)
committerAlexander Soldatov/Platform Lab /SRR/Staff Engineer/Samsung Electronics <soldatov.a@samsung.com>
Tue, 1 Dec 2020 15:57:17 +0000 (18:57 +0300)
src/arch/arm/asmhelpers.S

index 6dcc89288c600dcb25a4575bd1a50e4ad609c01d..2d792b979185c9cd7ca94d0c5896c78b9916daf9 100644 (file)
@@ -7,30 +7,42 @@
 // EXTERN_C void EnterNaked3(FunctionIDOrClientID functionIDOrClientID);
 //
 NESTED_ENTRY EnterNaked3, _TEXT, NoHandler
-    push    {r0-r7, lr}
-    .save   {r0-r7, lr}
+    // From src/jit/codegenarm.cpp:
+    //     On Arm arguments are prespilled on stack, which frees r0-r3.
+    PROLOG_PUSH "{r4-r11, lr}"
+    alloc_stack 4  // 8 byte align
     bl      C_FUNC(EnterStub)
-    pop     {r0-r7, pc}
+    free_stack 4
+    EPILOG_POP "{r4-r11, pc}"
 NESTED_END EnterNaked3, _TEXT
 
 //
 // EXTERN_C void LeaveNaked3(FunctionIDOrClientID functionIDOrClientID);
 //
 NESTED_ENTRY LeaveNaked3, _TEXT, NoHandler
-    push    {r0-r7, lr}
-    .save   {r0-r7, lr}
+    // From src/jit/codegenarm.cpp:
+    //     It is assumed that profiler Leave callback doesn't trash registers r1,REG_PROFILER_RET_SCRATCH (r2)...
+    //     In the following cases r0 doesn't contain a return value and hence need not be preserved before emitting Leave callback.
+    PROLOG_PUSH "{r1, r2, r4-r11, lr}"
+    alloc_stack 4  // 8 byte align
     bl      C_FUNC(LeaveStub)
-    pop     {r0-r7, pc}
+    free_stack 4
+    EPILOG_POP "{r1, r2, r4-r11, pc}"
 NESTED_END LeaveNaked3, _TEXT
 
 //
 // EXTERN_C void TailcallNaked3(FunctionIDOrClientID functionIDOrClientID);
 //
 NESTED_ENTRY TailcallNaked3, _TEXT, NoHandler
-    push    {r0-r7, lr}
-    .save   {r0-r7, lr}
+    // From src/jit/codegenarm.cpp:
+    //     It is assumed that profiler Leave callback doesn't trash registers r1,REG_PROFILER_RET_SCRATCH (r2)...
+    //     In the following cases r0 doesn't contain a return value and hence need not be preserved before emitting Leave callback.
+    // Note, Jit use same code for Tail callback helper and for Leave callback helper.
+    PROLOG_PUSH "{r1, r2, r4-r11, lr}"
+    alloc_stack 4  // 8 byte align
     bl      C_FUNC(TailcallStub)
-    pop     {r0-r7, pc}
+    free_stack 4
+    EPILOG_POP "{r1, r2, r4-r11, pc}"
 NESTED_END TailcallNaked3, _TEXT
 
 NESTED_ENTRY getPrevPC, _TEXT, NoHandler