xref: /llvm-project/llvm/test/CodeGen/AArch64/frem.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
4; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
5; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
6
7define double @frem_f64(double %a, double %b) {
8; CHECK-LABEL: frem_f64:
9; CHECK:       // %bb.0: // %entry
10; CHECK-NEXT:    b fmod
11entry:
12  %c = frem double %a, %b
13  ret double %c
14}
15
16define float @frem_f32(float %a, float %b) {
17; CHECK-LABEL: frem_f32:
18; CHECK:       // %bb.0: // %entry
19; CHECK-NEXT:    b fmodf
20entry:
21  %c = frem float %a, %b
22  ret float %c
23}
24
25define half @frem_f16(half %a, half %b) {
26; CHECK-LABEL: frem_f16:
27; CHECK:       // %bb.0: // %entry
28; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
29; CHECK-NEXT:    .cfi_def_cfa_offset 16
30; CHECK-NEXT:    .cfi_offset w30, -16
31; CHECK-NEXT:    fcvt s0, h0
32; CHECK-NEXT:    fcvt s1, h1
33; CHECK-NEXT:    bl fmodf
34; CHECK-NEXT:    fcvt h0, s0
35; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
36; CHECK-NEXT:    ret
37entry:
38  %c = frem half %a, %b
39  ret half %c
40}
41
42define fp128 @frem_fp128(fp128 %a, fp128 %b) {
43; CHECK-LABEL: frem_fp128:
44; CHECK:       // %bb.0: // %entry
45; CHECK-NEXT:    b fmodl
46entry:
47  %c = frem fp128 %a, %b
48  ret fp128 %c
49}
50
51define <1 x double> @frem_v1f64(<1 x double> %a, <1 x double> %b) {
52; CHECK-LABEL: frem_v1f64:
53; CHECK:       // %bb.0: // %entry
54; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
55; CHECK-NEXT:    .cfi_def_cfa_offset 16
56; CHECK-NEXT:    .cfi_offset w30, -16
57; CHECK-NEXT:    bl fmod
58; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
59; CHECK-NEXT:    ret
60entry:
61  %c = frem <1 x double> %a, %b
62  ret <1 x double> %c
63}
64
65define <2 x double> @frem_v2f64(<2 x double> %a, <2 x double> %b) {
66; CHECK-SD-LABEL: frem_v2f64:
67; CHECK-SD:       // %bb.0: // %entry
68; CHECK-SD-NEXT:    sub sp, sp, #64
69; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
70; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
71; CHECK-SD-NEXT:    .cfi_offset w30, -16
72; CHECK-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
73; CHECK-SD-NEXT:    mov d0, v0.d[1]
74; CHECK-SD-NEXT:    mov d1, v1.d[1]
75; CHECK-SD-NEXT:    bl fmod
76; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
77; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
78; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
79; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
80; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
81; CHECK-SD-NEXT:    bl fmod
82; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
83; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
84; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
85; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
86; CHECK-SD-NEXT:    add sp, sp, #64
87; CHECK-SD-NEXT:    ret
88;
89; CHECK-GI-LABEL: frem_v2f64:
90; CHECK-GI:       // %bb.0: // %entry
91; CHECK-GI-NEXT:    sub sp, sp, #48
92; CHECK-GI-NEXT:    stp d9, d8, [sp, #16] // 16-byte Folded Spill
93; CHECK-GI-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
94; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
95; CHECK-GI-NEXT:    .cfi_offset w30, -16
96; CHECK-GI-NEXT:    .cfi_offset b8, -24
97; CHECK-GI-NEXT:    .cfi_offset b9, -32
98; CHECK-GI-NEXT:    mov d8, v0.d[1]
99; CHECK-GI-NEXT:    mov d9, v1.d[1]
100; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
101; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 killed $q1
102; CHECK-GI-NEXT:    bl fmod
103; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
104; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
105; CHECK-GI-NEXT:    fmov d1, d9
106; CHECK-GI-NEXT:    fmov d0, d8
107; CHECK-GI-NEXT:    bl fmod
108; CHECK-GI-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
109; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
110; CHECK-GI-NEXT:    ldp d9, d8, [sp, #16] // 16-byte Folded Reload
111; CHECK-GI-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
112; CHECK-GI-NEXT:    mov v1.d[1], v0.d[0]
113; CHECK-GI-NEXT:    mov v0.16b, v1.16b
114; CHECK-GI-NEXT:    add sp, sp, #48
115; CHECK-GI-NEXT:    ret
116entry:
117  %c = frem <2 x double> %a, %b
118  ret <2 x double> %c
119}
120
121define <3 x double> @frem_v3f64(<3 x double> %a, <3 x double> %b) {
122; CHECK-SD-LABEL: frem_v3f64:
123; CHECK-SD:       // %bb.0: // %entry
124; CHECK-SD-NEXT:    str d12, [sp, #-48]! // 8-byte Folded Spill
125; CHECK-SD-NEXT:    stp d11, d10, [sp, #8] // 16-byte Folded Spill
126; CHECK-SD-NEXT:    stp d9, d8, [sp, #24] // 16-byte Folded Spill
127; CHECK-SD-NEXT:    str x30, [sp, #40] // 8-byte Folded Spill
128; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
129; CHECK-SD-NEXT:    .cfi_offset w30, -8
130; CHECK-SD-NEXT:    .cfi_offset b8, -16
131; CHECK-SD-NEXT:    .cfi_offset b9, -24
132; CHECK-SD-NEXT:    .cfi_offset b10, -32
133; CHECK-SD-NEXT:    .cfi_offset b11, -40
134; CHECK-SD-NEXT:    .cfi_offset b12, -48
135; CHECK-SD-NEXT:    fmov d11, d1
136; CHECK-SD-NEXT:    fmov d1, d3
137; CHECK-SD-NEXT:    fmov d8, d5
138; CHECK-SD-NEXT:    fmov d9, d4
139; CHECK-SD-NEXT:    fmov d10, d2
140; CHECK-SD-NEXT:    bl fmod
141; CHECK-SD-NEXT:    fmov d12, d0
142; CHECK-SD-NEXT:    fmov d0, d11
143; CHECK-SD-NEXT:    fmov d1, d9
144; CHECK-SD-NEXT:    bl fmod
145; CHECK-SD-NEXT:    fmov d9, d0
146; CHECK-SD-NEXT:    fmov d0, d10
147; CHECK-SD-NEXT:    fmov d1, d8
148; CHECK-SD-NEXT:    bl fmod
149; CHECK-SD-NEXT:    fmov d1, d9
150; CHECK-SD-NEXT:    ldp d9, d8, [sp, #24] // 16-byte Folded Reload
151; CHECK-SD-NEXT:    ldp d11, d10, [sp, #8] // 16-byte Folded Reload
152; CHECK-SD-NEXT:    fmov d2, d0
153; CHECK-SD-NEXT:    ldr x30, [sp, #40] // 8-byte Folded Reload
154; CHECK-SD-NEXT:    fmov d0, d12
155; CHECK-SD-NEXT:    ldr d12, [sp], #48 // 8-byte Folded Reload
156; CHECK-SD-NEXT:    ret
157;
158; CHECK-GI-LABEL: frem_v3f64:
159; CHECK-GI:       // %bb.0: // %entry
160; CHECK-GI-NEXT:    str d12, [sp, #-48]! // 8-byte Folded Spill
161; CHECK-GI-NEXT:    stp d11, d10, [sp, #8] // 16-byte Folded Spill
162; CHECK-GI-NEXT:    stp d9, d8, [sp, #24] // 16-byte Folded Spill
163; CHECK-GI-NEXT:    str x30, [sp, #40] // 8-byte Folded Spill
164; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
165; CHECK-GI-NEXT:    .cfi_offset w30, -8
166; CHECK-GI-NEXT:    .cfi_offset b8, -16
167; CHECK-GI-NEXT:    .cfi_offset b9, -24
168; CHECK-GI-NEXT:    .cfi_offset b10, -32
169; CHECK-GI-NEXT:    .cfi_offset b11, -40
170; CHECK-GI-NEXT:    .cfi_offset b12, -48
171; CHECK-GI-NEXT:    fmov d8, d1
172; CHECK-GI-NEXT:    fmov d1, d3
173; CHECK-GI-NEXT:    fmov d9, d2
174; CHECK-GI-NEXT:    fmov d10, d4
175; CHECK-GI-NEXT:    fmov d11, d5
176; CHECK-GI-NEXT:    bl fmod
177; CHECK-GI-NEXT:    fmov d12, d0
178; CHECK-GI-NEXT:    fmov d0, d8
179; CHECK-GI-NEXT:    fmov d1, d10
180; CHECK-GI-NEXT:    bl fmod
181; CHECK-GI-NEXT:    fmov d8, d0
182; CHECK-GI-NEXT:    fmov d0, d9
183; CHECK-GI-NEXT:    fmov d1, d11
184; CHECK-GI-NEXT:    bl fmod
185; CHECK-GI-NEXT:    fmov d1, d8
186; CHECK-GI-NEXT:    ldp d9, d8, [sp, #24] // 16-byte Folded Reload
187; CHECK-GI-NEXT:    ldp d11, d10, [sp, #8] // 16-byte Folded Reload
188; CHECK-GI-NEXT:    fmov d2, d0
189; CHECK-GI-NEXT:    ldr x30, [sp, #40] // 8-byte Folded Reload
190; CHECK-GI-NEXT:    fmov d0, d12
191; CHECK-GI-NEXT:    ldr d12, [sp], #48 // 8-byte Folded Reload
192; CHECK-GI-NEXT:    ret
193entry:
194  %c = frem <3 x double> %a, %b
195  ret <3 x double> %c
196}
197
198define <4 x double> @frem_v4f64(<4 x double> %a, <4 x double> %b) {
199; CHECK-SD-LABEL: frem_v4f64:
200; CHECK-SD:       // %bb.0: // %entry
201; CHECK-SD-NEXT:    sub sp, sp, #96
202; CHECK-SD-NEXT:    str x30, [sp, #80] // 8-byte Folded Spill
203; CHECK-SD-NEXT:    .cfi_def_cfa_offset 96
204; CHECK-SD-NEXT:    .cfi_offset w30, -16
205; CHECK-SD-NEXT:    stp q0, q2, [sp] // 32-byte Folded Spill
206; CHECK-SD-NEXT:    mov d0, v0.d[1]
207; CHECK-SD-NEXT:    stp q1, q3, [sp, #48] // 32-byte Folded Spill
208; CHECK-SD-NEXT:    mov d1, v2.d[1]
209; CHECK-SD-NEXT:    bl fmod
210; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
211; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
212; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
213; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
214; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
215; CHECK-SD-NEXT:    bl fmod
216; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
217; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
218; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
219; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
220; CHECK-SD-NEXT:    ldp q0, q1, [sp, #48] // 32-byte Folded Reload
221; CHECK-SD-NEXT:    mov d0, v0.d[1]
222; CHECK-SD-NEXT:    mov d1, v1.d[1]
223; CHECK-SD-NEXT:    bl fmod
224; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
225; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
226; CHECK-SD-NEXT:    ldp q0, q1, [sp, #48] // 32-byte Folded Reload
227; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
228; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
229; CHECK-SD-NEXT:    bl fmod
230; CHECK-SD-NEXT:    fmov d1, d0
231; CHECK-SD-NEXT:    ldp q2, q0, [sp, #16] // 32-byte Folded Reload
232; CHECK-SD-NEXT:    ldr x30, [sp, #80] // 8-byte Folded Reload
233; CHECK-SD-NEXT:    mov v1.d[1], v2.d[0]
234; CHECK-SD-NEXT:    add sp, sp, #96
235; CHECK-SD-NEXT:    ret
236;
237; CHECK-GI-LABEL: frem_v4f64:
238; CHECK-GI:       // %bb.0: // %entry
239; CHECK-GI-NEXT:    sub sp, sp, #112
240; CHECK-GI-NEXT:    stp d11, d10, [sp, #64] // 16-byte Folded Spill
241; CHECK-GI-NEXT:    stp d9, d8, [sp, #80] // 16-byte Folded Spill
242; CHECK-GI-NEXT:    str x30, [sp, #96] // 8-byte Folded Spill
243; CHECK-GI-NEXT:    .cfi_def_cfa_offset 112
244; CHECK-GI-NEXT:    .cfi_offset w30, -16
245; CHECK-GI-NEXT:    .cfi_offset b8, -24
246; CHECK-GI-NEXT:    .cfi_offset b9, -32
247; CHECK-GI-NEXT:    .cfi_offset b10, -40
248; CHECK-GI-NEXT:    .cfi_offset b11, -48
249; CHECK-GI-NEXT:    mov v4.16b, v1.16b
250; CHECK-GI-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
251; CHECK-GI-NEXT:    mov v1.16b, v2.16b
252; CHECK-GI-NEXT:    str q3, [sp] // 16-byte Folded Spill
253; CHECK-GI-NEXT:    mov d8, v0.d[1]
254; CHECK-GI-NEXT:    mov d10, v2.d[1]
255; CHECK-GI-NEXT:    mov d11, v3.d[1]
256; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
257; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 killed $q1
258; CHECK-GI-NEXT:    mov d9, v4.d[1]
259; CHECK-GI-NEXT:    bl fmod
260; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
261; CHECK-GI-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
262; CHECK-GI-NEXT:    fmov d1, d10
263; CHECK-GI-NEXT:    fmov d0, d8
264; CHECK-GI-NEXT:    bl fmod
265; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
266; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
267; CHECK-GI-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
268; CHECK-GI-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
269; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 killed $q1
270; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
271; CHECK-GI-NEXT:    bl fmod
272; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
273; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
274; CHECK-GI-NEXT:    fmov d1, d11
275; CHECK-GI-NEXT:    fmov d0, d9
276; CHECK-GI-NEXT:    bl fmod
277; CHECK-GI-NEXT:    ldp q3, q1, [sp, #16] // 32-byte Folded Reload
278; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
279; CHECK-GI-NEXT:    ldr q2, [sp, #48] // 16-byte Folded Reload
280; CHECK-GI-NEXT:    ldp d9, d8, [sp, #80] // 16-byte Folded Reload
281; CHECK-GI-NEXT:    ldr x30, [sp, #96] // 8-byte Folded Reload
282; CHECK-GI-NEXT:    ldp d11, d10, [sp, #64] // 16-byte Folded Reload
283; CHECK-GI-NEXT:    mov v2.d[1], v3.d[0]
284; CHECK-GI-NEXT:    mov v1.d[1], v0.d[0]
285; CHECK-GI-NEXT:    mov v0.16b, v2.16b
286; CHECK-GI-NEXT:    add sp, sp, #112
287; CHECK-GI-NEXT:    ret
288entry:
289  %c = frem <4 x double> %a, %b
290  ret <4 x double> %c
291}
292
293define <2 x float> @frem_v2f32(<2 x float> %a, <2 x float> %b) {
294; CHECK-SD-LABEL: frem_v2f32:
295; CHECK-SD:       // %bb.0: // %entry
296; CHECK-SD-NEXT:    sub sp, sp, #64
297; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
298; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
299; CHECK-SD-NEXT:    .cfi_offset w30, -16
300; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
301; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
302; CHECK-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
303; CHECK-SD-NEXT:    mov s0, v0.s[1]
304; CHECK-SD-NEXT:    mov s1, v1.s[1]
305; CHECK-SD-NEXT:    bl fmodf
306; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
307; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
308; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
309; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
310; CHECK-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
311; CHECK-SD-NEXT:    bl fmodf
312; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
313; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
314; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
315; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
316; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
317; CHECK-SD-NEXT:    add sp, sp, #64
318; CHECK-SD-NEXT:    ret
319;
320; CHECK-GI-LABEL: frem_v2f32:
321; CHECK-GI:       // %bb.0: // %entry
322; CHECK-GI-NEXT:    sub sp, sp, #48
323; CHECK-GI-NEXT:    stp d9, d8, [sp, #16] // 16-byte Folded Spill
324; CHECK-GI-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
325; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
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:    // kill: def $d0 killed $d0 def $q0
330; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
331; CHECK-GI-NEXT:    mov s8, v0.s[1]
332; CHECK-GI-NEXT:    mov s9, v1.s[1]
333; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
334; CHECK-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
335; CHECK-GI-NEXT:    bl fmodf
336; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
337; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
338; CHECK-GI-NEXT:    fmov s1, s9
339; CHECK-GI-NEXT:    fmov s0, s8
340; CHECK-GI-NEXT:    bl fmodf
341; CHECK-GI-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
342; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
343; CHECK-GI-NEXT:    ldp d9, d8, [sp, #16] // 16-byte Folded Reload
344; CHECK-GI-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
345; CHECK-GI-NEXT:    mov v1.s[1], v0.s[0]
346; CHECK-GI-NEXT:    fmov d0, d1
347; CHECK-GI-NEXT:    add sp, sp, #48
348; CHECK-GI-NEXT:    ret
349entry:
350  %c = frem <2 x float> %a, %b
351  ret <2 x float> %c
352}
353
354define <3 x float> @frem_v3f32(<3 x float> %a, <3 x float> %b) {
355; CHECK-SD-LABEL: frem_v3f32:
356; CHECK-SD:       // %bb.0: // %entry
357; CHECK-SD-NEXT:    sub sp, sp, #64
358; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
359; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
360; CHECK-SD-NEXT:    .cfi_offset w30, -16
361; CHECK-SD-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
362; CHECK-SD-NEXT:    mov s0, v0.s[1]
363; CHECK-SD-NEXT:    mov s1, v1.s[1]
364; CHECK-SD-NEXT:    bl fmodf
365; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
366; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
367; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
368; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
369; CHECK-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
370; CHECK-SD-NEXT:    bl fmodf
371; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
372; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
373; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
374; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
375; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
376; CHECK-SD-NEXT:    mov s0, v0.s[2]
377; CHECK-SD-NEXT:    mov s1, v1.s[2]
378; CHECK-SD-NEXT:    bl fmodf
379; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
380; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
381; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
382; CHECK-SD-NEXT:    mov v1.s[2], v0.s[0]
383; CHECK-SD-NEXT:    mov v0.16b, v1.16b
384; CHECK-SD-NEXT:    add sp, sp, #64
385; CHECK-SD-NEXT:    ret
386;
387; CHECK-GI-LABEL: frem_v3f32:
388; CHECK-GI:       // %bb.0: // %entry
389; CHECK-GI-NEXT:    sub sp, sp, #80
390; CHECK-GI-NEXT:    stp d11, d10, [sp, #32] // 16-byte Folded Spill
391; CHECK-GI-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill
392; CHECK-GI-NEXT:    str x30, [sp, #64] // 8-byte Folded Spill
393; CHECK-GI-NEXT:    .cfi_def_cfa_offset 80
394; CHECK-GI-NEXT:    .cfi_offset w30, -16
395; CHECK-GI-NEXT:    .cfi_offset b8, -24
396; CHECK-GI-NEXT:    .cfi_offset b9, -32
397; CHECK-GI-NEXT:    .cfi_offset b10, -40
398; CHECK-GI-NEXT:    .cfi_offset b11, -48
399; CHECK-GI-NEXT:    mov s8, v0.s[1]
400; CHECK-GI-NEXT:    mov s9, v0.s[2]
401; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
402; CHECK-GI-NEXT:    mov s10, v1.s[1]
403; CHECK-GI-NEXT:    mov s11, v1.s[2]
404; CHECK-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
405; CHECK-GI-NEXT:    bl fmodf
406; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
407; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
408; CHECK-GI-NEXT:    fmov s1, s10
409; CHECK-GI-NEXT:    fmov s0, s8
410; CHECK-GI-NEXT:    bl fmodf
411; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
412; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
413; CHECK-GI-NEXT:    fmov s1, s11
414; CHECK-GI-NEXT:    fmov s0, s9
415; CHECK-GI-NEXT:    bl fmodf
416; CHECK-GI-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
417; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
418; CHECK-GI-NEXT:    ldr x30, [sp, #64] // 8-byte Folded Reload
419; CHECK-GI-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload
420; CHECK-GI-NEXT:    ldp d11, d10, [sp, #32] // 16-byte Folded Reload
421; CHECK-GI-NEXT:    mov v1.s[1], v2.s[0]
422; CHECK-GI-NEXT:    mov v1.s[2], v0.s[0]
423; CHECK-GI-NEXT:    mov v0.16b, v1.16b
424; CHECK-GI-NEXT:    add sp, sp, #80
425; CHECK-GI-NEXT:    ret
426entry:
427  %c = frem <3 x float> %a, %b
428  ret <3 x float> %c
429}
430
431define <4 x float> @frem_v4f32(<4 x float> %a, <4 x float> %b) {
432; CHECK-SD-LABEL: frem_v4f32:
433; CHECK-SD:       // %bb.0: // %entry
434; CHECK-SD-NEXT:    sub sp, sp, #64
435; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
436; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
437; CHECK-SD-NEXT:    .cfi_offset w30, -16
438; CHECK-SD-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
439; CHECK-SD-NEXT:    mov s0, v0.s[1]
440; CHECK-SD-NEXT:    mov s1, v1.s[1]
441; CHECK-SD-NEXT:    bl fmodf
442; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
443; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
444; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
445; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
446; CHECK-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
447; CHECK-SD-NEXT:    bl fmodf
448; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
449; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
450; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
451; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
452; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
453; CHECK-SD-NEXT:    mov s0, v0.s[2]
454; CHECK-SD-NEXT:    mov s1, v1.s[2]
455; CHECK-SD-NEXT:    bl fmodf
456; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
457; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
458; CHECK-SD-NEXT:    mov v1.s[2], v0.s[0]
459; CHECK-SD-NEXT:    str q1, [sp] // 16-byte Folded Spill
460; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
461; CHECK-SD-NEXT:    mov s0, v0.s[3]
462; CHECK-SD-NEXT:    mov s1, v1.s[3]
463; CHECK-SD-NEXT:    bl fmodf
464; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
465; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
466; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
467; CHECK-SD-NEXT:    mov v1.s[3], v0.s[0]
468; CHECK-SD-NEXT:    mov v0.16b, v1.16b
469; CHECK-SD-NEXT:    add sp, sp, #64
470; CHECK-SD-NEXT:    ret
471;
472; CHECK-GI-LABEL: frem_v4f32:
473; CHECK-GI:       // %bb.0: // %entry
474; CHECK-GI-NEXT:    sub sp, sp, #112
475; CHECK-GI-NEXT:    stp d13, d12, [sp, #48] // 16-byte Folded Spill
476; CHECK-GI-NEXT:    stp d11, d10, [sp, #64] // 16-byte Folded Spill
477; CHECK-GI-NEXT:    stp d9, d8, [sp, #80] // 16-byte Folded Spill
478; CHECK-GI-NEXT:    str x30, [sp, #96] // 8-byte Folded Spill
479; CHECK-GI-NEXT:    .cfi_def_cfa_offset 112
480; CHECK-GI-NEXT:    .cfi_offset w30, -16
481; CHECK-GI-NEXT:    .cfi_offset b8, -24
482; CHECK-GI-NEXT:    .cfi_offset b9, -32
483; CHECK-GI-NEXT:    .cfi_offset b10, -40
484; CHECK-GI-NEXT:    .cfi_offset b11, -48
485; CHECK-GI-NEXT:    .cfi_offset b12, -56
486; CHECK-GI-NEXT:    .cfi_offset b13, -64
487; CHECK-GI-NEXT:    mov s8, v0.s[1]
488; CHECK-GI-NEXT:    mov s9, v0.s[2]
489; CHECK-GI-NEXT:    mov s10, v0.s[3]
490; CHECK-GI-NEXT:    mov s11, v1.s[1]
491; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
492; CHECK-GI-NEXT:    mov s12, v1.s[2]
493; CHECK-GI-NEXT:    mov s13, v1.s[3]
494; CHECK-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
495; CHECK-GI-NEXT:    bl fmodf
496; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
497; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
498; CHECK-GI-NEXT:    fmov s1, s11
499; CHECK-GI-NEXT:    fmov s0, s8
500; CHECK-GI-NEXT:    bl fmodf
501; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
502; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
503; CHECK-GI-NEXT:    fmov s1, s12
504; CHECK-GI-NEXT:    fmov s0, s9
505; CHECK-GI-NEXT:    bl fmodf
506; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
507; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
508; CHECK-GI-NEXT:    fmov s1, s13
509; CHECK-GI-NEXT:    fmov s0, s10
510; CHECK-GI-NEXT:    bl fmodf
511; CHECK-GI-NEXT:    ldp q2, q1, [sp, #16] // 32-byte Folded Reload
512; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
513; CHECK-GI-NEXT:    ldr x30, [sp, #96] // 8-byte Folded Reload
514; CHECK-GI-NEXT:    ldp d9, d8, [sp, #80] // 16-byte Folded Reload
515; CHECK-GI-NEXT:    ldp d11, d10, [sp, #64] // 16-byte Folded Reload
516; CHECK-GI-NEXT:    mov v1.s[1], v2.s[0]
517; CHECK-GI-NEXT:    ldr q2, [sp] // 16-byte Folded Reload
518; CHECK-GI-NEXT:    ldp d13, d12, [sp, #48] // 16-byte Folded Reload
519; CHECK-GI-NEXT:    mov v1.s[2], v2.s[0]
520; CHECK-GI-NEXT:    mov v1.s[3], v0.s[0]
521; CHECK-GI-NEXT:    mov v0.16b, v1.16b
522; CHECK-GI-NEXT:    add sp, sp, #112
523; CHECK-GI-NEXT:    ret
524entry:
525  %c = frem <4 x float> %a, %b
526  ret <4 x float> %c
527}
528
529define <8 x float> @frem_v8f32(<8 x float> %a, <8 x float> %b) {
530; CHECK-SD-LABEL: frem_v8f32:
531; CHECK-SD:       // %bb.0: // %entry
532; CHECK-SD-NEXT:    sub sp, sp, #96
533; CHECK-SD-NEXT:    str x30, [sp, #80] // 8-byte Folded Spill
534; CHECK-SD-NEXT:    .cfi_def_cfa_offset 96
535; CHECK-SD-NEXT:    .cfi_offset w30, -16
536; CHECK-SD-NEXT:    stp q0, q2, [sp] // 32-byte Folded Spill
537; CHECK-SD-NEXT:    mov s0, v0.s[1]
538; CHECK-SD-NEXT:    stp q1, q3, [sp, #32] // 32-byte Folded Spill
539; CHECK-SD-NEXT:    mov s1, v2.s[1]
540; CHECK-SD-NEXT:    bl fmodf
541; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
542; CHECK-SD-NEXT:    str q0, [sp, #64] // 16-byte Folded Spill
543; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
544; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
545; CHECK-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
546; CHECK-SD-NEXT:    bl fmodf
547; CHECK-SD-NEXT:    ldr q1, [sp, #64] // 16-byte Folded Reload
548; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
549; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
550; CHECK-SD-NEXT:    str q0, [sp, #64] // 16-byte Folded Spill
551; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
552; CHECK-SD-NEXT:    mov s0, v0.s[2]
553; CHECK-SD-NEXT:    mov s1, v1.s[2]
554; CHECK-SD-NEXT:    bl fmodf
555; CHECK-SD-NEXT:    ldr q1, [sp, #64] // 16-byte Folded Reload
556; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
557; CHECK-SD-NEXT:    mov v1.s[2], v0.s[0]
558; CHECK-SD-NEXT:    str q1, [sp, #64] // 16-byte Folded Spill
559; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
560; CHECK-SD-NEXT:    mov s0, v0.s[3]
561; CHECK-SD-NEXT:    mov s1, v1.s[3]
562; CHECK-SD-NEXT:    bl fmodf
563; CHECK-SD-NEXT:    ldr q1, [sp, #64] // 16-byte Folded Reload
564; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
565; CHECK-SD-NEXT:    mov v1.s[3], v0.s[0]
566; CHECK-SD-NEXT:    str q1, [sp, #64] // 16-byte Folded Spill
567; CHECK-SD-NEXT:    ldp q0, q1, [sp, #32] // 32-byte Folded Reload
568; CHECK-SD-NEXT:    mov s0, v0.s[1]
569; CHECK-SD-NEXT:    mov s1, v1.s[1]
570; CHECK-SD-NEXT:    bl fmodf
571; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
572; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
573; CHECK-SD-NEXT:    ldp q0, q1, [sp, #32] // 32-byte Folded Reload
574; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
575; CHECK-SD-NEXT:    // kill: def $s1 killed $s1 killed $q1
576; CHECK-SD-NEXT:    bl fmodf
577; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
578; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
579; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
580; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
581; CHECK-SD-NEXT:    ldp q0, q1, [sp, #32] // 32-byte Folded Reload
582; CHECK-SD-NEXT:    mov s0, v0.s[2]
583; CHECK-SD-NEXT:    mov s1, v1.s[2]
584; CHECK-SD-NEXT:    bl fmodf
585; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
586; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
587; CHECK-SD-NEXT:    mov v1.s[2], v0.s[0]
588; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
589; CHECK-SD-NEXT:    ldp q0, q1, [sp, #32] // 32-byte Folded Reload
590; CHECK-SD-NEXT:    mov s0, v0.s[3]
591; CHECK-SD-NEXT:    mov s1, v1.s[3]
592; CHECK-SD-NEXT:    bl fmodf
593; CHECK-SD-NEXT:    fmov s2, s0
594; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
595; CHECK-SD-NEXT:    ldr q0, [sp, #64] // 16-byte Folded Reload
596; CHECK-SD-NEXT:    ldr x30, [sp, #80] // 8-byte Folded Reload
597; CHECK-SD-NEXT:    mov v1.s[3], v2.s[0]
598; CHECK-SD-NEXT:    add sp, sp, #96
599; CHECK-SD-NEXT:    ret
600;
601; CHECK-GI-LABEL: frem_v8f32:
602; CHECK-GI:       // %bb.0: // %entry
603; CHECK-GI-NEXT:    sub sp, sp, #208
604; CHECK-GI-NEXT:    stp d15, d14, [sp, #128] // 16-byte Folded Spill
605; CHECK-GI-NEXT:    stp d13, d12, [sp, #144] // 16-byte Folded Spill
606; CHECK-GI-NEXT:    stp d11, d10, [sp, #160] // 16-byte Folded Spill
607; CHECK-GI-NEXT:    stp d9, d8, [sp, #176] // 16-byte Folded Spill
608; CHECK-GI-NEXT:    str x30, [sp, #192] // 8-byte Folded Spill
609; CHECK-GI-NEXT:    .cfi_def_cfa_offset 208
610; CHECK-GI-NEXT:    .cfi_offset w30, -16
611; CHECK-GI-NEXT:    .cfi_offset b8, -24
612; CHECK-GI-NEXT:    .cfi_offset b9, -32
613; CHECK-GI-NEXT:    .cfi_offset b10, -40
614; CHECK-GI-NEXT:    .cfi_offset b11, -48
615; CHECK-GI-NEXT:    .cfi_offset b12, -56
616; CHECK-GI-NEXT:    .cfi_offset b13, -64
617; CHECK-GI-NEXT:    .cfi_offset b14, -72
618; CHECK-GI-NEXT:    .cfi_offset b15, -80
619; CHECK-GI-NEXT:    mov v4.16b, v1.16b
620; CHECK-GI-NEXT:    mov v1.16b, v2.16b
621; CHECK-GI-NEXT:    mov s8, v0.s[1]
622; CHECK-GI-NEXT:    mov s9, v0.s[2]
623; CHECK-GI-NEXT:    mov s10, v0.s[3]
624; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
625; CHECK-GI-NEXT:    mov s12, v3.s[1]
626; CHECK-GI-NEXT:    mov s11, v3.s[2]
627; CHECK-GI-NEXT:    mov s2, v4.s[1]
628; CHECK-GI-NEXT:    stp q3, q4, [sp] // 32-byte Folded Spill
629; CHECK-GI-NEXT:    mov s5, v4.s[3]
630; CHECK-GI-NEXT:    mov s14, v1.s[1]
631; CHECK-GI-NEXT:    mov s15, v1.s[2]
632; CHECK-GI-NEXT:    mov s13, v1.s[3]
633; CHECK-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
634; CHECK-GI-NEXT:    str s2, [sp, #48] // 4-byte Folded Spill
635; CHECK-GI-NEXT:    mov s2, v4.s[2]
636; CHECK-GI-NEXT:    str s2, [sp, #112] // 4-byte Folded Spill
637; CHECK-GI-NEXT:    mov s2, v3.s[3]
638; CHECK-GI-NEXT:    stp s2, s5, [sp, #200] // 8-byte Folded Spill
639; CHECK-GI-NEXT:    bl fmodf
640; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
641; CHECK-GI-NEXT:    str q0, [sp, #96] // 16-byte Folded Spill
642; CHECK-GI-NEXT:    fmov s1, s14
643; CHECK-GI-NEXT:    fmov s0, s8
644; CHECK-GI-NEXT:    bl fmodf
645; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
646; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
647; CHECK-GI-NEXT:    fmov s1, s15
648; CHECK-GI-NEXT:    fmov s0, s9
649; CHECK-GI-NEXT:    bl fmodf
650; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
651; CHECK-GI-NEXT:    str q0, [sp, #80] // 16-byte Folded Spill
652; CHECK-GI-NEXT:    fmov s1, s13
653; CHECK-GI-NEXT:    fmov s0, s10
654; CHECK-GI-NEXT:    bl fmodf
655; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
656; CHECK-GI-NEXT:    str q0, [sp, #64] // 16-byte Folded Spill
657; CHECK-GI-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
658; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
659; CHECK-GI-NEXT:    // kill: def $s1 killed $s1 killed $q1
660; CHECK-GI-NEXT:    bl fmodf
661; CHECK-GI-NEXT:    fmov s1, s12
662; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
663; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
664; CHECK-GI-NEXT:    ldr s0, [sp, #48] // 4-byte Folded Reload
665; CHECK-GI-NEXT:    bl fmodf
666; CHECK-GI-NEXT:    fmov s1, s11
667; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
668; CHECK-GI-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
669; CHECK-GI-NEXT:    ldr s0, [sp, #112] // 4-byte Folded Reload
670; CHECK-GI-NEXT:    bl fmodf
671; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
672; CHECK-GI-NEXT:    str q0, [sp, #112] // 16-byte Folded Spill
673; CHECK-GI-NEXT:    ldp s1, s0, [sp, #200] // 8-byte Folded Reload
674; CHECK-GI-NEXT:    bl fmodf
675; CHECK-GI-NEXT:    ldp q3, q2, [sp, #16] // 32-byte Folded Reload
676; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
677; CHECK-GI-NEXT:    ldr q1, [sp, #96] // 16-byte Folded Reload
678; CHECK-GI-NEXT:    ldp d9, d8, [sp, #176] // 16-byte Folded Reload
679; CHECK-GI-NEXT:    ldr x30, [sp, #192] // 8-byte Folded Reload
680; CHECK-GI-NEXT:    ldp d11, d10, [sp, #160] // 16-byte Folded Reload
681; CHECK-GI-NEXT:    mov v1.s[1], v2.s[0]
682; CHECK-GI-NEXT:    ldr q2, [sp, #48] // 16-byte Folded Reload
683; CHECK-GI-NEXT:    ldp d13, d12, [sp, #144] // 16-byte Folded Reload
684; CHECK-GI-NEXT:    mov v3.s[1], v2.s[0]
685; CHECK-GI-NEXT:    ldr q2, [sp, #80] // 16-byte Folded Reload
686; CHECK-GI-NEXT:    ldp d15, d14, [sp, #128] // 16-byte Folded Reload
687; CHECK-GI-NEXT:    mov v1.s[2], v2.s[0]
688; CHECK-GI-NEXT:    ldr q2, [sp, #112] // 16-byte Folded Reload
689; CHECK-GI-NEXT:    mov v3.s[2], v2.s[0]
690; CHECK-GI-NEXT:    ldr q2, [sp, #64] // 16-byte Folded Reload
691; CHECK-GI-NEXT:    mov v1.s[3], v2.s[0]
692; CHECK-GI-NEXT:    mov v3.s[3], v0.s[0]
693; CHECK-GI-NEXT:    mov v2.16b, v1.16b
694; CHECK-GI-NEXT:    mov v1.16b, v3.16b
695; CHECK-GI-NEXT:    mov v0.16b, v2.16b
696; CHECK-GI-NEXT:    add sp, sp, #208
697; CHECK-GI-NEXT:    ret
698entry:
699  %c = frem <8 x float> %a, %b
700  ret <8 x float> %c
701}
702
703define <7 x half> @frem_v7f16(<7 x half> %a, <7 x half> %b) {
704; CHECK-SD-LABEL: frem_v7f16:
705; CHECK-SD:       // %bb.0: // %entry
706; CHECK-SD-NEXT:    sub sp, sp, #64
707; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
708; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
709; CHECK-SD-NEXT:    .cfi_offset w30, -16
710; CHECK-SD-NEXT:    mov h3, v0.h[1]
711; CHECK-SD-NEXT:    mov h2, v1.h[1]
712; CHECK-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
713; CHECK-SD-NEXT:    fcvt s0, h3
714; CHECK-SD-NEXT:    fcvt s1, h2
715; CHECK-SD-NEXT:    bl fmodf
716; CHECK-SD-NEXT:    fcvt h0, s0
717; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
718; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
719; CHECK-SD-NEXT:    fcvt s0, h0
720; CHECK-SD-NEXT:    fcvt s1, h1
721; CHECK-SD-NEXT:    bl fmodf
722; CHECK-SD-NEXT:    fcvt h0, s0
723; CHECK-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
724; CHECK-SD-NEXT:    mov h1, v1.h[2]
725; CHECK-SD-NEXT:    mov v0.h[1], v2.h[0]
726; CHECK-SD-NEXT:    fcvt s1, h1
727; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
728; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
729; CHECK-SD-NEXT:    mov h0, v0.h[2]
730; CHECK-SD-NEXT:    fcvt s0, h0
731; CHECK-SD-NEXT:    bl fmodf
732; CHECK-SD-NEXT:    fcvt h0, s0
733; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
734; CHECK-SD-NEXT:    mov v1.h[2], v0.h[0]
735; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
736; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
737; CHECK-SD-NEXT:    mov h0, v0.h[3]
738; CHECK-SD-NEXT:    mov h1, v1.h[3]
739; CHECK-SD-NEXT:    fcvt s0, h0
740; CHECK-SD-NEXT:    fcvt s1, h1
741; CHECK-SD-NEXT:    bl fmodf
742; CHECK-SD-NEXT:    fcvt h0, s0
743; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
744; CHECK-SD-NEXT:    mov v1.h[3], v0.h[0]
745; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
746; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
747; CHECK-SD-NEXT:    mov h0, v0.h[4]
748; CHECK-SD-NEXT:    mov h1, v1.h[4]
749; CHECK-SD-NEXT:    fcvt s0, h0
750; CHECK-SD-NEXT:    fcvt s1, h1
751; CHECK-SD-NEXT:    bl fmodf
752; CHECK-SD-NEXT:    fcvt h0, s0
753; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
754; CHECK-SD-NEXT:    mov v1.h[4], v0.h[0]
755; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
756; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
757; CHECK-SD-NEXT:    mov h0, v0.h[5]
758; CHECK-SD-NEXT:    mov h1, v1.h[5]
759; CHECK-SD-NEXT:    fcvt s0, h0
760; CHECK-SD-NEXT:    fcvt s1, h1
761; CHECK-SD-NEXT:    bl fmodf
762; CHECK-SD-NEXT:    fcvt h0, s0
763; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
764; CHECK-SD-NEXT:    mov v1.h[5], v0.h[0]
765; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
766; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
767; CHECK-SD-NEXT:    mov h0, v0.h[6]
768; CHECK-SD-NEXT:    mov h1, v1.h[6]
769; CHECK-SD-NEXT:    fcvt s0, h0
770; CHECK-SD-NEXT:    fcvt s1, h1
771; CHECK-SD-NEXT:    bl fmodf
772; CHECK-SD-NEXT:    fcvt h0, s0
773; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
774; CHECK-SD-NEXT:    mov v1.h[6], v0.h[0]
775; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
776; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
777; CHECK-SD-NEXT:    mov h0, v0.h[7]
778; CHECK-SD-NEXT:    mov h1, v1.h[7]
779; CHECK-SD-NEXT:    fcvt s0, h0
780; CHECK-SD-NEXT:    fcvt s1, h1
781; CHECK-SD-NEXT:    bl fmodf
782; CHECK-SD-NEXT:    fcvt h1, s0
783; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
784; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
785; CHECK-SD-NEXT:    mov v0.h[7], v1.h[0]
786; CHECK-SD-NEXT:    add sp, sp, #64
787; CHECK-SD-NEXT:    ret
788;
789; CHECK-GI-LABEL: frem_v7f16:
790; CHECK-GI:       // %bb.0: // %entry
791; CHECK-GI-NEXT:    sub sp, sp, #176
792; CHECK-GI-NEXT:    stp d15, d14, [sp, #96] // 16-byte Folded Spill
793; CHECK-GI-NEXT:    stp d13, d12, [sp, #112] // 16-byte Folded Spill
794; CHECK-GI-NEXT:    stp d11, d10, [sp, #128] // 16-byte Folded Spill
795; CHECK-GI-NEXT:    stp d9, d8, [sp, #144] // 16-byte Folded Spill
796; CHECK-GI-NEXT:    str x30, [sp, #160] // 8-byte Folded Spill
797; CHECK-GI-NEXT:    .cfi_def_cfa_offset 176
798; CHECK-GI-NEXT:    .cfi_offset w30, -16
799; CHECK-GI-NEXT:    .cfi_offset b8, -24
800; CHECK-GI-NEXT:    .cfi_offset b9, -32
801; CHECK-GI-NEXT:    .cfi_offset b10, -40
802; CHECK-GI-NEXT:    .cfi_offset b11, -48
803; CHECK-GI-NEXT:    .cfi_offset b12, -56
804; CHECK-GI-NEXT:    .cfi_offset b13, -64
805; CHECK-GI-NEXT:    .cfi_offset b14, -72
806; CHECK-GI-NEXT:    .cfi_offset b15, -80
807; CHECK-GI-NEXT:    mov h2, v0.h[5]
808; CHECK-GI-NEXT:    mov h9, v0.h[1]
809; CHECK-GI-NEXT:    mov h10, v0.h[2]
810; CHECK-GI-NEXT:    mov h11, v0.h[3]
811; CHECK-GI-NEXT:    mov h12, v0.h[4]
812; CHECK-GI-NEXT:    mov h14, v1.h[1]
813; CHECK-GI-NEXT:    mov h15, v1.h[2]
814; CHECK-GI-NEXT:    mov h8, v1.h[3]
815; CHECK-GI-NEXT:    mov h13, v1.h[4]
816; CHECK-GI-NEXT:    str h2, [sp, #48] // 2-byte Folded Spill
817; CHECK-GI-NEXT:    mov h2, v0.h[6]
818; CHECK-GI-NEXT:    fcvt s0, h0
819; CHECK-GI-NEXT:    str h2, [sp, #80] // 2-byte Folded Spill
820; CHECK-GI-NEXT:    mov h2, v1.h[5]
821; CHECK-GI-NEXT:    str h2, [sp, #172] // 2-byte Folded Spill
822; CHECK-GI-NEXT:    mov h2, v1.h[6]
823; CHECK-GI-NEXT:    fcvt s1, h1
824; CHECK-GI-NEXT:    str h2, [sp, #174] // 2-byte Folded Spill
825; CHECK-GI-NEXT:    bl fmodf
826; CHECK-GI-NEXT:    fcvt s2, h9
827; CHECK-GI-NEXT:    fcvt h0, s0
828; CHECK-GI-NEXT:    fcvt s1, h14
829; CHECK-GI-NEXT:    str q0, [sp, #64] // 16-byte Folded Spill
830; CHECK-GI-NEXT:    fmov s0, s2
831; CHECK-GI-NEXT:    bl fmodf
832; CHECK-GI-NEXT:    fcvt s2, h10
833; CHECK-GI-NEXT:    fcvt h0, s0
834; CHECK-GI-NEXT:    fcvt s1, h15
835; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
836; CHECK-GI-NEXT:    fmov s0, s2
837; CHECK-GI-NEXT:    bl fmodf
838; CHECK-GI-NEXT:    fcvt s2, h11
839; CHECK-GI-NEXT:    fcvt h0, s0
840; CHECK-GI-NEXT:    fcvt s1, h8
841; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
842; CHECK-GI-NEXT:    fmov s0, s2
843; CHECK-GI-NEXT:    bl fmodf
844; CHECK-GI-NEXT:    fcvt s2, h12
845; CHECK-GI-NEXT:    fcvt h0, s0
846; CHECK-GI-NEXT:    fcvt s1, h13
847; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
848; CHECK-GI-NEXT:    fmov s0, s2
849; CHECK-GI-NEXT:    bl fmodf
850; CHECK-GI-NEXT:    ldr h1, [sp, #48] // 2-byte Folded Reload
851; CHECK-GI-NEXT:    fcvt h0, s0
852; CHECK-GI-NEXT:    fcvt s2, h1
853; CHECK-GI-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
854; CHECK-GI-NEXT:    ldr h0, [sp, #172] // 2-byte Folded Reload
855; CHECK-GI-NEXT:    fcvt s1, h0
856; CHECK-GI-NEXT:    fmov s0, s2
857; CHECK-GI-NEXT:    bl fmodf
858; CHECK-GI-NEXT:    ldr h1, [sp, #80] // 2-byte Folded Reload
859; CHECK-GI-NEXT:    fcvt h0, s0
860; CHECK-GI-NEXT:    fcvt s2, h1
861; CHECK-GI-NEXT:    str q0, [sp, #80] // 16-byte Folded Spill
862; CHECK-GI-NEXT:    ldr h0, [sp, #174] // 2-byte Folded Reload
863; CHECK-GI-NEXT:    fcvt s1, h0
864; CHECK-GI-NEXT:    fmov s0, s2
865; CHECK-GI-NEXT:    bl fmodf
866; CHECK-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
867; CHECK-GI-NEXT:    fcvt h0, s0
868; CHECK-GI-NEXT:    ldr q1, [sp, #64] // 16-byte Folded Reload
869; CHECK-GI-NEXT:    ldp d9, d8, [sp, #144] // 16-byte Folded Reload
870; CHECK-GI-NEXT:    ldp d11, d10, [sp, #128] // 16-byte Folded Reload
871; CHECK-GI-NEXT:    ldr x30, [sp, #160] // 8-byte Folded Reload
872; CHECK-GI-NEXT:    mov v1.h[1], v3.h[0]
873; CHECK-GI-NEXT:    ldp d13, d12, [sp, #112] // 16-byte Folded Reload
874; CHECK-GI-NEXT:    ldp d15, d14, [sp, #96] // 16-byte Folded Reload
875; CHECK-GI-NEXT:    mov v1.h[2], v2.h[0]
876; CHECK-GI-NEXT:    ldr q2, [sp] // 16-byte Folded Reload
877; CHECK-GI-NEXT:    mov v1.h[3], v2.h[0]
878; CHECK-GI-NEXT:    ldr q2, [sp, #48] // 16-byte Folded Reload
879; CHECK-GI-NEXT:    mov v1.h[4], v2.h[0]
880; CHECK-GI-NEXT:    ldr q2, [sp, #80] // 16-byte Folded Reload
881; CHECK-GI-NEXT:    mov v1.h[5], v2.h[0]
882; CHECK-GI-NEXT:    mov v1.h[6], v0.h[0]
883; CHECK-GI-NEXT:    mov v0.16b, v1.16b
884; CHECK-GI-NEXT:    add sp, sp, #176
885; CHECK-GI-NEXT:    ret
886entry:
887  %c = frem <7 x half> %a, %b
888  ret <7 x half> %c
889}
890
891define <4 x half> @frem_v4f16(<4 x half> %a, <4 x half> %b) {
892; CHECK-SD-LABEL: frem_v4f16:
893; CHECK-SD:       // %bb.0: // %entry
894; CHECK-SD-NEXT:    sub sp, sp, #64
895; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
896; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
897; CHECK-SD-NEXT:    .cfi_offset w30, -16
898; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
899; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
900; CHECK-SD-NEXT:    mov h3, v0.h[1]
901; CHECK-SD-NEXT:    mov h2, v1.h[1]
902; CHECK-SD-NEXT:    stp q0, q1, [sp, #16] // 32-byte Folded Spill
903; CHECK-SD-NEXT:    fcvt s0, h3
904; CHECK-SD-NEXT:    fcvt s1, h2
905; CHECK-SD-NEXT:    bl fmodf
906; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
907; CHECK-SD-NEXT:    fcvt h0, s0
908; CHECK-SD-NEXT:    fcvt s2, h1
909; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
910; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
911; CHECK-SD-NEXT:    fcvt s1, h0
912; CHECK-SD-NEXT:    fmov s0, s2
913; CHECK-SD-NEXT:    bl fmodf
914; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
915; CHECK-SD-NEXT:    fcvt h3, s0
916; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
917; CHECK-SD-NEXT:    mov h1, v1.h[2]
918; CHECK-SD-NEXT:    mov h2, v0.h[2]
919; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
920; CHECK-SD-NEXT:    mov v3.h[1], v0.h[0]
921; CHECK-SD-NEXT:    fcvt s0, h1
922; CHECK-SD-NEXT:    fcvt s1, h2
923; CHECK-SD-NEXT:    str q3, [sp] // 16-byte Folded Spill
924; CHECK-SD-NEXT:    bl fmodf
925; CHECK-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
926; CHECK-SD-NEXT:    fcvt h0, s0
927; CHECK-SD-NEXT:    ldr q3, [sp] // 16-byte Folded Reload
928; CHECK-SD-NEXT:    mov h1, v1.h[3]
929; CHECK-SD-NEXT:    mov h2, v2.h[3]
930; CHECK-SD-NEXT:    mov v3.h[2], v0.h[0]
931; CHECK-SD-NEXT:    fcvt s0, h1
932; CHECK-SD-NEXT:    fcvt s1, h2
933; CHECK-SD-NEXT:    str q3, [sp] // 16-byte Folded Spill
934; CHECK-SD-NEXT:    bl fmodf
935; CHECK-SD-NEXT:    fcvt h1, s0
936; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
937; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
938; CHECK-SD-NEXT:    mov v0.h[3], v1.h[0]
939; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
940; CHECK-SD-NEXT:    add sp, sp, #64
941; CHECK-SD-NEXT:    ret
942;
943; CHECK-GI-LABEL: frem_v4f16:
944; CHECK-GI:       // %bb.0: // %entry
945; CHECK-GI-NEXT:    sub sp, sp, #112
946; CHECK-GI-NEXT:    stp d13, d12, [sp, #48] // 16-byte Folded Spill
947; CHECK-GI-NEXT:    stp d11, d10, [sp, #64] // 16-byte Folded Spill
948; CHECK-GI-NEXT:    stp d9, d8, [sp, #80] // 16-byte Folded Spill
949; CHECK-GI-NEXT:    str x30, [sp, #96] // 8-byte Folded Spill
950; CHECK-GI-NEXT:    .cfi_def_cfa_offset 112
951; CHECK-GI-NEXT:    .cfi_offset w30, -16
952; CHECK-GI-NEXT:    .cfi_offset b8, -24
953; CHECK-GI-NEXT:    .cfi_offset b9, -32
954; CHECK-GI-NEXT:    .cfi_offset b10, -40
955; CHECK-GI-NEXT:    .cfi_offset b11, -48
956; CHECK-GI-NEXT:    .cfi_offset b12, -56
957; CHECK-GI-NEXT:    .cfi_offset b13, -64
958; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
959; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
960; CHECK-GI-NEXT:    mov h8, v0.h[1]
961; CHECK-GI-NEXT:    mov h9, v0.h[2]
962; CHECK-GI-NEXT:    mov h10, v0.h[3]
963; CHECK-GI-NEXT:    mov h11, v1.h[1]
964; CHECK-GI-NEXT:    mov h12, v1.h[2]
965; CHECK-GI-NEXT:    mov h13, v1.h[3]
966; CHECK-GI-NEXT:    fcvt s0, h0
967; CHECK-GI-NEXT:    fcvt s1, h1
968; CHECK-GI-NEXT:    bl fmodf
969; CHECK-GI-NEXT:    fcvt s2, h8
970; CHECK-GI-NEXT:    fcvt h0, s0
971; CHECK-GI-NEXT:    fcvt s1, h11
972; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
973; CHECK-GI-NEXT:    fmov s0, s2
974; CHECK-GI-NEXT:    bl fmodf
975; CHECK-GI-NEXT:    fcvt s2, h9
976; CHECK-GI-NEXT:    fcvt h0, s0
977; CHECK-GI-NEXT:    fcvt s1, h12
978; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
979; CHECK-GI-NEXT:    fmov s0, s2
980; CHECK-GI-NEXT:    bl fmodf
981; CHECK-GI-NEXT:    fcvt s2, h10
982; CHECK-GI-NEXT:    fcvt h0, s0
983; CHECK-GI-NEXT:    fcvt s1, h13
984; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
985; CHECK-GI-NEXT:    fmov s0, s2
986; CHECK-GI-NEXT:    bl fmodf
987; CHECK-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
988; CHECK-GI-NEXT:    fcvt h0, s0
989; CHECK-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
990; CHECK-GI-NEXT:    ldp d9, d8, [sp, #80] // 16-byte Folded Reload
991; CHECK-GI-NEXT:    ldp d11, d10, [sp, #64] // 16-byte Folded Reload
992; CHECK-GI-NEXT:    ldr x30, [sp, #96] // 8-byte Folded Reload
993; CHECK-GI-NEXT:    mov v1.h[1], v3.h[0]
994; CHECK-GI-NEXT:    ldp d13, d12, [sp, #48] // 16-byte Folded Reload
995; CHECK-GI-NEXT:    mov v1.h[2], v2.h[0]
996; CHECK-GI-NEXT:    mov v1.h[3], v0.h[0]
997; CHECK-GI-NEXT:    mov v0.16b, v1.16b
998; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
999; CHECK-GI-NEXT:    add sp, sp, #112
1000; CHECK-GI-NEXT:    ret
1001entry:
1002  %c = frem <4 x half> %a, %b
1003  ret <4 x half> %c
1004}
1005
1006define <8 x half> @frem_v8f16(<8 x half> %a, <8 x half> %b) {
1007; CHECK-SD-LABEL: frem_v8f16:
1008; CHECK-SD:       // %bb.0: // %entry
1009; CHECK-SD-NEXT:    sub sp, sp, #64
1010; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
1011; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
1012; CHECK-SD-NEXT:    .cfi_offset w30, -16
1013; CHECK-SD-NEXT:    mov h3, v0.h[1]
1014; CHECK-SD-NEXT:    mov h2, v1.h[1]
1015; CHECK-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
1016; CHECK-SD-NEXT:    fcvt s0, h3
1017; CHECK-SD-NEXT:    fcvt s1, h2
1018; CHECK-SD-NEXT:    bl fmodf
1019; CHECK-SD-NEXT:    fcvt h0, s0
1020; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
1021; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
1022; CHECK-SD-NEXT:    fcvt s0, h0
1023; CHECK-SD-NEXT:    fcvt s1, h1
1024; CHECK-SD-NEXT:    bl fmodf
1025; CHECK-SD-NEXT:    fcvt h0, s0
1026; CHECK-SD-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
1027; CHECK-SD-NEXT:    mov h1, v1.h[2]
1028; CHECK-SD-NEXT:    mov v0.h[1], v2.h[0]
1029; CHECK-SD-NEXT:    fcvt s1, h1
1030; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
1031; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1032; CHECK-SD-NEXT:    mov h0, v0.h[2]
1033; CHECK-SD-NEXT:    fcvt s0, h0
1034; CHECK-SD-NEXT:    bl fmodf
1035; CHECK-SD-NEXT:    fcvt h0, s0
1036; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1037; CHECK-SD-NEXT:    mov v1.h[2], v0.h[0]
1038; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
1039; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
1040; CHECK-SD-NEXT:    mov h0, v0.h[3]
1041; CHECK-SD-NEXT:    mov h1, v1.h[3]
1042; CHECK-SD-NEXT:    fcvt s0, h0
1043; CHECK-SD-NEXT:    fcvt s1, h1
1044; CHECK-SD-NEXT:    bl fmodf
1045; CHECK-SD-NEXT:    fcvt h0, s0
1046; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1047; CHECK-SD-NEXT:    mov v1.h[3], v0.h[0]
1048; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
1049; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
1050; CHECK-SD-NEXT:    mov h0, v0.h[4]
1051; CHECK-SD-NEXT:    mov h1, v1.h[4]
1052; CHECK-SD-NEXT:    fcvt s0, h0
1053; CHECK-SD-NEXT:    fcvt s1, h1
1054; CHECK-SD-NEXT:    bl fmodf
1055; CHECK-SD-NEXT:    fcvt h0, s0
1056; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1057; CHECK-SD-NEXT:    mov v1.h[4], v0.h[0]
1058; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
1059; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
1060; CHECK-SD-NEXT:    mov h0, v0.h[5]
1061; CHECK-SD-NEXT:    mov h1, v1.h[5]
1062; CHECK-SD-NEXT:    fcvt s0, h0
1063; CHECK-SD-NEXT:    fcvt s1, h1
1064; CHECK-SD-NEXT:    bl fmodf
1065; CHECK-SD-NEXT:    fcvt h0, s0
1066; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1067; CHECK-SD-NEXT:    mov v1.h[5], v0.h[0]
1068; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
1069; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
1070; CHECK-SD-NEXT:    mov h0, v0.h[6]
1071; CHECK-SD-NEXT:    mov h1, v1.h[6]
1072; CHECK-SD-NEXT:    fcvt s0, h0
1073; CHECK-SD-NEXT:    fcvt s1, h1
1074; CHECK-SD-NEXT:    bl fmodf
1075; CHECK-SD-NEXT:    fcvt h0, s0
1076; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1077; CHECK-SD-NEXT:    mov v1.h[6], v0.h[0]
1078; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
1079; CHECK-SD-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
1080; CHECK-SD-NEXT:    mov h0, v0.h[7]
1081; CHECK-SD-NEXT:    mov h1, v1.h[7]
1082; CHECK-SD-NEXT:    fcvt s0, h0
1083; CHECK-SD-NEXT:    fcvt s1, h1
1084; CHECK-SD-NEXT:    bl fmodf
1085; CHECK-SD-NEXT:    fcvt h1, s0
1086; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
1087; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
1088; CHECK-SD-NEXT:    mov v0.h[7], v1.h[0]
1089; CHECK-SD-NEXT:    add sp, sp, #64
1090; CHECK-SD-NEXT:    ret
1091;
1092; CHECK-GI-LABEL: frem_v8f16:
1093; CHECK-GI:       // %bb.0: // %entry
1094; CHECK-GI-NEXT:    sub sp, sp, #192
1095; CHECK-GI-NEXT:    stp d15, d14, [sp, #112] // 16-byte Folded Spill
1096; CHECK-GI-NEXT:    stp d13, d12, [sp, #128] // 16-byte Folded Spill
1097; CHECK-GI-NEXT:    stp d11, d10, [sp, #144] // 16-byte Folded Spill
1098; CHECK-GI-NEXT:    stp d9, d8, [sp, #160] // 16-byte Folded Spill
1099; CHECK-GI-NEXT:    str x30, [sp, #176] // 8-byte Folded Spill
1100; CHECK-GI-NEXT:    .cfi_def_cfa_offset 192
1101; CHECK-GI-NEXT:    .cfi_offset w30, -16
1102; CHECK-GI-NEXT:    .cfi_offset b8, -24
1103; CHECK-GI-NEXT:    .cfi_offset b9, -32
1104; CHECK-GI-NEXT:    .cfi_offset b10, -40
1105; CHECK-GI-NEXT:    .cfi_offset b11, -48
1106; CHECK-GI-NEXT:    .cfi_offset b12, -56
1107; CHECK-GI-NEXT:    .cfi_offset b13, -64
1108; CHECK-GI-NEXT:    .cfi_offset b14, -72
1109; CHECK-GI-NEXT:    .cfi_offset b15, -80
1110; CHECK-GI-NEXT:    mov h2, v0.h[5]
1111; CHECK-GI-NEXT:    mov h11, v0.h[1]
1112; CHECK-GI-NEXT:    mov h12, v0.h[2]
1113; CHECK-GI-NEXT:    mov h13, v0.h[3]
1114; CHECK-GI-NEXT:    mov h14, v0.h[4]
1115; CHECK-GI-NEXT:    mov h8, v1.h[1]
1116; CHECK-GI-NEXT:    mov h9, v1.h[2]
1117; CHECK-GI-NEXT:    mov h10, v1.h[3]
1118; CHECK-GI-NEXT:    mov h15, v1.h[4]
1119; CHECK-GI-NEXT:    str h2, [sp, #48] // 2-byte Folded Spill
1120; CHECK-GI-NEXT:    mov h2, v0.h[6]
1121; CHECK-GI-NEXT:    str h2, [sp, #64] // 2-byte Folded Spill
1122; CHECK-GI-NEXT:    mov h2, v0.h[7]
1123; CHECK-GI-NEXT:    fcvt s0, h0
1124; CHECK-GI-NEXT:    str h2, [sp, #96] // 2-byte Folded Spill
1125; CHECK-GI-NEXT:    mov h2, v1.h[5]
1126; CHECK-GI-NEXT:    str h2, [sp, #186] // 2-byte Folded Spill
1127; CHECK-GI-NEXT:    mov h2, v1.h[6]
1128; CHECK-GI-NEXT:    str h2, [sp, #188] // 2-byte Folded Spill
1129; CHECK-GI-NEXT:    mov h2, v1.h[7]
1130; CHECK-GI-NEXT:    fcvt s1, h1
1131; CHECK-GI-NEXT:    str h2, [sp, #190] // 2-byte Folded Spill
1132; CHECK-GI-NEXT:    bl fmodf
1133; CHECK-GI-NEXT:    fcvt s2, h11
1134; CHECK-GI-NEXT:    fcvt h0, s0
1135; CHECK-GI-NEXT:    fcvt s1, h8
1136; CHECK-GI-NEXT:    str q0, [sp, #80] // 16-byte Folded Spill
1137; CHECK-GI-NEXT:    fmov s0, s2
1138; CHECK-GI-NEXT:    bl fmodf
1139; CHECK-GI-NEXT:    fcvt s2, h12
1140; CHECK-GI-NEXT:    fcvt h0, s0
1141; CHECK-GI-NEXT:    fcvt s1, h9
1142; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
1143; CHECK-GI-NEXT:    fmov s0, s2
1144; CHECK-GI-NEXT:    bl fmodf
1145; CHECK-GI-NEXT:    fcvt s2, h13
1146; CHECK-GI-NEXT:    fcvt h0, s0
1147; CHECK-GI-NEXT:    fcvt s1, h10
1148; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1149; CHECK-GI-NEXT:    fmov s0, s2
1150; CHECK-GI-NEXT:    bl fmodf
1151; CHECK-GI-NEXT:    fcvt s2, h14
1152; CHECK-GI-NEXT:    fcvt h0, s0
1153; CHECK-GI-NEXT:    fcvt s1, h15
1154; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1155; CHECK-GI-NEXT:    fmov s0, s2
1156; CHECK-GI-NEXT:    bl fmodf
1157; CHECK-GI-NEXT:    ldr h1, [sp, #48] // 2-byte Folded Reload
1158; CHECK-GI-NEXT:    fcvt h0, s0
1159; CHECK-GI-NEXT:    fcvt s2, h1
1160; CHECK-GI-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
1161; CHECK-GI-NEXT:    ldr h0, [sp, #186] // 2-byte Folded Reload
1162; CHECK-GI-NEXT:    fcvt s1, h0
1163; CHECK-GI-NEXT:    fmov s0, s2
1164; CHECK-GI-NEXT:    bl fmodf
1165; CHECK-GI-NEXT:    ldr h1, [sp, #64] // 2-byte Folded Reload
1166; CHECK-GI-NEXT:    fcvt h0, s0
1167; CHECK-GI-NEXT:    fcvt s2, h1
1168; CHECK-GI-NEXT:    str q0, [sp, #64] // 16-byte Folded Spill
1169; CHECK-GI-NEXT:    ldr h0, [sp, #188] // 2-byte Folded Reload
1170; CHECK-GI-NEXT:    fcvt s1, h0
1171; CHECK-GI-NEXT:    fmov s0, s2
1172; CHECK-GI-NEXT:    bl fmodf
1173; CHECK-GI-NEXT:    ldr h1, [sp, #96] // 2-byte Folded Reload
1174; CHECK-GI-NEXT:    fcvt h0, s0
1175; CHECK-GI-NEXT:    fcvt s2, h1
1176; CHECK-GI-NEXT:    str q0, [sp, #96] // 16-byte Folded Spill
1177; CHECK-GI-NEXT:    ldr h0, [sp, #190] // 2-byte Folded Reload
1178; CHECK-GI-NEXT:    fcvt s1, h0
1179; CHECK-GI-NEXT:    fmov s0, s2
1180; CHECK-GI-NEXT:    bl fmodf
1181; CHECK-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
1182; CHECK-GI-NEXT:    fcvt h0, s0
1183; CHECK-GI-NEXT:    ldr q1, [sp, #80] // 16-byte Folded Reload
1184; CHECK-GI-NEXT:    ldp d9, d8, [sp, #160] // 16-byte Folded Reload
1185; CHECK-GI-NEXT:    ldp d11, d10, [sp, #144] // 16-byte Folded Reload
1186; CHECK-GI-NEXT:    ldr x30, [sp, #176] // 8-byte Folded Reload
1187; CHECK-GI-NEXT:    mov v1.h[1], v3.h[0]
1188; CHECK-GI-NEXT:    ldp d13, d12, [sp, #128] // 16-byte Folded Reload
1189; CHECK-GI-NEXT:    ldp d15, d14, [sp, #112] // 16-byte Folded Reload
1190; CHECK-GI-NEXT:    mov v1.h[2], v2.h[0]
1191; CHECK-GI-NEXT:    ldr q2, [sp] // 16-byte Folded Reload
1192; CHECK-GI-NEXT:    mov v1.h[3], v2.h[0]
1193; CHECK-GI-NEXT:    ldp q3, q2, [sp, #48] // 32-byte Folded Reload
1194; CHECK-GI-NEXT:    mov v1.h[4], v3.h[0]
1195; CHECK-GI-NEXT:    mov v1.h[5], v2.h[0]
1196; CHECK-GI-NEXT:    ldr q2, [sp, #96] // 16-byte Folded Reload
1197; CHECK-GI-NEXT:    mov v1.h[6], v2.h[0]
1198; CHECK-GI-NEXT:    mov v1.h[7], v0.h[0]
1199; CHECK-GI-NEXT:    mov v0.16b, v1.16b
1200; CHECK-GI-NEXT:    add sp, sp, #192
1201; CHECK-GI-NEXT:    ret
1202entry:
1203  %c = frem <8 x half> %a, %b
1204  ret <8 x half> %c
1205}
1206
1207define <16 x half> @frem_v16f16(<16 x half> %a, <16 x half> %b) {
1208; CHECK-SD-LABEL: frem_v16f16:
1209; CHECK-SD:       // %bb.0: // %entry
1210; CHECK-SD-NEXT:    sub sp, sp, #96
1211; CHECK-SD-NEXT:    str x30, [sp, #80] // 8-byte Folded Spill
1212; CHECK-SD-NEXT:    .cfi_def_cfa_offset 96
1213; CHECK-SD-NEXT:    .cfi_offset w30, -16
1214; CHECK-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
1215; CHECK-SD-NEXT:    mov h1, v2.h[1]
1216; CHECK-SD-NEXT:    stp q3, q2, [sp, #32] // 32-byte Folded Spill
1217; CHECK-SD-NEXT:    mov h3, v0.h[1]
1218; CHECK-SD-NEXT:    fcvt s1, h1
1219; CHECK-SD-NEXT:    fcvt s0, h3
1220; CHECK-SD-NEXT:    bl fmodf
1221; CHECK-SD-NEXT:    fcvt h0, s0
1222; CHECK-SD-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1223; CHECK-SD-NEXT:    fcvt s1, h1
1224; CHECK-SD-NEXT:    str q0, [sp, #64] // 16-byte Folded Spill
1225; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1226; CHECK-SD-NEXT:    fcvt s0, h0
1227; CHECK-SD-NEXT:    bl fmodf
1228; CHECK-SD-NEXT:    fcvt h0, s0
1229; CHECK-SD-NEXT:    ldp q1, q2, [sp, #48] // 32-byte Folded Reload
1230; CHECK-SD-NEXT:    mov h1, v1.h[2]
1231; CHECK-SD-NEXT:    mov v0.h[1], v2.h[0]
1232; CHECK-SD-NEXT:    fcvt s1, h1
1233; CHECK-SD-NEXT:    str q0, [sp, #64] // 16-byte Folded Spill
1234; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1235; CHECK-SD-NEXT:    mov h0, v0.h[2]
1236; CHECK-SD-NEXT:    fcvt s0, h0
1237; CHECK-SD-NEXT:    bl fmodf
1238; CHECK-SD-NEXT:    fcvt h0, s0
1239; CHECK-SD-NEXT:    ldr q1, [sp, #64] // 16-byte Folded Reload
1240; CHECK-SD-NEXT:    mov v1.h[2], v0.h[0]
1241; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1242; CHECK-SD-NEXT:    mov h0, v0.h[3]
1243; CHECK-SD-NEXT:    str q1, [sp, #64] // 16-byte Folded Spill
1244; CHECK-SD-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1245; CHECK-SD-NEXT:    mov h1, v1.h[3]
1246; CHECK-SD-NEXT:    fcvt s0, h0
1247; CHECK-SD-NEXT:    fcvt s1, h1
1248; CHECK-SD-NEXT:    bl fmodf
1249; CHECK-SD-NEXT:    fcvt h0, s0
1250; CHECK-SD-NEXT:    ldr q1, [sp, #64] // 16-byte Folded Reload
1251; CHECK-SD-NEXT:    mov v1.h[3], v0.h[0]
1252; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1253; CHECK-SD-NEXT:    mov h0, v0.h[4]
1254; CHECK-SD-NEXT:    str q1, [sp, #64] // 16-byte Folded Spill
1255; CHECK-SD-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1256; CHECK-SD-NEXT:    mov h1, v1.h[4]
1257; CHECK-SD-NEXT:    fcvt s0, h0
1258; CHECK-SD-NEXT:    fcvt s1, h1
1259; CHECK-SD-NEXT:    bl fmodf
1260; CHECK-SD-NEXT:    fcvt h0, s0
1261; CHECK-SD-NEXT:    ldr q1, [sp, #64] // 16-byte Folded Reload
1262; CHECK-SD-NEXT:    mov v1.h[4], v0.h[0]
1263; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1264; CHECK-SD-NEXT:    mov h0, v0.h[5]
1265; CHECK-SD-NEXT:    str q1, [sp, #64] // 16-byte Folded Spill
1266; CHECK-SD-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1267; CHECK-SD-NEXT:    mov h1, v1.h[5]
1268; CHECK-SD-NEXT:    fcvt s0, h0
1269; CHECK-SD-NEXT:    fcvt s1, h1
1270; CHECK-SD-NEXT:    bl fmodf
1271; CHECK-SD-NEXT:    fcvt h0, s0
1272; CHECK-SD-NEXT:    ldr q1, [sp, #64] // 16-byte Folded Reload
1273; CHECK-SD-NEXT:    mov v1.h[5], v0.h[0]
1274; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1275; CHECK-SD-NEXT:    mov h0, v0.h[6]
1276; CHECK-SD-NEXT:    str q1, [sp, #64] // 16-byte Folded Spill
1277; CHECK-SD-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1278; CHECK-SD-NEXT:    mov h1, v1.h[6]
1279; CHECK-SD-NEXT:    fcvt s0, h0
1280; CHECK-SD-NEXT:    fcvt s1, h1
1281; CHECK-SD-NEXT:    bl fmodf
1282; CHECK-SD-NEXT:    fcvt h0, s0
1283; CHECK-SD-NEXT:    ldr q1, [sp, #64] // 16-byte Folded Reload
1284; CHECK-SD-NEXT:    mov v1.h[6], v0.h[0]
1285; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1286; CHECK-SD-NEXT:    mov h0, v0.h[7]
1287; CHECK-SD-NEXT:    str q1, [sp, #64] // 16-byte Folded Spill
1288; CHECK-SD-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1289; CHECK-SD-NEXT:    mov h1, v1.h[7]
1290; CHECK-SD-NEXT:    fcvt s0, h0
1291; CHECK-SD-NEXT:    fcvt s1, h1
1292; CHECK-SD-NEXT:    bl fmodf
1293; CHECK-SD-NEXT:    fcvt h0, s0
1294; CHECK-SD-NEXT:    ldr q1, [sp, #64] // 16-byte Folded Reload
1295; CHECK-SD-NEXT:    mov v1.h[7], v0.h[0]
1296; CHECK-SD-NEXT:    str q1, [sp, #64] // 16-byte Folded Spill
1297; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
1298; CHECK-SD-NEXT:    mov h0, v0.h[1]
1299; CHECK-SD-NEXT:    mov h1, v1.h[1]
1300; CHECK-SD-NEXT:    fcvt s0, h0
1301; CHECK-SD-NEXT:    fcvt s1, h1
1302; CHECK-SD-NEXT:    bl fmodf
1303; CHECK-SD-NEXT:    fcvt h0, s0
1304; CHECK-SD-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
1305; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
1306; CHECK-SD-NEXT:    fcvt s0, h0
1307; CHECK-SD-NEXT:    fcvt s1, h1
1308; CHECK-SD-NEXT:    bl fmodf
1309; CHECK-SD-NEXT:    fcvt h0, s0
1310; CHECK-SD-NEXT:    ldp q1, q2, [sp, #32] // 32-byte Folded Reload
1311; CHECK-SD-NEXT:    mov h1, v1.h[2]
1312; CHECK-SD-NEXT:    mov v0.h[1], v2.h[0]
1313; CHECK-SD-NEXT:    fcvt s1, h1
1314; CHECK-SD-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
1315; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1316; CHECK-SD-NEXT:    mov h0, v0.h[2]
1317; CHECK-SD-NEXT:    fcvt s0, h0
1318; CHECK-SD-NEXT:    bl fmodf
1319; CHECK-SD-NEXT:    fcvt h0, s0
1320; CHECK-SD-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1321; CHECK-SD-NEXT:    mov v1.h[2], v0.h[0]
1322; CHECK-SD-NEXT:    str q1, [sp, #48] // 16-byte Folded Spill
1323; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
1324; CHECK-SD-NEXT:    mov h0, v0.h[3]
1325; CHECK-SD-NEXT:    mov h1, v1.h[3]
1326; CHECK-SD-NEXT:    fcvt s0, h0
1327; CHECK-SD-NEXT:    fcvt s1, h1
1328; CHECK-SD-NEXT:    bl fmodf
1329; CHECK-SD-NEXT:    fcvt h0, s0
1330; CHECK-SD-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1331; CHECK-SD-NEXT:    mov v1.h[3], v0.h[0]
1332; CHECK-SD-NEXT:    str q1, [sp, #48] // 16-byte Folded Spill
1333; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
1334; CHECK-SD-NEXT:    mov h0, v0.h[4]
1335; CHECK-SD-NEXT:    mov h1, v1.h[4]
1336; CHECK-SD-NEXT:    fcvt s0, h0
1337; CHECK-SD-NEXT:    fcvt s1, h1
1338; CHECK-SD-NEXT:    bl fmodf
1339; CHECK-SD-NEXT:    fcvt h0, s0
1340; CHECK-SD-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1341; CHECK-SD-NEXT:    mov v1.h[4], v0.h[0]
1342; CHECK-SD-NEXT:    str q1, [sp, #48] // 16-byte Folded Spill
1343; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
1344; CHECK-SD-NEXT:    mov h0, v0.h[5]
1345; CHECK-SD-NEXT:    mov h1, v1.h[5]
1346; CHECK-SD-NEXT:    fcvt s0, h0
1347; CHECK-SD-NEXT:    fcvt s1, h1
1348; CHECK-SD-NEXT:    bl fmodf
1349; CHECK-SD-NEXT:    fcvt h0, s0
1350; CHECK-SD-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1351; CHECK-SD-NEXT:    mov v1.h[5], v0.h[0]
1352; CHECK-SD-NEXT:    str q1, [sp, #48] // 16-byte Folded Spill
1353; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
1354; CHECK-SD-NEXT:    mov h0, v0.h[6]
1355; CHECK-SD-NEXT:    mov h1, v1.h[6]
1356; CHECK-SD-NEXT:    fcvt s0, h0
1357; CHECK-SD-NEXT:    fcvt s1, h1
1358; CHECK-SD-NEXT:    bl fmodf
1359; CHECK-SD-NEXT:    fcvt h0, s0
1360; CHECK-SD-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1361; CHECK-SD-NEXT:    mov v1.h[6], v0.h[0]
1362; CHECK-SD-NEXT:    str q1, [sp, #48] // 16-byte Folded Spill
1363; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
1364; CHECK-SD-NEXT:    mov h0, v0.h[7]
1365; CHECK-SD-NEXT:    mov h1, v1.h[7]
1366; CHECK-SD-NEXT:    fcvt s0, h0
1367; CHECK-SD-NEXT:    fcvt s1, h1
1368; CHECK-SD-NEXT:    bl fmodf
1369; CHECK-SD-NEXT:    fmov s1, s0
1370; CHECK-SD-NEXT:    ldr x30, [sp, #80] // 8-byte Folded Reload
1371; CHECK-SD-NEXT:    fcvt h2, s1
1372; CHECK-SD-NEXT:    ldp q1, q0, [sp, #48] // 32-byte Folded Reload
1373; CHECK-SD-NEXT:    mov v1.h[7], v2.h[0]
1374; CHECK-SD-NEXT:    add sp, sp, #96
1375; CHECK-SD-NEXT:    ret
1376;
1377; CHECK-GI-LABEL: frem_v16f16:
1378; CHECK-GI:       // %bb.0: // %entry
1379; CHECK-GI-NEXT:    sub sp, sp, #448
1380; CHECK-GI-NEXT:    stp d15, d14, [sp, #368] // 16-byte Folded Spill
1381; CHECK-GI-NEXT:    stp d13, d12, [sp, #384] // 16-byte Folded Spill
1382; CHECK-GI-NEXT:    stp d11, d10, [sp, #400] // 16-byte Folded Spill
1383; CHECK-GI-NEXT:    stp d9, d8, [sp, #416] // 16-byte Folded Spill
1384; CHECK-GI-NEXT:    stp x29, x30, [sp, #432] // 16-byte Folded Spill
1385; CHECK-GI-NEXT:    .cfi_def_cfa_offset 448
1386; CHECK-GI-NEXT:    .cfi_offset w30, -8
1387; CHECK-GI-NEXT:    .cfi_offset w29, -16
1388; CHECK-GI-NEXT:    .cfi_offset b8, -24
1389; CHECK-GI-NEXT:    .cfi_offset b9, -32
1390; CHECK-GI-NEXT:    .cfi_offset b10, -40
1391; CHECK-GI-NEXT:    .cfi_offset b11, -48
1392; CHECK-GI-NEXT:    .cfi_offset b12, -56
1393; CHECK-GI-NEXT:    .cfi_offset b13, -64
1394; CHECK-GI-NEXT:    .cfi_offset b14, -72
1395; CHECK-GI-NEXT:    .cfi_offset b15, -80
1396; CHECK-GI-NEXT:    mov v4.16b, v1.16b
1397; CHECK-GI-NEXT:    str q1, [sp, #112] // 16-byte Folded Spill
1398; CHECK-GI-NEXT:    mov h1, v0.h[4]
1399; CHECK-GI-NEXT:    mov h12, v0.h[1]
1400; CHECK-GI-NEXT:    mov h13, v0.h[2]
1401; CHECK-GI-NEXT:    str q3, [sp, #16] // 16-byte Folded Spill
1402; CHECK-GI-NEXT:    mov h14, v0.h[3]
1403; CHECK-GI-NEXT:    mov h15, v2.h[1]
1404; CHECK-GI-NEXT:    mov h8, v2.h[2]
1405; CHECK-GI-NEXT:    mov h9, v2.h[3]
1406; CHECK-GI-NEXT:    mov h10, v2.h[4]
1407; CHECK-GI-NEXT:    mov h11, v2.h[5]
1408; CHECK-GI-NEXT:    str h1, [sp, #272] // 2-byte Folded Spill
1409; CHECK-GI-NEXT:    mov h1, v0.h[5]
1410; CHECK-GI-NEXT:    str h1, [sp, #240] // 2-byte Folded Spill
1411; CHECK-GI-NEXT:    mov h1, v0.h[6]
1412; CHECK-GI-NEXT:    str h1, [sp, #176] // 2-byte Folded Spill
1413; CHECK-GI-NEXT:    mov h1, v0.h[7]
1414; CHECK-GI-NEXT:    fcvt s0, h0
1415; CHECK-GI-NEXT:    str h1, [sp, #144] // 2-byte Folded Spill
1416; CHECK-GI-NEXT:    mov h1, v4.h[1]
1417; CHECK-GI-NEXT:    str h1, [sp, #48] // 2-byte Folded Spill
1418; CHECK-GI-NEXT:    mov h1, v4.h[2]
1419; CHECK-GI-NEXT:    str h1, [sp, #80] // 2-byte Folded Spill
1420; CHECK-GI-NEXT:    mov h1, v4.h[3]
1421; CHECK-GI-NEXT:    str h1, [sp, #128] // 2-byte Folded Spill
1422; CHECK-GI-NEXT:    mov h1, v4.h[4]
1423; CHECK-GI-NEXT:    str h1, [sp, #192] // 2-byte Folded Spill
1424; CHECK-GI-NEXT:    mov h1, v4.h[5]
1425; CHECK-GI-NEXT:    str h1, [sp, #256] // 2-byte Folded Spill
1426; CHECK-GI-NEXT:    mov h1, v4.h[6]
1427; CHECK-GI-NEXT:    str h1, [sp, #336] // 2-byte Folded Spill
1428; CHECK-GI-NEXT:    mov h1, v4.h[7]
1429; CHECK-GI-NEXT:    str h1, [sp, #352] // 2-byte Folded Spill
1430; CHECK-GI-NEXT:    mov h1, v2.h[6]
1431; CHECK-GI-NEXT:    str h1, [sp, #12] // 2-byte Folded Spill
1432; CHECK-GI-NEXT:    mov h1, v2.h[7]
1433; CHECK-GI-NEXT:    str h1, [sp, #14] // 2-byte Folded Spill
1434; CHECK-GI-NEXT:    mov h1, v3.h[1]
1435; CHECK-GI-NEXT:    str h1, [sp, #44] // 2-byte Folded Spill
1436; CHECK-GI-NEXT:    mov h1, v3.h[2]
1437; CHECK-GI-NEXT:    str h1, [sp, #46] // 2-byte Folded Spill
1438; CHECK-GI-NEXT:    mov h1, v3.h[3]
1439; CHECK-GI-NEXT:    str h1, [sp, #78] // 2-byte Folded Spill
1440; CHECK-GI-NEXT:    mov h1, v3.h[4]
1441; CHECK-GI-NEXT:    str h1, [sp, #110] // 2-byte Folded Spill
1442; CHECK-GI-NEXT:    mov h1, v3.h[5]
1443; CHECK-GI-NEXT:    str h1, [sp, #174] // 2-byte Folded Spill
1444; CHECK-GI-NEXT:    mov h1, v3.h[6]
1445; CHECK-GI-NEXT:    str h1, [sp, #238] // 2-byte Folded Spill
1446; CHECK-GI-NEXT:    mov h1, v3.h[7]
1447; CHECK-GI-NEXT:    str h1, [sp, #302] // 2-byte Folded Spill
1448; CHECK-GI-NEXT:    fcvt s1, h2
1449; CHECK-GI-NEXT:    bl fmodf
1450; CHECK-GI-NEXT:    fcvt s2, h12
1451; CHECK-GI-NEXT:    fcvt h0, s0
1452; CHECK-GI-NEXT:    fcvt s1, h15
1453; CHECK-GI-NEXT:    str q0, [sp, #304] // 16-byte Folded Spill
1454; CHECK-GI-NEXT:    fmov s0, s2
1455; CHECK-GI-NEXT:    bl fmodf
1456; CHECK-GI-NEXT:    fcvt s2, h13
1457; CHECK-GI-NEXT:    fcvt h0, s0
1458; CHECK-GI-NEXT:    fcvt s1, h8
1459; CHECK-GI-NEXT:    str q0, [sp, #208] // 16-byte Folded Spill
1460; CHECK-GI-NEXT:    fmov s0, s2
1461; CHECK-GI-NEXT:    bl fmodf
1462; CHECK-GI-NEXT:    fcvt s2, h14
1463; CHECK-GI-NEXT:    fcvt h0, s0
1464; CHECK-GI-NEXT:    fcvt s1, h9
1465; CHECK-GI-NEXT:    str q0, [sp, #320] // 16-byte Folded Spill
1466; CHECK-GI-NEXT:    fmov s0, s2
1467; CHECK-GI-NEXT:    bl fmodf
1468; CHECK-GI-NEXT:    ldr h1, [sp, #272] // 2-byte Folded Reload
1469; CHECK-GI-NEXT:    fcvt h0, s0
1470; CHECK-GI-NEXT:    fcvt s2, h1
1471; CHECK-GI-NEXT:    fcvt s1, h10
1472; CHECK-GI-NEXT:    str q0, [sp, #272] // 16-byte Folded Spill
1473; CHECK-GI-NEXT:    fmov s0, s2
1474; CHECK-GI-NEXT:    bl fmodf
1475; CHECK-GI-NEXT:    ldr h1, [sp, #240] // 2-byte Folded Reload
1476; CHECK-GI-NEXT:    fcvt h0, s0
1477; CHECK-GI-NEXT:    fcvt s2, h1
1478; CHECK-GI-NEXT:    fcvt s1, h11
1479; CHECK-GI-NEXT:    str q0, [sp, #240] // 16-byte Folded Spill
1480; CHECK-GI-NEXT:    fmov s0, s2
1481; CHECK-GI-NEXT:    bl fmodf
1482; CHECK-GI-NEXT:    ldr h1, [sp, #176] // 2-byte Folded Reload
1483; CHECK-GI-NEXT:    fcvt h0, s0
1484; CHECK-GI-NEXT:    fcvt s2, h1
1485; CHECK-GI-NEXT:    str q0, [sp, #176] // 16-byte Folded Spill
1486; CHECK-GI-NEXT:    ldr h0, [sp, #12] // 2-byte Folded Reload
1487; CHECK-GI-NEXT:    fcvt s1, h0
1488; CHECK-GI-NEXT:    fmov s0, s2
1489; CHECK-GI-NEXT:    bl fmodf
1490; CHECK-GI-NEXT:    ldr h1, [sp, #144] // 2-byte Folded Reload
1491; CHECK-GI-NEXT:    fcvt h0, s0
1492; CHECK-GI-NEXT:    fcvt s2, h1
1493; CHECK-GI-NEXT:    str q0, [sp, #144] // 16-byte Folded Spill
1494; CHECK-GI-NEXT:    ldr h0, [sp, #14] // 2-byte Folded Reload
1495; CHECK-GI-NEXT:    fcvt s1, h0
1496; CHECK-GI-NEXT:    fmov s0, s2
1497; CHECK-GI-NEXT:    bl fmodf
1498; CHECK-GI-NEXT:    ldr q1, [sp, #112] // 16-byte Folded Reload
1499; CHECK-GI-NEXT:    fcvt h0, s0
1500; CHECK-GI-NEXT:    fcvt s2, h1
1501; CHECK-GI-NEXT:    str q0, [sp, #112] // 16-byte Folded Spill
1502; CHECK-GI-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1503; CHECK-GI-NEXT:    fcvt s1, h0
1504; CHECK-GI-NEXT:    fmov s0, s2
1505; CHECK-GI-NEXT:    bl fmodf
1506; CHECK-GI-NEXT:    ldr h1, [sp, #48] // 2-byte Folded Reload
1507; CHECK-GI-NEXT:    fcvt h0, s0
1508; CHECK-GI-NEXT:    fcvt s2, h1
1509; CHECK-GI-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
1510; CHECK-GI-NEXT:    ldr h0, [sp, #44] // 2-byte Folded Reload
1511; CHECK-GI-NEXT:    fcvt s1, h0
1512; CHECK-GI-NEXT:    fmov s0, s2
1513; CHECK-GI-NEXT:    bl fmodf
1514; CHECK-GI-NEXT:    ldr h1, [sp, #80] // 2-byte Folded Reload
1515; CHECK-GI-NEXT:    fcvt h0, s0
1516; CHECK-GI-NEXT:    fcvt s2, h1
1517; CHECK-GI-NEXT:    str q0, [sp, #80] // 16-byte Folded Spill
1518; CHECK-GI-NEXT:    ldr h0, [sp, #46] // 2-byte Folded Reload
1519; CHECK-GI-NEXT:    fcvt s1, h0
1520; CHECK-GI-NEXT:    fmov s0, s2
1521; CHECK-GI-NEXT:    bl fmodf
1522; CHECK-GI-NEXT:    ldr h1, [sp, #128] // 2-byte Folded Reload
1523; CHECK-GI-NEXT:    fcvt h0, s0
1524; CHECK-GI-NEXT:    fcvt s2, h1
1525; CHECK-GI-NEXT:    str q0, [sp, #128] // 16-byte Folded Spill
1526; CHECK-GI-NEXT:    ldr h0, [sp, #78] // 2-byte Folded Reload
1527; CHECK-GI-NEXT:    fcvt s1, h0
1528; CHECK-GI-NEXT:    fmov s0, s2
1529; CHECK-GI-NEXT:    bl fmodf
1530; CHECK-GI-NEXT:    ldr h1, [sp, #192] // 2-byte Folded Reload
1531; CHECK-GI-NEXT:    fcvt h0, s0
1532; CHECK-GI-NEXT:    fcvt s2, h1
1533; CHECK-GI-NEXT:    str q0, [sp, #192] // 16-byte Folded Spill
1534; CHECK-GI-NEXT:    ldr h0, [sp, #110] // 2-byte Folded Reload
1535; CHECK-GI-NEXT:    fcvt s1, h0
1536; CHECK-GI-NEXT:    fmov s0, s2
1537; CHECK-GI-NEXT:    bl fmodf
1538; CHECK-GI-NEXT:    ldr h1, [sp, #256] // 2-byte Folded Reload
1539; CHECK-GI-NEXT:    fcvt h0, s0
1540; CHECK-GI-NEXT:    fcvt s2, h1
1541; CHECK-GI-NEXT:    str q0, [sp, #256] // 16-byte Folded Spill
1542; CHECK-GI-NEXT:    ldr h0, [sp, #174] // 2-byte Folded Reload
1543; CHECK-GI-NEXT:    fcvt s1, h0
1544; CHECK-GI-NEXT:    fmov s0, s2
1545; CHECK-GI-NEXT:    bl fmodf
1546; CHECK-GI-NEXT:    ldr h1, [sp, #336] // 2-byte Folded Reload
1547; CHECK-GI-NEXT:    fcvt h0, s0
1548; CHECK-GI-NEXT:    fcvt s2, h1
1549; CHECK-GI-NEXT:    str q0, [sp, #336] // 16-byte Folded Spill
1550; CHECK-GI-NEXT:    ldr h0, [sp, #238] // 2-byte Folded Reload
1551; CHECK-GI-NEXT:    fcvt s1, h0
1552; CHECK-GI-NEXT:    fmov s0, s2
1553; CHECK-GI-NEXT:    bl fmodf
1554; CHECK-GI-NEXT:    ldr h1, [sp, #352] // 2-byte Folded Reload
1555; CHECK-GI-NEXT:    fcvt h0, s0
1556; CHECK-GI-NEXT:    fcvt s2, h1
1557; CHECK-GI-NEXT:    str q0, [sp, #352] // 16-byte Folded Spill
1558; CHECK-GI-NEXT:    ldr h0, [sp, #302] // 2-byte Folded Reload
1559; CHECK-GI-NEXT:    fcvt s1, h0
1560; CHECK-GI-NEXT:    fmov s0, s2
1561; CHECK-GI-NEXT:    bl fmodf
1562; CHECK-GI-NEXT:    ldr q3, [sp, #304] // 16-byte Folded Reload
1563; CHECK-GI-NEXT:    ldr q2, [sp, #208] // 16-byte Folded Reload
1564; CHECK-GI-NEXT:    ldr q1, [sp, #48] // 16-byte Folded Reload
1565; CHECK-GI-NEXT:    ldp x29, x30, [sp, #432] // 16-byte Folded Reload
1566; CHECK-GI-NEXT:    mov v3.h[1], v2.h[0]
1567; CHECK-GI-NEXT:    ldr q2, [sp, #80] // 16-byte Folded Reload
1568; CHECK-GI-NEXT:    ldp d9, d8, [sp, #416] // 16-byte Folded Reload
1569; CHECK-GI-NEXT:    mov v1.h[1], v2.h[0]
1570; CHECK-GI-NEXT:    ldr q2, [sp, #320] // 16-byte Folded Reload
1571; CHECK-GI-NEXT:    ldp d11, d10, [sp, #400] // 16-byte Folded Reload
1572; CHECK-GI-NEXT:    mov v3.h[2], v2.h[0]
1573; CHECK-GI-NEXT:    ldr q2, [sp, #128] // 16-byte Folded Reload
1574; CHECK-GI-NEXT:    ldp d13, d12, [sp, #384] // 16-byte Folded Reload
1575; CHECK-GI-NEXT:    mov v1.h[2], v2.h[0]
1576; CHECK-GI-NEXT:    ldr q2, [sp, #272] // 16-byte Folded Reload
1577; CHECK-GI-NEXT:    ldp d15, d14, [sp, #368] // 16-byte Folded Reload
1578; CHECK-GI-NEXT:    mov v3.h[3], v2.h[0]
1579; CHECK-GI-NEXT:    ldr q2, [sp, #192] // 16-byte Folded Reload
1580; CHECK-GI-NEXT:    mov v1.h[3], v2.h[0]
1581; CHECK-GI-NEXT:    ldp q4, q2, [sp, #240] // 32-byte Folded Reload
1582; CHECK-GI-NEXT:    mov v3.h[4], v4.h[0]
1583; CHECK-GI-NEXT:    mov v1.h[4], v2.h[0]
1584; CHECK-GI-NEXT:    ldr q2, [sp, #176] // 16-byte Folded Reload
1585; CHECK-GI-NEXT:    mov v3.h[5], v2.h[0]
1586; CHECK-GI-NEXT:    ldr q2, [sp, #336] // 16-byte Folded Reload
1587; CHECK-GI-NEXT:    mov v1.h[5], v2.h[0]
1588; CHECK-GI-NEXT:    fcvt h2, s0
1589; CHECK-GI-NEXT:    ldr q0, [sp, #144] // 16-byte Folded Reload
1590; CHECK-GI-NEXT:    mov v3.h[6], v0.h[0]
1591; CHECK-GI-NEXT:    ldr q0, [sp, #352] // 16-byte Folded Reload
1592; CHECK-GI-NEXT:    mov v1.h[6], v0.h[0]
1593; CHECK-GI-NEXT:    ldr q0, [sp, #112] // 16-byte Folded Reload
1594; CHECK-GI-NEXT:    mov v3.h[7], v0.h[0]
1595; CHECK-GI-NEXT:    mov v1.h[7], v2.h[0]
1596; CHECK-GI-NEXT:    mov v0.16b, v3.16b
1597; CHECK-GI-NEXT:    add sp, sp, #448
1598; CHECK-GI-NEXT:    ret
1599entry:
1600  %c = frem <16 x half> %a, %b
1601  ret <16 x half> %c
1602}
1603
1604define <2 x fp128> @frem_v2fp128(<2 x fp128> %a, <2 x fp128> %b) {
1605; CHECK-SD-LABEL: frem_v2fp128:
1606; CHECK-SD:       // %bb.0: // %entry
1607; CHECK-SD-NEXT:    sub sp, sp, #64
1608; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
1609; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
1610; CHECK-SD-NEXT:    .cfi_offset w30, -16
1611; CHECK-SD-NEXT:    stp q1, q3, [sp, #16] // 32-byte Folded Spill
1612; CHECK-SD-NEXT:    mov v1.16b, v2.16b
1613; CHECK-SD-NEXT:    bl fmodl
1614; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1615; CHECK-SD-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
1616; CHECK-SD-NEXT:    bl fmodl
1617; CHECK-SD-NEXT:    mov v1.16b, v0.16b
1618; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1619; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
1620; CHECK-SD-NEXT:    add sp, sp, #64
1621; CHECK-SD-NEXT:    ret
1622;
1623; CHECK-GI-LABEL: frem_v2fp128:
1624; CHECK-GI:       // %bb.0: // %entry
1625; CHECK-GI-NEXT:    sub sp, sp, #64
1626; CHECK-GI-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
1627; CHECK-GI-NEXT:    .cfi_def_cfa_offset 64
1628; CHECK-GI-NEXT:    .cfi_offset w30, -16
1629; CHECK-GI-NEXT:    stp q3, q1, [sp, #16] // 32-byte Folded Spill
1630; CHECK-GI-NEXT:    mov v1.16b, v2.16b
1631; CHECK-GI-NEXT:    bl fmodl
1632; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1633; CHECK-GI-NEXT:    ldp q1, q0, [sp, #16] // 32-byte Folded Reload
1634; CHECK-GI-NEXT:    bl fmodl
1635; CHECK-GI-NEXT:    mov v1.16b, v0.16b
1636; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1637; CHECK-GI-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
1638; CHECK-GI-NEXT:    add sp, sp, #64
1639; CHECK-GI-NEXT:    ret
1640entry:
1641  %c = frem <2 x fp128> %a, %b
1642  ret <2 x fp128> %c
1643}
1644