Skip to content

Commit 27b6f75

Browse files
committed
[AArch64] Add tests for frem power2 lowering. NFC
1 parent c18bcd0 commit 27b6f75

File tree

1 file changed

+371
-0
lines changed

1 file changed

+371
-0
lines changed
Lines changed: 371 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,371 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+
; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4+
5+
define float @frem2(float %x) {
6+
; CHECK-LABEL: frem2:
7+
; CHECK: // %bb.0: // %entry
8+
; CHECK-NEXT: fmov s1, #2.00000000
9+
; CHECK-NEXT: b fmodf
10+
entry:
11+
%fmod = frem float %x, 2.0
12+
ret float %fmod
13+
}
14+
15+
define float @frem2_nsz(float %x) {
16+
; CHECK-LABEL: frem2_nsz:
17+
; CHECK: // %bb.0: // %entry
18+
; CHECK-NEXT: fmov s1, #2.00000000
19+
; CHECK-NEXT: b fmodf
20+
entry:
21+
%fmod = frem nsz float %x, 2.0
22+
ret float %fmod
23+
}
24+
25+
define float @frem2_abs(float %x) {
26+
; CHECK-LABEL: frem2_abs:
27+
; CHECK: // %bb.0: // %entry
28+
; CHECK-NEXT: fabs s0, s0
29+
; CHECK-NEXT: fmov s1, #2.00000000
30+
; CHECK-NEXT: b fmodf
31+
entry:
32+
%a = tail call float @llvm.fabs.f32(float %x)
33+
%fmod = frem float %a, 2.0
34+
ret float %fmod
35+
}
36+
37+
define half @hrem2_nsz(half %x) {
38+
; CHECK-SD-LABEL: hrem2_nsz:
39+
; CHECK-SD: // %bb.0: // %entry
40+
; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
41+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 16
42+
; CHECK-SD-NEXT: .cfi_offset w30, -16
43+
; CHECK-SD-NEXT: fcvt s0, h0
44+
; CHECK-SD-NEXT: fmov s1, #2.00000000
45+
; CHECK-SD-NEXT: bl fmodf
46+
; CHECK-SD-NEXT: fcvt h0, s0
47+
; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
48+
; CHECK-SD-NEXT: ret
49+
;
50+
; CHECK-GI-LABEL: hrem2_nsz:
51+
; CHECK-GI: // %bb.0: // %entry
52+
; CHECK-GI-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
53+
; CHECK-GI-NEXT: .cfi_def_cfa_offset 16
54+
; CHECK-GI-NEXT: .cfi_offset w30, -16
55+
; CHECK-GI-NEXT: fmov h1, #2.00000000
56+
; CHECK-GI-NEXT: fcvt s0, h0
57+
; CHECK-GI-NEXT: fcvt s1, h1
58+
; CHECK-GI-NEXT: bl fmodf
59+
; CHECK-GI-NEXT: fcvt h0, s0
60+
; CHECK-GI-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
61+
; CHECK-GI-NEXT: ret
62+
entry:
63+
%fmod = frem nsz half %x, 2.0
64+
ret half %fmod
65+
}
66+
67+
define double @drem2_nsz(double %x) {
68+
; CHECK-LABEL: drem2_nsz:
69+
; CHECK: // %bb.0: // %entry
70+
; CHECK-NEXT: fmov d1, #2.00000000
71+
; CHECK-NEXT: b fmod
72+
entry:
73+
%fmod = frem nsz double %x, 2.0
74+
ret double %fmod
75+
}
76+
77+
define float @frem3_nsz(float %x) {
78+
; CHECK-LABEL: frem3_nsz:
79+
; CHECK: // %bb.0: // %entry
80+
; CHECK-NEXT: fmov s1, #3.00000000
81+
; CHECK-NEXT: b fmodf
82+
entry:
83+
%fmod = frem nsz float %x, 3.0
84+
ret float %fmod
85+
}
86+
87+
define float @frem05_nsz(float %x) {
88+
; CHECK-LABEL: frem05_nsz:
89+
; CHECK: // %bb.0: // %entry
90+
; CHECK-NEXT: fmov s1, #0.50000000
91+
; CHECK-NEXT: b fmodf
92+
entry:
93+
%fmod = frem nsz float %x, 0.5
94+
ret float %fmod
95+
}
96+
97+
define float @fremm2_nsz(float %x) {
98+
; CHECK-LABEL: fremm2_nsz:
99+
; CHECK: // %bb.0: // %entry
100+
; CHECK-NEXT: fmov s1, #-2.00000000
101+
; CHECK-NEXT: b fmodf
102+
entry:
103+
%fmod = frem nsz float %x, -2.0
104+
ret float %fmod
105+
}
106+
107+
define float @frem4_abs(float %x) {
108+
; CHECK-LABEL: frem4_abs:
109+
; CHECK: // %bb.0: // %entry
110+
; CHECK-NEXT: fabs s0, s0
111+
; CHECK-NEXT: fmov s1, #4.00000000
112+
; CHECK-NEXT: b fmodf
113+
entry:
114+
%a = tail call float @llvm.fabs.f32(float %x)
115+
%fmod = frem float %a, 4.0
116+
ret float %fmod
117+
}
118+
119+
define float @frem16_abs(float %x) {
120+
; CHECK-LABEL: frem16_abs:
121+
; CHECK: // %bb.0: // %entry
122+
; CHECK-NEXT: fabs s0, s0
123+
; CHECK-NEXT: fmov s1, #16.00000000
124+
; CHECK-NEXT: b fmodf
125+
entry:
126+
%a = tail call float @llvm.fabs.f32(float %x)
127+
%fmod = frem float %a, 16.0
128+
ret float %fmod
129+
}
130+
131+
define float @frem4294967296_abs(float %x) {
132+
; CHECK-LABEL: frem4294967296_abs:
133+
; CHECK: // %bb.0: // %entry
134+
; CHECK-NEXT: fabs s0, s0
135+
; CHECK-NEXT: mov w8, #1333788672 // =0x4f800000
136+
; CHECK-NEXT: fmov s1, w8
137+
; CHECK-NEXT: b fmodf
138+
entry:
139+
%a = tail call float @llvm.fabs.f32(float %x)
140+
%fmod = frem float %a, 4294967296.0
141+
ret float %fmod
142+
}
143+
144+
define float @frem1152921504606846976_abs(float %x) {
145+
; CHECK-LABEL: frem1152921504606846976_abs:
146+
; CHECK: // %bb.0: // %entry
147+
; CHECK-NEXT: fabs s0, s0
148+
; CHECK-NEXT: mov w8, #1568669696 // =0x5d800000
149+
; CHECK-NEXT: fmov s1, w8
150+
; CHECK-NEXT: b fmodf
151+
entry:
152+
%a = tail call float @llvm.fabs.f32(float %x)
153+
%fmod = frem float %a, 1152921504606846976.0
154+
ret float %fmod
155+
}
156+
157+
define float @frem4611686018427387904_abs(float %x) {
158+
; CHECK-LABEL: frem4611686018427387904_abs:
159+
; CHECK: // %bb.0: // %entry
160+
; CHECK-NEXT: fabs s0, s0
161+
; CHECK-NEXT: mov w8, #1585446912 // =0x5e800000
162+
; CHECK-NEXT: fmov s1, w8
163+
; CHECK-NEXT: b fmodf
164+
entry:
165+
%a = tail call float @llvm.fabs.f32(float %x)
166+
%fmod = frem float %a, 4611686018427387904.0
167+
ret float %fmod
168+
}
169+
170+
define float @frem9223372036854775808_abs(float %x) {
171+
; CHECK-LABEL: frem9223372036854775808_abs:
172+
; CHECK: // %bb.0: // %entry
173+
; CHECK-NEXT: fabs s0, s0
174+
; CHECK-NEXT: movi v1.2s, #95, lsl #24
175+
; CHECK-NEXT: b fmodf
176+
entry:
177+
%a = tail call float @llvm.fabs.f32(float %x)
178+
%fmod = frem float %a, 9223372036854775808.0
179+
ret float %fmod
180+
}
181+
182+
define <4 x float> @frem2_nsz_vec(<4 x float> %x) {
183+
; CHECK-SD-LABEL: frem2_nsz_vec:
184+
; CHECK-SD: // %bb.0: // %entry
185+
; CHECK-SD-NEXT: sub sp, sp, #48
186+
; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
187+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 48
188+
; CHECK-SD-NEXT: .cfi_offset w30, -16
189+
; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
190+
; CHECK-SD-NEXT: mov s0, v0.s[1]
191+
; CHECK-SD-NEXT: fmov s1, #2.00000000
192+
; CHECK-SD-NEXT: bl fmodf
193+
; CHECK-SD-NEXT: fmov s1, #2.00000000
194+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
195+
; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
196+
; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
197+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
198+
; CHECK-SD-NEXT: bl fmodf
199+
; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
200+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
201+
; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]
202+
; CHECK-SD-NEXT: fmov s1, #2.00000000
203+
; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
204+
; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
205+
; CHECK-SD-NEXT: mov s0, v0.s[2]
206+
; CHECK-SD-NEXT: bl fmodf
207+
; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
208+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
209+
; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]
210+
; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
211+
; CHECK-SD-NEXT: mov s0, v0.s[3]
212+
; CHECK-SD-NEXT: str q1, [sp] // 16-byte Folded Spill
213+
; CHECK-SD-NEXT: fmov s1, #2.00000000
214+
; CHECK-SD-NEXT: bl fmodf
215+
; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
216+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
217+
; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
218+
; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]
219+
; CHECK-SD-NEXT: mov v0.16b, v1.16b
220+
; CHECK-SD-NEXT: add sp, sp, #48
221+
; CHECK-SD-NEXT: ret
222+
;
223+
; CHECK-GI-LABEL: frem2_nsz_vec:
224+
; CHECK-GI: // %bb.0: // %entry
225+
; CHECK-GI-NEXT: sub sp, sp, #80
226+
; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Folded Spill
227+
; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill
228+
; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Folded Spill
229+
; CHECK-GI-NEXT: .cfi_def_cfa_offset 80
230+
; CHECK-GI-NEXT: .cfi_offset w30, -8
231+
; CHECK-GI-NEXT: .cfi_offset b8, -16
232+
; CHECK-GI-NEXT: .cfi_offset b9, -24
233+
; CHECK-GI-NEXT: .cfi_offset b10, -32
234+
; CHECK-GI-NEXT: fmov s1, #2.00000000
235+
; CHECK-GI-NEXT: mov s8, v0.s[1]
236+
; CHECK-GI-NEXT: mov s9, v0.s[2]
237+
; CHECK-GI-NEXT: mov s10, v0.s[3]
238+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
239+
; CHECK-GI-NEXT: bl fmodf
240+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
241+
; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
242+
; CHECK-GI-NEXT: fmov s1, #2.00000000
243+
; CHECK-GI-NEXT: fmov s0, s8
244+
; CHECK-GI-NEXT: bl fmodf
245+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
246+
; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
247+
; CHECK-GI-NEXT: fmov s1, #2.00000000
248+
; CHECK-GI-NEXT: fmov s0, s9
249+
; CHECK-GI-NEXT: bl fmodf
250+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
251+
; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
252+
; CHECK-GI-NEXT: fmov s1, #2.00000000
253+
; CHECK-GI-NEXT: fmov s0, s10
254+
; CHECK-GI-NEXT: bl fmodf
255+
; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload
256+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
257+
; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Folded Reload
258+
; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload
259+
; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Folded Reload
260+
; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]
261+
; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Folded Reload
262+
; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]
263+
; CHECK-GI-NEXT: mov v1.s[3], v0.s[0]
264+
; CHECK-GI-NEXT: mov v0.16b, v1.16b
265+
; CHECK-GI-NEXT: add sp, sp, #80
266+
; CHECK-GI-NEXT: ret
267+
entry:
268+
%fmod = frem nsz <4 x float> %x, <float 2.0, float 2.0, float 2.0, float 2.0>
269+
ret <4 x float> %fmod
270+
}
271+
272+
define <4 x float> @frem1152921504606846976_absv(<4 x float> %x) {
273+
; CHECK-SD-LABEL: frem1152921504606846976_absv:
274+
; CHECK-SD: // %bb.0: // %entry
275+
; CHECK-SD-NEXT: sub sp, sp, #48
276+
; CHECK-SD-NEXT: str d8, [sp, #32] // 8-byte Folded Spill
277+
; CHECK-SD-NEXT: str x30, [sp, #40] // 8-byte Folded Spill
278+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 48
279+
; CHECK-SD-NEXT: .cfi_offset w30, -8
280+
; CHECK-SD-NEXT: .cfi_offset b8, -16
281+
; CHECK-SD-NEXT: fabs v0.4s, v0.4s
282+
; CHECK-SD-NEXT: mov w8, #1568669696 // =0x5d800000
283+
; CHECK-SD-NEXT: fmov s8, w8
284+
; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
285+
; CHECK-SD-NEXT: mov s0, v0.s[1]
286+
; CHECK-SD-NEXT: fmov s1, s8
287+
; CHECK-SD-NEXT: bl fmodf
288+
; CHECK-SD-NEXT: fmov s1, s8
289+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
290+
; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
291+
; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
292+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
293+
; CHECK-SD-NEXT: bl fmodf
294+
; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
295+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
296+
; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]
297+
; CHECK-SD-NEXT: fmov s1, s8
298+
; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
299+
; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
300+
; CHECK-SD-NEXT: mov s0, v0.s[2]
301+
; CHECK-SD-NEXT: bl fmodf
302+
; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
303+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
304+
; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]
305+
; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
306+
; CHECK-SD-NEXT: mov s0, v0.s[3]
307+
; CHECK-SD-NEXT: str q1, [sp] // 16-byte Folded Spill
308+
; CHECK-SD-NEXT: fmov s1, s8
309+
; CHECK-SD-NEXT: bl fmodf
310+
; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
311+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
312+
; CHECK-SD-NEXT: ldr x30, [sp, #40] // 8-byte Folded Reload
313+
; CHECK-SD-NEXT: ldr d8, [sp, #32] // 8-byte Folded Reload
314+
; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]
315+
; CHECK-SD-NEXT: mov v0.16b, v1.16b
316+
; CHECK-SD-NEXT: add sp, sp, #48
317+
; CHECK-SD-NEXT: ret
318+
;
319+
; CHECK-GI-LABEL: frem1152921504606846976_absv:
320+
; CHECK-GI: // %bb.0: // %entry
321+
; CHECK-GI-NEXT: sub sp, sp, #96
322+
; CHECK-GI-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill
323+
; CHECK-GI-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill
324+
; CHECK-GI-NEXT: str x30, [sp, #80] // 8-byte Folded Spill
325+
; CHECK-GI-NEXT: .cfi_def_cfa_offset 96
326+
; CHECK-GI-NEXT: .cfi_offset w30, -16
327+
; CHECK-GI-NEXT: .cfi_offset b8, -24
328+
; CHECK-GI-NEXT: .cfi_offset b9, -32
329+
; CHECK-GI-NEXT: .cfi_offset b10, -40
330+
; CHECK-GI-NEXT: .cfi_offset b11, -48
331+
; CHECK-GI-NEXT: mov w8, #1568669696 // =0x5d800000
332+
; CHECK-GI-NEXT: fabs v0.4s, v0.4s
333+
; CHECK-GI-NEXT: fmov s11, w8
334+
; CHECK-GI-NEXT: fmov s1, s11
335+
; CHECK-GI-NEXT: mov s8, v0.s[1]
336+
; CHECK-GI-NEXT: mov s9, v0.s[2]
337+
; CHECK-GI-NEXT: mov s10, v0.s[3]
338+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
339+
; CHECK-GI-NEXT: bl fmodf
340+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
341+
; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
342+
; CHECK-GI-NEXT: fmov s1, s11
343+
; CHECK-GI-NEXT: fmov s0, s8
344+
; CHECK-GI-NEXT: bl fmodf
345+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
346+
; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
347+
; CHECK-GI-NEXT: fmov s1, s11
348+
; CHECK-GI-NEXT: fmov s0, s9
349+
; CHECK-GI-NEXT: bl fmodf
350+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
351+
; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
352+
; CHECK-GI-NEXT: fmov s1, s11
353+
; CHECK-GI-NEXT: fmov s0, s10
354+
; CHECK-GI-NEXT: bl fmodf
355+
; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload
356+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
357+
; CHECK-GI-NEXT: ldr x30, [sp, #80] // 8-byte Folded Reload
358+
; CHECK-GI-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload
359+
; CHECK-GI-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload
360+
; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]
361+
; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Folded Reload
362+
; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]
363+
; CHECK-GI-NEXT: mov v1.s[3], v0.s[0]
364+
; CHECK-GI-NEXT: mov v0.16b, v1.16b
365+
; CHECK-GI-NEXT: add sp, sp, #96
366+
; CHECK-GI-NEXT: ret
367+
entry:
368+
%a = tail call <4 x float> @llvm.fabs.v4f32(<4 x float> %x)
369+
%fmod = frem <4 x float> %a, <float 1152921504606846976.0, float 1152921504606846976.0, float 1152921504606846976.0, float 1152921504606846976.0>
370+
ret <4 x float> %fmod
371+
}

0 commit comments

Comments
 (0)