setjmp: optimize longjmp prologues
authorAlexander Monakov <amonakov@ispras.ru>
Wed, 12 Aug 2020 11:34:30 +0000 (14:34 +0300)
committerRich Felker <dalias@aerifal.cx>
Thu, 13 Aug 2020 01:52:56 +0000 (21:52 -0400)
Use a branchless sequence that is one byte shorter on 64-bit, same size
on 32-bit. Thanks to Pete Cawley for suggesting this variant.

src/setjmp/i386/longjmp.s
src/setjmp/x32/longjmp.s
src/setjmp/x86_64/longjmp.s

index b429f13..8188f06 100644 (file)
@@ -6,10 +6,8 @@ _longjmp:
 longjmp:
        mov  4(%esp),%edx
        mov  8(%esp),%eax
-       test    %eax,%eax
-       jnz 1f
-       inc     %eax
-1:
+       cmp       $1,%eax
+       adc       $0, %al
        mov   (%edx),%ebx
        mov  4(%edx),%esi
        mov  8(%edx),%edi
index bb88afa..1b2661c 100644 (file)
@@ -5,11 +5,9 @@
 .type longjmp,@function
 _longjmp:
 longjmp:
-       mov %esi,%eax           /* val will be longjmp return */
-       test %esi,%esi
-       jnz 1f
-       inc %eax                /* if val==0, val=1 per longjmp semantics */
-1:
+       xor %eax,%eax
+       cmp $1,%esi             /* CF = val ? 0 : 1 */
+       adc %esi,%eax           /* eax = val + !val */
        mov (%rdi),%rbx         /* rdi is the jmp_buf, restore regs from it */
        mov 8(%rdi),%rbp
        mov 16(%rdi),%r12
index bb88afa..1b2661c 100644 (file)
@@ -5,11 +5,9 @@
 .type longjmp,@function
 _longjmp:
 longjmp:
-       mov %esi,%eax           /* val will be longjmp return */
-       test %esi,%esi
-       jnz 1f
-       inc %eax                /* if val==0, val=1 per longjmp semantics */
-1:
+       xor %eax,%eax
+       cmp $1,%esi             /* CF = val ? 0 : 1 */
+       adc %esi,%eax           /* eax = val + !val */
        mov (%rdi),%rbx         /* rdi is the jmp_buf, restore regs from it */
        mov 8(%rdi),%rbp
        mov 16(%rdi),%r12