Skip to content

Commit bf94ba3

Browse files
authored
[RISCV][MC] Fix all remaining fcvt instructions that didn't accept rounding mode but should have (llvm#67889)
This is a follow-up to llvm#67555, performing the same fix for the other instructions that had this issue: * fcvt.d.w * fcvt.d.wu * fcvt.s.h * fcvt.d.h As before, we stick to the 'rne' default because this gives maximum compatibility with older LLVM and GNU tools when disassembling. I've also double checked disassembling fp-default-rounding-mode.s with GNU objdump to re-confirm it uses frm=0b000 for these instructions.
1 parent d8127b2 commit bf94ba3

File tree

9 files changed

+110
-54
lines changed

9 files changed

+110
-54
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoD.td

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,12 @@ foreach Ext = DExts in {
140140
"fcvt.wu.d">,
141141
Sched<[WriteFCvtF64ToI32, ReadFCvtF64ToI32]>;
142142

143-
defm FCVT_D_W : FPUnaryOp_r_m<0b1101001, 0b00000, 0b000, Ext, Ext.PrimaryTy, GPR,
144-
"fcvt.d.w">,
143+
defm FCVT_D_W : FPUnaryOp_r_frmlegacy_m<0b1101001, 0b00000, Ext, Ext.PrimaryTy, GPR,
144+
"fcvt.d.w">,
145145
Sched<[WriteFCvtI32ToF64, ReadFCvtI32ToF64]>;
146146

147-
defm FCVT_D_WU : FPUnaryOp_r_m<0b1101001, 0b00001, 0b000, Ext, Ext.PrimaryTy, GPR,
148-
"fcvt.d.wu">,
147+
defm FCVT_D_WU : FPUnaryOp_r_frmlegacy_m<0b1101001, 0b00001, Ext, Ext.PrimaryTy, GPR,
148+
"fcvt.d.wu">,
149149
Sched<[WriteFCvtI32ToF64, ReadFCvtI32ToF64]>;
150150
} // foreach Ext = DExts
151151

@@ -555,8 +555,8 @@ def : Pat<(i32 (any_lrint FPR64:$rs1)), (FCVT_W_D $rs1, FRM_DYN)>;
555555
def : Pat<(i32 (any_lround FPR64:$rs1)), (FCVT_W_D $rs1, FRM_RMM)>;
556556

557557
// [u]int->double.
558-
def : Pat<(any_sint_to_fp (i32 GPR:$rs1)), (FCVT_D_W GPR:$rs1)>;
559-
def : Pat<(any_uint_to_fp (i32 GPR:$rs1)), (FCVT_D_WU GPR:$rs1)>;
558+
def : Pat<(any_sint_to_fp (i32 GPR:$rs1)), (FCVT_D_W GPR:$rs1, FRM_RNE)>;
559+
def : Pat<(any_uint_to_fp (i32 GPR:$rs1)), (FCVT_D_WU GPR:$rs1, FRM_RNE)>;
560560
} // Predicates = [HasStdExtD, IsRV32]
561561

562562
let Predicates = [HasStdExtZdinx, IsRV32] in {
@@ -576,8 +576,8 @@ def : Pat<(i32 (any_lrint FPR64IN32X:$rs1)), (FCVT_W_D_IN32X $rs1, FRM_DYN)>;
576576
def : Pat<(i32 (any_lround FPR64IN32X:$rs1)), (FCVT_W_D_IN32X $rs1, FRM_RMM)>;
577577

578578
// [u]int->double.
579-
def : Pat<(any_sint_to_fp (i32 GPR:$rs1)), (FCVT_D_W_IN32X GPR:$rs1)>;
580-
def : Pat<(any_uint_to_fp (i32 GPR:$rs1)), (FCVT_D_WU_IN32X GPR:$rs1)>;
579+
def : Pat<(any_sint_to_fp (i32 GPR:$rs1)), (FCVT_D_W_IN32X GPR:$rs1, FRM_RNE)>;
580+
def : Pat<(any_uint_to_fp (i32 GPR:$rs1)), (FCVT_D_WU_IN32X GPR:$rs1, FRM_RNE)>;
581581
} // Predicates = [HasStdExtZdinx, IsRV32]
582582

