mirror of
git://git.musl-libc.org/musl
synced 2025-03-06 20:48:29 +01:00
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.
This commit is contained in:
parent
59b64ff686
commit
4554f155dd
3 changed files with 8 additions and 14 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue