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)