Skip to content

Commit dcc5ba4

Browse files
[PowerPC] Add missing patterns for lround when i32 is returned. (#111863)
The patch adds support for lround when the output type of the rounding is i32. The support for a rounding result of type i64 existed before this patch.
1 parent 6924fc0 commit dcc5ba4

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

llvm/lib/Target/PowerPC/PPCInstrVSX.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3606,6 +3606,10 @@ def : Pat<(i64 (lround f64:$S)),
36063606
(i64 (MFVSRD (FCTID (XSRDPI $S))))>;
36073607
def : Pat<(i64 (lround f32:$S)),
36083608
(i64 (MFVSRD (FCTID (XSRDPI (COPY_TO_REGCLASS $S, VSFRC)))))>;
3609+
def : Pat<(i32 (lround f64:$S)),
3610+
(i32 (MFVSRWZ (FCTIW (XSRDPI $S))))>;
3611+
def : Pat<(i32 (lround f32:$S)),
3612+
(i32 (MFVSRWZ (FCTIW (XSRDPI (COPY_TO_REGCLASS $S, VSFRC)))))>;
36093613
def : Pat<(i64 (llround f64:$S)),
36103614
(i64 (MFVSRD (FCTID (XSRDPI $S))))>;
36113615
def : Pat<(i64 (llround f32:$S)),

llvm/test/CodeGen/PowerPC/scalar-rounding-ops.ll

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,48 @@ entry:
214214

215215
declare i64 @llvm.lround.i64.f64(double)
216216

217+
define dso_local i32 @test_lroundi32f64(double %d) local_unnamed_addr {
218+
; BE-LABEL: test_lroundi32f64:
219+
; BE: # %bb.0: # %entry
220+
; BE-NEXT: mflr r0
221+
; BE-NEXT: stdu r1, -112(r1)
222+
; BE-NEXT: std r0, 128(r1)
223+
; BE-NEXT: .cfi_def_cfa_offset 112
224+
; BE-NEXT: .cfi_offset lr, 16
225+
; BE-NEXT: bl lround
226+
; BE-NEXT: nop
227+
; BE-NEXT: addi r1, r1, 112
228+
; BE-NEXT: ld r0, 16(r1)
229+
; BE-NEXT: mtlr r0
230+
; BE-NEXT: blr
231+
;
232+
; CHECK-LABEL: test_lroundi32f64:
233+
; CHECK: # %bb.0: # %entry
234+
; CHECK-NEXT: mflr r0
235+
; CHECK-NEXT: stdu r1, -32(r1)
236+
; CHECK-NEXT: std r0, 48(r1)
237+
; CHECK-NEXT: .cfi_def_cfa_offset 32
238+
; CHECK-NEXT: .cfi_offset lr, 16
239+
; CHECK-NEXT: bl lround
240+
; CHECK-NEXT: nop
241+
; CHECK-NEXT: addi r1, r1, 32
242+
; CHECK-NEXT: ld r0, 16(r1)
243+
; CHECK-NEXT: mtlr r0
244+
; CHECK-NEXT: blr
245+
;
246+
; FAST-LABEL: test_lroundi32f64:
247+
; FAST: # %bb.0: # %entry
248+
; FAST-NEXT: xsrdpi f0, f1
249+
; FAST-NEXT: fctiw f0, f0
250+
; FAST-NEXT: mffprwz r3, f0
251+
; FAST-NEXT: blr
252+
entry:
253+
%0 = tail call i32 @llvm.lround.i32.f64(double %d)
254+
ret i32 %0
255+
}
256+
257+
declare i32 @llvm.lround.i32.f64(double)
258+
217259
define dso_local i64 @test_lroundf(float %f) local_unnamed_addr {
218260
; BE-LABEL: test_lroundf:
219261
; BE: # %bb.0: # %entry
@@ -256,6 +298,48 @@ entry:
256298

257299
declare i64 @llvm.lround.i64.f32(float)
258300

301+
define dso_local i32 @test_lroundi32f32(float %d) local_unnamed_addr {
302+
; BE-LABEL: test_lroundi32f32:
303+
; BE: # %bb.0: # %entry
304+
; BE-NEXT: mflr r0
305+
; BE-NEXT: stdu r1, -112(r1)
306+
; BE-NEXT: std r0, 128(r1)
307+
; BE-NEXT: .cfi_def_cfa_offset 112
308+
; BE-NEXT: .cfi_offset lr, 16
309+
; BE-NEXT: bl lroundf
310+
; BE-NEXT: nop
311+
; BE-NEXT: addi r1, r1, 112
312+
; BE-NEXT: ld r0, 16(r1)
313+
; BE-NEXT: mtlr r0
314+
; BE-NEXT: blr
315+
;
316+
; CHECK-LABEL: test_lroundi32f32:
317+
; CHECK: # %bb.0: # %entry
318+
; CHECK-NEXT: mflr r0
319+
; CHECK-NEXT: stdu r1, -32(r1)
320+
; CHECK-NEXT: std r0, 48(r1)
321+
; CHECK-NEXT: .cfi_def_cfa_offset 32
322+
; CHECK-NEXT: .cfi_offset lr, 16
323+
; CHECK-NEXT: bl lroundf
324+
; CHECK-NEXT: nop
325+
; CHECK-NEXT: addi r1, r1, 32
326+
; CHECK-NEXT: ld r0, 16(r1)
327+
; CHECK-NEXT: mtlr r0
328+
; CHECK-NEXT: blr
329+
;
330+
; FAST-LABEL: test_lroundi32f32:
331+
; FAST: # %bb.0: # %entry
332+
; FAST-NEXT: xsrdpi f0, f1
333+
; FAST-NEXT: fctiw f0, f0
334+
; FAST-NEXT: mffprwz r3, f0
335+
; FAST-NEXT: blr
336+
entry:
337+
%0 = tail call i32 @llvm.lround.i32.f32(float %d)
338+
ret i32 %0
339+
}
340+
341+
declare i32 @llvm.lround.i32.f32(float)
342+
259343
define dso_local i64 @test_llround(double %d) local_unnamed_addr {
260344
; BE-LABEL: test_llround:
261345
; BE: # %bb.0: # %entry

0 commit comments

Comments
 (0)