xref: /llvm-project/compiler-rt/lib/builtins/clzti2.c (revision a6b264b51d4fa786d9df659621fc1ffad1fdc5d0)
1*a6b264b5SAlexey Samsonov /* ===-- clzti2.c - Implement __clzti2 -------------------------------------===
2*a6b264b5SAlexey Samsonov  *
3*a6b264b5SAlexey Samsonov  *      	       The LLVM Compiler Infrastructure
4*a6b264b5SAlexey Samsonov  *
5*a6b264b5SAlexey Samsonov  * This file is dual licensed under the MIT and the University of Illinois Open
6*a6b264b5SAlexey Samsonov  * Source Licenses. See LICENSE.TXT for details.
7*a6b264b5SAlexey Samsonov  *
8*a6b264b5SAlexey Samsonov  * ===----------------------------------------------------------------------===
9*a6b264b5SAlexey Samsonov  *
10*a6b264b5SAlexey Samsonov  * This file implements __clzti2 for the compiler_rt library.
11*a6b264b5SAlexey Samsonov  *
12*a6b264b5SAlexey Samsonov  * ===----------------------------------------------------------------------===
13*a6b264b5SAlexey Samsonov  */
14*a6b264b5SAlexey Samsonov 
15*a6b264b5SAlexey Samsonov #include "int_lib.h"
16*a6b264b5SAlexey Samsonov 
17*a6b264b5SAlexey Samsonov #if __x86_64
18*a6b264b5SAlexey Samsonov 
19*a6b264b5SAlexey Samsonov /* Returns: the number of leading 0-bits */
20*a6b264b5SAlexey Samsonov 
21*a6b264b5SAlexey Samsonov /* Precondition: a != 0 */
22*a6b264b5SAlexey Samsonov 
23*a6b264b5SAlexey Samsonov si_int
24*a6b264b5SAlexey Samsonov __clzti2(ti_int a)
25*a6b264b5SAlexey Samsonov {
26*a6b264b5SAlexey Samsonov     twords x;
27*a6b264b5SAlexey Samsonov     x.all = a;
28*a6b264b5SAlexey Samsonov     const di_int f = -(x.s.high == 0);
29*a6b264b5SAlexey Samsonov     return __builtin_clzll((x.s.high & ~f) | (x.s.low & f)) +
30*a6b264b5SAlexey Samsonov            ((si_int)f & ((si_int)(sizeof(di_int) * CHAR_BIT)));
31*a6b264b5SAlexey Samsonov }
32*a6b264b5SAlexey Samsonov 
33*a6b264b5SAlexey Samsonov #endif /* __x86_64 */
34