Skip to content

Commit 0cb48f4

Browse files
authored
Don't set RM field when fcvt doesn't round (#98857)
CPUs and QEMU tend to ignore it but according to RISC-V ISA fcvt.d.s or fcvt.d.w[u] never round so it is an error. Besides, external disassemblers choke on it.
1 parent 463869b commit 0cb48f4

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

src/coreclr/jit/emitriscv64.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -625,15 +625,17 @@ void emitter::emitIns_R_R(
625625
assert(isGeneralRegisterOrR0(reg2));
626626
code |= (reg1 & 0x1f) << 7;
627627
code |= reg2 << 15;
628-
code |= 0x7 << 12;
628+
if (INS_fcvt_d_w != ins && INS_fcvt_d_wu != ins) // fcvt.d.w[u] always produces an exact result
629+
code |= 0x7 << 12; // round according to frm status register
629630
}
630631
else if (INS_fcvt_s_d == ins || INS_fcvt_d_s == ins)
631632
{
632633
assert(isFloatReg(reg1));
633634
assert(isFloatReg(reg2));
634635
code |= (reg1 & 0x1f) << 7;
635636
code |= (reg2 & 0x1f) << 15;
636-
code |= 0x7 << 12;
637+
if (INS_fcvt_d_s != ins) // fcvt.d.s never rounds
638+
code |= 0x7 << 12; // round according to frm status register
637639
}
638640
else
639641
{

0 commit comments

Comments
 (0)