summaryrefslogtreecommitdiffstats
path: root/newlib/libc/machine/riscv/ffs.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/riscv/ffs.c')
-rw-r--r--newlib/libc/machine/riscv/ffs.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/newlib/libc/machine/riscv/ffs.c b/newlib/libc/machine/riscv/ffs.c
new file mode 100644
index 000000000..652207722
--- /dev/null
+++ b/newlib/libc/machine/riscv/ffs.c
@@ -0,0 +1,32 @@
+/* Copyright (c) 2017 SiFive Inc. All rights reserved.
+
+ This copyrighted material is made available to anyone wishing to use,
+ modify, copy, or redistribute it subject to the terms and conditions
+ of the BSD License. This program is distributed in the hope that
+ it will be useful, but WITHOUT ANY WARRANTY expressed or implied,
+ including the implied warranties of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. A copy of this license is available at
+ http://www.opensource.org/licenses.
+*/
+#include <strings.h>
+
+int
+ffs (int word)
+{
+#if __riscv_xlen == 32
+ return (__builtin_ffs (word));
+#else
+ int i;
+
+ if (!word)
+ return 0;
+
+ i = 0;
+ for (;;)
+ {
+ if (((1 << i++) & word) != 0)
+ return i;
+ }
+ return 0;
+#endif
+}