From 4554f155dd23a65fcdfd39f1d5af8af55ba37694 Mon Sep 17 00:00:00 2001 From: Alexander Monakov Date: Wed, 12 Aug 2020 14:34:30 +0300 Subject: 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. --- src/setjmp/x86_64/longjmp.s | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'src/setjmp/x86_64/longjmp.s') 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 -- cgit v1.2.1