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