583583
let Predicates = [HasStdExtD, IsRV64] in {
@@ -593,8 +593,8 @@ def : Pat<(riscv_any_fcvt_w_rv64 FPR64:$rs1, timm:$frm), (FCVT_W_D $rs1, timm:$
593593
def : Pat<(riscv_any_fcvt_wu_rv64 FPR64:$rs1, timm:$frm), (FCVT_WU_D $rs1, timm:$frm)>;
594594

595595
// [u]int32->fp
596-
def : Pat<(any_sint_to_fp (i64 (sexti32 (i64 GPR:$rs1)))), (FCVT_D_W $rs1)>;
597-
def : Pat<(any_uint_to_fp (i64 (zexti32 (i64 GPR:$rs1)))), (FCVT_D_WU $rs1)>;
596+
def : Pat<(any_sint_to_fp (i64 (sexti32 (i64 GPR:$rs1)))), (FCVT_D_W $rs1, FRM_RNE)>;
597+
def : Pat<(any_uint_to_fp (i64 (zexti32 (i64 GPR:$rs1)))), (FCVT_D_WU $rs1, FRM_RNE)>;
598598

599599
// Saturating double->[u]int64.
600600
def : Pat<(i64 (riscv_fcvt_x FPR64:$rs1, timm:$frm)), (FCVT_L_D $rs1, timm:$frm)>;
@@ -630,8 +630,8 @@ def : Pat<(riscv_any_fcvt_w_rv64 FPR64INX:$rs1, timm:$frm), (FCVT_W_D_INX $rs1,
630630
def : Pat<(riscv_any_fcvt_wu_rv64 FPR64INX:$rs1, timm:$frm), (FCVT_WU_D_INX $rs1, timm:$frm)>;
631631

632632
// [u]int32->fp
633-
def : Pat<(any_sint_to_fp (i64 (sexti32 (i64 GPR:$rs1)))), (FCVT_D_W_INX $rs1)>;
634-
def : Pat<(any_uint_to_fp (i64 (zexti32 (i64 GPR:$rs1)))), (FCVT_D_WU_INX $rs1)>;
633+
def : Pat<(any_sint_to_fp (i64 (sexti32 (i64 GPR:$rs1)))), (FCVT_D_W_INX $rs1, FRM_RNE)>;
634+
def : Pat<(any_uint_to_fp (i64 (zexti32 (i64 GPR:$rs1)))), (FCVT_D_WU_INX $rs1, FRM_RNE)>;
635635

636636
// Saturating double->[u]int64.
637637
def : Pat<(i64 (riscv_fcvt_x FPR64INX:$rs1, timm:$frm)), (FCVT_L_D_INX $rs1, timm:$frm)>;

llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ foreach Ext = ZfhminExts in {
142142
Ext.F32Ty, "fcvt.h.s">,
143143
Sched<[WriteFCvtF32ToF16, ReadFCvtF32ToF16]>;
144144

145-
defm FCVT_S_H : FPUnaryOp_r_m<0b0100000, 0b00010, 0b000, Ext, Ext.F32Ty,
146-
Ext.PrimaryTy, "fcvt.s.h">,
145+
defm FCVT_S_H : FPUnaryOp_r_frmlegacy_m<0b0100000, 0b00010,Ext, Ext.F32Ty,
146+
Ext.PrimaryTy, "fcvt.s.h">,
147147
Sched<[WriteFCvtF16ToF32, ReadFCvtF16ToF32]>;
148148
} // foreach Ext = ZfhminExts
149149

@@ -191,8 +191,8 @@ foreach Ext = ZfhminDExts in {
191191
Ext.F64Ty, "fcvt.h.d">,
192192
Sched<[WriteFCvtF64ToF16, ReadFCvtF64ToF16]>;
193193

194-
defm FCVT_D_H : FPUnaryOp_r_m<0b0100001, 0b00010, 0b000, Ext, Ext.F64Ty,
195-
Ext.F16Ty, "fcvt.d.h">,
194+
defm FCVT_D_H : FPUnaryOp_r_frmlegacy_m<0b0100001, 0b00010, Ext, Ext.F64Ty,
195+
Ext.F16Ty, "fcvt.d.h">,
196196
Sched<[WriteFCvtF16ToF64, ReadFCvtF16ToF64]>;
197197
} // foreach Ext = ZfhminDExts
198198

@@ -439,29 +439,29 @@ let Predicates = [HasStdExtZfhOrZfhmin] in {
439439

440440
// f32 -> f16, f16 -> f32
441441
def : Pat<(f16 (any_fpround FPR32:$rs1)), (FCVT_H_S FPR32:$rs1, FRM_DYN)>;
442-
def : Pat<(any_fpextend (f16 FPR16:$rs1)), (FCVT_S_H FPR16:$rs1)>;
442+
def : Pat<(any_fpextend (f16 FPR16:$rs1)), (FCVT_S_H FPR16:$rs1, FRM_RNE)>;
443443

444444
// Moves (no conversion)
445445
def : Pat<(f16 (riscv_fmv_h_x GPR:$src)), (FMV_H_X GPR:$src)>;
446446
def : Pat<(riscv_fmv_x_anyexth (f16 FPR16:$src)), (FMV_X_H FPR16:$src)>;
447447
def : Pat<(riscv_fmv_x_signexth (f16 FPR16:$src)), (FMV_X_H FPR16:$src)>;
448448

449-
def : Pat<(fcopysign FPR32:$rs1, (f16 FPR16:$rs2)), (FSGNJ_S $rs1, (FCVT_S_H $rs2))>;
449+
def : Pat<(fcopysign FPR32:$rs1, (f16 FPR16:$rs2)), (FSGNJ_S $rs1, (FCVT_S_H $rs2, FRM_RNE))>;
450450
} // Predicates = [HasStdExtZfhOrZfhmin]
451451

452452
let Predicates = [HasStdExtZhinxOrZhinxmin] in {
453453
/// Float conversion operations
454454

455455
// f32 -> f16, f16 -> f32
456456
def : Pat<(any_fpround FPR32INX:$rs1), (FCVT_H_S_INX FPR32INX:$rs1, FRM_DYN)>;
457-
def : Pat<(any_fpextend FPR16INX:$rs1), (FCVT_S_H_INX FPR16INX:$rs1)>;
457+
def : Pat<(any_fpextend FPR16INX:$rs1), (FCVT_S_H_INX FPR16INX:$rs1, FRM_RNE)>;
458458

459459
// Moves (no conversion)
460460
def : Pat<(f16 (riscv_fmv_h_x GPR:$src)), (COPY_TO_REGCLASS GPR:$src, GPR)>;
461461
def : Pat<(riscv_fmv_x_anyexth FPR16INX:$src), (COPY_TO_REGCLASS FPR16INX:$src, GPR)>;
462462
def : Pat<(riscv_fmv_x_signexth FPR16INX:$src), (COPY_TO_REGCLASS FPR16INX:$src, GPR)>;
463463

464-
def : Pat<(fcopysign FPR32INX:$rs1, FPR16INX:$rs2), (FSGNJ_S_INX $rs1, (FCVT_S_H_INX $rs2))>;
464+
def : Pat<(fcopysign FPR32INX:$rs1, FPR16INX:$rs2), (FSGNJ_S_INX $rs1, (FCVT_S_H_INX $rs2, FRM_RNE))>;
465465
} // Predicates = [HasStdExtZhinxOrZhinxmin]
466466

467467
let Predicates = [HasStdExtZfh, IsRV32] in {
@@ -568,48 +568,48 @@ let Predicates = [HasStdExtZfhOrZfhmin, HasStdExtD] in {
568568
/// Float conversion operations
569569
// f64 -> f16, f16 -> f64
570570
def : Pat<(f16 (any_fpround FPR64:$rs1)), (FCVT_H_D FPR64:$rs1, FRM_DYN)>;
571-
def : Pat<(any_fpextend (f16 FPR16:$rs1)), (FCVT_D_H FPR16:$rs1)>;
571+
def : Pat<(any_fpextend (f16 FPR16:$rs1)), (FCVT_D_H FPR16:$rs1, FRM_RNE)>;
572572

573573
/// Float arithmetic operations
574574
def : Pat<(f16 (fcopysign FPR16:$rs1, FPR64:$rs2)),
575575
(FSGNJ_H $rs1, (FCVT_H_D $rs2, FRM_DYN))>;
576-
def : Pat<(fcopysign FPR64:$rs1, (f16 FPR16:$rs2)), (FSGNJ_D $rs1, (FCVT_D_H $rs2))>;
576+
def : Pat<(fcopysign FPR64:$rs1, (f16 FPR16:$rs2)), (FSGNJ_D $rs1, (FCVT_D_H $rs2, FRM_RNE))>;
577577
} // Predicates = [HasStdExtZfhOrZfhmin, HasStdExtD]
578578

579579
let Predicates = [HasStdExtZhinxOrZhinxmin, HasStdExtZdinx, IsRV32] in {
580580
/// Float conversion operations
581581
// f64 -> f16, f16 -> f64
582582
def : Pat<(any_fpround FPR64IN32X:$rs1), (FCVT_H_D_IN32X FPR64IN32X:$rs1, FRM_DYN)>;
583-
def : Pat<(any_fpextend FPR16INX:$rs1), (FCVT_D_H_IN32X FPR16INX:$rs1)>;
583+
def : Pat<(any_fpextend FPR16INX:$rs1), (FCVT_D_H_IN32X FPR16INX:$rs1, FRM_RNE)>;
584584

585585
/// Float arithmetic operations
586586
def : Pat<(fcopysign FPR16INX:$rs1, FPR64IN32X:$rs2),
587587
(FSGNJ_H_INX $rs1, (FCVT_H_D_IN32X $rs2, 0b111))>;
588-
def : Pat<(fcopysign FPR64IN32X:$rs1, FPR16INX:$rs2), (FSGNJ_D_IN32X $rs1, (FCVT_D_H_IN32X $rs2))>;
588+
def : Pat<(fcopysign FPR64IN32X:$rs1, FPR16INX:$rs2), (FSGNJ_D_IN32X $rs1, (FCVT_D_H_IN32X $rs2, FRM_RNE))>;
589589
} // Predicates = [HasStdExtZhinxOrZhinxmin, HasStdExtZdinx, IsRV32]
590590

591591
let Predicates = [HasStdExtZhinxOrZhinxmin, HasStdExtZdinx, IsRV64] in {
592592
/// Float conversion operations
593593
// f64 -> f16, f16 -> f64
594594
def : Pat<(any_fpround FPR64INX:$rs1), (FCVT_H_D_INX FPR64INX:$rs1, FRM_DYN)>;
595-
def : Pat<(any_fpextend FPR16INX:$rs1), (FCVT_D_H_INX FPR16INX:$rs1)>;
595+
def : Pat<(any_fpextend FPR16INX:$rs1), (FCVT_D_H_INX FPR16INX:$rs1, FRM_RNE)>;
596596

597597
/// Float arithmetic operations
598598
def : Pat<(fcopysign FPR16INX:$rs1, FPR64INX:$rs2),
599599
(FSGNJ_H_INX $rs1, (FCVT_H_D_INX $rs2, 0b111))>;
600-
def : Pat<(fcopysign FPR64INX:$rs1, FPR16INX:$rs2), (FSGNJ_D_INX $rs1, (FCVT_D_H_INX $rs2))>;
600+
def : Pat<(fcopysign FPR64INX:$rs1, FPR16INX:$rs2), (FSGNJ_D_INX $rs1, (FCVT_D_H_INX $rs2, FRM_RNE))>;
601601
} // Predicates = [HasStdExtZhinxOrZhinxmin, HasStdExtZdinx, IsRV64]
602602

603603
let Predicates = [HasStdExtZfhmin, NoStdExtZfh, IsRV32] in {
604604
// half->[u]int. Round-to-zero must be used.
605-
def : Pat<(i32 (any_fp_to_sint (f16 FPR16:$rs1))), (FCVT_W_S (FCVT_S_H $rs1), FRM_RTZ)>;
606-
def : Pat<(i32 (any_fp_to_uint (f16 FPR16:$rs1))), (FCVT_WU_S (FCVT_S_H $rs1), FRM_RTZ)>;
605+
def : Pat<(i32 (any_fp_to_sint (f16 FPR16:$rs1))), (FCVT_W_S (FCVT_S_H $rs1, FRM_RNE), FRM_RTZ)>;
606+
def : Pat<(i32 (any_fp_to_uint (f16 FPR16:$rs1))), (FCVT_WU_S (FCVT_S_H $rs1, FRM_RNE), FRM_RTZ)>;
607607

608608
// half->int32 with current rounding mode.
609-
def : Pat<(i32 (any_lrint (f16 FPR16:$rs1))), (FCVT_W_S (FCVT_S_H $rs1), FRM_DYN)>;
609+
def : Pat<(i32 (any_lrint (f16 FPR16:$rs1))), (FCVT_W_S (FCVT_S_H $rs1, FRM_RNE), FRM_DYN)>;
610610

611611
// half->int32 rounded to nearest with ties rounded away from zero.
612-
def : Pat<(i32 (any_lround (f16 FPR16:$rs1))), (FCVT_W_S (FCVT_S_H $rs1), FRM_RMM)>;
612+
def : Pat<(i32 (any_lround (f16 FPR16:$rs1))), (FCVT_W_S (FCVT_S_H $rs1, FRM_RNE), FRM_RMM)>;
613613

614614
// [u]int->half. Match GCC and default to using dynamic rounding mode.
615615
def : Pat<(f16 (any_sint_to_fp (i32 GPR:$rs1))), (FCVT_H_S (FCVT_S_W $rs1, FRM_DYN), FRM_DYN)>;
@@ -618,14 +618,14 @@ def : Pat<(f16 (any_uint_to_fp (i32 GPR:$rs1))), (FCVT_H_S (FCVT_S_WU $rs1, FRM_
618618

619619
let Predicates = [HasStdExtZhinxmin, NoStdExtZhinx, IsRV32] in {
620620
// half->[u]int. Round-to-zero must be used.
621-
def : Pat<(i32 (any_fp_to_sint FPR16INX:$rs1)), (FCVT_W_S_INX (FCVT_S_H_INX $rs1), FRM_RTZ)>;
622-
def : Pat<(i32 (any_fp_to_uint FPR16INX:$rs1)), (FCVT_WU_S_INX (FCVT_S_H_INX $rs1), FRM_RTZ)>;
621+
def : Pat<(i32 (any_fp_to_sint FPR16INX:$rs1)), (FCVT_W_S_INX (FCVT_S_H_INX $rs1, FRM_RNE), FRM_RTZ)>;
622+
def : Pat<(i32 (any_fp_to_uint FPR16INX:$rs1)), (FCVT_WU_S_INX (FCVT_S_H_INX $rs1, FRM_RNE), FRM_RTZ)>;
623623

624624
// half->int32 with current rounding mode.
625-
def : Pat<(i32 (any_lrint FPR16INX:$rs1)), (FCVT_W_S_INX (FCVT_S_H_INX $rs1), FRM_DYN)>;
625+
def : Pat<(i32 (any_lrint FPR16INX:$rs1)), (FCVT_W_S_INX (FCVT_S_H_INX $rs1, FRM_RNE), FRM_DYN)>;
626626

627627
// half->int32 rounded to nearest with ties rounded away from zero.
628-
def : Pat<(i32 (any_lround FPR16INX:$rs1)), (FCVT_W_S_INX (FCVT_S_H_INX $rs1), FRM_RMM)>;
628+
def : Pat<(i32 (any_lround FPR16INX:$rs1)), (FCVT_W_S_INX (FCVT_S_H_INX $rs1, FRM_RNE), FRM_RMM)>;
629629

630630
// [u]int->half. Match GCC and default to using dynamic rounding mode.
631631
def : Pat<(any_sint_to_fp (i32 GPR:$rs1)), (FCVT_H_S_INX (FCVT_S_W_INX $rs1, FRM_DYN), FRM_DYN)>;
@@ -634,16 +634,16 @@ def : Pat<(any_uint_to_fp (i32 GPR:$rs1)), (FCVT_H_S_INX (FCVT_S_WU_INX $rs1, FR
634634

635635
let Predicates = [HasStdExtZfhmin, NoStdExtZfh, IsRV64] in {
636636
// half->[u]int64. Round-to-zero must be used.
637-
def : Pat<(i64 (any_fp_to_sint (f16 FPR16:$rs1))), (FCVT_L_S (FCVT_S_H $rs1), FRM_RTZ)>;
638-
def : Pat<(i64 (any_fp_to_uint (f16 FPR16:$rs1))), (FCVT_LU_S (FCVT_S_H $rs1), FRM_RTZ)>;
637+
def : Pat<(i64 (any_fp_to_sint (f16 FPR16:$rs1))), (FCVT_L_S (FCVT_S_H $rs1, FRM_RNE), FRM_RTZ)>;
638+
def : Pat<(i64 (any_fp_to_uint (f16 FPR16:$rs1))), (FCVT_LU_S (FCVT_S_H $rs1, FRM_RNE), FRM_RTZ)>;
639639

640640
// half->int64 with current rounding mode.
641-
def : Pat<(i64 (any_lrint (f16 FPR16:$rs1))), (FCVT_L_S (FCVT_S_H $rs1), FRM_DYN)>;
642-
def : Pat<(i64 (any_llrint (f16 FPR16:$rs1))), (FCVT_L_S (FCVT_S_H $rs1), FRM_DYN)>;
641+
def : Pat<(i64 (any_lrint (f16 FPR16:$rs1))), (FCVT_L_S (FCVT_S_H $rs1, FRM_RNE), FRM_DYN)>;
642+
def : Pat<(i64 (any_llrint (f16 FPR16:$rs1))), (FCVT_L_S (FCVT_S_H $rs1, FRM_RNE), FRM_DYN)>;
643643

644644
// half->int64 rounded to nearest with ties rounded away from zero.
645-
def : Pat<(i64 (any_lround (f16 FPR16:$rs1))), (FCVT_L_S (FCVT_S_H $rs1), FRM_RMM)>;
646-
def : Pat<(i64 (any_llround (f16 FPR16:$rs1))), (FCVT_L_S (FCVT_S_H $rs1), FRM_RMM)>;
645+
def : Pat<(i64 (any_lround (f16 FPR16:$rs1))), (FCVT_L_S (FCVT_S_H $rs1, FRM_RNE), FRM_RMM)>;
646+
def : Pat<(i64 (any_llround (f16 FPR16:$rs1))), (FCVT_L_S (FCVT_S_H $rs1, FRM_RNE), FRM_RMM)>;
647647

648648
// [u]int->fp. Match GCC and default to using dynamic rounding mode.
649649
def : Pat<(f16 (any_sint_to_fp (i64 GPR:$rs1))), (FCVT_H_S (FCVT_S_L $rs1, FRM_DYN), FRM_DYN)>;
@@ -652,16 +652,16 @@ def : Pat<(f16 (any_uint_to_fp (i64 GPR:$rs1))), (FCVT_H_S (FCVT_S_LU $rs1, FRM_
652652

653653
let Predicates = [HasStdExtZhinxmin, NoStdExtZhinx, IsRV64] in {
654654
// half->[u]int64. Round-to-zero must be used.
655-
def : Pat<(i64 (any_fp_to_sint FPR16INX:$rs1)), (FCVT_L_S_INX (FCVT_S_H_INX $rs1), FRM_RTZ)>;
656-
def : Pat<(i64 (any_fp_to_uint FPR16INX:$rs1)), (FCVT_LU_S_INX (FCVT_S_H_INX $rs1), FRM_RTZ)>;
655+
def : Pat<(i64 (any_fp_to_sint FPR16INX:$rs1)), (FCVT_L_S_INX (FCVT_S_H_INX $rs1, FRM_RNE), FRM_RTZ)>;
656+
def : Pat<(i64 (any_fp_to_uint FPR16INX:$rs1)), (FCVT_LU_S_INX (FCVT_S_H_INX $rs1, FRM_RNE), FRM_RTZ)>;
657657

658658
// half->int64 with current rounding mode.
659-
def : Pat<(i64 (any_lrint FPR16INX:$rs1)), (FCVT_L_S_INX (FCVT_S_H_INX $rs1), FRM_DYN)>;
660-
def : Pat<(i64 (any_llrint FPR16INX:$rs1)), (FCVT_L_S_INX (FCVT_S_H_INX $rs1), FRM_DYN)>;
659+
def : Pat<(i64 (any_lrint FPR16INX:$rs1)), (FCVT_L_S_INX (FCVT_S_H_INX $rs1, FRM_RNE), FRM_DYN)>;
660+
def : Pat<(i64 (any_llrint FPR16INX:$rs1)), (FCVT_L_S_INX (FCVT_S_H_INX $rs1, FRM_RNE), FRM_DYN)>;
661661

662662
// half->int64 rounded to nearest with ties rounded away from zero.
663-
def : Pat<(i64 (any_lround FPR16INX:$rs1)), (FCVT_L_S_INX (FCVT_S_H_INX $rs1), FRM_RMM)>;
664-
def : Pat<(i64 (any_llround FPR16INX:$rs1)), (FCVT_L_S_INX (FCVT_S_H_INX $rs1), FRM_RMM)>;
663+
def : Pat<(i64 (any_lround FPR16INX:$rs1)), (FCVT_L_S_INX (FCVT_S_H_INX $rs1, FRM_RNE), FRM_RMM)>;
664+
def : Pat<(i64 (any_llround FPR16INX:$rs1)), (FCVT_L_S_INX (FCVT_S_H_INX $rs1, FRM_RNE), FRM_RMM)>;
665665

666666
// [u]int->fp. Match GCC and default to using dynamic rounding mode.
667667
def : Pat<(any_sint_to_fp (i64 GPR:$rs1)), (FCVT_H_S_INX (FCVT_S_L_INX $rs1, FRM_DYN), FRM_DYN)>;

llvm/test/MC/RISCV/fp-default-rounding-mode.s

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,23 @@ fcvt.w.d a0, fa0
8989
# CHECK-ALIAS: fcvt.wu.d a0, fa0{{$}}
9090
fcvt.wu.d a0, fa0
9191

92-
# FIXME: fcvt.d.w should have a default rounding mode.
92+
# For historical reasons defaults to frm==0b000 (rne) but doesn't print this
93+
# default rounding mode.
9394
# CHECK-INST: fcvt.d.w fa0, a0{{$}}
9495
# CHECK-ALIAS: fcvt.d.w fa0, a0{{$}}
9596
fcvt.d.w fa0, a0
97+
# CHECK-INST: fcvt.d.w fa0, a0{{$}}
98+
# CHECK-ALIAS: fcvt.d.w fa0, a0{{$}}
99+
fcvt.d.w fa0, a0, rne
96100

97-
# FIXME: fcvt.d.wu should have a default rounding mode.
101+
# For historical reasons defaults to frm==0b000 (rne) but doesn't print this
102+
# default rounding mode.
98103
# CHECK-INST: fcvt.d.wu fa0, a0{{$}}
99104
# CHECK-ALIAS: fcvt.d.wu fa0, a0{{$}}
100105
fcvt.d.wu fa0, a0
106+
# CHECK-INST: fcvt.d.wu fa0, a0{{$}}
107+
# CHECK-ALIAS: fcvt.d.wu fa0, a0{{$}}
108+
fcvt.d.wu fa0, a0, rne
101109

102110
# CHECK-INST: fcvt.l.d a0, fa0, dyn{{$}}
103111
# CHECK-ALIAS: fcvt.l.d a0, fa0{{$}}
@@ -125,19 +133,27 @@ fmadd.h fa0, fa1, fa2, fa3
125133
# CHECK-ALIAS: fadd.h fa0, fa1, fa2{{$}}
126134
fadd.h fa0, fa1, fa2
127135

128-
# FIXME: fcvt.s.h should have a default rounding mode.
136+
# For historical reasons defaults to frm==0b000 (rne) but doesn't print this
137+
# default rounding mode.
129138
# CHECK-INST: fcvt.s.h fa0, fa0{{$}}
130139
# CHECK-ALIAS: fcvt.s.h fa0, fa0{{$}}
131140
fcvt.s.h fa0, fa0
141+
# CHECK-INST: fcvt.s.h fa0, fa0{{$}}
142+
# CHECK-ALIAS: fcvt.s.h fa0, fa0{{$}}
143+
fcvt.s.h fa0, fa0, rne
132144

133145
# CHECK-INST: fcvt.h.s fa0, fa0, dyn{{$}}
134146
# CHECK-ALIAS: fcvt.h.s fa0, fa0{{$}}
135147
fcvt.h.s fa0, fa0
136148

137-
# FIXME: fcvt.d.h should have a default rounding mode.
149+
# For historical reasons defaults to frm==0b000 (rne) but doesn't print this
150+
# default rounding mode.
138151
# CHECK-INST: fcvt.d.h fa0, fa0{{$}}
139152
# CHECK-ALIAS: fcvt.d.h fa0, fa0{{$}}
140153
fcvt.d.h fa0, fa0
154+
# CHECK-INST: fcvt.d.h fa0, fa0{{$}}
155+
# CHECK-ALIAS: fcvt.d.h fa0, fa0{{$}}
156+
fcvt.d.h fa0, fa0, rne
141157

142158
# CHECK-INST: fcvt.h.d fa0, fa0, dyn{{$}}
143159
# CHECK-ALIAS: fcvt.h.d fa0, fa0{{$}}

llvm/test/MC/RISCV/fp-inx-default-rounding-mode.s

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,23 @@ fcvt.w.d a0, a0
9292
# CHECK-ALIAS: fcvt.wu.d a0, a0{{$}}
9393
fcvt.wu.d a0, a0
9494

95-
# FIXME: fcvt.d.w should have a default rounding mode.
95+
# For historical reasons defaults to frm==0b000 (rne) but doesn't print this
96+
# default rounding mode.
9697
# CHECK-INST: fcvt.d.w a0, a0{{$}}
9798
# CHECK-ALIAS: fcvt.d.w a0, a0{{$}}
9899
fcvt.d.w a0, a0
100+
# CHECK-INST: fcvt.d.w a0, a0{{$}}
101+
# CHECK-ALIAS: fcvt.d.w a0, a0{{$}}
102+
fcvt.d.w a0, a0, rne
99103

100-
# FIXME: fcvt.d.wu should have a default rounding mode.
104+
# For historical reasons defaults to frm==0b000 (rne) but doesn't print this
105+
# default rounding mode.
101106
# CHECK-INST: fcvt.d.wu a0, a0{{$}}
102107
# CHECK-ALIAS: fcvt.d.wu a0, a0{{$}}
103108
fcvt.d.wu a0, a0
109+
# CHECK-INST: fcvt.d.wu a0, a0{{$}}
110+
# CHECK-ALIAS: fcvt.d.wu a0, a0{{$}}
111+
fcvt.d.wu a0, a0, rne
104112

105113
# CHECK-INST: fcvt.l.d a0, a0, dyn{{$}}
106114
# CHECK-ALIAS: fcvt.l.d a0, a0{{$}}
@@ -128,19 +136,27 @@ fmadd.h a0, a1, a2, a3
128136
# CHECK-ALIAS: fadd.h a0, a1, a2{{$}}
129137
fadd.h a0, a1, a2
130138

131-
# FIXME: fcvt.s.h should have a default rounding mode.
139+
# For historical reasons defaults to frm==0b000 (rne) but doesn't print this
140+
# default rounding mode.
132141
# CHECK-INST: fcvt.s.h a0, a0{{$}}
133142
# CHECK-ALIAS: fcvt.s.h a0, a0{{$}}
134143
fcvt.s.h a0, a0
144+
# CHECK-INST: fcvt.s.h a0, a0{{$}}
145+
# CHECK-ALIAS: fcvt.s.h a0, a0{{$}}
146+
fcvt.s.h a0, a0, rne
135147

136148
# CHECK-INST: fcvt.h.s a0, a0, dyn{{$}}
137149
# CHECK-ALIAS: fcvt.h.s a0, a0{{$}}
138150
fcvt.h.s a0, a0
139151

140-
# FIXME: fcvt.d.h should have a default rounding mode.
152+
# For historical reasons defaults to frm==0b000 (rne) but doesn't print this
153+
# default rounding mode.
141154
# CHECK-INST: fcvt.d.h a0, a0{{$}}
142155
# CHECK-ALIAS: fcvt.d.h a0, a0{{$}}
143156
fcvt.d.h a0, a0
157+
# CHECK-INST: fcvt.d.h a0, a0{{$}}
158+
# CHECK-ALIAS: fcvt.d.h a0, a0{{$}}
159+
fcvt.d.h a0, a0, rne
144160

145161
# CHECK-INST: fcvt.h.d a0, a0, dyn{{$}}
146162
# CHECK-ALIAS: fcvt.h.d a0, a0{{$}}

llvm/test/MC/RISCV/rv32d-valid.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,15 @@ fcvt.w.d a4, ft11, dyn
118118
# CHECK-ASM-AND-OBJ: fcvt.d.w ft0, a5
119119
# CHECK-ASM: encoding: [0x53,0x80,0x07,0xd2]
120120
fcvt.d.w ft0, a5
121+
# CHECK-ASM-AND-OBJ: fcvt.d.w ft0, a5, rup
122+
# CHECK-ASM: encoding: [0x53,0xb0,0x07,0xd2]
123+
fcvt.d.w ft0, a5, rup
121124
# CHECK-ASM-AND-OBJ: fcvt.d.wu ft1, a6
122125
# CHECK-ASM: encoding: [0xd3,0x00,0x18,0xd2]
123126
fcvt.d.wu ft1, a6
127+
# CHECK-ASM-AND-OBJ: fcvt.d.wu ft1, a6, rup
128+
# CHECK-ASM: encoding: [0xd3,0x30,0x18,0xd2]
129+
fcvt.d.wu ft1, a6, rup
124130

125131
# Rounding modes
126132

llvm/test/MC/RISCV/rv32zdinx-valid.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,15 @@ fcvt.w.d x20, x22, dyn
8181
# CHECK-ASM-AND-OBJ: fcvt.d.w s10, t3
8282
# CHECK-ASM: encoding: [0x53,0x0d,0x0e,0xd2]
8383
fcvt.d.w x26, x28
84+
# CHECK-ASM-AND-OBJ: fcvt.d.w s10, t3, rup
85+
# CHECK-ASM: encoding: [0x53,0x3d,0x0e,0xd2]
86+
fcvt.d.w x26, x28, rup
8487
# CHECK-ASM-AND-OBJ: fcvt.d.wu s10, t3
8588
# CHECK-ASM: encoding: [0x53,0x0d,0x1e,0xd2]
8689
fcvt.d.wu x26, x28
90+
# CHECK-ASM-AND-OBJ: fcvt.d.wu s10, t3, rup
91+
# CHECK-ASM: encoding: [0x53,0x3d,0x1e,0xd2]
92+
fcvt.d.wu x26, x28, rup
8793

8894
# Rounding modes
8995

0 commit comments

Comments
 (0)