[kvm-unit-tests PATCH v2 08/24] riscv: Add riscv32 support
Andrew Jones
andrew.jones at linux.dev
Thu Feb 1 07:24:43 PST 2024
On Fri, Jan 26, 2024 at 03:23:33PM +0100, Andrew Jones wrote:
...
> diff --git a/lib/ldiv32.c b/lib/ldiv32.c
> index 897a4b9cd39e..9ce2a6a1faf0 100644
> --- a/lib/ldiv32.c
> +++ b/lib/ldiv32.c
> @@ -1,5 +1,21 @@
> #include <stdint.h>
>
> +#if __riscv_xlen == 32
> +int __clzdi2(unsigned long);
> +
> +int __clzdi2(unsigned long a)
> +{
> + int n = 0;
> +
> + while (a) {
> + ++n;
> + a >>= 1;
> + }
> +
> + return 32 - n;
> +}
> +#endif
> +
On riscv32, when attempting to do printf("%llx\n", x), where x is a 64-bit
type, I found a bug with the above. It turns out that despite [1] stating
that __clzdi2() takes an unsigned long, libgcc code which generates calls
to it expect it to take an unsigned long long. I've fixed this for v3 by
renaming the above function to __clzsi2() and adding
int __clzdi2(uint64_t num)
{
return num >> 32 ? __clzsi2(num >> 32) : __clzsi2(num) + 32;
}
[1] https://gcc.gnu.org/onlinedocs/gccint/Integer-library-routines.html
Thanks,
drew
More information about the kvm-riscv
mailing list