ffsdi2.c revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
1/* ===-- ffsdi2.c - Implement __ffsdi2 -------------------------------------===
2 *
3 *                     The LLVM Compiler Infrastructure
4 *
5 * This file is dual licensed under the MIT and the University of Illinois Open
6 * Source Licenses. See LICENSE.TXT for details.
7 *
8 * ===----------------------------------------------------------------------===
9 *
10 * This file implements __ffsdi2 for the compiler_rt library.
11 *
12 * ===----------------------------------------------------------------------===
13 */
14
15#include "int_lib.h"
16
17/* Returns: the index of the least significant 1-bit in a, or
18 * the value zero if a is zero. The least significant bit is index one.
19 */
20
21COMPILER_RT_ABI si_int
22__ffsdi2(di_int a)
23{
24    dwords x;
25    x.all = a;
26    if (x.s.low == 0)
27    {
28        if (x.s.high == 0)
29            return 0;
30        return __builtin_ctz(x.s.high) + (1 + sizeof(si_int) * CHAR_BIT);
31    }
32    return __builtin_ctz(x.s.low) + 1;
33}
34