clzdi2.c revision 303975
1159952Sobrien/* ===-- clzdi2.c - Implement __clzdi2 -------------------------------------===
2159952Sobrien *
3159952Sobrien *               The LLVM Compiler Infrastructure
4159952Sobrien *
5159952Sobrien * This file is dual licensed under the MIT and the University of Illinois Open
6159952Sobrien * Source Licenses. See LICENSE.TXT for details.
7159952Sobrien *
8159952Sobrien * ===----------------------------------------------------------------------===
9159952Sobrien *
10159952Sobrien * This file implements __clzdi2 for the compiler_rt library.
11159952Sobrien *
12159952Sobrien * ===----------------------------------------------------------------------===
13159952Sobrien */
14159952Sobrien
15159952Sobrien#include "int_lib.h"
16159952Sobrien
17159967Sobrien/* Returns: the number of leading 0-bits */
18159967Sobrien
19159952Sobrien/* Precondition: a != 0 */
20159952Sobrien
21159952SobrienCOMPILER_RT_ABI si_int
22159967Sobrien__clzdi2(di_int a)
23159952Sobrien{
24159952Sobrien    dwords x;
25159952Sobrien    x.all = a;
26159952Sobrien    const si_int f = -(x.s.high == 0);
27170589Syongari    return __builtin_clz((x.s.high & ~f) | (x.s.low & f)) +
28159967Sobrien           (f & ((si_int)(sizeof(si_int) * CHAR_BIT)));
29159952Sobrien}
30159952Sobrien