summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2019-02-12 11:31:06 +0100
committerDaniel Kiper <daniel.kiper@oracle.com>2019-02-25 14:02:05 +0100
commite795b9011fdb7208cccb1804d9bbc81a6cd251c6 (patch)
tree108a26b9a8bd47d2267b79c316b36c0d8cdc8ff4
parent861212333e09a455dd3b7eaab71f1eefb676b39e (diff)
RISC-V: Add libgcc helpers for clz
Gcc may decide it wants to call helper functions to execute clz. Provide them in our own copy of libgcc. Signed-off-by: Alexander Graf <agraf@suse.de> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
-rw-r--r--grub-core/kern/compiler-rt.c42
-rw-r--r--include/grub/compiler-rt.h7
2 files changed, 49 insertions, 0 deletions
diff --git a/grub-core/kern/compiler-rt.c b/grub-core/kern/compiler-rt.c
index 5cfcb3907..7438a507e 100644
--- a/grub-core/kern/compiler-rt.c
+++ b/grub-core/kern/compiler-rt.c
@@ -417,3 +417,45 @@ __aeabi_llsl (grub_uint64_t u, int b)
__attribute__ ((alias ("__ashldi3")));
#endif
+
+#ifdef __riscv
+
+/* Based on libgcc from gcc suite. */
+int
+__clzsi2 (grub_uint32_t val)
+{
+ int i = 32;
+ int j = 16;
+ int temp;
+
+ for (; j; j >>= 1)
+ {
+ if ((temp = val) >> j)
+ {
+ if (j == 1)
+ {
+ return (i - 2);
+ }
+ else
+ {
+ i -= j;
+ val = temp;
+ }
+ }
+ }
+ return (i - val);
+}
+
+int
+__clzdi2 (grub_uint64_t val)
+{
+ if (val >> 32)
+ {
+ return __clzsi2 (val >> 32);
+ }
+ else
+ {
+ return __clzsi2 (val) + 32;
+ }
+}
+#endif
diff --git a/include/grub/compiler-rt.h b/include/grub/compiler-rt.h
index dc73649a5..2cc69e239 100644
--- a/include/grub/compiler-rt.h
+++ b/include/grub/compiler-rt.h
@@ -108,6 +108,13 @@ EXPORT_FUNC (__aeabi_llsr) (grub_uint64_t u, int b);
#endif
+#ifdef __riscv
+int
+EXPORT_FUNC (__clzsi2) (grub_uint32_t val);
+
+int
+EXPORT_FUNC (__clzdi2) (grub_uint64_t val);
+#endif
#if defined (__powerpc__)