diff options
author | Alexander Monakov <amonakov@ispras.ru> | 2020-08-12 14:34:30 +0300 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2020-08-12 21:52:56 -0400 |
commit | 4554f155dd23a65fcdfd39f1d5af8af55ba37694 (patch) | |
tree | 6d30aec1be17901269cb0ef58d6cd379634f1e8f | |
parent | 59b64ff686cef2a87e9552658b2c8d2531f87176 (diff) | |
download | musl-4554f155dd23a65fcdfd39f1d5af8af55ba37694.tar.gz musl-4554f155dd23a65fcdfd39f1d5af8af55ba37694.tar.xz musl-4554f155dd23a65fcdfd39f1d5af8af55ba37694.zip |
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.
-rw-r--r-- | src/setjmp/i386/longjmp.s | 6 | ||||
-rw-r--r-- | src/setjmp/x32/longjmp.s | 8 | ||||
-rw-r--r-- | src/setjmp/x86_64/longjmp.s | 8 |
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 |