Alexandre Julliard : winecrt0: Use multiple load/store instructions in setjmp() on ARM.

Alexandre Julliard julliard at winehq.org
Tue Jun 22 16:17:06 CDT 2021


Module: wine
Branch: master
Commit: 74776480347660f149d6ad3f21d4fb353fb61910
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=74776480347660f149d6ad3f21d4fb353fb61910

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jun 21 17:31:29 2021 +0200

winecrt0: Use multiple load/store instructions in setjmp() on ARM.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winecrt0/setjmp.c | 39 ++++++---------------------------------
 1 file changed, 6 insertions(+), 33 deletions(-)

diff --git a/dlls/winecrt0/setjmp.c b/dlls/winecrt0/setjmp.c
index 642e78e355e..d83df54b889 100644
--- a/dlls/winecrt0/setjmp.c
+++ b/dlls/winecrt0/setjmp.c
@@ -106,54 +106,27 @@ __ASM_GLOBAL_FUNC( __wine_longjmp,
 #elif defined(__arm__)
 
 __ASM_GLOBAL_FUNC( __wine_setjmpex,
-                   "str r1, [r0]\n\t"              /* jmp_buf->Frame */
-                   "str r4, [r0, #0x4]\n\t"        /* jmp_buf->R4 */
-                   "str r5, [r0, #0x8]\n\t"        /* jmp_buf->R5 */
-                   "str r6, [r0, #0xc]\n\t"        /* jmp_buf->R6 */
-                   "str r7, [r0, #0x10]\n\t"       /* jmp_buf->R7 */
-                   "str r8, [r0, #0x14]\n\t"       /* jmp_buf->R8 */
-                   "str r9, [r0, #0x18]\n\t"       /* jmp_buf->R9 */
-                   "str r10, [r0, #0x1c]\n\t"      /* jmp_buf->R10 */
-                   "str r11, [r0, #0x20]\n\t"      /* jmp_buf->R11 */
+                   "stm r0, {r1,r4-r11}\n"         /* jmp_buf->Frame,R4..R11 */
                    "str sp, [r0, #0x24]\n\t"       /* jmp_buf->Sp */
                    "str lr, [r0, #0x28]\n\t"       /* jmp_buf->Pc */
 #ifndef __SOFTFP__
                    "vmrs r2, fpscr\n\t"
                    "str r2, [r0, #0x2c]\n\t"       /* jmp_buf->Fpscr */
-                   "vstr d8,  [r0, #0x30]\n\t"     /* jmp_buf->D[0] */
-                   "vstr d9,  [r0, #0x38]\n\t"     /* jmp_buf->D[1] */
-                   "vstr d10, [r0, #0x40]\n\t"     /* jmp_buf->D[2] */
-                   "vstr d11, [r0, #0x48]\n\t"     /* jmp_buf->D[3] */
-                   "vstr d12, [r0, #0x50]\n\t"     /* jmp_buf->D[4] */
-                   "vstr d13, [r0, #0x58]\n\t"     /* jmp_buf->D[5] */
-                   "vstr d14, [r0, #0x60]\n\t"     /* jmp_buf->D[6] */
-                   "vstr d15, [r0, #0x68]\n\t"     /* jmp_buf->D[7] */
+                   "add r0, r0, #0x30\n\t"
+                   "vstm r0, {d8-d15}\n\t"         /* jmp_buf->D[0..7] */
 #endif
                    "mov r0, #0\n\t"
                    "bx lr" )
 
 __ASM_GLOBAL_FUNC( __wine_longjmp,
-                   "ldr r4, [r0, #0x4]\n\t"        /* jmp_buf->R4 */
-                   "ldr r5, [r0, #0x8]\n\t"        /* jmp_buf->R5 */
-                   "ldr r6, [r0, #0xc]\n\t"        /* jmp_buf->R6 */
-                   "ldr r7, [r0, #0x10]\n\t"       /* jmp_buf->R7 */
-                   "ldr r8, [r0, #0x14]\n\t"       /* jmp_buf->R8 */
-                   "ldr r9, [r0, #0x18]\n\t"       /* jmp_buf->R9 */
-                   "ldr r10, [r0, #0x1c]\n\t"      /* jmp_buf->R10 */
-                   "ldr r11, [r0, #0x20]\n\t"      /* jmp_buf->R11 */
+                   "ldm r0, {r3-r11}\n\t"          /* jmp_buf->Frame,R4..R11 */
                    "ldr sp, [r0, #0x24]\n\t"       /* jmp_buf->Sp */
                    "ldr r2, [r0, #0x28]\n\t"       /* jmp_buf->Pc */
 #ifndef __SOFTFP__
                    "ldr r3, [r0, #0x2c]\n\t"       /* jmp_buf->Fpscr */
                    "vmsr fpscr, r3\n\t"
-                   "vldr d8,  [r0, #0x30]\n\t"     /* jmp_buf->D[0] */
-                   "vldr d9,  [r0, #0x38]\n\t"     /* jmp_buf->D[1] */
-                   "vldr d10, [r0, #0x40]\n\t"     /* jmp_buf->D[2] */
-                   "vldr d11, [r0, #0x48]\n\t"     /* jmp_buf->D[3] */
-                   "vldr d12, [r0, #0x50]\n\t"     /* jmp_buf->D[4] */
-                   "vldr d13, [r0, #0x58]\n\t"     /* jmp_buf->D[5] */
-                   "vldr d14, [r0, #0x60]\n\t"     /* jmp_buf->D[6] */
-                   "vldr d15, [r0, #0x68]\n\t"     /* jmp_buf->D[7] */
+                   "add r0, r0, #0x30\n\t"
+                   "vldm r0, {d8-d15}\n\t"         /* jmp_buf->D[0..7] */
 #endif
                    "mov r0, r1\n\t"                /* retval */
                    "bx r2" )




More information about the wine-cvs mailing list