61 lines
1.9 KiB
ArmAsm
61 lines
1.9 KiB
ArmAsm
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
//
|
|
// Permission to use, copy, modify, and/or distribute this software for any
|
|
// purpose with or without fee is hereby granted, provided that the above
|
|
// copyright notice and this permission notice appear in all copies.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Count leading zero bits in a single word
|
|
// Input a; output function return
|
|
//
|
|
// extern uint64_t word_clz (uint64_t a);
|
|
//
|
|
// Standard x86-64 ABI: RDI = a, returns RAX
|
|
// Microsoft x64 ABI: RCX = a, returns RAX
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#include "s2n_bignum_internal.h"
|
|
|
|
.intel_syntax noprefix
|
|
S2N_BN_SYM_VISIBILITY_DIRECTIVE(word_clz)
|
|
S2N_BN_SYM_PRIVACY_DIRECTIVE(word_clz)
|
|
.text
|
|
|
|
S2N_BN_SYMBOL(word_clz):
|
|
endbr64
|
|
|
|
#if WINDOWS_ABI
|
|
push rdi
|
|
push rsi
|
|
mov rdi, rcx
|
|
#endif
|
|
|
|
// First do rax = 63 - bsr(a), which is right except (maybe) for zero inputs
|
|
|
|
bsr rax, rdi
|
|
xor rax, 63
|
|
|
|
// Force return of 64 in the zero-input case
|
|
|
|
mov edx, 64
|
|
test rdi, rdi
|
|
cmove rax, rdx
|
|
|
|
#if WINDOWS_ABI
|
|
pop rsi
|
|
pop rdi
|
|
#endif
|
|
ret
|
|
|
|
#if defined(__linux__) && defined(__ELF__)
|
|
.section .note.GNU-stack,"",%progbits
|
|
#endif
|