ctzdi2.c revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ===-- ctzdi2.c - Implement __ctzdi2 -------------------------------------===
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file is dual licensed under the MIT and the University of Illinois Open
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Source Licenses. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ===----------------------------------------------------------------------===
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file implements __ctzdi2 for the compiler_rt library.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ===----------------------------------------------------------------------===
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "int_lib.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Returns: the number of trailing 0-bits  */
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Precondition: a != 0 */
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILER_RT_ABI si_int
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__ctzdi2(di_int a)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dwords x;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    x.all = a;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const si_int f = -(x.s.low == 0);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return __builtin_ctz((x.s.high & f) | (x.s.low & ~f)) +
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              (f & ((si_int)(sizeof(si_int) * CHAR_BIT)));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)