aboutsummaryrefslogtreecommitdiff
path: root/contrib/compiler-rt/lib/builtins
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2017-04-05 02:40:53 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2017-04-05 02:40:53 +0000
commit813b8a9e899111af92e13c23e971cc9e003f534b (patch)
tree1e6fe5e67568e740974da51e4bb265c5091de5eb /contrib/compiler-rt/lib/builtins
parent2e2e26d14ed556cf57d65e109066a7c7d7ce00ac (diff)
downloadsrc-813b8a9e899111af92e13c23e971cc9e003f534b.tar.gz
src-813b8a9e899111af92e13c23e971cc9e003f534b.zip
Add an implementation of __ffssi2() derived from __ffsdi2().
Newer versions of GCC include an __ffssi2() symbol in libgcc and the compiler can emit calls to it in generated code. This is true for at least GCC 6.2 when compiling world for mips and mips64. Reviewed by: jmallett, dim Sponsored by: DARPA / AFRL Differential Revision: https://reviews.freebsd.org/D10086
Notes
Notes: svn path=/head/; revision=316511
Diffstat (limited to 'contrib/compiler-rt/lib/builtins')
-rw-r--r--contrib/compiler-rt/lib/builtins/README.txt1
-rw-r--r--contrib/compiler-rt/lib/builtins/ffssi2.c29
2 files changed, 30 insertions, 0 deletions
diff --git a/contrib/compiler-rt/lib/builtins/README.txt b/contrib/compiler-rt/lib/builtins/README.txt
index ad36e4e5279a..b3d083614ee0 100644
--- a/contrib/compiler-rt/lib/builtins/README.txt
+++ b/contrib/compiler-rt/lib/builtins/README.txt
@@ -45,6 +45,7 @@ si_int __ctzsi2(si_int a); // count trailing zeros
si_int __ctzdi2(di_int a); // count trailing zeros
si_int __ctzti2(ti_int a); // count trailing zeros
+si_int __ffssi2(si_int a); // find least significant 1 bit
si_int __ffsdi2(di_int a); // find least significant 1 bit
si_int __ffsti2(ti_int a); // find least significant 1 bit
diff --git a/contrib/compiler-rt/lib/builtins/ffssi2.c b/contrib/compiler-rt/lib/builtins/ffssi2.c
new file mode 100644
index 000000000000..e5180eff5e08
--- /dev/null
+++ b/contrib/compiler-rt/lib/builtins/ffssi2.c
@@ -0,0 +1,29 @@
+/* ===-- ffssi2.c - Implement __ffssi2 -------------------------------------===
+ *
+ * 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 __ffssi2 for the compiler_rt library.
+ *
+ * ===----------------------------------------------------------------------===
+ */
+
+#include "int_lib.h"
+
+/* Returns: the index of the least significant 1-bit in a, or
+ * the value zero if a is zero. The least significant bit is index one.
+ */
+
+COMPILER_RT_ABI si_int
+__ffssi2(si_int a)
+{
+ if (a == 0)
+ {
+ return 0;
+ }
+ return __builtin_ctz(a) + 1;
+}