Skip to content

Commit 261d4bb

Browse files
authored
[RISCV] f32 roundeven pattern missed for Zfa (llvm#118672)
f32 roundeven pattern was missing from RISCVInstrInfoZfa.td. Tests for roundeven.f32/f16/f64 were missing.
1 parent 35c7df1 commit 261d4bb

File tree

4 files changed

+51
-10
lines changed

4 files changed

+51
-10
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoZfa.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ def: Pat<(any_frint FPR32:$rs1), (FROUNDNX_S FPR32:$rs1, FRM_DYN)>;
215215
def: Pat<(any_fnearbyint FPR32:$rs1), (FROUND_S FPR32:$rs1, FRM_DYN)>;
216216

217217
def: Pat<(any_fround FPR32:$rs1), (FROUND_S FPR32:$rs1, FRM_RMM)>;
218+
def: Pat<(any_froundeven FPR32:$rs1), (FROUND_S FPR32:$rs1, FRM_RNE)>;
218219
def: Pat<(any_ffloor FPR32:$rs1), (FROUND_S FPR32:$rs1, FRM_RDN)>;
219220
def: Pat<(any_fceil FPR32:$rs1), (FROUND_S FPR32:$rs1, FRM_RUP)>;
220221
def: Pat<(any_ftrunc FPR32:$rs1), (FROUND_S FPR32:$rs1, FRM_RTZ)>;

llvm/test/CodeGen/RISCV/double-zfa.ll

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,17 @@ define double @fround_d_5(double %a) nounwind {
243243

244244
declare double @nearbyint(double) nounwind readnone
245245

246+
define double @fround_d_6(double %a) nounwind {
247+
; CHECK-LABEL: fround_d_6:
248+
; CHECK: # %bb.0:
249+
; CHECK-NEXT: fround.d fa0, fa0, rne
250+
; CHECK-NEXT: ret
251+
%call = tail call double @llvm.roundeven.f64(double %a) nounwind readnone
252+
ret double %call
253+
}
254+
255+
declare double @llvm.roundeven.f64(double) nounwind readnone
256+
246257

247258
define double @froundnx_d(double %a) nounwind {
248259
; CHECK-LABEL: froundnx_d:
@@ -378,21 +389,21 @@ define double @select_loadfpimm(double %x) nounwind {
378389
; RV32IDZFA-NEXT: fcvt.d.w fa5, zero
379390
; RV32IDZFA-NEXT: fle.d a0, fa5, fa0
380391
; RV32IDZFA-NEXT: fli.d fa0, 0.5
381-
; RV32IDZFA-NEXT: bnez a0, .LBB35_2
392+
; RV32IDZFA-NEXT: bnez a0, .LBB36_2
382393
; RV32IDZFA-NEXT: # %bb.1:
383394
; RV32IDZFA-NEXT: fneg.d fa0, fa0
384-
; RV32IDZFA-NEXT: .LBB35_2: # %entry
395+
; RV32IDZFA-NEXT: .LBB36_2: # %entry
385396
; RV32IDZFA-NEXT: ret
386397
;
387398
; RV64DZFA-LABEL: select_loadfpimm:
388399
; RV64DZFA: # %bb.0: # %entry
389400
; RV64DZFA-NEXT: fmv.d.x fa5, zero
390401
; RV64DZFA-NEXT: fle.d a0, fa5, fa0
391402
; RV64DZFA-NEXT: fli.d fa0, 0.5
392-
; RV64DZFA-NEXT: bnez a0, .LBB35_2
403+
; RV64DZFA-NEXT: bnez a0, .LBB36_2
393404
; RV64DZFA-NEXT: # %bb.1:
394405
; RV64DZFA-NEXT: fneg.d fa0, fa0
395-
; RV64DZFA-NEXT: .LBB35_2: # %entry
406+
; RV64DZFA-NEXT: .LBB36_2: # %entry
396407
; RV64DZFA-NEXT: ret
397408
entry:
398409
%cmp = fcmp ult double %x, 0.000000e+00

llvm/test/CodeGen/RISCV/float-zfa.ll

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,17 @@ define float @fround_s_5(float %a) nounwind {
198198

199199
declare float @nearbyintf(float) nounwind readnone
200200

201+
define float @fround_s_6(float %a) nounwind {
202+
; CHECK-LABEL: fround_s_6:
203+
; CHECK: # %bb.0:
204+
; CHECK-NEXT: fround.s fa0, fa0, rne
205+
; CHECK-NEXT: ret
206+
%call = tail call float @llvm.roundeven.f32(float %a) nounwind readnone
207+
ret float %call
208+
}
209+
210+
declare float @llvm.roundeven.f32(float) nounwind readnone
211+
201212

202213
define float @froundnx_s(float %a) nounwind {
203214
; CHECK-LABEL: froundnx_s:
@@ -317,10 +328,10 @@ define float @select_loadfpimm(float %x) nounwind {
317328
; CHECK-NEXT: fmv.w.x fa5, zero
318329
; CHECK-NEXT: fle.s a0, fa5, fa0
319330
; CHECK-NEXT: fli.s fa0, 0.5
320-
; CHECK-NEXT: bnez a0, .LBB30_2
331+
; CHECK-NEXT: bnez a0, .LBB31_2
321332
; CHECK-NEXT: # %bb.1:
322333
; CHECK-NEXT: fneg.s fa0, fa0
323-
; CHECK-NEXT: .LBB30_2: # %entry
334+
; CHECK-NEXT: .LBB31_2: # %entry
324335
; CHECK-NEXT: ret
325336
entry:
326337
%cmp = fcmp ult float %x, 0.000000e+00

llvm/test/CodeGen/RISCV/half-zfa.ll

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,24 @@ define half @fround_h_5(half %a) nounwind {
140140

141141
declare half @llvm.nearbyint.f16(half) nounwind readnone
142142

143+
define half @fround_h_6(half %a) nounwind {
144+
; CHECK-LABEL: fround_h_6:
145+
; CHECK: # %bb.0:
146+
; CHECK-NEXT: fround.h fa0, fa0, rne
147+
; CHECK-NEXT: ret
148+
;
149+
; ZFHMIN-LABEL: fround_h_6:
150+
; ZFHMIN: # %bb.0:
151+
; ZFHMIN-NEXT: fcvt.s.h fa5, fa0
152+
; ZFHMIN-NEXT: fround.s fa5, fa5, rne
153+
; ZFHMIN-NEXT: fcvt.h.s fa0, fa5
154+
; ZFHMIN-NEXT: ret
155+
%call = tail call half @llvm.roundeven.f16(half %a) nounwind readnone
156+
ret half %call
157+
}
158+
159+
declare half @llvm.roundeven.f16(half) nounwind readnone
160+
143161

144162
define half @froundnx_h(half %a) nounwind {
145163
; CHECK-LABEL: froundnx_h:
@@ -321,10 +339,10 @@ define half @select_loadfpimm(half %x) nounwind {
321339
; CHECK-NEXT: fmv.h.x fa5, zero
322340
; CHECK-NEXT: fle.h a0, fa5, fa0
323341
; CHECK-NEXT: fli.h fa0, 0.5
324-
; CHECK-NEXT: bnez a0, .LBB16_2
342+
; CHECK-NEXT: bnez a0, .LBB17_2
325343
; CHECK-NEXT: # %bb.1:
326344
; CHECK-NEXT: fneg.h fa0, fa0
327-
; CHECK-NEXT: .LBB16_2: # %entry
345+
; CHECK-NEXT: .LBB17_2: # %entry
328346
; CHECK-NEXT: ret
329347
;
330348
; ZFHMIN-LABEL: select_loadfpimm:
@@ -334,8 +352,8 @@ define half @select_loadfpimm(half %x) nounwind {
334352
; ZFHMIN-NEXT: fle.s a0, fa4, fa5
335353
; ZFHMIN-NEXT: xori a0, a0, 1
336354
; ZFHMIN-NEXT: slli a0, a0, 1
337-
; ZFHMIN-NEXT: lui a1, %hi(.LCPI16_0)
338-
; ZFHMIN-NEXT: addi a1, a1, %lo(.LCPI16_0)
355+
; ZFHMIN-NEXT: lui a1, %hi(.LCPI17_0)
356+
; ZFHMIN-NEXT: addi a1, a1, %lo(.LCPI17_0)
339357
; ZFHMIN-NEXT: add a0, a1, a0
340358
; ZFHMIN-NEXT: flh fa0, 0(a0)
341359
; ZFHMIN-NEXT: ret

0 commit comments

Comments
 (0)