Bug report: Floating conversion from double to unsigned int may provide wrong result
Hi there!
I've detected a bug in CVFPU.
Brief bug description
A conversion from double to unsigned int fcvt.wu.d provides wrong results in some cases.
I discovered the bug through cva6.
Example instance 1
Here is an example RISC-V (rv64imfd) snippet:
  .section ".text.init","ax",@progbits
  .globl _start
  .align 2
_start:
  # Enable the FPU
  li t0, 0x2000
  csrs mstatus, t0
  csrw	fcsr,x0
  la t0, .fdata0
  fld ft0, (t0)
  fcvt.wu.d a0, ft0, rup
  li t0, 0x10
  sd a0, (t0)
  sw x0, 0(x0)
infinite_loop:
  j infinite_loop
.section ".fdata0","ax",@progbits
  .8byte 0x41dfffffffc00001 # 2.14748e+09Expected and actual results
We expect a0=0xffffffff80000000. I verified this with Spike.
However,  CVA6 gives a0=0x80000000.
Example instance 2
Here is an example RISC-V (rv64imfd) snippet:
  .section ".text.init","ax",@progbits
  .globl _start
  .align 2
_start:
  # Enable the FPU
  li t0, 0x2000
  csrs mstatus, t0
  csrw	fcsr,x0
  la t0, .fdata0
  fld ft0, (t0)
  fcvt.wu.d a0, ft0, rmm
  li t0, 0x10
  sd a0, (t0)
  sw x0, 0(x0)
infinite_loop:
  j infinite_loop
.section ".fdata0","ax",@progbits
  .8byte 0x41efffffffffffff # 4.29497e+09Expected and actual results
We expect a0=0xffffffffffffffff. I verified this with Spike.
However,  CVA6 gives a0=0.
Thanks! Flavien