From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.3 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 29437 invoked from network); 11 Aug 2020 23:10:23 -0000 Received: from mother.openwall.net (195.42.179.200) by inbox.vuxu.org with ESMTPUTF8; 11 Aug 2020 23:10:23 -0000 Received: (qmail 3904 invoked by uid 550); 11 Aug 2020 23:10:20 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 3874 invoked from network); 11 Aug 2020 23:10:20 -0000 From: Alexander Monakov To: musl@lists.openwall.com Date: Wed, 12 Aug 2020 02:10:08 +0300 Message-Id: <20200811231008.8896-1-amonakov@ispras.ru> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20200811181116.8433-1-amonakov@ispras.ru> References: <20200811181116.8433-1-amonakov@ispras.ru> Subject: [musl] [PATCH] setjmp: optimize x86-64 longjmp prologues Use a branchless sequence that is one byte shorter as well. --- src/setjmp/x32/longjmp.s | 9 ++++----- src/setjmp/x86_64/longjmp.s | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/setjmp/x32/longjmp.s b/src/setjmp/x32/longjmp.s index bb88afa1..c8ad86fa 100644 --- a/src/setjmp/x32/longjmp.s +++ b/src/setjmp/x32/longjmp.s @@ -5,11 +5,10 @@ .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 %esi,%eax /* CF==0 iff val==0 */ + cmc /* CF = !val */ + 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..c8ad86fa 100644 --- a/src/setjmp/x86_64/longjmp.s +++ b/src/setjmp/x86_64/longjmp.s @@ -5,11 +5,10 @@ .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 %esi,%eax /* CF==0 iff val==0 */ + cmc /* CF = !val */ + 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 -- 2.11.0