Import ctzdi2.c from LLVM compiler-rt
authorSandrine Bailleux <sandrine.bailleux@arm.com>
Wed, 19 Jul 2017 13:05:47 +0000 (14:05 +0100)
committerSandrine Bailleux <sandrine.bailleux@arm.com>
Wed, 26 Jul 2017 08:28:23 +0000 (09:28 +0100)
When using __builtin_ctzll() in AArch32 code, the compiler may translate
that into a call to the __ctzdi2() function. In this case, the linking
phase fails because TF doesn't provide an implementation for it.

This patch imports the implementation of the __ctzdi2() function from
LLVM's compiler-rt project and hooks it into TF's build system. The
ctzdi2.c file is an unmodified copy from the master branch as of
July 19 2017 (SVN revision: 308480).

Change-Id: I96766a025ba28e1afc6ef6a5c4ef91d85fc8f32b
Signed-off-by: Sandrine Bailleux <sandrine.bailleux@arm.com>
lib/compiler-rt/builtins/ctzdi2.c [new file with mode: 0644]
lib/compiler-rt/compiler-rt.mk

diff --git a/lib/compiler-rt/builtins/ctzdi2.c b/lib/compiler-rt/builtins/ctzdi2.c
new file mode 100644 (file)
index 0000000..db3c6fd
--- /dev/null
@@ -0,0 +1,29 @@
+/* ===-- ctzdi2.c - Implement __ctzdi2 -------------------------------------===
+ *
+ *                     The LLVM Compiler Infrastructure
+ *
+ * This file is dual licensed under the MIT and the University of Illinois Open
+ * Source Licenses. See LICENSE.TXT for details.
+ *
+ * ===----------------------------------------------------------------------===
+ *
+ * This file implements __ctzdi2 for the compiler_rt library.
+ *
+ * ===----------------------------------------------------------------------===
+ */
+
+#include "int_lib.h"
+
+/* Returns: the number of trailing 0-bits  */
+
+/* Precondition: a != 0 */
+
+COMPILER_RT_ABI si_int
+__ctzdi2(di_int a)
+{
+    dwords x;
+    x.all = a;
+    const si_int f = -(x.s.low == 0);
+    return __builtin_ctz((x.s.high & f) | (x.s.low & ~f)) +
+              (f & ((si_int)(sizeof(si_int) * CHAR_BIT)));
+}
index 3bdd31903c6693954a055ca76706639ea21540c4..cb5ab31c058ccda8992cc1dc4cc3ea55d2c74b1a 100644 (file)
@@ -30,5 +30,6 @@
 
 ifeq (${ARCH},aarch32)
 COMPILER_RT_SRCS       :=      lib/compiler-rt/builtins/arm/aeabi_uldivmod.S   \
-                               lib/compiler-rt/builtins/udivmoddi4.c
+                               lib/compiler-rt/builtins/udivmoddi4.c           \
+                               lib/compiler-rt/builtins/ctzdi2.c
 endif