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