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>
This commit is contained in:
Alexander Graf 2019-02-12 11:31:06 +01:00 committed by Daniel Kiper
parent 861212333e
commit e795b9011f
2 changed files with 49 additions and 0 deletions

View 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

View 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__)