1*8a6a9560SDaniel Boulby //===-- ctzdi2.c - Implement __ctzdi2 -------------------------------------===// 2*8a6a9560SDaniel Boulby // 3*8a6a9560SDaniel Boulby // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*8a6a9560SDaniel Boulby // See https://llvm.org/LICENSE.txt for license information. 5*8a6a9560SDaniel Boulby // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*8a6a9560SDaniel Boulby // 7*8a6a9560SDaniel Boulby //===----------------------------------------------------------------------===// 8*8a6a9560SDaniel Boulby // 9*8a6a9560SDaniel Boulby // This file implements __ctzdi2 for the compiler_rt library. 10*8a6a9560SDaniel Boulby // 11*8a6a9560SDaniel Boulby //===----------------------------------------------------------------------===// 127bba6884SSandrine Bailleux 137bba6884SSandrine Bailleux #include "int_lib.h" 147bba6884SSandrine Bailleux 15*8a6a9560SDaniel Boulby // Returns: the number of trailing 0-bits 167bba6884SSandrine Bailleux 17*8a6a9560SDaniel Boulby #if !defined(__clang__) && \ 18*8a6a9560SDaniel Boulby ((defined(__sparc__) && defined(__arch64__)) || defined(__mips64) || \ 19*8a6a9560SDaniel Boulby (defined(__riscv) && __SIZEOF_POINTER__ >= 8)) 20*8a6a9560SDaniel Boulby // On 64-bit architectures with neither a native clz instruction nor a native 21*8a6a9560SDaniel Boulby // ctz instruction, gcc resolves __builtin_ctz to __ctzdi2 rather than 22*8a6a9560SDaniel Boulby // __ctzsi2, leading to infinite recursion. 23*8a6a9560SDaniel Boulby #define __builtin_ctz(a) __ctzsi2(a) 24*8a6a9560SDaniel Boulby extern int __ctzsi2(si_int); 25*8a6a9560SDaniel Boulby #endif 267bba6884SSandrine Bailleux 27*8a6a9560SDaniel Boulby // Precondition: a != 0 28*8a6a9560SDaniel Boulby __ctzdi2(di_int a)29*8a6a9560SDaniel BoulbyCOMPILER_RT_ABI int __ctzdi2(di_int a) { 307bba6884SSandrine Bailleux dwords x; 317bba6884SSandrine Bailleux x.all = a; 327bba6884SSandrine Bailleux const si_int f = -(x.s.low == 0); 33*8a6a9560SDaniel Boulby return ctzsi((x.s.high & f) | (x.s.low & ~f)) + 347bba6884SSandrine Bailleux (f & ((si_int)(sizeof(si_int) * CHAR_BIT))); 357bba6884SSandrine Bailleux } 36