summaryrefslogtreecommitdiff
path: root/src/setjmp
diff options
context:
space:
mode:
authorAlexander Monakov <amonakov@ispras.ru>2020-08-12 14:34:30 +0300
committerRich Felker <dalias@aerifal.cx>2020-08-12 21:52:56 -0400
commit4554f155dd23a65fcdfd39f1d5af8af55ba37694 (patch)
tree6d30aec1be17901269cb0ef58d6cd379634f1e8f /src/setjmp
parent59b64ff686cef2a87e9552658b2c8d2531f87176 (diff)
downloadmusl-4554f155dd23a65fcdfd39f1d5af8af55ba37694.tar.gz
setjmp: optimize longjmp prologues
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.
Diffstat (limited to 'src/setjmp')
-rw-r--r--src/setjmp/i386/longjmp.s6
-rw-r--r--src/setjmp/x32/longjmp.s8
-rw-r--r--src/setjmp/x86_64/longjmp.s8
3 files changed, 8 insertions, 14 deletions
diff --git a/src/setjmp/i386/longjmp.s b/src/setjmp/i386/longjmp.s
index b429f135..8188f06b 100644
--- a/src/setjmp/i386/longjmp.s
+++ b/src/setjmp/i386/longjmp.s
@@ -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
diff --git a/src/setjmp/x32/longjmp.s b/src/setjmp/x32/longjmp.s
index bb88afa1..1b2661c3 100644
--- a/src/setjmp/x32/longjmp.s
+++ b/src/setjmp/x32/longjmp.s
@@ -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
diff --git a/src/setjmp/x86_64/longjmp.s b/src/setjmp/x86_64/longjmp.s
index bb88afa1..1b2661c3 100644
--- a/src/setjmp/x86_64/longjmp.s
+++ b/src/setjmp/x86_64/longjmp.s
@@ -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