Skip to content

Commit 2a9f93b

Browse files
authored
[RISCV] Use RNE rounding mode for fcvt.s.bf16. Don't print the rounding mode if RNE. (#106948)
The rounding mode has no effect on the instruction behavior. Using RNE matches what we do for fcvt.s.h, fcvt.d.f, fcvt.d.h which are similarily not affected by the rounding mode. This appears to match the behavior of binutils. According to compiler explore, objdump is unable to disassembler fcvt.s.bf16 with a non-zero rounding mode.
1 parent e1bde1c commit 2a9f93b

File tree

4 files changed

+23
-17
lines changed

4 files changed

+23
-17
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoZfbfmin.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def riscv_fpround_bf16
3030
let Predicates = [HasStdExtZfbfmin] in {
3131
def FCVT_BF16_S : FPUnaryOp_r_frm<0b0100010, 0b01000, FPR16, FPR32, "fcvt.bf16.s">,
3232
Sched<[WriteFCvtF32ToF16, ReadFCvtF32ToF16]>;
33-
def FCVT_S_BF16 : FPUnaryOp_r_frm<0b0100000, 0b00110, FPR32, FPR16, "fcvt.s.bf16">,
33+
def FCVT_S_BF16 : FPUnaryOp_r_frmlegacy<0b0100000, 0b00110, FPR32, FPR16, "fcvt.s.bf16">,
3434
Sched<[WriteFCvtF16ToF32, ReadFCvtF16ToF32]>;
3535
} // Predicates = [HasStdExtZfbfmin]
3636

@@ -50,7 +50,7 @@ def : StPat<store, FSH, FPR16, bf16>;
5050
def : Pat<(bf16 (riscv_fpround_bf16 FPR32:$rs1)),
5151
(FCVT_BF16_S FPR32:$rs1, FRM_DYN)>;
5252
def : Pat<(fpextend (bf16 FPR16:$rs1)),
53-
(FCVT_S_BF16 FPR16:$rs1, FRM_DYN)>;
53+
(FCVT_S_BF16 FPR16:$rs1, FRM_RNE)>;
5454

5555
// Moves (no conversion)
5656
def : Pat<(bf16 (riscv_fmv_h_x GPR:$src)), (FMV_H_X GPR:$src)>;

