xref: /llvm-project/llvm/test/CodeGen/AArch64/vector-lrint.ll (revision 109ede496ecf6de5dabace08d73ec7604b343a6b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=aarch64 -mattr=+neon |\
3; RUN:   FileCheck %s --check-prefixes=CHECK-i32
4; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=aarch64 -mattr=+neon |\
5; RUN:   FileCheck %s --check-prefixes=CHECK-i64,CHECK-i64-SD
6; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=aarch64 -mattr=+neon \
7; RUN:   -global-isel -global-isel-abort=2 2>&1 |\
8; RUN:   FileCheck %s --check-prefixes=CHECK-i32,CHECK-i32-GI
9; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=aarch64 -mattr=+neon \
10; RUN:   -global-isel -global-isel-abort=2 2>&1 |\
11; RUN:   FileCheck %s --check-prefixes=CHECK-i64,CHECK-i64-GI
12
13; CHECK-i32-GI:       warning: Instruction selection used fallback path for lrint_v1f16
14; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v2f16
15; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v4f16
16; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v8f16
17; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v16f16
18; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v32f16
19; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v1f32
20; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v2f32
21; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v4f32
22; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v8f32
23; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v16f32
24; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v32f32
25; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v1f64
26; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v2f64
27; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v4f64
28; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v8f64
29; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v16f64
30; CHECK-i32-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v32f64
31
32; CHECK-i64-GI:       warning: Instruction selection used fallback path for lrint_v2f16
33; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v4f16
34; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v8f16
35; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v16f16
36; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v32f16
37; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v2f32
38; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v4f32
39; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v8f32
40; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v16f32
41; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v32f32
42; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v2f64
43; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v4f64
44; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v8f64
45; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v16f64
46; CHECK-i64-GI-NEXT:  warning: Instruction selection used fallback path for lrint_v32f64
47
48define <1 x iXLen> @lrint_v1f16(<1 x half> %x) {
49; CHECK-i32-LABEL: lrint_v1f16:
50; CHECK-i32:       // %bb.0:
51; CHECK-i32-NEXT:    fcvt s0, h0
52; CHECK-i32-NEXT:    frintx s0, s0
53; CHECK-i32-NEXT:    fcvtzs w8, s0
54; CHECK-i32-NEXT:    fmov s0, w8
55; CHECK-i32-NEXT:    ret
56;
57; CHECK-i64-LABEL: lrint_v1f16:
58; CHECK-i64:       // %bb.0:
59; CHECK-i64-NEXT:    fcvt s0, h0
60; CHECK-i64-NEXT:    frintx s0, s0
61; CHECK-i64-NEXT:    fcvtzs x8, s0
62; CHECK-i64-NEXT:    fmov d0, x8
63; CHECK-i64-NEXT:    ret
64  %a = call <1 x iXLen> @llvm.lrint.v1iXLen.v1f16(<1 x half> %x)
65  ret <1 x iXLen> %a
66}
67declare <1 x iXLen> @llvm.lrint.v1iXLen.v1f16(<1 x half>)
68
69define <2 x iXLen> @lrint_v2f16(<2 x half> %x) {
70; CHECK-i32-LABEL: lrint_v2f16:
71; CHECK-i32:       // %bb.0:
72; CHECK-i32-NEXT:    // kill: def $d0 killed $d0 def $q0
73; CHECK-i32-NEXT:    mov h1, v0.h[1]
74; CHECK-i32-NEXT:    fcvt s0, h0
75; CHECK-i32-NEXT:    fcvt s1, h1
76; CHECK-i32-NEXT:    frintx s0, s0
77; CHECK-i32-NEXT:    frintx s1, s1
78; CHECK-i32-NEXT:    fcvtzs w8, s0
79; CHECK-i32-NEXT:    fcvtzs w9, s1
80; CHECK-i32-NEXT:    fmov s0, w8
81; CHECK-i32-NEXT:    mov v0.s[1], w9
82; CHECK-i32-NEXT:    // kill: def $d0 killed $d0 killed $q0
83; CHECK-i32-NEXT:    ret
84;
85; CHECK-i64-LABEL: lrint_v2f16:
86; CHECK-i64:       // %bb.0:
87; CHECK-i64-NEXT:    // kill: def $d0 killed $d0 def $q0
88; CHECK-i64-NEXT:    mov h1, v0.h[1]
89; CHECK-i64-NEXT:    fcvt s0, h0
90; CHECK-i64-NEXT:    fcvt s1, h1
91; CHECK-i64-NEXT:    frintx s0, s0
92; CHECK-i64-NEXT:    frintx s1, s1
93; CHECK-i64-NEXT:    fcvtzs x8, s0
94; CHECK-i64-NEXT:    fcvtzs x9, s1
95; CHECK-i64-NEXT:    fmov d0, x8
96; CHECK-i64-NEXT:    mov v0.d[1], x9
97; CHECK-i64-NEXT:    ret
98  %a = call <2 x iXLen> @llvm.lrint.v2iXLen.v2f16(<2 x half> %x)
99  ret <2 x iXLen> %a
100}
101declare <2 x iXLen> @llvm.lrint.v2iXLen.v2f16(<2 x half>)
102
103define <4 x iXLen> @lrint_v4f16(<4 x half> %x) {
104; CHECK-i32-LABEL: lrint_v4f16:
105; CHECK-i32:       // %bb.0:
106; CHECK-i32-NEXT:    // kill: def $d0 killed $d0 def $q0
107; CHECK-i32-NEXT:    mov h1, v0.h[1]
108; CHECK-i32-NEXT:    fcvt s2, h0
109; CHECK-i32-NEXT:    mov h3, v0.h[2]
110; CHECK-i32-NEXT:    mov h0, v0.h[3]
111; CHECK-i32-NEXT:    fcvt s1, h1
112; CHECK-i32-NEXT:    frintx s2, s2
113; CHECK-i32-NEXT:    fcvt s3, h3
114; CHECK-i32-NEXT:    frintx s1, s1
115; CHECK-i32-NEXT:    fcvtzs w8, s2
116; CHECK-i32-NEXT:    fcvt s2, h0
117; CHECK-i32-NEXT:    fcvtzs w9, s1
118; CHECK-i32-NEXT:    frintx s1, s3
119; CHECK-i32-NEXT:    fmov s0, w8
120; CHECK-i32-NEXT:    mov v0.s[1], w9
121; CHECK-i32-NEXT:    fcvtzs w8, s1
122; CHECK-i32-NEXT:    frintx s1, s2
123; CHECK-i32-NEXT:    mov v0.s[2], w8
124; CHECK-i32-NEXT:    fcvtzs w8, s1
125; CHECK-i32-NEXT:    mov v0.s[3], w8
126; CHECK-i32-NEXT:    ret
127;
128; CHECK-i64-LABEL: lrint_v4f16:
129; CHECK-i64:       // %bb.0:
130; CHECK-i64-NEXT:    // kill: def $d0 killed $d0 def $q0
131; CHECK-i64-NEXT:    mov h1, v0.h[2]
132; CHECK-i64-NEXT:    mov h2, v0.h[1]
133; CHECK-i64-NEXT:    mov h3, v0.h[3]
134; CHECK-i64-NEXT:    fcvt s0, h0
135; CHECK-i64-NEXT:    fcvt s1, h1
136; CHECK-i64-NEXT:    fcvt s2, h2
137; CHECK-i64-NEXT:    fcvt s3, h3
138; CHECK-i64-NEXT:    frintx s0, s0
139; CHECK-i64-NEXT:    frintx s1, s1
140; CHECK-i64-NEXT:    frintx s2, s2
141; CHECK-i64-NEXT:    frintx s3, s3
142; CHECK-i64-NEXT:    fcvtzs x8, s0
143; CHECK-i64-NEXT:    fcvtzs x9, s1
144; CHECK-i64-NEXT:    fcvtzs x10, s2
145; CHECK-i64-NEXT:    fcvtzs x11, s3
146; CHECK-i64-NEXT:    fmov d0, x8
147; CHECK-i64-NEXT:    fmov d1, x9
148; CHECK-i64-NEXT:    mov v0.d[1], x10
149; CHECK-i64-NEXT:    mov v1.d[1], x11
150; CHECK-i64-NEXT:    ret
151  %a = call <4 x iXLen> @llvm.lrint.v4iXLen.v4f16(<4 x half> %x)
152  ret <4 x iXLen> %a
153}
154declare <4 x iXLen> @llvm.lrint.v4iXLen.v4f16(<4 x half>)
155
156define <8 x iXLen> @lrint_v8f16(<8 x half> %x) {
157; CHECK-i32-LABEL: lrint_v8f16:
158; CHECK-i32:       // %bb.0:
159; CHECK-i32-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
160; CHECK-i32-NEXT:    mov h3, v0.h[1]
161; CHECK-i32-NEXT:    fcvt s6, h0
162; CHECK-i32-NEXT:    mov h4, v0.h[2]
163; CHECK-i32-NEXT:    mov h0, v0.h[3]
164; CHECK-i32-NEXT:    mov h2, v1.h[1]
165; CHECK-i32-NEXT:    fcvt s5, h1
166; CHECK-i32-NEXT:    mov h7, v1.h[2]
167; CHECK-i32-NEXT:    fcvt s3, h3
168; CHECK-i32-NEXT:    frintx s6, s6
169; CHECK-i32-NEXT:    fcvt s4, h4
170; CHECK-i32-NEXT:    mov h1, v1.h[3]
171; CHECK-i32-NEXT:    fcvt s2, h2
172; CHECK-i32-NEXT:    frintx s5, s5
173; CHECK-i32-NEXT:    fcvt s7, h7
174; CHECK-i32-NEXT:    frintx s3, s3
175; CHECK-i32-NEXT:    fcvtzs w9, s6
176; CHECK-i32-NEXT:    frintx s4, s4
177; CHECK-i32-NEXT:    frintx s2, s2
178; CHECK-i32-NEXT:    fcvtzs w8, s5
179; CHECK-i32-NEXT:    fcvt s5, h1
180; CHECK-i32-NEXT:    fcvtzs w11, s3
181; CHECK-i32-NEXT:    fcvt s3, h0
182; CHECK-i32-NEXT:    fmov s0, w9
183; CHECK-i32-NEXT:    fcvtzs w12, s4
184; CHECK-i32-NEXT:    fcvtzs w10, s2
185; CHECK-i32-NEXT:    frintx s2, s7
186; CHECK-i32-NEXT:    fmov s1, w8
187; CHECK-i32-NEXT:    mov v0.s[1], w11
188; CHECK-i32-NEXT:    fcvtzs w8, s2
189; CHECK-i32-NEXT:    mov v1.s[1], w10
190; CHECK-i32-NEXT:    frintx s2, s3
191; CHECK-i32-NEXT:    frintx s3, s5
192; CHECK-i32-NEXT:    mov v0.s[2], w12
193; CHECK-i32-NEXT:    mov v1.s[2], w8
194; CHECK-i32-NEXT:    fcvtzs w9, s2
195; CHECK-i32-NEXT:    fcvtzs w8, s3
196; CHECK-i32-NEXT:    mov v0.s[3], w9
197; CHECK-i32-NEXT:    mov v1.s[3], w8
198; CHECK-i32-NEXT:    ret
199;
200; CHECK-i64-LABEL: lrint_v8f16:
201; CHECK-i64:       // %bb.0:
202; CHECK-i64-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
203; CHECK-i64-NEXT:    mov h4, v0.h[2]
204; CHECK-i64-NEXT:    mov h3, v0.h[1]
205; CHECK-i64-NEXT:    mov h7, v0.h[3]
206; CHECK-i64-NEXT:    fcvt s0, h0
207; CHECK-i64-NEXT:    mov h2, v1.h[2]
208; CHECK-i64-NEXT:    mov h5, v1.h[1]
209; CHECK-i64-NEXT:    mov h6, v1.h[3]
210; CHECK-i64-NEXT:    fcvt s1, h1
211; CHECK-i64-NEXT:    fcvt s4, h4
212; CHECK-i64-NEXT:    fcvt s3, h3
213; CHECK-i64-NEXT:    fcvt s7, h7
214; CHECK-i64-NEXT:    frintx s0, s0
215; CHECK-i64-NEXT:    fcvt s2, h2
216; CHECK-i64-NEXT:    fcvt s5, h5
217; CHECK-i64-NEXT:    fcvt s6, h6
218; CHECK-i64-NEXT:    frintx s1, s1
219; CHECK-i64-NEXT:    frintx s4, s4
220; CHECK-i64-NEXT:    frintx s3, s3
221; CHECK-i64-NEXT:    frintx s7, s7
222; CHECK-i64-NEXT:    fcvtzs x9, s0
223; CHECK-i64-NEXT:    frintx s2, s2
224; CHECK-i64-NEXT:    frintx s5, s5
225; CHECK-i64-NEXT:    frintx s6, s6
226; CHECK-i64-NEXT:    fcvtzs x8, s1
227; CHECK-i64-NEXT:    fcvtzs x12, s4
228; CHECK-i64-NEXT:    fcvtzs x11, s3
229; CHECK-i64-NEXT:    fcvtzs x15, s7
230; CHECK-i64-NEXT:    fmov d0, x9
231; CHECK-i64-NEXT:    fcvtzs x10, s2
232; CHECK-i64-NEXT:    fcvtzs x13, s5
233; CHECK-i64-NEXT:    fcvtzs x14, s6
234; CHECK-i64-NEXT:    fmov d2, x8
235; CHECK-i64-NEXT:    fmov d1, x12
236; CHECK-i64-NEXT:    mov v0.d[1], x11
237; CHECK-i64-NEXT:    fmov d3, x10
238; CHECK-i64-NEXT:    mov v2.d[1], x13
239; CHECK-i64-NEXT:    mov v1.d[1], x15
240; CHECK-i64-NEXT:    mov v3.d[1], x14
241; CHECK-i64-NEXT:    ret
242  %a = call <8 x iXLen> @llvm.lrint.v8iXLen.v8f16(<8 x half> %x)
243  ret <8 x iXLen> %a
244}
245declare <8 x iXLen> @llvm.lrint.v8iXLen.v8f16(<8 x half>)
246
247define <16 x iXLen> @lrint_v16f16(<16 x half> %x) {
248; CHECK-i32-LABEL: lrint_v16f16:
249; CHECK-i32:       // %bb.0:
250; CHECK-i32-NEXT:    ext v2.16b, v0.16b, v0.16b, #8
251; CHECK-i32-NEXT:    ext v3.16b, v1.16b, v1.16b, #8
252; CHECK-i32-NEXT:    mov h18, v0.h[1]
253; CHECK-i32-NEXT:    mov h19, v1.h[1]
254; CHECK-i32-NEXT:    fcvt s20, h0
255; CHECK-i32-NEXT:    mov h21, v0.h[2]
256; CHECK-i32-NEXT:    mov h0, v0.h[3]
257; CHECK-i32-NEXT:    mov h4, v2.h[1]
258; CHECK-i32-NEXT:    mov h5, v2.h[2]
259; CHECK-i32-NEXT:    fcvt s6, h2
260; CHECK-i32-NEXT:    fcvt s7, h3
261; CHECK-i32-NEXT:    mov h16, v3.h[1]
262; CHECK-i32-NEXT:    mov h17, v3.h[2]
263; CHECK-i32-NEXT:    fcvt s18, h18
264; CHECK-i32-NEXT:    fcvt s19, h19
265; CHECK-i32-NEXT:    mov h2, v2.h[3]
266; CHECK-i32-NEXT:    fcvt s4, h4
267; CHECK-i32-NEXT:    fcvt s5, h5
268; CHECK-i32-NEXT:    frintx s6, s6
269; CHECK-i32-NEXT:    frintx s7, s7
270; CHECK-i32-NEXT:    fcvt s16, h16
271; CHECK-i32-NEXT:    fcvt s17, h17
272; CHECK-i32-NEXT:    frintx s18, s18
273; CHECK-i32-NEXT:    fcvt s2, h2
274; CHECK-i32-NEXT:    frintx s4, s4
275; CHECK-i32-NEXT:    frintx s5, s5
276; CHECK-i32-NEXT:    fcvtzs w8, s6
277; CHECK-i32-NEXT:    fcvt s6, h1
278; CHECK-i32-NEXT:    fcvtzs w9, s7
279; CHECK-i32-NEXT:    mov h7, v1.h[2]
280; CHECK-i32-NEXT:    frintx s16, s16
281; CHECK-i32-NEXT:    fcvtzs w15, s18
282; CHECK-i32-NEXT:    fcvtzs w10, s4
283; CHECK-i32-NEXT:    frintx s4, s17
284; CHECK-i32-NEXT:    fcvtzs w11, s5
285; CHECK-i32-NEXT:    frintx s5, s20
286; CHECK-i32-NEXT:    fcvt s17, h21
287; CHECK-i32-NEXT:    frintx s6, s6
288; CHECK-i32-NEXT:    fcvtzs w12, s16
289; CHECK-i32-NEXT:    frintx s16, s19
290; CHECK-i32-NEXT:    fcvt s7, h7
291; CHECK-i32-NEXT:    mov h19, v1.h[3]
292; CHECK-i32-NEXT:    fmov s1, w8
293; CHECK-i32-NEXT:    fcvtzs w13, s4
294; CHECK-i32-NEXT:    mov h4, v3.h[3]
295; CHECK-i32-NEXT:    fmov s3, w9
296; CHECK-i32-NEXT:    fcvtzs w14, s5
297; CHECK-i32-NEXT:    frintx s5, s17
298; CHECK-i32-NEXT:    fcvtzs w16, s6
299; CHECK-i32-NEXT:    fcvt s17, h0
300; CHECK-i32-NEXT:    fcvtzs w8, s16
301; CHECK-i32-NEXT:    frintx s6, s7
302; CHECK-i32-NEXT:    fcvt s7, h19
303; CHECK-i32-NEXT:    mov v1.s[1], w10
304; CHECK-i32-NEXT:    mov v3.s[1], w12
305; CHECK-i32-NEXT:    fcvt s4, h4
306; CHECK-i32-NEXT:    fcvtzs w9, s5
307; CHECK-i32-NEXT:    fmov s0, w14
308; CHECK-i32-NEXT:    frintx s5, s2
309; CHECK-i32-NEXT:    fmov s2, w16
310; CHECK-i32-NEXT:    frintx s16, s17
311; CHECK-i32-NEXT:    fcvtzs w10, s6
312; CHECK-i32-NEXT:    frintx s6, s7
313; CHECK-i32-NEXT:    mov v1.s[2], w11
314; CHECK-i32-NEXT:    mov v3.s[2], w13
315; CHECK-i32-NEXT:    mov v0.s[1], w15
316; CHECK-i32-NEXT:    frintx s4, s4
317; CHECK-i32-NEXT:    mov v2.s[1], w8
318; CHECK-i32-NEXT:    fcvtzs w8, s5
319; CHECK-i32-NEXT:    fcvtzs w12, s16
320; CHECK-i32-NEXT:    mov v0.s[2], w9
321; CHECK-i32-NEXT:    fcvtzs w9, s4
322; CHECK-i32-NEXT:    mov v2.s[2], w10
323; CHECK-i32-NEXT:    fcvtzs w10, s6
324; CHECK-i32-NEXT:    mov v1.s[3], w8
325; CHECK-i32-NEXT:    mov v0.s[3], w12
326; CHECK-i32-NEXT:    mov v3.s[3], w9
327; CHECK-i32-NEXT:    mov v2.s[3], w10
328; CHECK-i32-NEXT:    ret
329;
330; CHECK-i64-LABEL: lrint_v16f16:
331; CHECK-i64:       // %bb.0:
332; CHECK-i64-NEXT:    ext v2.16b, v0.16b, v0.16b, #8
333; CHECK-i64-NEXT:    ext v3.16b, v1.16b, v1.16b, #8
334; CHECK-i64-NEXT:    mov h17, v0.h[1]
335; CHECK-i64-NEXT:    mov h19, v0.h[2]
336; CHECK-i64-NEXT:    fcvt s18, h0
337; CHECK-i64-NEXT:    mov h0, v0.h[3]
338; CHECK-i64-NEXT:    mov h4, v2.h[1]
339; CHECK-i64-NEXT:    mov h5, v2.h[2]
340; CHECK-i64-NEXT:    fcvt s7, h3
341; CHECK-i64-NEXT:    fcvt s6, h2
342; CHECK-i64-NEXT:    mov h16, v3.h[2]
343; CHECK-i64-NEXT:    mov h2, v2.h[3]
344; CHECK-i64-NEXT:    fcvt s17, h17
345; CHECK-i64-NEXT:    fcvt s19, h19
346; CHECK-i64-NEXT:    frintx s18, s18
347; CHECK-i64-NEXT:    fcvt s0, h0
348; CHECK-i64-NEXT:    fcvt s4, h4
349; CHECK-i64-NEXT:    fcvt s5, h5
350; CHECK-i64-NEXT:    frintx s7, s7
351; CHECK-i64-NEXT:    frintx s6, s6
352; CHECK-i64-NEXT:    fcvt s16, h16
353; CHECK-i64-NEXT:    fcvt s2, h2
354; CHECK-i64-NEXT:    frintx s17, s17
355; CHECK-i64-NEXT:    frintx s19, s19
356; CHECK-i64-NEXT:    fcvtzs x13, s18
357; CHECK-i64-NEXT:    frintx s0, s0
358; CHECK-i64-NEXT:    frintx s4, s4
359; CHECK-i64-NEXT:    frintx s5, s5
360; CHECK-i64-NEXT:    fcvtzs x9, s7
361; CHECK-i64-NEXT:    mov h7, v1.h[2]
362; CHECK-i64-NEXT:    fcvtzs x8, s6
363; CHECK-i64-NEXT:    mov h6, v1.h[1]
364; CHECK-i64-NEXT:    frintx s16, s16
365; CHECK-i64-NEXT:    fcvtzs x14, s17
366; CHECK-i64-NEXT:    fcvtzs x15, s19
367; CHECK-i64-NEXT:    fcvtzs x10, s4
368; CHECK-i64-NEXT:    mov h4, v3.h[1]
369; CHECK-i64-NEXT:    fcvtzs x11, s5
370; CHECK-i64-NEXT:    mov h5, v1.h[3]
371; CHECK-i64-NEXT:    mov h3, v3.h[3]
372; CHECK-i64-NEXT:    fcvt s1, h1
373; CHECK-i64-NEXT:    fcvt s7, h7
374; CHECK-i64-NEXT:    fcvt s6, h6
375; CHECK-i64-NEXT:    fcvtzs x12, s16
376; CHECK-i64-NEXT:    frintx s16, s2
377; CHECK-i64-NEXT:    fmov d2, x8
378; CHECK-i64-NEXT:    fcvt s4, h4
379; CHECK-i64-NEXT:    fcvt s3, h3
380; CHECK-i64-NEXT:    fcvt s5, h5
381; CHECK-i64-NEXT:    frintx s1, s1
382; CHECK-i64-NEXT:    frintx s7, s7
383; CHECK-i64-NEXT:    frintx s17, s6
384; CHECK-i64-NEXT:    fmov d6, x9
385; CHECK-i64-NEXT:    mov v2.d[1], x10
386; CHECK-i64-NEXT:    frintx s4, s4
387; CHECK-i64-NEXT:    frintx s18, s3
388; CHECK-i64-NEXT:    frintx s5, s5
389; CHECK-i64-NEXT:    fcvtzs x8, s1
390; CHECK-i64-NEXT:    fcvtzs x9, s7
391; CHECK-i64-NEXT:    fmov d3, x11
392; CHECK-i64-NEXT:    fcvtzs x11, s0
393; CHECK-i64-NEXT:    fmov d7, x12
394; CHECK-i64-NEXT:    fcvtzs x12, s16
395; CHECK-i64-NEXT:    fcvtzs x16, s17
396; CHECK-i64-NEXT:    fcvtzs x17, s4
397; CHECK-i64-NEXT:    fmov d0, x13
398; CHECK-i64-NEXT:    fmov d1, x15
399; CHECK-i64-NEXT:    fcvtzs x18, s18
400; CHECK-i64-NEXT:    fcvtzs x0, s5
401; CHECK-i64-NEXT:    fmov d4, x8
402; CHECK-i64-NEXT:    fmov d5, x9
403; CHECK-i64-NEXT:    mov v0.d[1], x14
404; CHECK-i64-NEXT:    mov v1.d[1], x11
405; CHECK-i64-NEXT:    mov v3.d[1], x12
406; CHECK-i64-NEXT:    mov v4.d[1], x16
407; CHECK-i64-NEXT:    mov v6.d[1], x17
408; CHECK-i64-NEXT:    mov v7.d[1], x18
409; CHECK-i64-NEXT:    mov v5.d[1], x0
410; CHECK-i64-NEXT:    ret
411  %a = call <16 x iXLen> @llvm.lrint.v16iXLen.v16f16(<16 x half> %x)
412  ret <16 x iXLen> %a
413}
414declare <16 x iXLen> @llvm.lrint.v16iXLen.v16f16(<16 x half>)
415
416define <32 x iXLen> @lrint_v32f16(<32 x half> %x) {
417; CHECK-i32-LABEL: lrint_v32f16:
418; CHECK-i32:       // %bb.0:
419; CHECK-i32-NEXT:    ext v5.16b, v0.16b, v0.16b, #8
420; CHECK-i32-NEXT:    ext v4.16b, v1.16b, v1.16b, #8
421; CHECK-i32-NEXT:    ext v17.16b, v2.16b, v2.16b, #8
422; CHECK-i32-NEXT:    mov h6, v5.h[1]
423; CHECK-i32-NEXT:    fcvt s7, h5
424; CHECK-i32-NEXT:    mov h16, v5.h[2]
425; CHECK-i32-NEXT:    mov h5, v5.h[3]
426; CHECK-i32-NEXT:    mov h18, v4.h[1]
427; CHECK-i32-NEXT:    mov h20, v4.h[3]
428; CHECK-i32-NEXT:    mov h19, v4.h[2]
429; CHECK-i32-NEXT:    fcvt s21, h4
430; CHECK-i32-NEXT:    mov h23, v17.h[1]
431; CHECK-i32-NEXT:    ext v4.16b, v3.16b, v3.16b, #8
432; CHECK-i32-NEXT:    fcvt s22, h17
433; CHECK-i32-NEXT:    fcvt s6, h6
434; CHECK-i32-NEXT:    frintx s7, s7
435; CHECK-i32-NEXT:    fcvt s16, h16
436; CHECK-i32-NEXT:    fcvt s5, h5
437; CHECK-i32-NEXT:    fcvt s18, h18
438; CHECK-i32-NEXT:    fcvt s20, h20
439; CHECK-i32-NEXT:    fcvt s19, h19
440; CHECK-i32-NEXT:    frintx s22, s22
441; CHECK-i32-NEXT:    frintx s6, s6
442; CHECK-i32-NEXT:    fcvtzs w12, s7
443; CHECK-i32-NEXT:    frintx s7, s16
444; CHECK-i32-NEXT:    frintx s5, s5
445; CHECK-i32-NEXT:    frintx s16, s21
446; CHECK-i32-NEXT:    fcvt s21, h23
447; CHECK-i32-NEXT:    frintx s18, s18
448; CHECK-i32-NEXT:    frintx s20, s20
449; CHECK-i32-NEXT:    frintx s19, s19
450; CHECK-i32-NEXT:    fcvtzs w15, s22
451; CHECK-i32-NEXT:    mov h22, v1.h[2]
452; CHECK-i32-NEXT:    fcvtzs w17, s6
453; CHECK-i32-NEXT:    mov h6, v17.h[2]
454; CHECK-i32-NEXT:    mov h17, v17.h[3]
455; CHECK-i32-NEXT:    fcvtzs w9, s7
456; CHECK-i32-NEXT:    mov h7, v4.h[2]
457; CHECK-i32-NEXT:    fcvtzs w8, s5
458; CHECK-i32-NEXT:    mov h5, v4.h[1]
459; CHECK-i32-NEXT:    fcvtzs w13, s16
460; CHECK-i32-NEXT:    frintx s16, s21
461; CHECK-i32-NEXT:    fcvtzs w14, s18
462; CHECK-i32-NEXT:    fcvtzs w10, s20
463; CHECK-i32-NEXT:    fcvt s18, h4
464; CHECK-i32-NEXT:    fcvt s6, h6
465; CHECK-i32-NEXT:    fcvt s17, h17
466; CHECK-i32-NEXT:    mov h20, v0.h[2]
467; CHECK-i32-NEXT:    fcvt s7, h7
468; CHECK-i32-NEXT:    fcvtzs w11, s19
469; CHECK-i32-NEXT:    mov h19, v0.h[1]
470; CHECK-i32-NEXT:    fcvt s5, h5
471; CHECK-i32-NEXT:    fcvtzs w0, s16
472; CHECK-i32-NEXT:    mov h21, v1.h[1]
473; CHECK-i32-NEXT:    frintx s18, s18
474; CHECK-i32-NEXT:    mov h4, v4.h[3]
475; CHECK-i32-NEXT:    frintx s6, s6
476; CHECK-i32-NEXT:    frintx s16, s17
477; CHECK-i32-NEXT:    mov h17, v0.h[3]
478; CHECK-i32-NEXT:    fcvt s0, h0
479; CHECK-i32-NEXT:    fcvt s19, h19
480; CHECK-i32-NEXT:    frintx s5, s5
481; CHECK-i32-NEXT:    fcvtzs w2, s18
482; CHECK-i32-NEXT:    fcvt s18, h21
483; CHECK-i32-NEXT:    fcvt s21, h2
484; CHECK-i32-NEXT:    fcvtzs w18, s6
485; CHECK-i32-NEXT:    frintx s6, s7
486; CHECK-i32-NEXT:    fcvt s7, h20
487; CHECK-i32-NEXT:    fcvtzs w16, s16
488; CHECK-i32-NEXT:    fcvt s16, h17
489; CHECK-i32-NEXT:    fcvt s17, h1
490; CHECK-i32-NEXT:    frintx s0, s0
491; CHECK-i32-NEXT:    fcvtzs w3, s5
492; CHECK-i32-NEXT:    frintx s5, s19
493; CHECK-i32-NEXT:    fcvt s19, h22
494; CHECK-i32-NEXT:    mov h1, v1.h[3]
495; CHECK-i32-NEXT:    fcvtzs w1, s6
496; CHECK-i32-NEXT:    frintx s6, s7
497; CHECK-i32-NEXT:    mov h7, v2.h[1]
498; CHECK-i32-NEXT:    frintx s17, s17
499; CHECK-i32-NEXT:    frintx s20, s16
500; CHECK-i32-NEXT:    fmov s16, w12
501; CHECK-i32-NEXT:    fcvtzs w4, s0
502; CHECK-i32-NEXT:    frintx s0, s18
503; CHECK-i32-NEXT:    fcvtzs w5, s5
504; CHECK-i32-NEXT:    frintx s5, s19
505; CHECK-i32-NEXT:    frintx s18, s21
506; CHECK-i32-NEXT:    fcvt s19, h3
507; CHECK-i32-NEXT:    fcvtzs w12, s6
508; CHECK-i32-NEXT:    fcvt s6, h7
509; CHECK-i32-NEXT:    mov h7, v3.h[1]
510; CHECK-i32-NEXT:    fcvtzs w6, s17
511; CHECK-i32-NEXT:    fmov s17, w13
512; CHECK-i32-NEXT:    mov v16.s[1], w17
513; CHECK-i32-NEXT:    fcvtzs w17, s20
514; CHECK-i32-NEXT:    fcvtzs w7, s0
515; CHECK-i32-NEXT:    mov h0, v2.h[2]
516; CHECK-i32-NEXT:    mov h20, v3.h[2]
517; CHECK-i32-NEXT:    fcvtzs w13, s5
518; CHECK-i32-NEXT:    fmov s5, w15
519; CHECK-i32-NEXT:    frintx s6, s6
520; CHECK-i32-NEXT:    fcvt s7, h7
521; CHECK-i32-NEXT:    mov v17.s[1], w14
522; CHECK-i32-NEXT:    fcvtzs w14, s18
523; CHECK-i32-NEXT:    frintx s18, s19
524; CHECK-i32-NEXT:    mov h2, v2.h[3]
525; CHECK-i32-NEXT:    fcvt s0, h0
526; CHECK-i32-NEXT:    mov h3, v3.h[3]
527; CHECK-i32-NEXT:    mov v5.s[1], w0
528; CHECK-i32-NEXT:    fcvt s19, h20
529; CHECK-i32-NEXT:    fcvt s1, h1
530; CHECK-i32-NEXT:    mov v16.s[2], w9
531; CHECK-i32-NEXT:    fcvtzs w15, s6
532; CHECK-i32-NEXT:    frintx s6, s7
533; CHECK-i32-NEXT:    fmov s7, w2
534; CHECK-i32-NEXT:    fcvtzs w0, s18
535; CHECK-i32-NEXT:    fcvt s20, h2
536; CHECK-i32-NEXT:    fcvt s18, h4
537; CHECK-i32-NEXT:    frintx s21, s0
538; CHECK-i32-NEXT:    fcvt s3, h3
539; CHECK-i32-NEXT:    fmov s0, w4
540; CHECK-i32-NEXT:    frintx s19, s19
541; CHECK-i32-NEXT:    fmov s2, w6
542; CHECK-i32-NEXT:    fmov s4, w14
543; CHECK-i32-NEXT:    fcvtzs w2, s6
544; CHECK-i32-NEXT:    mov v7.s[1], w3
545; CHECK-i32-NEXT:    frintx s1, s1
546; CHECK-i32-NEXT:    fmov s6, w0
547; CHECK-i32-NEXT:    mov v0.s[1], w5
548; CHECK-i32-NEXT:    frintx s20, s20
549; CHECK-i32-NEXT:    mov v2.s[1], w7
550; CHECK-i32-NEXT:    fcvtzs w3, s21
551; CHECK-i32-NEXT:    mov v4.s[1], w15
552; CHECK-i32-NEXT:    fcvtzs w14, s19
553; CHECK-i32-NEXT:    frintx s18, s18
554; CHECK-i32-NEXT:    frintx s3, s3
555; CHECK-i32-NEXT:    mov v6.s[1], w2
556; CHECK-i32-NEXT:    mov v17.s[2], w11
557; CHECK-i32-NEXT:    fcvtzs w15, s1
558; CHECK-i32-NEXT:    fcvtzs w0, s20
559; CHECK-i32-NEXT:    mov v5.s[2], w18
560; CHECK-i32-NEXT:    mov v0.s[2], w12
561; CHECK-i32-NEXT:    mov v7.s[2], w1
562; CHECK-i32-NEXT:    mov v2.s[2], w13
563; CHECK-i32-NEXT:    mov v4.s[2], w3
564; CHECK-i32-NEXT:    fcvtzs w9, s18
565; CHECK-i32-NEXT:    fcvtzs w11, s3
566; CHECK-i32-NEXT:    mov v16.s[3], w8
567; CHECK-i32-NEXT:    mov v6.s[2], w14
568; CHECK-i32-NEXT:    mov v17.s[3], w10
569; CHECK-i32-NEXT:    mov v0.s[3], w17
570; CHECK-i32-NEXT:    mov v5.s[3], w16
571; CHECK-i32-NEXT:    mov v2.s[3], w15
572; CHECK-i32-NEXT:    mov v4.s[3], w0
573; CHECK-i32-NEXT:    mov v7.s[3], w9
574; CHECK-i32-NEXT:    mov v1.16b, v16.16b
575; CHECK-i32-NEXT:    mov v6.s[3], w11
576; CHECK-i32-NEXT:    mov v3.16b, v17.16b
577; CHECK-i32-NEXT:    ret
578;
579; CHECK-i64-LABEL: lrint_v32f16:
580; CHECK-i64:       // %bb.0:
581; CHECK-i64-NEXT:    ext v4.16b, v1.16b, v1.16b, #8
582; CHECK-i64-NEXT:    ext v5.16b, v2.16b, v2.16b, #8
583; CHECK-i64-NEXT:    ext v6.16b, v3.16b, v3.16b, #8
584; CHECK-i64-NEXT:    ext v7.16b, v0.16b, v0.16b, #8
585; CHECK-i64-NEXT:    mov h19, v0.h[1]
586; CHECK-i64-NEXT:    fcvt s21, h0
587; CHECK-i64-NEXT:    mov h23, v1.h[2]
588; CHECK-i64-NEXT:    fcvt s22, h1
589; CHECK-i64-NEXT:    fcvt s26, h2
590; CHECK-i64-NEXT:    mov h27, v2.h[1]
591; CHECK-i64-NEXT:    mov h28, v2.h[2]
592; CHECK-i64-NEXT:    mov h16, v4.h[2]
593; CHECK-i64-NEXT:    fcvt s17, h5
594; CHECK-i64-NEXT:    mov h18, v5.h[2]
595; CHECK-i64-NEXT:    mov h20, v6.h[2]
596; CHECK-i64-NEXT:    fcvt s24, h7
597; CHECK-i64-NEXT:    fcvt s25, h6
598; CHECK-i64-NEXT:    fcvt s19, h19
599; CHECK-i64-NEXT:    frintx s22, s22
600; CHECK-i64-NEXT:    fcvt s16, h16
601; CHECK-i64-NEXT:    frintx s17, s17
602; CHECK-i64-NEXT:    fcvt s18, h18
603; CHECK-i64-NEXT:    fcvt s20, h20
604; CHECK-i64-NEXT:    frintx s16, s16
605; CHECK-i64-NEXT:    fcvtzs x12, s17
606; CHECK-i64-NEXT:    frintx s17, s18
607; CHECK-i64-NEXT:    frintx s18, s21
608; CHECK-i64-NEXT:    fcvt s21, h23
609; CHECK-i64-NEXT:    frintx s23, s24
610; CHECK-i64-NEXT:    frintx s24, s25
611; CHECK-i64-NEXT:    frintx s25, s19
612; CHECK-i64-NEXT:    mov h19, v7.h[1]
613; CHECK-i64-NEXT:    fcvtzs x13, s16
614; CHECK-i64-NEXT:    frintx s16, s20
615; CHECK-i64-NEXT:    frintx s20, s26
616; CHECK-i64-NEXT:    fcvtzs x9, s23
617; CHECK-i64-NEXT:    mov h23, v3.h[2]
618; CHECK-i64-NEXT:    fcvt s26, h27
619; CHECK-i64-NEXT:    fcvtzs x15, s24
620; CHECK-i64-NEXT:    fcvtzs x10, s25
621; CHECK-i64-NEXT:    fcvt s24, h28
622; CHECK-i64-NEXT:    mov h25, v3.h[3]
623; CHECK-i64-NEXT:    fcvtzs x14, s17
624; CHECK-i64-NEXT:    frintx s21, s21
625; CHECK-i64-NEXT:    fmov d17, x12
626; CHECK-i64-NEXT:    fcvtzs x12, s16
627; CHECK-i64-NEXT:    fmov d16, x13
628; CHECK-i64-NEXT:    fcvtzs x13, s22
629; CHECK-i64-NEXT:    fcvt s22, h3
630; CHECK-i64-NEXT:    mov h3, v3.h[1]
631; CHECK-i64-NEXT:    mov h27, v0.h[2]
632; CHECK-i64-NEXT:    mov h28, v2.h[3]
633; CHECK-i64-NEXT:    fcvt s23, h23
634; CHECK-i64-NEXT:    frintx s26, s26
635; CHECK-i64-NEXT:    fcvtzs x16, s20
636; CHECK-i64-NEXT:    frintx s20, s24
637; CHECK-i64-NEXT:    fcvt s24, h25
638; CHECK-i64-NEXT:    fcvtzs x11, s18
639; CHECK-i64-NEXT:    fmov d18, x14
640; CHECK-i64-NEXT:    fcvtzs x14, s21
641; CHECK-i64-NEXT:    frintx s22, s22
642; CHECK-i64-NEXT:    fcvt s3, h3
643; CHECK-i64-NEXT:    fcvt s25, h27
644; CHECK-i64-NEXT:    fcvt s27, h28
645; CHECK-i64-NEXT:    frintx s23, s23
646; CHECK-i64-NEXT:    mov h21, v1.h[3]
647; CHECK-i64-NEXT:    fmov d2, x15
648; CHECK-i64-NEXT:    fcvtzs x15, s26
649; CHECK-i64-NEXT:    fmov d26, x13
650; CHECK-i64-NEXT:    mov h1, v1.h[1]
651; CHECK-i64-NEXT:    fcvtzs x13, s20
652; CHECK-i64-NEXT:    frintx s20, s24
653; CHECK-i64-NEXT:    fmov d24, x14
654; CHECK-i64-NEXT:    fcvtzs x14, s22
655; CHECK-i64-NEXT:    frintx s3, s3
656; CHECK-i64-NEXT:    fmov d22, x16
657; CHECK-i64-NEXT:    frintx s27, s27
658; CHECK-i64-NEXT:    fcvtzs x16, s23
659; CHECK-i64-NEXT:    fcvt s21, h21
660; CHECK-i64-NEXT:    frintx s25, s25
661; CHECK-i64-NEXT:    fcvt s1, h1
662; CHECK-i64-NEXT:    mov h0, v0.h[3]
663; CHECK-i64-NEXT:    mov h23, v7.h[2]
664; CHECK-i64-NEXT:    mov v22.d[1], x15
665; CHECK-i64-NEXT:    fcvtzs x15, s20
666; CHECK-i64-NEXT:    fmov d20, x13
667; CHECK-i64-NEXT:    fcvtzs x13, s3
668; CHECK-i64-NEXT:    fmov d3, x14
669; CHECK-i64-NEXT:    fcvtzs x14, s27
670; CHECK-i64-NEXT:    fmov d27, x16
671; CHECK-i64-NEXT:    frintx s21, s21
672; CHECK-i64-NEXT:    mov h7, v7.h[3]
673; CHECK-i64-NEXT:    frintx s1, s1
674; CHECK-i64-NEXT:    fcvt s0, h0
675; CHECK-i64-NEXT:    fcvt s23, h23
676; CHECK-i64-NEXT:    fcvt s19, h19
677; CHECK-i64-NEXT:    mov v27.d[1], x15
678; CHECK-i64-NEXT:    fcvtzs x15, s25
679; CHECK-i64-NEXT:    mov h25, v6.h[3]
680; CHECK-i64-NEXT:    mov h6, v6.h[1]
681; CHECK-i64-NEXT:    mov v3.d[1], x13
682; CHECK-i64-NEXT:    fcvtzs x13, s21
683; CHECK-i64-NEXT:    mov h21, v5.h[1]
684; CHECK-i64-NEXT:    mov h5, v5.h[3]
685; CHECK-i64-NEXT:    mov v20.d[1], x14
686; CHECK-i64-NEXT:    fcvtzs x14, s1
687; CHECK-i64-NEXT:    mov h1, v4.h[1]
688; CHECK-i64-NEXT:    frintx s0, s0
689; CHECK-i64-NEXT:    fcvt s25, h25
690; CHECK-i64-NEXT:    fcvt s7, h7
691; CHECK-i64-NEXT:    stp q3, q27, [x8, #192]
692; CHECK-i64-NEXT:    fcvt s6, h6
693; CHECK-i64-NEXT:    mov h3, v4.h[3]
694; CHECK-i64-NEXT:    stp q22, q20, [x8, #128]
695; CHECK-i64-NEXT:    fcvt s21, h21
696; CHECK-i64-NEXT:    fcvt s5, h5
697; CHECK-i64-NEXT:    mov v24.d[1], x13
698; CHECK-i64-NEXT:    mov v26.d[1], x14
699; CHECK-i64-NEXT:    fcvt s4, h4
700; CHECK-i64-NEXT:    frintx s22, s25
701; CHECK-i64-NEXT:    fmov d20, x12
702; CHECK-i64-NEXT:    fcvt s1, h1
703; CHECK-i64-NEXT:    frintx s6, s6
704; CHECK-i64-NEXT:    fcvt s3, h3
705; CHECK-i64-NEXT:    fcvtzs x12, s0
706; CHECK-i64-NEXT:    frintx s5, s5
707; CHECK-i64-NEXT:    frintx s21, s21
708; CHECK-i64-NEXT:    fmov d0, x11
709; CHECK-i64-NEXT:    stp q26, q24, [x8, #64]
710; CHECK-i64-NEXT:    fmov d24, x15
711; CHECK-i64-NEXT:    frintx s4, s4
712; CHECK-i64-NEXT:    fcvtzs x11, s22
713; CHECK-i64-NEXT:    frintx s22, s23
714; CHECK-i64-NEXT:    frintx s1, s1
715; CHECK-i64-NEXT:    fcvtzs x13, s6
716; CHECK-i64-NEXT:    frintx s3, s3
717; CHECK-i64-NEXT:    frintx s6, s7
718; CHECK-i64-NEXT:    fcvtzs x14, s5
719; CHECK-i64-NEXT:    mov v24.d[1], x12
720; CHECK-i64-NEXT:    frintx s5, s19
721; CHECK-i64-NEXT:    fcvtzs x12, s21
722; CHECK-i64-NEXT:    mov v0.d[1], x10
723; CHECK-i64-NEXT:    fcvtzs x10, s4
724; CHECK-i64-NEXT:    mov v20.d[1], x11
725; CHECK-i64-NEXT:    fcvtzs x11, s22
726; CHECK-i64-NEXT:    mov v2.d[1], x13
727; CHECK-i64-NEXT:    fcvtzs x15, s3
728; CHECK-i64-NEXT:    fcvtzs x13, s1
729; CHECK-i64-NEXT:    mov v18.d[1], x14
730; CHECK-i64-NEXT:    fcvtzs x14, s6
731; CHECK-i64-NEXT:    stp q0, q24, [x8]
732; CHECK-i64-NEXT:    mov v17.d[1], x12
733; CHECK-i64-NEXT:    fcvtzs x12, s5
734; CHECK-i64-NEXT:    fmov d0, x10
735; CHECK-i64-NEXT:    fmov d1, x11
736; CHECK-i64-NEXT:    stp q2, q20, [x8, #224]
737; CHECK-i64-NEXT:    fmov d2, x9
738; CHECK-i64-NEXT:    mov v16.d[1], x15
739; CHECK-i64-NEXT:    stp q17, q18, [x8, #160]
740; CHECK-i64-NEXT:    mov v0.d[1], x13
741; CHECK-i64-NEXT:    mov v1.d[1], x14
742; CHECK-i64-NEXT:    mov v2.d[1], x12
743; CHECK-i64-NEXT:    stp q0, q16, [x8, #96]
744; CHECK-i64-NEXT:    stp q2, q1, [x8, #32]
745; CHECK-i64-NEXT:    ret
746  %a = call <32 x iXLen> @llvm.lrint.v32iXLen.v32f16(<32 x half> %x)
747  ret <32 x iXLen> %a
748}
749declare <32 x iXLen> @llvm.lrint.v32iXLen.v32f16(<32 x half>)
750
751define <1 x iXLen> @lrint_v1f32(<1 x float> %x) {
752; CHECK-i32-LABEL: lrint_v1f32:
753; CHECK-i32:       // %bb.0:
754; CHECK-i32-NEXT:    frintx v0.2s, v0.2s
755; CHECK-i32-NEXT:    fcvtzs v0.2s, v0.2s
756; CHECK-i32-NEXT:    ret
757;
758; CHECK-i64-SD-LABEL: lrint_v1f32:
759; CHECK-i64-SD:       // %bb.0:
760; CHECK-i64-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
761; CHECK-i64-SD-NEXT:    frintx s0, s0
762; CHECK-i64-SD-NEXT:    fcvtzs x8, s0
763; CHECK-i64-SD-NEXT:    fmov d0, x8
764; CHECK-i64-SD-NEXT:    ret
765;
766; CHECK-i64-GI-LABEL: lrint_v1f32:
767; CHECK-i64-GI:       // %bb.0:
768; CHECK-i64-GI-NEXT:    frintx s0, s0
769; CHECK-i64-GI-NEXT:    fcvtzs x8, s0
770; CHECK-i64-GI-NEXT:    fmov d0, x8
771; CHECK-i64-GI-NEXT:    ret
772  %a = call <1 x iXLen> @llvm.lrint.v1iXLen.v1f32(<1 x float> %x)
773  ret <1 x iXLen> %a
774}
775declare <1 x iXLen> @llvm.lrint.v1iXLen.v1f32(<1 x float>)
776
777define <2 x iXLen> @lrint_v2f32(<2 x float> %x) {
778; CHECK-i32-LABEL: lrint_v2f32:
779; CHECK-i32:       // %bb.0:
780; CHECK-i32-NEXT:    frintx v0.2s, v0.2s
781; CHECK-i32-NEXT:    fcvtzs v0.2s, v0.2s
782; CHECK-i32-NEXT:    ret
783;
784; CHECK-i64-LABEL: lrint_v2f32:
785; CHECK-i64:       // %bb.0:
786; CHECK-i64-NEXT:    frintx v0.2s, v0.2s
787; CHECK-i64-NEXT:    fcvtl v0.2d, v0.2s
788; CHECK-i64-NEXT:    fcvtzs v0.2d, v0.2d
789; CHECK-i64-NEXT:    ret
790  %a = call <2 x iXLen> @llvm.lrint.v2iXLen.v2f32(<2 x float> %x)
791  ret <2 x iXLen> %a
792}
793declare <2 x iXLen> @llvm.lrint.v2iXLen.v2f32(<2 x float>)
794
795define <4 x iXLen> @lrint_v4f32(<4 x float> %x) {
796; CHECK-i32-LABEL: lrint_v4f32:
797; CHECK-i32:       // %bb.0:
798; CHECK-i32-NEXT:    frintx v0.4s, v0.4s
799; CHECK-i32-NEXT:    fcvtzs v0.4s, v0.4s
800; CHECK-i32-NEXT:    ret
801;
802; CHECK-i64-LABEL: lrint_v4f32:
803; CHECK-i64:       // %bb.0:
804; CHECK-i64-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
805; CHECK-i64-NEXT:    frintx v0.2s, v0.2s
806; CHECK-i64-NEXT:    frintx v1.2s, v1.2s
807; CHECK-i64-NEXT:    fcvtl v0.2d, v0.2s
808; CHECK-i64-NEXT:    fcvtl v1.2d, v1.2s
809; CHECK-i64-NEXT:    fcvtzs v0.2d, v0.2d
810; CHECK-i64-NEXT:    fcvtzs v1.2d, v1.2d
811; CHECK-i64-NEXT:    ret
812  %a = call <4 x iXLen> @llvm.lrint.v4iXLen.v4f32(<4 x float> %x)
813  ret <4 x iXLen> %a
814}
815declare <4 x iXLen> @llvm.lrint.v4iXLen.v4f32(<4 x float>)
816
817define <8 x iXLen> @lrint_v8f32(<8 x float> %x) {
818; CHECK-i32-LABEL: lrint_v8f32:
819; CHECK-i32:       // %bb.0:
820; CHECK-i32-NEXT:    frintx v0.4s, v0.4s
821; CHECK-i32-NEXT:    frintx v1.4s, v1.4s
822; CHECK-i32-NEXT:    fcvtzs v0.4s, v0.4s
823; CHECK-i32-NEXT:    fcvtzs v1.4s, v1.4s
824; CHECK-i32-NEXT:    ret
825;
826; CHECK-i64-LABEL: lrint_v8f32:
827; CHECK-i64:       // %bb.0:
828; CHECK-i64-NEXT:    ext v2.16b, v0.16b, v0.16b, #8
829; CHECK-i64-NEXT:    ext v3.16b, v1.16b, v1.16b, #8
830; CHECK-i64-NEXT:    frintx v0.2s, v0.2s
831; CHECK-i64-NEXT:    frintx v1.2s, v1.2s
832; CHECK-i64-NEXT:    frintx v2.2s, v2.2s
833; CHECK-i64-NEXT:    frintx v3.2s, v3.2s
834; CHECK-i64-NEXT:    fcvtl v0.2d, v0.2s
835; CHECK-i64-NEXT:    fcvtl v1.2d, v1.2s
836; CHECK-i64-NEXT:    fcvtl v4.2d, v2.2s
837; CHECK-i64-NEXT:    fcvtl v3.2d, v3.2s
838; CHECK-i64-NEXT:    fcvtzs v0.2d, v0.2d
839; CHECK-i64-NEXT:    fcvtzs v2.2d, v1.2d
840; CHECK-i64-NEXT:    fcvtzs v1.2d, v4.2d
841; CHECK-i64-NEXT:    fcvtzs v3.2d, v3.2d
842; CHECK-i64-NEXT:    ret
843  %a = call <8 x iXLen> @llvm.lrint.v8iXLen.v8f32(<8 x float> %x)
844  ret <8 x iXLen> %a
845}
846declare <8 x iXLen> @llvm.lrint.v8iXLen.v8f32(<8 x float>)
847
848define <16 x iXLen> @lrint_v16f32(<16 x float> %x) {
849; CHECK-i32-LABEL: lrint_v16f32:
850; CHECK-i32:       // %bb.0:
851; CHECK-i32-NEXT:    frintx v0.4s, v0.4s
852; CHECK-i32-NEXT:    frintx v1.4s, v1.4s
853; CHECK-i32-NEXT:    frintx v2.4s, v2.4s
854; CHECK-i32-NEXT:    frintx v3.4s, v3.4s
855; CHECK-i32-NEXT:    fcvtzs v0.4s, v0.4s
856; CHECK-i32-NEXT:    fcvtzs v1.4s, v1.4s
857; CHECK-i32-NEXT:    fcvtzs v2.4s, v2.4s
858; CHECK-i32-NEXT:    fcvtzs v3.4s, v3.4s
859; CHECK-i32-NEXT:    ret
860;
861; CHECK-i64-LABEL: lrint_v16f32:
862; CHECK-i64:       // %bb.0:
863; CHECK-i64-NEXT:    ext v4.16b, v1.16b, v1.16b, #8
864; CHECK-i64-NEXT:    ext v5.16b, v0.16b, v0.16b, #8
865; CHECK-i64-NEXT:    ext v6.16b, v2.16b, v2.16b, #8
866; CHECK-i64-NEXT:    ext v7.16b, v3.16b, v3.16b, #8
867; CHECK-i64-NEXT:    frintx v0.2s, v0.2s
868; CHECK-i64-NEXT:    frintx v1.2s, v1.2s
869; CHECK-i64-NEXT:    frintx v2.2s, v2.2s
870; CHECK-i64-NEXT:    frintx v3.2s, v3.2s
871; CHECK-i64-NEXT:    frintx v5.2s, v5.2s
872; CHECK-i64-NEXT:    frintx v4.2s, v4.2s
873; CHECK-i64-NEXT:    frintx v6.2s, v6.2s
874; CHECK-i64-NEXT:    frintx v7.2s, v7.2s
875; CHECK-i64-NEXT:    fcvtl v0.2d, v0.2s
876; CHECK-i64-NEXT:    fcvtl v1.2d, v1.2s
877; CHECK-i64-NEXT:    fcvtl v16.2d, v2.2s
878; CHECK-i64-NEXT:    fcvtl v18.2d, v3.2s
879; CHECK-i64-NEXT:    fcvtl v5.2d, v5.2s
880; CHECK-i64-NEXT:    fcvtl v17.2d, v4.2s
881; CHECK-i64-NEXT:    fcvtl v19.2d, v6.2s
882; CHECK-i64-NEXT:    fcvtl v7.2d, v7.2s
883; CHECK-i64-NEXT:    fcvtzs v0.2d, v0.2d
884; CHECK-i64-NEXT:    fcvtzs v2.2d, v1.2d
885; CHECK-i64-NEXT:    fcvtzs v4.2d, v16.2d
886; CHECK-i64-NEXT:    fcvtzs v6.2d, v18.2d
887; CHECK-i64-NEXT:    fcvtzs v1.2d, v5.2d
888; CHECK-i64-NEXT:    fcvtzs v3.2d, v17.2d
889; CHECK-i64-NEXT:    fcvtzs v5.2d, v19.2d
890; CHECK-i64-NEXT:    fcvtzs v7.2d, v7.2d
891; CHECK-i64-NEXT:    ret
892  %a = call <16 x iXLen> @llvm.lrint.v16iXLen.v16f32(<16 x float> %x)
893  ret <16 x iXLen> %a
894}
895declare <16 x iXLen> @llvm.lrint.v16iXLen.v16f32(<16 x float>)
896
897define <32 x iXLen> @lrint_v32f32(<32 x float> %x) {
898; CHECK-i32-LABEL: lrint_v32f32:
899; CHECK-i32:       // %bb.0:
900; CHECK-i32-NEXT:    frintx v0.4s, v0.4s
901; CHECK-i32-NEXT:    frintx v1.4s, v1.4s
902; CHECK-i32-NEXT:    frintx v2.4s, v2.4s
903; CHECK-i32-NEXT:    frintx v3.4s, v3.4s
904; CHECK-i32-NEXT:    frintx v4.4s, v4.4s
905; CHECK-i32-NEXT:    frintx v5.4s, v5.4s
906; CHECK-i32-NEXT:    frintx v6.4s, v6.4s
907; CHECK-i32-NEXT:    frintx v7.4s, v7.4s
908; CHECK-i32-NEXT:    fcvtzs v0.4s, v0.4s
909; CHECK-i32-NEXT:    fcvtzs v1.4s, v1.4s
910; CHECK-i32-NEXT:    fcvtzs v2.4s, v2.4s
911; CHECK-i32-NEXT:    fcvtzs v3.4s, v3.4s
912; CHECK-i32-NEXT:    fcvtzs v4.4s, v4.4s
913; CHECK-i32-NEXT:    fcvtzs v5.4s, v5.4s
914; CHECK-i32-NEXT:    fcvtzs v6.4s, v6.4s
915; CHECK-i32-NEXT:    fcvtzs v7.4s, v7.4s
916; CHECK-i32-NEXT:    ret
917;
918; CHECK-i64-LABEL: lrint_v32f32:
919; CHECK-i64:       // %bb.0:
920; CHECK-i64-NEXT:    ext v16.16b, v7.16b, v7.16b, #8
921; CHECK-i64-NEXT:    ext v17.16b, v6.16b, v6.16b, #8
922; CHECK-i64-NEXT:    frintx v7.2s, v7.2s
923; CHECK-i64-NEXT:    frintx v6.2s, v6.2s
924; CHECK-i64-NEXT:    ext v18.16b, v5.16b, v5.16b, #8
925; CHECK-i64-NEXT:    ext v21.16b, v4.16b, v4.16b, #8
926; CHECK-i64-NEXT:    ext v22.16b, v2.16b, v2.16b, #8
927; CHECK-i64-NEXT:    frintx v5.2s, v5.2s
928; CHECK-i64-NEXT:    ext v23.16b, v3.16b, v3.16b, #8
929; CHECK-i64-NEXT:    frintx v4.2s, v4.2s
930; CHECK-i64-NEXT:    ext v19.16b, v0.16b, v0.16b, #8
931; CHECK-i64-NEXT:    ext v20.16b, v1.16b, v1.16b, #8
932; CHECK-i64-NEXT:    frintx v16.2s, v16.2s
933; CHECK-i64-NEXT:    frintx v17.2s, v17.2s
934; CHECK-i64-NEXT:    fcvtl v7.2d, v7.2s
935; CHECK-i64-NEXT:    fcvtl v6.2d, v6.2s
936; CHECK-i64-NEXT:    frintx v18.2s, v18.2s
937; CHECK-i64-NEXT:    frintx v21.2s, v21.2s
938; CHECK-i64-NEXT:    frintx v2.2s, v2.2s
939; CHECK-i64-NEXT:    frintx v3.2s, v3.2s
940; CHECK-i64-NEXT:    fcvtl v5.2d, v5.2s
941; CHECK-i64-NEXT:    frintx v23.2s, v23.2s
942; CHECK-i64-NEXT:    fcvtl v4.2d, v4.2s
943; CHECK-i64-NEXT:    frintx v1.2s, v1.2s
944; CHECK-i64-NEXT:    fcvtl v16.2d, v16.2s
945; CHECK-i64-NEXT:    fcvtl v17.2d, v17.2s
946; CHECK-i64-NEXT:    fcvtzs v7.2d, v7.2d
947; CHECK-i64-NEXT:    fcvtzs v6.2d, v6.2d
948; CHECK-i64-NEXT:    fcvtl v18.2d, v18.2s
949; CHECK-i64-NEXT:    fcvtl v21.2d, v21.2s
950; CHECK-i64-NEXT:    frintx v20.2s, v20.2s
951; CHECK-i64-NEXT:    fcvtl v3.2d, v3.2s
952; CHECK-i64-NEXT:    fcvtzs v5.2d, v5.2d
953; CHECK-i64-NEXT:    frintx v0.2s, v0.2s
954; CHECK-i64-NEXT:    fcvtl v2.2d, v2.2s
955; CHECK-i64-NEXT:    fcvtzs v4.2d, v4.2d
956; CHECK-i64-NEXT:    fcvtzs v16.2d, v16.2d
957; CHECK-i64-NEXT:    fcvtzs v17.2d, v17.2d
958; CHECK-i64-NEXT:    fcvtl v1.2d, v1.2s
959; CHECK-i64-NEXT:    fcvtzs v3.2d, v3.2d
960; CHECK-i64-NEXT:    fcvtl v0.2d, v0.2s
961; CHECK-i64-NEXT:    fcvtzs v2.2d, v2.2d
962; CHECK-i64-NEXT:    stp q6, q17, [x8, #192]
963; CHECK-i64-NEXT:    fcvtl v6.2d, v23.2s
964; CHECK-i64-NEXT:    frintx v17.2s, v19.2s
965; CHECK-i64-NEXT:    stp q7, q16, [x8, #224]
966; CHECK-i64-NEXT:    frintx v7.2s, v22.2s
967; CHECK-i64-NEXT:    fcvtzs v16.2d, v18.2d
968; CHECK-i64-NEXT:    fcvtzs v18.2d, v21.2d
969; CHECK-i64-NEXT:    fcvtzs v1.2d, v1.2d
970; CHECK-i64-NEXT:    fcvtzs v0.2d, v0.2d
971; CHECK-i64-NEXT:    fcvtzs v6.2d, v6.2d
972; CHECK-i64-NEXT:    stp q5, q16, [x8, #160]
973; CHECK-i64-NEXT:    fcvtl v7.2d, v7.2s
974; CHECK-i64-NEXT:    fcvtl v5.2d, v20.2s
975; CHECK-i64-NEXT:    stp q4, q18, [x8, #128]
976; CHECK-i64-NEXT:    fcvtl v4.2d, v17.2s
977; CHECK-i64-NEXT:    stp q3, q6, [x8, #96]
978; CHECK-i64-NEXT:    fcvtzs v7.2d, v7.2d
979; CHECK-i64-NEXT:    fcvtzs v3.2d, v5.2d
980; CHECK-i64-NEXT:    stp q1, q3, [x8, #32]
981; CHECK-i64-NEXT:    stp q2, q7, [x8, #64]
982; CHECK-i64-NEXT:    fcvtzs v2.2d, v4.2d
983; CHECK-i64-NEXT:    stp q0, q2, [x8]
984; CHECK-i64-NEXT:    ret
985  %a = call <32 x iXLen> @llvm.lrint.v32iXLen.v32f32(<32 x float> %x)
986  ret <32 x iXLen> %a
987}
988declare <32 x iXLen> @llvm.lrint.v32iXLen.v32f32(<32 x float>)
989
990define <1 x iXLen> @lrint_v1f64(<1 x double> %x) {
991; CHECK-i32-LABEL: lrint_v1f64:
992; CHECK-i32:       // %bb.0:
993; CHECK-i32-NEXT:    frintx d0, d0
994; CHECK-i32-NEXT:    fcvtzs w8, d0
995; CHECK-i32-NEXT:    fmov s0, w8
996; CHECK-i32-NEXT:    ret
997;
998; CHECK-i64-LABEL: lrint_v1f64:
999; CHECK-i64:       // %bb.0:
1000; CHECK-i64-NEXT:    frintx d0, d0
1001; CHECK-i64-NEXT:    fcvtzs x8, d0
1002; CHECK-i64-NEXT:    fmov d0, x8
1003; CHECK-i64-NEXT:    ret
1004  %a = call <1 x iXLen> @llvm.lrint.v1iXLen.v1f64(<1 x double> %x)
1005  ret <1 x iXLen> %a
1006}
1007declare <1 x iXLen> @llvm.lrint.v1iXLen.v1f64(<1 x double>)
1008
1009define <2 x iXLen> @lrint_v2f64(<2 x double> %x) {
1010; CHECK-i32-LABEL: lrint_v2f64:
1011; CHECK-i32:       // %bb.0:
1012; CHECK-i32-NEXT:    frintx v0.2d, v0.2d
1013; CHECK-i32-NEXT:    mov d1, v0.d[1]
1014; CHECK-i32-NEXT:    fcvtzs w8, d0
1015; CHECK-i32-NEXT:    fcvtzs w9, d1
1016; CHECK-i32-NEXT:    fmov s0, w8
1017; CHECK-i32-NEXT:    mov v0.s[1], w9
1018; CHECK-i32-NEXT:    // kill: def $d0 killed $d0 killed $q0
1019; CHECK-i32-NEXT:    ret
1020;
1021; CHECK-i64-LABEL: lrint_v2f64:
1022; CHECK-i64:       // %bb.0:
1023; CHECK-i64-NEXT:    frintx v0.2d, v0.2d
1024; CHECK-i64-NEXT:    fcvtzs v0.2d, v0.2d
1025; CHECK-i64-NEXT:    ret
1026  %a = call <2 x iXLen> @llvm.lrint.v2iXLen.v2f64(<2 x double> %x)
1027  ret <2 x iXLen> %a
1028}
1029declare <2 x iXLen> @llvm.lrint.v2iXLen.v2f64(<2 x double>)
1030
1031define <4 x iXLen> @lrint_v4f64(<4 x double> %x) {
1032; CHECK-i32-LABEL: lrint_v4f64:
1033; CHECK-i32:       // %bb.0:
1034; CHECK-i32-NEXT:    frintx v0.2d, v0.2d
1035; CHECK-i32-NEXT:    frintx v1.2d, v1.2d
1036; CHECK-i32-NEXT:    mov d2, v0.d[1]
1037; CHECK-i32-NEXT:    fcvtzs w8, d0
1038; CHECK-i32-NEXT:    fcvtzs w9, d2
1039; CHECK-i32-NEXT:    fmov s0, w8
1040; CHECK-i32-NEXT:    fcvtzs w8, d1
1041; CHECK-i32-NEXT:    mov d1, v1.d[1]
1042; CHECK-i32-NEXT:    mov v0.s[1], w9
1043; CHECK-i32-NEXT:    mov v0.s[2], w8
1044; CHECK-i32-NEXT:    fcvtzs w8, d1
1045; CHECK-i32-NEXT:    mov v0.s[3], w8
1046; CHECK-i32-NEXT:    ret
1047;
1048; CHECK-i64-LABEL: lrint_v4f64:
1049; CHECK-i64:       // %bb.0:
1050; CHECK-i64-NEXT:    frintx v0.2d, v0.2d
1051; CHECK-i64-NEXT:    frintx v1.2d, v1.2d
1052; CHECK-i64-NEXT:    fcvtzs v0.2d, v0.2d
1053; CHECK-i64-NEXT:    fcvtzs v1.2d, v1.2d
1054; CHECK-i64-NEXT:    ret
1055  %a = call <4 x iXLen> @llvm.lrint.v4iXLen.v4f64(<4 x double> %x)
1056  ret <4 x iXLen> %a
1057}
1058declare <4 x iXLen> @llvm.lrint.v4iXLen.v4f64(<4 x double>)
1059
1060define <8 x iXLen> @lrint_v8f64(<8 x double> %x) {
1061; CHECK-i32-LABEL: lrint_v8f64:
1062; CHECK-i32:       // %bb.0:
1063; CHECK-i32-NEXT:    frintx v2.2d, v2.2d
1064; CHECK-i32-NEXT:    frintx v0.2d, v0.2d
1065; CHECK-i32-NEXT:    frintx v3.2d, v3.2d
1066; CHECK-i32-NEXT:    mov d4, v0.d[1]
1067; CHECK-i32-NEXT:    mov d5, v2.d[1]
1068; CHECK-i32-NEXT:    fcvtzs w8, d0
1069; CHECK-i32-NEXT:    fcvtzs w9, d2
1070; CHECK-i32-NEXT:    frintx v2.2d, v1.2d
1071; CHECK-i32-NEXT:    fcvtzs w10, d4
1072; CHECK-i32-NEXT:    fcvtzs w11, d5
1073; CHECK-i32-NEXT:    fmov s0, w8
1074; CHECK-i32-NEXT:    fmov s1, w9
1075; CHECK-i32-NEXT:    fcvtzs w8, d2
1076; CHECK-i32-NEXT:    mov d2, v2.d[1]
1077; CHECK-i32-NEXT:    fcvtzs w9, d3
1078; CHECK-i32-NEXT:    mov d3, v3.d[1]
1079; CHECK-i32-NEXT:    mov v0.s[1], w10
1080; CHECK-i32-NEXT:    mov v1.s[1], w11
1081; CHECK-i32-NEXT:    mov v0.s[2], w8
1082; CHECK-i32-NEXT:    fcvtzs w8, d2
1083; CHECK-i32-NEXT:    mov v1.s[2], w9
1084; CHECK-i32-NEXT:    fcvtzs w9, d3
1085; CHECK-i32-NEXT:    mov v0.s[3], w8
1086; CHECK-i32-NEXT:    mov v1.s[3], w9
1087; CHECK-i32-NEXT:    ret
1088;
1089; CHECK-i64-LABEL: lrint_v8f64:
1090; CHECK-i64:       // %bb.0:
1091; CHECK-i64-NEXT:    frintx v0.2d, v0.2d
1092; CHECK-i64-NEXT:    frintx v1.2d, v1.2d
1093; CHECK-i64-NEXT:    frintx v2.2d, v2.2d
1094; CHECK-i64-NEXT:    frintx v3.2d, v3.2d
1095; CHECK-i64-NEXT:    fcvtzs v0.2d, v0.2d
1096; CHECK-i64-NEXT:    fcvtzs v1.2d, v1.2d
1097; CHECK-i64-NEXT:    fcvtzs v2.2d, v2.2d
1098; CHECK-i64-NEXT:    fcvtzs v3.2d, v3.2d
1099; CHECK-i64-NEXT:    ret
1100  %a = call <8 x iXLen> @llvm.lrint.v8iXLen.v8f64(<8 x double> %x)
1101  ret <8 x iXLen> %a
1102}
1103declare <8 x iXLen> @llvm.lrint.v8iXLen.v8f64(<8 x double>)
1104
1105define <16 x iXLen> @lrint_v16f64(<16 x double> %x) {
1106; CHECK-i32-LABEL: lrint_v16f64:
1107; CHECK-i32:       // %bb.0:
1108; CHECK-i32-NEXT:    frintx v0.2d, v0.2d
1109; CHECK-i32-NEXT:    frintx v2.2d, v2.2d
1110; CHECK-i32-NEXT:    frintx v4.2d, v4.2d
1111; CHECK-i32-NEXT:    frintx v6.2d, v6.2d
1112; CHECK-i32-NEXT:    frintx v17.2d, v1.2d
1113; CHECK-i32-NEXT:    frintx v5.2d, v5.2d
1114; CHECK-i32-NEXT:    fcvtzs w8, d0
1115; CHECK-i32-NEXT:    mov d16, v0.d[1]
1116; CHECK-i32-NEXT:    fcvtzs w9, d2
1117; CHECK-i32-NEXT:    mov d2, v2.d[1]
1118; CHECK-i32-NEXT:    fcvtzs w10, d4
1119; CHECK-i32-NEXT:    mov d4, v4.d[1]
1120; CHECK-i32-NEXT:    fcvtzs w11, d6
1121; CHECK-i32-NEXT:    mov d6, v6.d[1]
1122; CHECK-i32-NEXT:    fmov s0, w8
1123; CHECK-i32-NEXT:    fcvtzs w8, d16
1124; CHECK-i32-NEXT:    frintx v16.2d, v3.2d
1125; CHECK-i32-NEXT:    fmov s1, w9
1126; CHECK-i32-NEXT:    fcvtzs w9, d2
1127; CHECK-i32-NEXT:    fmov s2, w10
1128; CHECK-i32-NEXT:    fcvtzs w10, d4
1129; CHECK-i32-NEXT:    frintx v4.2d, v7.2d
1130; CHECK-i32-NEXT:    fmov s3, w11
1131; CHECK-i32-NEXT:    fcvtzs w11, d6
1132; CHECK-i32-NEXT:    mov d6, v17.d[1]
1133; CHECK-i32-NEXT:    mov v0.s[1], w8
1134; CHECK-i32-NEXT:    fcvtzs w8, d17
1135; CHECK-i32-NEXT:    mov d7, v16.d[1]
1136; CHECK-i32-NEXT:    mov v1.s[1], w9
1137; CHECK-i32-NEXT:    fcvtzs w9, d16
1138; CHECK-i32-NEXT:    mov v2.s[1], w10
1139; CHECK-i32-NEXT:    fcvtzs w10, d5
1140; CHECK-i32-NEXT:    mov d5, v5.d[1]
1141; CHECK-i32-NEXT:    mov v3.s[1], w11
1142; CHECK-i32-NEXT:    fcvtzs w11, d4
1143; CHECK-i32-NEXT:    mov d4, v4.d[1]
1144; CHECK-i32-NEXT:    mov v0.s[2], w8
1145; CHECK-i32-NEXT:    fcvtzs w8, d6
1146; CHECK-i32-NEXT:    mov v1.s[2], w9
1147; CHECK-i32-NEXT:    fcvtzs w9, d7
1148; CHECK-i32-NEXT:    mov v2.s[2], w10
1149; CHECK-i32-NEXT:    fcvtzs w10, d5
1150; CHECK-i32-NEXT:    mov v3.s[2], w11
1151; CHECK-i32-NEXT:    fcvtzs w11, d4
1152; CHECK-i32-NEXT:    mov v0.s[3], w8
1153; CHECK-i32-NEXT:    mov v1.s[3], w9
1154; CHECK-i32-NEXT:    mov v2.s[3], w10
1155; CHECK-i32-NEXT:    mov v3.s[3], w11
1156; CHECK-i32-NEXT:    ret
1157;
1158; CHECK-i64-LABEL: lrint_v16f64:
1159; CHECK-i64:       // %bb.0:
1160; CHECK-i64-NEXT:    frintx v0.2d, v0.2d
1161; CHECK-i64-NEXT:    frintx v1.2d, v1.2d
1162; CHECK-i64-NEXT:    frintx v2.2d, v2.2d
1163; CHECK-i64-NEXT:    frintx v3.2d, v3.2d
1164; CHECK-i64-NEXT:    frintx v4.2d, v4.2d
1165; CHECK-i64-NEXT:    frintx v5.2d, v5.2d
1166; CHECK-i64-NEXT:    frintx v6.2d, v6.2d
1167; CHECK-i64-NEXT:    frintx v7.2d, v7.2d
1168; CHECK-i64-NEXT:    fcvtzs v0.2d, v0.2d
1169; CHECK-i64-NEXT:    fcvtzs v1.2d, v1.2d
1170; CHECK-i64-NEXT:    fcvtzs v2.2d, v2.2d
1171; CHECK-i64-NEXT:    fcvtzs v3.2d, v3.2d
1172; CHECK-i64-NEXT:    fcvtzs v4.2d, v4.2d
1173; CHECK-i64-NEXT:    fcvtzs v5.2d, v5.2d
1174; CHECK-i64-NEXT:    fcvtzs v6.2d, v6.2d
1175; CHECK-i64-NEXT:    fcvtzs v7.2d, v7.2d
1176; CHECK-i64-NEXT:    ret
1177  %a = call <16 x iXLen> @llvm.lrint.v16iXLen.v16f64(<16 x double> %x)
1178  ret <16 x iXLen> %a
1179}
1180declare <16 x iXLen> @llvm.lrint.v16iXLen.v16f64(<16 x double>)
1181
1182define <32 x iXLen> @lrint_v32f64(<32 x double> %x) {
1183; CHECK-i32-LABEL: lrint_v32f64:
1184; CHECK-i32:       // %bb.0:
1185; CHECK-i32-NEXT:    frintx v17.2d, v0.2d
1186; CHECK-i32-NEXT:    frintx v19.2d, v2.2d
1187; CHECK-i32-NEXT:    frintx v0.2d, v1.2d
1188; CHECK-i32-NEXT:    frintx v1.2d, v4.2d
1189; CHECK-i32-NEXT:    frintx v2.2d, v3.2d
1190; CHECK-i32-NEXT:    frintx v3.2d, v5.2d
1191; CHECK-i32-NEXT:    ldp q16, q5, [sp]
1192; CHECK-i32-NEXT:    frintx v18.2d, v6.2d
1193; CHECK-i32-NEXT:    frintx v4.2d, v7.2d
1194; CHECK-i32-NEXT:    ldp q22, q6, [sp, #64]
1195; CHECK-i32-NEXT:    mov d20, v17.d[1]
1196; CHECK-i32-NEXT:    mov d21, v19.d[1]
1197; CHECK-i32-NEXT:    fcvtzs w8, d17
1198; CHECK-i32-NEXT:    fcvtzs w9, d19
1199; CHECK-i32-NEXT:    ldp q17, q7, [sp, #32]
1200; CHECK-i32-NEXT:    fcvtzs w12, d0
1201; CHECK-i32-NEXT:    mov d19, v1.d[1]
1202; CHECK-i32-NEXT:    fcvtzs w13, d1
1203; CHECK-i32-NEXT:    frintx v16.2d, v16.2d
1204; CHECK-i32-NEXT:    mov d23, v18.d[1]
1205; CHECK-i32-NEXT:    fcvtzs w15, d18
1206; CHECK-i32-NEXT:    fcvtzs w10, d20
1207; CHECK-i32-NEXT:    fcvtzs w11, d21
1208; CHECK-i32-NEXT:    mov d21, v0.d[1]
1209; CHECK-i32-NEXT:    fmov s0, w8
1210; CHECK-i32-NEXT:    fmov s1, w9
1211; CHECK-i32-NEXT:    frintx v17.2d, v17.2d
1212; CHECK-i32-NEXT:    frintx v20.2d, v22.2d
1213; CHECK-i32-NEXT:    mov d22, v2.d[1]
1214; CHECK-i32-NEXT:    fcvtzs w14, d19
1215; CHECK-i32-NEXT:    mov d18, v16.d[1]
1216; CHECK-i32-NEXT:    frintx v7.2d, v7.2d
1217; CHECK-i32-NEXT:    mov v0.s[1], w10
1218; CHECK-i32-NEXT:    fcvtzs w10, d2
1219; CHECK-i32-NEXT:    mov v1.s[1], w11
1220; CHECK-i32-NEXT:    fcvtzs w8, d21
1221; CHECK-i32-NEXT:    ldp q21, q19, [sp, #96]
1222; CHECK-i32-NEXT:    fmov s2, w13
1223; CHECK-i32-NEXT:    fcvtzs w11, d23
1224; CHECK-i32-NEXT:    mov d23, v3.d[1]
1225; CHECK-i32-NEXT:    fcvtzs w9, d22
1226; CHECK-i32-NEXT:    mov d22, v17.d[1]
1227; CHECK-i32-NEXT:    fcvtzs w13, d18
1228; CHECK-i32-NEXT:    mov v0.s[2], w12
1229; CHECK-i32-NEXT:    fcvtzs w12, d16
1230; CHECK-i32-NEXT:    mov v1.s[2], w10
1231; CHECK-i32-NEXT:    fcvtzs w10, d3
1232; CHECK-i32-NEXT:    fmov s3, w15
1233; CHECK-i32-NEXT:    frintx v21.2d, v21.2d
1234; CHECK-i32-NEXT:    mov v2.s[1], w14
1235; CHECK-i32-NEXT:    mov d16, v20.d[1]
1236; CHECK-i32-NEXT:    fcvtzs w14, d17
1237; CHECK-i32-NEXT:    mov d17, v4.d[1]
1238; CHECK-i32-NEXT:    fcvtzs w15, d22
1239; CHECK-i32-NEXT:    frintx v22.2d, v5.2d
1240; CHECK-i32-NEXT:    mov v3.s[1], w11
1241; CHECK-i32-NEXT:    fcvtzs w11, d4
1242; CHECK-i32-NEXT:    fmov s4, w12
1243; CHECK-i32-NEXT:    fcvtzs w12, d20
1244; CHECK-i32-NEXT:    mov d18, v21.d[1]
1245; CHECK-i32-NEXT:    mov d20, v7.d[1]
1246; CHECK-i32-NEXT:    fmov s5, w14
1247; CHECK-i32-NEXT:    fcvtzs w14, d21
1248; CHECK-i32-NEXT:    mov v2.s[2], w10
1249; CHECK-i32-NEXT:    mov v4.s[1], w13
1250; CHECK-i32-NEXT:    fcvtzs w13, d16
1251; CHECK-i32-NEXT:    frintx v16.2d, v6.2d
1252; CHECK-i32-NEXT:    fcvtzs w10, d23
1253; CHECK-i32-NEXT:    mov v3.s[2], w11
1254; CHECK-i32-NEXT:    fcvtzs w11, d17
1255; CHECK-i32-NEXT:    fmov s6, w12
1256; CHECK-i32-NEXT:    mov v5.s[1], w15
1257; CHECK-i32-NEXT:    fcvtzs w15, d18
1258; CHECK-i32-NEXT:    frintx v18.2d, v19.2d
1259; CHECK-i32-NEXT:    fcvtzs w12, d22
1260; CHECK-i32-NEXT:    mov d19, v22.d[1]
1261; CHECK-i32-NEXT:    mov v0.s[3], w8
1262; CHECK-i32-NEXT:    mov v1.s[3], w9
1263; CHECK-i32-NEXT:    mov v6.s[1], w13
1264; CHECK-i32-NEXT:    fcvtzs w13, d7
1265; CHECK-i32-NEXT:    fmov s7, w14
1266; CHECK-i32-NEXT:    fcvtzs w14, d16
1267; CHECK-i32-NEXT:    mov d16, v16.d[1]
1268; CHECK-i32-NEXT:    mov v2.s[3], w10
1269; CHECK-i32-NEXT:    mov v4.s[2], w12
1270; CHECK-i32-NEXT:    fcvtzs w12, d19
1271; CHECK-i32-NEXT:    mov v3.s[3], w11
1272; CHECK-i32-NEXT:    mov v7.s[1], w15
1273; CHECK-i32-NEXT:    fcvtzs w15, d18
1274; CHECK-i32-NEXT:    mov d18, v18.d[1]
1275; CHECK-i32-NEXT:    mov v5.s[2], w13
1276; CHECK-i32-NEXT:    fcvtzs w13, d20
1277; CHECK-i32-NEXT:    mov v6.s[2], w14
1278; CHECK-i32-NEXT:    fcvtzs w14, d16
1279; CHECK-i32-NEXT:    mov v4.s[3], w12
1280; CHECK-i32-NEXT:    mov v7.s[2], w15
1281; CHECK-i32-NEXT:    fcvtzs w15, d18
1282; CHECK-i32-NEXT:    mov v5.s[3], w13
1283; CHECK-i32-NEXT:    mov v6.s[3], w14
1284; CHECK-i32-NEXT:    mov v7.s[3], w15
1285; CHECK-i32-NEXT:    ret
1286;
1287; CHECK-i64-LABEL: lrint_v32f64:
1288; CHECK-i64:       // %bb.0:
1289; CHECK-i64-NEXT:    ldp q17, q16, [sp, #96]
1290; CHECK-i64-NEXT:    frintx v7.2d, v7.2d
1291; CHECK-i64-NEXT:    ldp q19, q18, [sp, #64]
1292; CHECK-i64-NEXT:    frintx v6.2d, v6.2d
1293; CHECK-i64-NEXT:    ldp q21, q20, [sp, #32]
1294; CHECK-i64-NEXT:    frintx v5.2d, v5.2d
1295; CHECK-i64-NEXT:    frintx v16.2d, v16.2d
1296; CHECK-i64-NEXT:    frintx v17.2d, v17.2d
1297; CHECK-i64-NEXT:    frintx v4.2d, v4.2d
1298; CHECK-i64-NEXT:    frintx v18.2d, v18.2d
1299; CHECK-i64-NEXT:    frintx v19.2d, v19.2d
1300; CHECK-i64-NEXT:    frintx v3.2d, v3.2d
1301; CHECK-i64-NEXT:    ldp q23, q22, [sp]
1302; CHECK-i64-NEXT:    frintx v20.2d, v20.2d
1303; CHECK-i64-NEXT:    frintx v21.2d, v21.2d
1304; CHECK-i64-NEXT:    frintx v2.2d, v2.2d
1305; CHECK-i64-NEXT:    frintx v1.2d, v1.2d
1306; CHECK-i64-NEXT:    fcvtzs v16.2d, v16.2d
1307; CHECK-i64-NEXT:    fcvtzs v17.2d, v17.2d
1308; CHECK-i64-NEXT:    frintx v0.2d, v0.2d
1309; CHECK-i64-NEXT:    frintx v22.2d, v22.2d
1310; CHECK-i64-NEXT:    fcvtzs v18.2d, v18.2d
1311; CHECK-i64-NEXT:    frintx v23.2d, v23.2d
1312; CHECK-i64-NEXT:    fcvtzs v19.2d, v19.2d
1313; CHECK-i64-NEXT:    fcvtzs v20.2d, v20.2d
1314; CHECK-i64-NEXT:    fcvtzs v7.2d, v7.2d
1315; CHECK-i64-NEXT:    fcvtzs v6.2d, v6.2d
1316; CHECK-i64-NEXT:    fcvtzs v5.2d, v5.2d
1317; CHECK-i64-NEXT:    fcvtzs v4.2d, v4.2d
1318; CHECK-i64-NEXT:    stp q17, q16, [x8, #224]
1319; CHECK-i64-NEXT:    fcvtzs v16.2d, v21.2d
1320; CHECK-i64-NEXT:    fcvtzs v3.2d, v3.2d
1321; CHECK-i64-NEXT:    fcvtzs v17.2d, v22.2d
1322; CHECK-i64-NEXT:    fcvtzs v2.2d, v2.2d
1323; CHECK-i64-NEXT:    fcvtzs v1.2d, v1.2d
1324; CHECK-i64-NEXT:    stp q19, q18, [x8, #192]
1325; CHECK-i64-NEXT:    fcvtzs v18.2d, v23.2d
1326; CHECK-i64-NEXT:    fcvtzs v0.2d, v0.2d
1327; CHECK-i64-NEXT:    stp q4, q5, [x8, #64]
1328; CHECK-i64-NEXT:    stp q6, q7, [x8, #96]
1329; CHECK-i64-NEXT:    stp q2, q3, [x8, #32]
1330; CHECK-i64-NEXT:    stp q0, q1, [x8]
1331; CHECK-i64-NEXT:    stp q18, q17, [x8, #128]
1332; CHECK-i64-NEXT:    stp q16, q20, [x8, #160]
1333; CHECK-i64-NEXT:    ret
1334  %a = call <32 x iXLen> @llvm.lrint.v32iXLen.v16f64(<32 x double> %x)
1335  ret <32 x iXLen> %a
1336}
1337declare <32 x iXLen> @llvm.lrint.v32iXLen.v32f64(<32 x double>)
1338