Home | History | Annotate | Line # | Download | only in builtins
      1  1.1  joerg /* ===-- clzsi2.c - Implement __clzsi2 -------------------------------------===
      2  1.1  joerg  *
      3  1.1  joerg  *               The LLVM Compiler Infrastructure
      4  1.1  joerg  *
      5  1.1  joerg  * This file is dual licensed under the MIT and the University of Illinois Open
      6  1.1  joerg  * Source Licenses. See LICENSE.TXT for details.
      7  1.1  joerg  *
      8  1.1  joerg  * ===----------------------------------------------------------------------===
      9  1.1  joerg  *
     10  1.1  joerg  * This file implements __clzsi2 for the compiler_rt library.
     11  1.1  joerg  *
     12  1.1  joerg  * ===----------------------------------------------------------------------===
     13  1.1  joerg  */
     14  1.1  joerg 
     15  1.1  joerg #include "int_lib.h"
     16  1.1  joerg 
     17  1.1  joerg /* Returns: the number of leading 0-bits */
     18  1.1  joerg 
     19  1.1  joerg /* Precondition: a != 0 */
     20  1.1  joerg 
     21  1.1  joerg COMPILER_RT_ABI si_int
     22  1.1  joerg __clzsi2(si_int a)
     23  1.1  joerg {
     24  1.1  joerg     su_int x = (su_int)a;
     25  1.1  joerg     si_int t = ((x & 0xFFFF0000) == 0) << 4;  /* if (x is small) t = 16 else 0 */
     26  1.1  joerg     x >>= 16 - t;      /* x = [0 - 0xFFFF] */
     27  1.1  joerg     su_int r = t;       /* r = [0, 16] */
     28  1.1  joerg     /* return r + clz(x) */
     29  1.1  joerg     t = ((x & 0xFF00) == 0) << 3;
     30  1.1  joerg     x >>= 8 - t;       /* x = [0 - 0xFF] */
     31  1.1  joerg     r += t;            /* r = [0, 8, 16, 24] */
     32  1.1  joerg     /* return r + clz(x) */
     33  1.1  joerg     t = ((x & 0xF0) == 0) << 2;
     34  1.1  joerg     x >>= 4 - t;       /* x = [0 - 0xF] */
     35  1.1  joerg     r += t;            /* r = [0, 4, 8, 12, 16, 20, 24, 28] */
     36  1.1  joerg     /* return r + clz(x) */
     37  1.1  joerg     t = ((x & 0xC) == 0) << 1;
     38  1.1  joerg     x >>= 2 - t;       /* x = [0 - 3] */
     39  1.1  joerg     r += t;            /* r = [0 - 30] and is even */
     40  1.1  joerg     /* return r + clz(x) */
     41  1.1  joerg /*     switch (x)
     42  1.1  joerg  *     {
     43  1.1  joerg  *     case 0:
     44  1.1  joerg  *         return r + 2;
     45  1.1  joerg  *     case 1:
     46  1.1  joerg  *         return r + 1;
     47  1.1  joerg  *     case 2:
     48  1.1  joerg  *     case 3:
     49  1.1  joerg  *         return r;
     50  1.1  joerg  *     }
     51  1.1  joerg  */
     52  1.1  joerg     return r + ((2 - x) & -((x & 2) == 0));
     53  1.1  joerg }
     54