]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
RISC-V: Add libgcc helpers for clz
authorAlexander Graf <agraf@suse.de>
Tue, 12 Feb 2019 10:31:06 +0000 (11:31 +0100)
committerDaniel Kiper <daniel.kiper@oracle.com>
Mon, 25 Feb 2019 13:02:05 +0000 (14:02 +0100)
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>
grub-core/kern/compiler-rt.c
include/grub/compiler-rt.h

index 5cfcb3907f2be4aa42c3e29aa56a860e3ad4d936..7438a507ec851349fb0d031c3f4d82ddfbdecd1d 100644 (file)
@@ -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
index dc73649a5ea219c288d83dd1b2fdedf10ab16a5e..2cc69e23914522a099992f8a34948aad122853d5 100644 (file)
@@ -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__)