llvm/test/CodeGen/RISCV/bfloat-convert.ll

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
define i16 @fcvt_si_bf16(bfloat %a) nounwind {
1919
; CHECK32ZFBFMIN-LABEL: fcvt_si_bf16:
2020
; CHECK32ZFBFMIN: # %bb.0:
21-
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
21+
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
2222
; CHECK32ZFBFMIN-NEXT: fcvt.w.s a0, fa5, rtz
2323
; CHECK32ZFBFMIN-NEXT: ret
2424
;
@@ -32,7 +32,7 @@ define i16 @fcvt_si_bf16(bfloat %a) nounwind {
3232
;
3333
; CHECK64ZFBFMIN-LABEL: fcvt_si_bf16:
3434
; CHECK64ZFBFMIN: # %bb.0:
35-
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
35+
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
3636
; CHECK64ZFBFMIN-NEXT: fcvt.l.s a0, fa5, rtz
3737
; CHECK64ZFBFMIN-NEXT: ret
3838
;
@@ -120,7 +120,7 @@ declare i16 @llvm.fptosi.sat.i16.bf16(bfloat)
120120
define i16 @fcvt_ui_bf16(bfloat %a) nounwind {
121121
; CHECK32ZFBFMIN-LABEL: fcvt_ui_bf16:
122122
; CHECK32ZFBFMIN: # %bb.0:
123-
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
123+
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
124124
; CHECK32ZFBFMIN-NEXT: fcvt.wu.s a0, fa5, rtz
125125
; CHECK32ZFBFMIN-NEXT: ret
126126
;
@@ -134,7 +134,7 @@ define i16 @fcvt_ui_bf16(bfloat %a) nounwind {
134134
;
135135
; CHECK64ZFBFMIN-LABEL: fcvt_ui_bf16:
136136
; CHECK64ZFBFMIN: # %bb.0:
137-
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
137+
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
138138
; CHECK64ZFBFMIN-NEXT: fcvt.lu.s a0, fa5, rtz
139139
; CHECK64ZFBFMIN-NEXT: ret
140140
;
@@ -206,7 +206,7 @@ declare i16 @llvm.fptoui.sat.i16.bf16(bfloat)
206206
define i32 @fcvt_w_bf16(bfloat %a) nounwind {
207207
; CHECK32ZFBFMIN-LABEL: fcvt_w_bf16:
208208
; CHECK32ZFBFMIN: # %bb.0:
209-
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
209+
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
210210
; CHECK32ZFBFMIN-NEXT: fcvt.w.s a0, fa5, rtz
211211
; CHECK32ZFBFMIN-NEXT: ret
212212
;
@@ -288,7 +288,7 @@ declare i32 @llvm.fptosi.sat.i32.bf16(bfloat)
288288
define i32 @fcvt_wu_bf16(bfloat %a) nounwind {
289289
; CHECK32ZFBFMIN-LABEL: fcvt_wu_bf16:
290290
; CHECK32ZFBFMIN: # %bb.0:
291-
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
291+
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
292292
; CHECK32ZFBFMIN-NEXT: fcvt.wu.s a0, fa5, rtz
293293
; CHECK32ZFBFMIN-NEXT: ret
294294
;
@@ -320,7 +320,7 @@ define i32 @fcvt_wu_bf16(bfloat %a) nounwind {
320320
define i32 @fcvt_wu_bf16_multiple_use(bfloat %x, ptr %y) nounwind {
321321
; CHECK32ZFBFMIN-LABEL: fcvt_wu_bf16_multiple_use:
322322
; CHECK32ZFBFMIN: # %bb.0:
323-
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
323+
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
324324
; CHECK32ZFBFMIN-NEXT: fcvt.wu.s a0, fa5, rtz
325325
; CHECK32ZFBFMIN-NEXT: seqz a1, a0
326326
; CHECK32ZFBFMIN-NEXT: add a0, a0, a1
@@ -438,7 +438,7 @@ define i64 @fcvt_l_bf16(bfloat %a) nounwind {
438438
;
439439
; CHECK64ZFBFMIN-LABEL: fcvt_l_bf16:
440440
; CHECK64ZFBFMIN: # %bb.0:
441-
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
441+
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
442442
; CHECK64ZFBFMIN-NEXT: fcvt.l.s a0, fa5, rtz
443443
; CHECK64ZFBFMIN-NEXT: ret
444444
;
@@ -625,7 +625,7 @@ define i64 @fcvt_lu_bf16(bfloat %a) nounwind {
625625
;
626626
; CHECK64ZFBFMIN-LABEL: fcvt_lu_bf16:
627627
; CHECK64ZFBFMIN: # %bb.0:
628-
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
628+
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
629629
; CHECK64ZFBFMIN-NEXT: fcvt.lu.s a0, fa5, rtz
630630
; CHECK64ZFBFMIN-NEXT: ret
631631
;
@@ -1470,7 +1470,7 @@ define signext i32 @fcvt_bf16_wu_demanded_bits(i32 signext %0, ptr %1) nounwind
14701470
define signext i8 @fcvt_w_s_i8(bfloat %a) nounwind {
14711471
; CHECK32ZFBFMIN-LABEL: fcvt_w_s_i8:
14721472
; CHECK32ZFBFMIN: # %bb.0:
1473-
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
1473+
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
14741474
; CHECK32ZFBFMIN-NEXT: fcvt.w.s a0, fa5, rtz
14751475
; CHECK32ZFBFMIN-NEXT: ret
14761476
;
@@ -1484,7 +1484,7 @@ define signext i8 @fcvt_w_s_i8(bfloat %a) nounwind {
14841484
;
14851485
; CHECK64ZFBFMIN-LABEL: fcvt_w_s_i8:
14861486
; CHECK64ZFBFMIN: # %bb.0:
1487-
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
1487+
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
14881488
; CHECK64ZFBFMIN-NEXT: fcvt.l.s a0, fa5, rtz
14891489
; CHECK64ZFBFMIN-NEXT: ret
14901490
;
@@ -1572,7 +1572,7 @@ declare i8 @llvm.fptosi.sat.i8.bf16(bfloat)
15721572
define zeroext i8 @fcvt_wu_s_i8(bfloat %a) nounwind {
15731573
; CHECK32ZFBFMIN-LABEL: fcvt_wu_s_i8:
15741574
; CHECK32ZFBFMIN: # %bb.0:
1575-
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
1575+
; CHECK32ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
15761576
; CHECK32ZFBFMIN-NEXT: fcvt.wu.s a0, fa5, rtz
15771577
; CHECK32ZFBFMIN-NEXT: ret
15781578
;
@@ -1586,7 +1586,7 @@ define zeroext i8 @fcvt_wu_s_i8(bfloat %a) nounwind {
15861586
;
15871587
; CHECK64ZFBFMIN-LABEL: fcvt_wu_s_i8:
15881588
; CHECK64ZFBFMIN: # %bb.0:
1589-
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0, rne
1589+
; CHECK64ZFBFMIN-NEXT: fcvt.s.bf16 fa5, fa0
15901590
; CHECK64ZFBFMIN-NEXT: fcvt.lu.s a0, fa5, rtz
15911591
; CHECK64ZFBFMIN-NEXT: ret
15921592
;

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,12 @@ fcvt.h.lu fa0, a0
193193

194194
# Zfbfmin instructions
195195

196-
# CHECK-INST: fcvt.s.bf16 fa0, fa0, dyn{{$}}
196+
# CHECK-INST: fcvt.s.bf16 fa0, fa0{{$}}
197197
# CHECK-ALIAS: fcvt.s.bf16 fa0, fa0{{$}}
198198
fcvt.s.bf16 fa0, fa0
199+
# CHECK-INST: fcvt.s.bf16 fa0, fa0{{$}}
200+
# CHECK-ALIAS: fcvt.s.bf16 fa0, fa0{{$}}
201+
fcvt.s.bf16 fa0, fa0, rne
199202

200203
# CHECK-INST: fcvt.bf16.s fa0, fa0, dyn{{$}}
201204
# CHECK-ALIAS: fcvt.bf16.s fa0, fa0{{$}}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,11 @@ fmv.x.h a2, fs7
4949
fmv.h.x ft1, a6
5050

5151
# CHECK-ASM-AND-OBJ: fcvt.s.bf16 fa0, ft0
52-
# CHECK-ASM: encoding: [0x53,0x75,0x60,0x40]
52+
# CHECK-ASM: encoding: [0x53,0x05,0x60,0x40]
5353
fcvt.s.bf16 fa0, ft0
54+
# CHECK-ASM-AND-OBJ: fcvt.s.bf16 fa0, ft0, rup
55+
# CHECK-ASM: encoding: [0x53,0x35,0x60,0x40]
56+
fcvt.s.bf16 fa0, ft0, rup
5457
# CHECK-ASM-AND-OBJ: fcvt.bf16.s ft2, fa2
5558
# CHECK-ASM: encoding: [0x53,0x71,0x86,0x44]
5659
fcvt.bf16.s ft2, fa2

0 commit comments

Comments
 (0)