xref: /rk3399_ARM-atf/lib/compiler-rt/builtins/ctzdi2.c (revision 9900d4eb06605c6ff79801c4371445d245b7b2fb)
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 Boulby COMPILER_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