xref: /llvm-project/llvm/test/CodeGen/AArch64/fcvt.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-NOFP16
3; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-FP16
4; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-NOFP16
5; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16
6
7define double @ceil_f64(double %a) {
8; CHECK-LABEL: ceil_f64:
9; CHECK:       // %bb.0: // %entry
10; CHECK-NEXT:    frintp d0, d0
11; CHECK-NEXT:    ret
12entry:
13  %c = call double @llvm.ceil.f64(double %a)
14  ret double %c
15}
16
17define float @ceil_f32(float %a) {
18; CHECK-LABEL: ceil_f32:
19; CHECK:       // %bb.0: // %entry
20; CHECK-NEXT:    frintp s0, s0
21; CHECK-NEXT:    ret
22entry:
23  %c = call float @llvm.ceil.f32(float %a)
24  ret float %c
25}
26
27define half @ceil_f16(half %a) {
28; CHECK-SD-NOFP16-LABEL: ceil_f16:
29; CHECK-SD-NOFP16:       // %bb.0: // %entry
30; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
31; CHECK-SD-NOFP16-NEXT:    frintp s0, s0
32; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
33; CHECK-SD-NOFP16-NEXT:    ret
34;
35; CHECK-SD-FP16-LABEL: ceil_f16:
36; CHECK-SD-FP16:       // %bb.0: // %entry
37; CHECK-SD-FP16-NEXT:    frintp h0, h0
38; CHECK-SD-FP16-NEXT:    ret
39;
40; CHECK-GI-NOFP16-LABEL: ceil_f16:
41; CHECK-GI-NOFP16:       // %bb.0: // %entry
42; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
43; CHECK-GI-NOFP16-NEXT:    frintp s0, s0
44; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
45; CHECK-GI-NOFP16-NEXT:    ret
46;
47; CHECK-GI-FP16-LABEL: ceil_f16:
48; CHECK-GI-FP16:       // %bb.0: // %entry
49; CHECK-GI-FP16-NEXT:    frintp h0, h0
50; CHECK-GI-FP16-NEXT:    ret
51entry:
52  %c = call half @llvm.ceil.f16(half %a)
53  ret half %c
54}
55
56define <2 x double> @ceil_v2f64(<2 x double> %a) {
57; CHECK-LABEL: ceil_v2f64:
58; CHECK:       // %bb.0: // %entry
59; CHECK-NEXT:    frintp v0.2d, v0.2d
60; CHECK-NEXT:    ret
61entry:
62  %c = call <2 x double> @llvm.ceil.v2f64(<2 x double> %a)
63  ret <2 x double> %c
64}
65
66define <3 x double> @ceil_v3f64(<3 x double> %a) {
67; CHECK-SD-LABEL: ceil_v3f64:
68; CHECK-SD:       // %bb.0: // %entry
69; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
70; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
71; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
72; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
73; CHECK-SD-NEXT:    frintp v2.2d, v2.2d
74; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
75; CHECK-SD-NEXT:    frintp v0.2d, v0.2d
76; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
77; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
78; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
79; CHECK-SD-NEXT:    ret
80;
81; CHECK-GI-LABEL: ceil_v3f64:
82; CHECK-GI:       // %bb.0: // %entry
83; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
84; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
85; CHECK-GI-NEXT:    frintp d2, d2
86; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
87; CHECK-GI-NEXT:    frintp v0.2d, v0.2d
88; CHECK-GI-NEXT:    mov d1, v0.d[1]
89; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
90; CHECK-GI-NEXT:    ret
91entry:
92  %c = call <3 x double> @llvm.ceil.v3f64(<3 x double> %a)
93  ret <3 x double> %c
94}
95
96define <4 x double> @ceil_v4f64(<4 x double> %a) {
97; CHECK-LABEL: ceil_v4f64:
98; CHECK:       // %bb.0: // %entry
99; CHECK-NEXT:    frintp v0.2d, v0.2d
100; CHECK-NEXT:    frintp v1.2d, v1.2d
101; CHECK-NEXT:    ret
102entry:
103  %c = call <4 x double> @llvm.ceil.v4f64(<4 x double> %a)
104  ret <4 x double> %c
105}
106
107define <2 x float> @ceil_v2f32(<2 x float> %a) {
108; CHECK-LABEL: ceil_v2f32:
109; CHECK:       // %bb.0: // %entry
110; CHECK-NEXT:    frintp v0.2s, v0.2s
111; CHECK-NEXT:    ret
112entry:
113  %c = call <2 x float> @llvm.ceil.v2f32(<2 x float> %a)
114  ret <2 x float> %c
115}
116
117define <3 x float> @ceil_v3f32(<3 x float> %a) {
118; CHECK-LABEL: ceil_v3f32:
119; CHECK:       // %bb.0: // %entry
120; CHECK-NEXT:    frintp v0.4s, v0.4s
121; CHECK-NEXT:    ret
122entry:
123  %c = call <3 x float> @llvm.ceil.v3f32(<3 x float> %a)
124  ret <3 x float> %c
125}
126
127define <4 x float> @ceil_v4f32(<4 x float> %a) {
128; CHECK-LABEL: ceil_v4f32:
129; CHECK:       // %bb.0: // %entry
130; CHECK-NEXT:    frintp v0.4s, v0.4s
131; CHECK-NEXT:    ret
132entry:
133  %c = call <4 x float> @llvm.ceil.v4f32(<4 x float> %a)
134  ret <4 x float> %c
135}
136
137define <8 x float> @ceil_v8f32(<8 x float> %a) {
138; CHECK-LABEL: ceil_v8f32:
139; CHECK:       // %bb.0: // %entry
140; CHECK-NEXT:    frintp v0.4s, v0.4s
141; CHECK-NEXT:    frintp v1.4s, v1.4s
142; CHECK-NEXT:    ret
143entry:
144  %c = call <8 x float> @llvm.ceil.v8f32(<8 x float> %a)
145  ret <8 x float> %c
146}
147
148define <7 x half> @ceil_v7f16(<7 x half> %a) {
149; CHECK-SD-NOFP16-LABEL: ceil_v7f16:
150; CHECK-SD-NOFP16:       // %bb.0: // %entry
151; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
152; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
153; CHECK-SD-NOFP16-NEXT:    frintp v1.4s, v1.4s
154; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
155; CHECK-SD-NOFP16-NEXT:    frintp v1.4s, v2.4s
156; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
157; CHECK-SD-NOFP16-NEXT:    ret
158;
159; CHECK-SD-FP16-LABEL: ceil_v7f16:
160; CHECK-SD-FP16:       // %bb.0: // %entry
161; CHECK-SD-FP16-NEXT:    frintp v0.8h, v0.8h
162; CHECK-SD-FP16-NEXT:    ret
163;
164; CHECK-GI-NOFP16-LABEL: ceil_v7f16:
165; CHECK-GI-NOFP16:       // %bb.0: // %entry
166; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
167; CHECK-GI-NOFP16-NEXT:    mov v2.h[0], v0.h[4]
168; CHECK-GI-NOFP16-NEXT:    frintp v1.4s, v1.4s
169; CHECK-GI-NOFP16-NEXT:    mov v2.h[1], v0.h[5]
170; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
171; CHECK-GI-NOFP16-NEXT:    mov v2.h[2], v0.h[6]
172; CHECK-GI-NOFP16-NEXT:    mov v0.h[0], v1.h[0]
173; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v2.4h
174; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v1.h[1]
175; CHECK-GI-NOFP16-NEXT:    frintp v2.4s, v2.4s
176; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v1.h[2]
177; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v2.4s
178; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v1.h[3]
179; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v2.h[0]
180; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[1]
181; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v2.h[2]
182; CHECK-GI-NOFP16-NEXT:    ret
183;
184; CHECK-GI-FP16-LABEL: ceil_v7f16:
185; CHECK-GI-FP16:       // %bb.0: // %entry
186; CHECK-GI-FP16-NEXT:    frintp v0.8h, v0.8h
187; CHECK-GI-FP16-NEXT:    ret
188entry:
189  %c = call <7 x half> @llvm.ceil.v7f16(<7 x half> %a)
190  ret <7 x half> %c
191}
192
193define <4 x half> @ceil_v4f16(<4 x half> %a) {
194; CHECK-SD-NOFP16-LABEL: ceil_v4f16:
195; CHECK-SD-NOFP16:       // %bb.0: // %entry
196; CHECK-SD-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
197; CHECK-SD-NOFP16-NEXT:    frintp v0.4s, v0.4s
198; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
199; CHECK-SD-NOFP16-NEXT:    ret
200;
201; CHECK-SD-FP16-LABEL: ceil_v4f16:
202; CHECK-SD-FP16:       // %bb.0: // %entry
203; CHECK-SD-FP16-NEXT:    frintp v0.4h, v0.4h
204; CHECK-SD-FP16-NEXT:    ret
205;
206; CHECK-GI-NOFP16-LABEL: ceil_v4f16:
207; CHECK-GI-NOFP16:       // %bb.0: // %entry
208; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
209; CHECK-GI-NOFP16-NEXT:    frintp v0.4s, v0.4s
210; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
211; CHECK-GI-NOFP16-NEXT:    ret
212;
213; CHECK-GI-FP16-LABEL: ceil_v4f16:
214; CHECK-GI-FP16:       // %bb.0: // %entry
215; CHECK-GI-FP16-NEXT:    frintp v0.4h, v0.4h
216; CHECK-GI-FP16-NEXT:    ret
217entry:
218  %c = call <4 x half> @llvm.ceil.v4f16(<4 x half> %a)
219  ret <4 x half> %c
220}
221
222define <8 x half> @ceil_v8f16(<8 x half> %a) {
223; CHECK-SD-NOFP16-LABEL: ceil_v8f16:
224; CHECK-SD-NOFP16:       // %bb.0: // %entry
225; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
226; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
227; CHECK-SD-NOFP16-NEXT:    frintp v1.4s, v1.4s
228; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
229; CHECK-SD-NOFP16-NEXT:    frintp v1.4s, v2.4s
230; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
231; CHECK-SD-NOFP16-NEXT:    ret
232;
233; CHECK-SD-FP16-LABEL: ceil_v8f16:
234; CHECK-SD-FP16:       // %bb.0: // %entry
235; CHECK-SD-FP16-NEXT:    frintp v0.8h, v0.8h
236; CHECK-SD-FP16-NEXT:    ret
237;
238; CHECK-GI-NOFP16-LABEL: ceil_v8f16:
239; CHECK-GI-NOFP16:       // %bb.0: // %entry
240; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
241; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
242; CHECK-GI-NOFP16-NEXT:    frintp v1.4s, v1.4s
243; CHECK-GI-NOFP16-NEXT:    frintp v2.4s, v0.4s
244; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
245; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
246; CHECK-GI-NOFP16-NEXT:    ret
247;
248; CHECK-GI-FP16-LABEL: ceil_v8f16:
249; CHECK-GI-FP16:       // %bb.0: // %entry
250; CHECK-GI-FP16-NEXT:    frintp v0.8h, v0.8h
251; CHECK-GI-FP16-NEXT:    ret
252entry:
253  %c = call <8 x half> @llvm.ceil.v8f16(<8 x half> %a)
254  ret <8 x half> %c
255}
256
257define <16 x half> @ceil_v16f16(<16 x half> %a) {
258; CHECK-SD-NOFP16-LABEL: ceil_v16f16:
259; CHECK-SD-NOFP16:       // %bb.0: // %entry
260; CHECK-SD-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
261; CHECK-SD-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
262; CHECK-SD-NOFP16-NEXT:    fcvtl2 v4.4s, v0.8h
263; CHECK-SD-NOFP16-NEXT:    fcvtl2 v5.4s, v1.8h
264; CHECK-SD-NOFP16-NEXT:    frintp v2.4s, v2.4s
265; CHECK-SD-NOFP16-NEXT:    frintp v1.4s, v3.4s
266; CHECK-SD-NOFP16-NEXT:    frintp v3.4s, v5.4s
267; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
268; CHECK-SD-NOFP16-NEXT:    frintp v2.4s, v4.4s
269; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
270; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
271; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v3.4s
272; CHECK-SD-NOFP16-NEXT:    ret
273;
274; CHECK-SD-FP16-LABEL: ceil_v16f16:
275; CHECK-SD-FP16:       // %bb.0: // %entry
276; CHECK-SD-FP16-NEXT:    frintp v0.8h, v0.8h
277; CHECK-SD-FP16-NEXT:    frintp v1.8h, v1.8h
278; CHECK-SD-FP16-NEXT:    ret
279;
280; CHECK-GI-NOFP16-LABEL: ceil_v16f16:
281; CHECK-GI-NOFP16:       // %bb.0: // %entry
282; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
283; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
284; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
285; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
286; CHECK-GI-NOFP16-NEXT:    frintp v2.4s, v2.4s
287; CHECK-GI-NOFP16-NEXT:    frintp v3.4s, v3.4s
288; CHECK-GI-NOFP16-NEXT:    frintp v4.4s, v0.4s
289; CHECK-GI-NOFP16-NEXT:    frintp v5.4s, v1.4s
290; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
291; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
292; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
293; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
294; CHECK-GI-NOFP16-NEXT:    ret
295;
296; CHECK-GI-FP16-LABEL: ceil_v16f16:
297; CHECK-GI-FP16:       // %bb.0: // %entry
298; CHECK-GI-FP16-NEXT:    frintp v0.8h, v0.8h
299; CHECK-GI-FP16-NEXT:    frintp v1.8h, v1.8h
300; CHECK-GI-FP16-NEXT:    ret
301entry:
302  %c = call <16 x half> @llvm.ceil.v16f16(<16 x half> %a)
303  ret <16 x half> %c
304}
305
306define double @floor_f64(double %a) {
307; CHECK-LABEL: floor_f64:
308; CHECK:       // %bb.0: // %entry
309; CHECK-NEXT:    frintm d0, d0
310; CHECK-NEXT:    ret
311entry:
312  %c = call double @llvm.floor.f64(double %a)
313  ret double %c
314}
315
316define float @floor_f32(float %a) {
317; CHECK-LABEL: floor_f32:
318; CHECK:       // %bb.0: // %entry
319; CHECK-NEXT:    frintm s0, s0
320; CHECK-NEXT:    ret
321entry:
322  %c = call float @llvm.floor.f32(float %a)
323  ret float %c
324}
325
326define half @floor_f16(half %a) {
327; CHECK-SD-NOFP16-LABEL: floor_f16:
328; CHECK-SD-NOFP16:       // %bb.0: // %entry
329; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
330; CHECK-SD-NOFP16-NEXT:    frintm s0, s0
331; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
332; CHECK-SD-NOFP16-NEXT:    ret
333;
334; CHECK-SD-FP16-LABEL: floor_f16:
335; CHECK-SD-FP16:       // %bb.0: // %entry
336; CHECK-SD-FP16-NEXT:    frintm h0, h0
337; CHECK-SD-FP16-NEXT:    ret
338;
339; CHECK-GI-NOFP16-LABEL: floor_f16:
340; CHECK-GI-NOFP16:       // %bb.0: // %entry
341; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
342; CHECK-GI-NOFP16-NEXT:    frintm s0, s0
343; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
344; CHECK-GI-NOFP16-NEXT:    ret
345;
346; CHECK-GI-FP16-LABEL: floor_f16:
347; CHECK-GI-FP16:       // %bb.0: // %entry
348; CHECK-GI-FP16-NEXT:    frintm h0, h0
349; CHECK-GI-FP16-NEXT:    ret
350entry:
351  %c = call half @llvm.floor.f16(half %a)
352  ret half %c
353}
354
355define <2 x double> @floor_v2f64(<2 x double> %a) {
356; CHECK-LABEL: floor_v2f64:
357; CHECK:       // %bb.0: // %entry
358; CHECK-NEXT:    frintm v0.2d, v0.2d
359; CHECK-NEXT:    ret
360entry:
361  %c = call <2 x double> @llvm.floor.v2f64(<2 x double> %a)
362  ret <2 x double> %c
363}
364
365define <3 x double> @floor_v3f64(<3 x double> %a) {
366; CHECK-SD-LABEL: floor_v3f64:
367; CHECK-SD:       // %bb.0: // %entry
368; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
369; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
370; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
371; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
372; CHECK-SD-NEXT:    frintm v2.2d, v2.2d
373; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
374; CHECK-SD-NEXT:    frintm v0.2d, v0.2d
375; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
376; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
377; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
378; CHECK-SD-NEXT:    ret
379;
380; CHECK-GI-LABEL: floor_v3f64:
381; CHECK-GI:       // %bb.0: // %entry
382; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
383; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
384; CHECK-GI-NEXT:    frintm d2, d2
385; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
386; CHECK-GI-NEXT:    frintm v0.2d, v0.2d
387; CHECK-GI-NEXT:    mov d1, v0.d[1]
388; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
389; CHECK-GI-NEXT:    ret
390entry:
391  %c = call <3 x double> @llvm.floor.v3f64(<3 x double> %a)
392  ret <3 x double> %c
393}
394
395define <4 x double> @floor_v4f64(<4 x double> %a) {
396; CHECK-LABEL: floor_v4f64:
397; CHECK:       // %bb.0: // %entry
398; CHECK-NEXT:    frintm v0.2d, v0.2d
399; CHECK-NEXT:    frintm v1.2d, v1.2d
400; CHECK-NEXT:    ret
401entry:
402  %c = call <4 x double> @llvm.floor.v4f64(<4 x double> %a)
403  ret <4 x double> %c
404}
405
406define <2 x float> @floor_v2f32(<2 x float> %a) {
407; CHECK-LABEL: floor_v2f32:
408; CHECK:       // %bb.0: // %entry
409; CHECK-NEXT:    frintm v0.2s, v0.2s
410; CHECK-NEXT:    ret
411entry:
412  %c = call <2 x float> @llvm.floor.v2f32(<2 x float> %a)
413  ret <2 x float> %c
414}
415
416define <3 x float> @floor_v3f32(<3 x float> %a) {
417; CHECK-LABEL: floor_v3f32:
418; CHECK:       // %bb.0: // %entry
419; CHECK-NEXT:    frintm v0.4s, v0.4s
420; CHECK-NEXT:    ret
421entry:
422  %c = call <3 x float> @llvm.floor.v3f32(<3 x float> %a)
423  ret <3 x float> %c
424}
425
426define <4 x float> @floor_v4f32(<4 x float> %a) {
427; CHECK-LABEL: floor_v4f32:
428; CHECK:       // %bb.0: // %entry
429; CHECK-NEXT:    frintm v0.4s, v0.4s
430; CHECK-NEXT:    ret
431entry:
432  %c = call <4 x float> @llvm.floor.v4f32(<4 x float> %a)
433  ret <4 x float> %c
434}
435
436define <8 x float> @floor_v8f32(<8 x float> %a) {
437; CHECK-LABEL: floor_v8f32:
438; CHECK:       // %bb.0: // %entry
439; CHECK-NEXT:    frintm v0.4s, v0.4s
440; CHECK-NEXT:    frintm v1.4s, v1.4s
441; CHECK-NEXT:    ret
442entry:
443  %c = call <8 x float> @llvm.floor.v8f32(<8 x float> %a)
444  ret <8 x float> %c
445}
446
447define <7 x half> @floor_v7f16(<7 x half> %a) {
448; CHECK-SD-NOFP16-LABEL: floor_v7f16:
449; CHECK-SD-NOFP16:       // %bb.0: // %entry
450; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
451; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
452; CHECK-SD-NOFP16-NEXT:    frintm v1.4s, v1.4s
453; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
454; CHECK-SD-NOFP16-NEXT:    frintm v1.4s, v2.4s
455; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
456; CHECK-SD-NOFP16-NEXT:    ret
457;
458; CHECK-SD-FP16-LABEL: floor_v7f16:
459; CHECK-SD-FP16:       // %bb.0: // %entry
460; CHECK-SD-FP16-NEXT:    frintm v0.8h, v0.8h
461; CHECK-SD-FP16-NEXT:    ret
462;
463; CHECK-GI-NOFP16-LABEL: floor_v7f16:
464; CHECK-GI-NOFP16:       // %bb.0: // %entry
465; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
466; CHECK-GI-NOFP16-NEXT:    mov v2.h[0], v0.h[4]
467; CHECK-GI-NOFP16-NEXT:    frintm v1.4s, v1.4s
468; CHECK-GI-NOFP16-NEXT:    mov v2.h[1], v0.h[5]
469; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
470; CHECK-GI-NOFP16-NEXT:    mov v2.h[2], v0.h[6]
471; CHECK-GI-NOFP16-NEXT:    mov v0.h[0], v1.h[0]
472; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v2.4h
473; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v1.h[1]
474; CHECK-GI-NOFP16-NEXT:    frintm v2.4s, v2.4s
475; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v1.h[2]
476; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v2.4s
477; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v1.h[3]
478; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v2.h[0]
479; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[1]
480; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v2.h[2]
481; CHECK-GI-NOFP16-NEXT:    ret
482;
483; CHECK-GI-FP16-LABEL: floor_v7f16:
484; CHECK-GI-FP16:       // %bb.0: // %entry
485; CHECK-GI-FP16-NEXT:    frintm v0.8h, v0.8h
486; CHECK-GI-FP16-NEXT:    ret
487entry:
488  %c = call <7 x half> @llvm.floor.v7f16(<7 x half> %a)
489  ret <7 x half> %c
490}
491
492define <4 x half> @floor_v4f16(<4 x half> %a) {
493; CHECK-SD-NOFP16-LABEL: floor_v4f16:
494; CHECK-SD-NOFP16:       // %bb.0: // %entry
495; CHECK-SD-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
496; CHECK-SD-NOFP16-NEXT:    frintm v0.4s, v0.4s
497; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
498; CHECK-SD-NOFP16-NEXT:    ret
499;
500; CHECK-SD-FP16-LABEL: floor_v4f16:
501; CHECK-SD-FP16:       // %bb.0: // %entry
502; CHECK-SD-FP16-NEXT:    frintm v0.4h, v0.4h
503; CHECK-SD-FP16-NEXT:    ret
504;
505; CHECK-GI-NOFP16-LABEL: floor_v4f16:
506; CHECK-GI-NOFP16:       // %bb.0: // %entry
507; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
508; CHECK-GI-NOFP16-NEXT:    frintm v0.4s, v0.4s
509; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
510; CHECK-GI-NOFP16-NEXT:    ret
511;
512; CHECK-GI-FP16-LABEL: floor_v4f16:
513; CHECK-GI-FP16:       // %bb.0: // %entry
514; CHECK-GI-FP16-NEXT:    frintm v0.4h, v0.4h
515; CHECK-GI-FP16-NEXT:    ret
516entry:
517  %c = call <4 x half> @llvm.floor.v4f16(<4 x half> %a)
518  ret <4 x half> %c
519}
520
521define <8 x half> @floor_v8f16(<8 x half> %a) {
522; CHECK-SD-NOFP16-LABEL: floor_v8f16:
523; CHECK-SD-NOFP16:       // %bb.0: // %entry
524; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
525; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
526; CHECK-SD-NOFP16-NEXT:    frintm v1.4s, v1.4s
527; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
528; CHECK-SD-NOFP16-NEXT:    frintm v1.4s, v2.4s
529; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
530; CHECK-SD-NOFP16-NEXT:    ret
531;
532; CHECK-SD-FP16-LABEL: floor_v8f16:
533; CHECK-SD-FP16:       // %bb.0: // %entry
534; CHECK-SD-FP16-NEXT:    frintm v0.8h, v0.8h
535; CHECK-SD-FP16-NEXT:    ret
536;
537; CHECK-GI-NOFP16-LABEL: floor_v8f16:
538; CHECK-GI-NOFP16:       // %bb.0: // %entry
539; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
540; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
541; CHECK-GI-NOFP16-NEXT:    frintm v1.4s, v1.4s
542; CHECK-GI-NOFP16-NEXT:    frintm v2.4s, v0.4s
543; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
544; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
545; CHECK-GI-NOFP16-NEXT:    ret
546;
547; CHECK-GI-FP16-LABEL: floor_v8f16:
548; CHECK-GI-FP16:       // %bb.0: // %entry
549; CHECK-GI-FP16-NEXT:    frintm v0.8h, v0.8h
550; CHECK-GI-FP16-NEXT:    ret
551entry:
552  %c = call <8 x half> @llvm.floor.v8f16(<8 x half> %a)
553  ret <8 x half> %c
554}
555
556define <16 x half> @floor_v16f16(<16 x half> %a) {
557; CHECK-SD-NOFP16-LABEL: floor_v16f16:
558; CHECK-SD-NOFP16:       // %bb.0: // %entry
559; CHECK-SD-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
560; CHECK-SD-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
561; CHECK-SD-NOFP16-NEXT:    fcvtl2 v4.4s, v0.8h
562; CHECK-SD-NOFP16-NEXT:    fcvtl2 v5.4s, v1.8h
563; CHECK-SD-NOFP16-NEXT:    frintm v2.4s, v2.4s
564; CHECK-SD-NOFP16-NEXT:    frintm v1.4s, v3.4s
565; CHECK-SD-NOFP16-NEXT:    frintm v3.4s, v5.4s
566; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
567; CHECK-SD-NOFP16-NEXT:    frintm v2.4s, v4.4s
568; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
569; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
570; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v3.4s
571; CHECK-SD-NOFP16-NEXT:    ret
572;
573; CHECK-SD-FP16-LABEL: floor_v16f16:
574; CHECK-SD-FP16:       // %bb.0: // %entry
575; CHECK-SD-FP16-NEXT:    frintm v0.8h, v0.8h
576; CHECK-SD-FP16-NEXT:    frintm v1.8h, v1.8h
577; CHECK-SD-FP16-NEXT:    ret
578;
579; CHECK-GI-NOFP16-LABEL: floor_v16f16:
580; CHECK-GI-NOFP16:       // %bb.0: // %entry
581; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
582; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
583; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
584; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
585; CHECK-GI-NOFP16-NEXT:    frintm v2.4s, v2.4s
586; CHECK-GI-NOFP16-NEXT:    frintm v3.4s, v3.4s
587; CHECK-GI-NOFP16-NEXT:    frintm v4.4s, v0.4s
588; CHECK-GI-NOFP16-NEXT:    frintm v5.4s, v1.4s
589; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
590; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
591; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
592; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
593; CHECK-GI-NOFP16-NEXT:    ret
594;
595; CHECK-GI-FP16-LABEL: floor_v16f16:
596; CHECK-GI-FP16:       // %bb.0: // %entry
597; CHECK-GI-FP16-NEXT:    frintm v0.8h, v0.8h
598; CHECK-GI-FP16-NEXT:    frintm v1.8h, v1.8h
599; CHECK-GI-FP16-NEXT:    ret
600entry:
601  %c = call <16 x half> @llvm.floor.v16f16(<16 x half> %a)
602  ret <16 x half> %c
603}
604
605define double @nearbyint_f64(double %a) {
606; CHECK-LABEL: nearbyint_f64:
607; CHECK:       // %bb.0: // %entry
608; CHECK-NEXT:    frinti d0, d0
609; CHECK-NEXT:    ret
610entry:
611  %c = call double @llvm.nearbyint.f64(double %a)
612  ret double %c
613}
614
615define float @nearbyint_f32(float %a) {
616; CHECK-LABEL: nearbyint_f32:
617; CHECK:       // %bb.0: // %entry
618; CHECK-NEXT:    frinti s0, s0
619; CHECK-NEXT:    ret
620entry:
621  %c = call float @llvm.nearbyint.f32(float %a)
622  ret float %c
623}
624
625define half @nearbyint_f16(half %a) {
626; CHECK-SD-NOFP16-LABEL: nearbyint_f16:
627; CHECK-SD-NOFP16:       // %bb.0: // %entry
628; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
629; CHECK-SD-NOFP16-NEXT:    frinti s0, s0
630; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
631; CHECK-SD-NOFP16-NEXT:    ret
632;
633; CHECK-SD-FP16-LABEL: nearbyint_f16:
634; CHECK-SD-FP16:       // %bb.0: // %entry
635; CHECK-SD-FP16-NEXT:    frinti h0, h0
636; CHECK-SD-FP16-NEXT:    ret
637;
638; CHECK-GI-NOFP16-LABEL: nearbyint_f16:
639; CHECK-GI-NOFP16:       // %bb.0: // %entry
640; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
641; CHECK-GI-NOFP16-NEXT:    frinti s0, s0
642; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
643; CHECK-GI-NOFP16-NEXT:    ret
644;
645; CHECK-GI-FP16-LABEL: nearbyint_f16:
646; CHECK-GI-FP16:       // %bb.0: // %entry
647; CHECK-GI-FP16-NEXT:    frinti h0, h0
648; CHECK-GI-FP16-NEXT:    ret
649entry:
650  %c = call half @llvm.nearbyint.f16(half %a)
651  ret half %c
652}
653
654define <2 x double> @nearbyint_v2f64(<2 x double> %a) {
655; CHECK-LABEL: nearbyint_v2f64:
656; CHECK:       // %bb.0: // %entry
657; CHECK-NEXT:    frinti v0.2d, v0.2d
658; CHECK-NEXT:    ret
659entry:
660  %c = call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %a)
661  ret <2 x double> %c
662}
663
664define <3 x double> @nearbyint_v3f64(<3 x double> %a) {
665; CHECK-SD-LABEL: nearbyint_v3f64:
666; CHECK-SD:       // %bb.0: // %entry
667; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
668; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
669; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
670; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
671; CHECK-SD-NEXT:    frinti v2.2d, v2.2d
672; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
673; CHECK-SD-NEXT:    frinti v0.2d, v0.2d
674; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
675; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
676; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
677; CHECK-SD-NEXT:    ret
678;
679; CHECK-GI-LABEL: nearbyint_v3f64:
680; CHECK-GI:       // %bb.0: // %entry
681; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
682; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
683; CHECK-GI-NEXT:    frinti d2, d2
684; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
685; CHECK-GI-NEXT:    frinti v0.2d, v0.2d
686; CHECK-GI-NEXT:    mov d1, v0.d[1]
687; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
688; CHECK-GI-NEXT:    ret
689entry:
690  %c = call <3 x double> @llvm.nearbyint.v3f64(<3 x double> %a)
691  ret <3 x double> %c
692}
693
694define <4 x double> @nearbyint_v4f64(<4 x double> %a) {
695; CHECK-LABEL: nearbyint_v4f64:
696; CHECK:       // %bb.0: // %entry
697; CHECK-NEXT:    frinti v0.2d, v0.2d
698; CHECK-NEXT:    frinti v1.2d, v1.2d
699; CHECK-NEXT:    ret
700entry:
701  %c = call <4 x double> @llvm.nearbyint.v4f64(<4 x double> %a)
702  ret <4 x double> %c
703}
704
705define <2 x float> @nearbyint_v2f32(<2 x float> %a) {
706; CHECK-LABEL: nearbyint_v2f32:
707; CHECK:       // %bb.0: // %entry
708; CHECK-NEXT:    frinti v0.2s, v0.2s
709; CHECK-NEXT:    ret
710entry:
711  %c = call <2 x float> @llvm.nearbyint.v2f32(<2 x float> %a)
712  ret <2 x float> %c
713}
714
715define <3 x float> @nearbyint_v3f32(<3 x float> %a) {
716; CHECK-LABEL: nearbyint_v3f32:
717; CHECK:       // %bb.0: // %entry
718; CHECK-NEXT:    frinti v0.4s, v0.4s
719; CHECK-NEXT:    ret
720entry:
721  %c = call <3 x float> @llvm.nearbyint.v3f32(<3 x float> %a)
722  ret <3 x float> %c
723}
724
725define <4 x float> @nearbyint_v4f32(<4 x float> %a) {
726; CHECK-LABEL: nearbyint_v4f32:
727; CHECK:       // %bb.0: // %entry
728; CHECK-NEXT:    frinti v0.4s, v0.4s
729; CHECK-NEXT:    ret
730entry:
731  %c = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %a)
732  ret <4 x float> %c
733}
734
735define <8 x float> @nearbyint_v8f32(<8 x float> %a) {
736; CHECK-LABEL: nearbyint_v8f32:
737; CHECK:       // %bb.0: // %entry
738; CHECK-NEXT:    frinti v0.4s, v0.4s
739; CHECK-NEXT:    frinti v1.4s, v1.4s
740; CHECK-NEXT:    ret
741entry:
742  %c = call <8 x float> @llvm.nearbyint.v8f32(<8 x float> %a)
743  ret <8 x float> %c
744}
745
746define <7 x half> @nearbyint_v7f16(<7 x half> %a) {
747; CHECK-SD-NOFP16-LABEL: nearbyint_v7f16:
748; CHECK-SD-NOFP16:       // %bb.0: // %entry
749; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
750; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
751; CHECK-SD-NOFP16-NEXT:    frinti v1.4s, v1.4s
752; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
753; CHECK-SD-NOFP16-NEXT:    frinti v1.4s, v2.4s
754; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
755; CHECK-SD-NOFP16-NEXT:    ret
756;
757; CHECK-SD-FP16-LABEL: nearbyint_v7f16:
758; CHECK-SD-FP16:       // %bb.0: // %entry
759; CHECK-SD-FP16-NEXT:    frinti v0.8h, v0.8h
760; CHECK-SD-FP16-NEXT:    ret
761;
762; CHECK-GI-NOFP16-LABEL: nearbyint_v7f16:
763; CHECK-GI-NOFP16:       // %bb.0: // %entry
764; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
765; CHECK-GI-NOFP16-NEXT:    mov v2.h[0], v0.h[4]
766; CHECK-GI-NOFP16-NEXT:    frinti v1.4s, v1.4s
767; CHECK-GI-NOFP16-NEXT:    mov v2.h[1], v0.h[5]
768; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
769; CHECK-GI-NOFP16-NEXT:    mov v2.h[2], v0.h[6]
770; CHECK-GI-NOFP16-NEXT:    mov v0.h[0], v1.h[0]
771; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v2.4h
772; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v1.h[1]
773; CHECK-GI-NOFP16-NEXT:    frinti v2.4s, v2.4s
774; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v1.h[2]
775; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v2.4s
776; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v1.h[3]
777; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v2.h[0]
778; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[1]
779; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v2.h[2]
780; CHECK-GI-NOFP16-NEXT:    ret
781;
782; CHECK-GI-FP16-LABEL: nearbyint_v7f16:
783; CHECK-GI-FP16:       // %bb.0: // %entry
784; CHECK-GI-FP16-NEXT:    frinti v0.8h, v0.8h
785; CHECK-GI-FP16-NEXT:    ret
786entry:
787  %c = call <7 x half> @llvm.nearbyint.v7f16(<7 x half> %a)
788  ret <7 x half> %c
789}
790
791define <4 x half> @nearbyint_v4f16(<4 x half> %a) {
792; CHECK-SD-NOFP16-LABEL: nearbyint_v4f16:
793; CHECK-SD-NOFP16:       // %bb.0: // %entry
794; CHECK-SD-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
795; CHECK-SD-NOFP16-NEXT:    frinti v0.4s, v0.4s
796; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
797; CHECK-SD-NOFP16-NEXT:    ret
798;
799; CHECK-SD-FP16-LABEL: nearbyint_v4f16:
800; CHECK-SD-FP16:       // %bb.0: // %entry
801; CHECK-SD-FP16-NEXT:    frinti v0.4h, v0.4h
802; CHECK-SD-FP16-NEXT:    ret
803;
804; CHECK-GI-NOFP16-LABEL: nearbyint_v4f16:
805; CHECK-GI-NOFP16:       // %bb.0: // %entry
806; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
807; CHECK-GI-NOFP16-NEXT:    frinti v0.4s, v0.4s
808; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
809; CHECK-GI-NOFP16-NEXT:    ret
810;
811; CHECK-GI-FP16-LABEL: nearbyint_v4f16:
812; CHECK-GI-FP16:       // %bb.0: // %entry
813; CHECK-GI-FP16-NEXT:    frinti v0.4h, v0.4h
814; CHECK-GI-FP16-NEXT:    ret
815entry:
816  %c = call <4 x half> @llvm.nearbyint.v4f16(<4 x half> %a)
817  ret <4 x half> %c
818}
819
820define <8 x half> @nearbyint_v8f16(<8 x half> %a) {
821; CHECK-SD-NOFP16-LABEL: nearbyint_v8f16:
822; CHECK-SD-NOFP16:       // %bb.0: // %entry
823; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
824; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
825; CHECK-SD-NOFP16-NEXT:    frinti v1.4s, v1.4s
826; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
827; CHECK-SD-NOFP16-NEXT:    frinti v1.4s, v2.4s
828; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
829; CHECK-SD-NOFP16-NEXT:    ret
830;
831; CHECK-SD-FP16-LABEL: nearbyint_v8f16:
832; CHECK-SD-FP16:       // %bb.0: // %entry
833; CHECK-SD-FP16-NEXT:    frinti v0.8h, v0.8h
834; CHECK-SD-FP16-NEXT:    ret
835;
836; CHECK-GI-NOFP16-LABEL: nearbyint_v8f16:
837; CHECK-GI-NOFP16:       // %bb.0: // %entry
838; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
839; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
840; CHECK-GI-NOFP16-NEXT:    frinti v1.4s, v1.4s
841; CHECK-GI-NOFP16-NEXT:    frinti v2.4s, v0.4s
842; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
843; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
844; CHECK-GI-NOFP16-NEXT:    ret
845;
846; CHECK-GI-FP16-LABEL: nearbyint_v8f16:
847; CHECK-GI-FP16:       // %bb.0: // %entry
848; CHECK-GI-FP16-NEXT:    frinti v0.8h, v0.8h
849; CHECK-GI-FP16-NEXT:    ret
850entry:
851  %c = call <8 x half> @llvm.nearbyint.v8f16(<8 x half> %a)
852  ret <8 x half> %c
853}
854
855define <16 x half> @nearbyint_v16f16(<16 x half> %a) {
856; CHECK-SD-NOFP16-LABEL: nearbyint_v16f16:
857; CHECK-SD-NOFP16:       // %bb.0: // %entry
858; CHECK-SD-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
859; CHECK-SD-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
860; CHECK-SD-NOFP16-NEXT:    fcvtl2 v4.4s, v0.8h
861; CHECK-SD-NOFP16-NEXT:    fcvtl2 v5.4s, v1.8h
862; CHECK-SD-NOFP16-NEXT:    frinti v2.4s, v2.4s
863; CHECK-SD-NOFP16-NEXT:    frinti v1.4s, v3.4s
864; CHECK-SD-NOFP16-NEXT:    frinti v3.4s, v5.4s
865; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
866; CHECK-SD-NOFP16-NEXT:    frinti v2.4s, v4.4s
867; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
868; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
869; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v3.4s
870; CHECK-SD-NOFP16-NEXT:    ret
871;
872; CHECK-SD-FP16-LABEL: nearbyint_v16f16:
873; CHECK-SD-FP16:       // %bb.0: // %entry
874; CHECK-SD-FP16-NEXT:    frinti v0.8h, v0.8h
875; CHECK-SD-FP16-NEXT:    frinti v1.8h, v1.8h
876; CHECK-SD-FP16-NEXT:    ret
877;
878; CHECK-GI-NOFP16-LABEL: nearbyint_v16f16:
879; CHECK-GI-NOFP16:       // %bb.0: // %entry
880; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
881; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
882; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
883; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
884; CHECK-GI-NOFP16-NEXT:    frinti v2.4s, v2.4s
885; CHECK-GI-NOFP16-NEXT:    frinti v3.4s, v3.4s
886; CHECK-GI-NOFP16-NEXT:    frinti v4.4s, v0.4s
887; CHECK-GI-NOFP16-NEXT:    frinti v5.4s, v1.4s
888; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
889; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
890; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
891; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
892; CHECK-GI-NOFP16-NEXT:    ret
893;
894; CHECK-GI-FP16-LABEL: nearbyint_v16f16:
895; CHECK-GI-FP16:       // %bb.0: // %entry
896; CHECK-GI-FP16-NEXT:    frinti v0.8h, v0.8h
897; CHECK-GI-FP16-NEXT:    frinti v1.8h, v1.8h
898; CHECK-GI-FP16-NEXT:    ret
899entry:
900  %c = call <16 x half> @llvm.nearbyint.v16f16(<16 x half> %a)
901  ret <16 x half> %c
902}
903
904define double @roundeven_f64(double %a) {
905; CHECK-LABEL: roundeven_f64:
906; CHECK:       // %bb.0: // %entry
907; CHECK-NEXT:    frintn d0, d0
908; CHECK-NEXT:    ret
909entry:
910  %c = call double @llvm.roundeven.f64(double %a)
911  ret double %c
912}
913
914define float @roundeven_f32(float %a) {
915; CHECK-LABEL: roundeven_f32:
916; CHECK:       // %bb.0: // %entry
917; CHECK-NEXT:    frintn s0, s0
918; CHECK-NEXT:    ret
919entry:
920  %c = call float @llvm.roundeven.f32(float %a)
921  ret float %c
922}
923
924define half @roundeven_f16(half %a) {
925; CHECK-SD-NOFP16-LABEL: roundeven_f16:
926; CHECK-SD-NOFP16:       // %bb.0: // %entry
927; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
928; CHECK-SD-NOFP16-NEXT:    frintn s0, s0
929; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
930; CHECK-SD-NOFP16-NEXT:    ret
931;
932; CHECK-SD-FP16-LABEL: roundeven_f16:
933; CHECK-SD-FP16:       // %bb.0: // %entry
934; CHECK-SD-FP16-NEXT:    frintn h0, h0
935; CHECK-SD-FP16-NEXT:    ret
936;
937; CHECK-GI-NOFP16-LABEL: roundeven_f16:
938; CHECK-GI-NOFP16:       // %bb.0: // %entry
939; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
940; CHECK-GI-NOFP16-NEXT:    frintn s0, s0
941; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
942; CHECK-GI-NOFP16-NEXT:    ret
943;
944; CHECK-GI-FP16-LABEL: roundeven_f16:
945; CHECK-GI-FP16:       // %bb.0: // %entry
946; CHECK-GI-FP16-NEXT:    frintn h0, h0
947; CHECK-GI-FP16-NEXT:    ret
948entry:
949  %c = call half @llvm.roundeven.f16(half %a)
950  ret half %c
951}
952
953define <2 x double> @roundeven_v2f64(<2 x double> %a) {
954; CHECK-LABEL: roundeven_v2f64:
955; CHECK:       // %bb.0: // %entry
956; CHECK-NEXT:    frintn v0.2d, v0.2d
957; CHECK-NEXT:    ret
958entry:
959  %c = call <2 x double> @llvm.roundeven.v2f64(<2 x double> %a)
960  ret <2 x double> %c
961}
962
963define <3 x double> @roundeven_v3f64(<3 x double> %a) {
964; CHECK-SD-LABEL: roundeven_v3f64:
965; CHECK-SD:       // %bb.0: // %entry
966; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
967; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
968; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
969; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
970; CHECK-SD-NEXT:    frintn v2.2d, v2.2d
971; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
972; CHECK-SD-NEXT:    frintn v0.2d, v0.2d
973; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
974; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
975; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
976; CHECK-SD-NEXT:    ret
977;
978; CHECK-GI-LABEL: roundeven_v3f64:
979; CHECK-GI:       // %bb.0: // %entry
980; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
981; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
982; CHECK-GI-NEXT:    frintn d2, d2
983; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
984; CHECK-GI-NEXT:    frintn v0.2d, v0.2d
985; CHECK-GI-NEXT:    mov d1, v0.d[1]
986; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
987; CHECK-GI-NEXT:    ret
988entry:
989  %c = call <3 x double> @llvm.roundeven.v3f64(<3 x double> %a)
990  ret <3 x double> %c
991}
992
993define <4 x double> @roundeven_v4f64(<4 x double> %a) {
994; CHECK-LABEL: roundeven_v4f64:
995; CHECK:       // %bb.0: // %entry
996; CHECK-NEXT:    frintn v0.2d, v0.2d
997; CHECK-NEXT:    frintn v1.2d, v1.2d
998; CHECK-NEXT:    ret
999entry:
1000  %c = call <4 x double> @llvm.roundeven.v4f64(<4 x double> %a)
1001  ret <4 x double> %c
1002}
1003
1004define <2 x float> @roundeven_v2f32(<2 x float> %a) {
1005; CHECK-LABEL: roundeven_v2f32:
1006; CHECK:       // %bb.0: // %entry
1007; CHECK-NEXT:    frintn v0.2s, v0.2s
1008; CHECK-NEXT:    ret
1009entry:
1010  %c = call <2 x float> @llvm.roundeven.v2f32(<2 x float> %a)
1011  ret <2 x float> %c
1012}
1013
1014define <3 x float> @roundeven_v3f32(<3 x float> %a) {
1015; CHECK-LABEL: roundeven_v3f32:
1016; CHECK:       // %bb.0: // %entry
1017; CHECK-NEXT:    frintn v0.4s, v0.4s
1018; CHECK-NEXT:    ret
1019entry:
1020  %c = call <3 x float> @llvm.roundeven.v3f32(<3 x float> %a)
1021  ret <3 x float> %c
1022}
1023
1024define <4 x float> @roundeven_v4f32(<4 x float> %a) {
1025; CHECK-LABEL: roundeven_v4f32:
1026; CHECK:       // %bb.0: // %entry
1027; CHECK-NEXT:    frintn v0.4s, v0.4s
1028; CHECK-NEXT:    ret
1029entry:
1030  %c = call <4 x float> @llvm.roundeven.v4f32(<4 x float> %a)
1031  ret <4 x float> %c
1032}
1033
1034define <8 x float> @roundeven_v8f32(<8 x float> %a) {
1035; CHECK-LABEL: roundeven_v8f32:
1036; CHECK:       // %bb.0: // %entry
1037; CHECK-NEXT:    frintn v0.4s, v0.4s
1038; CHECK-NEXT:    frintn v1.4s, v1.4s
1039; CHECK-NEXT:    ret
1040entry:
1041  %c = call <8 x float> @llvm.roundeven.v8f32(<8 x float> %a)
1042  ret <8 x float> %c
1043}
1044
1045define <7 x half> @roundeven_v7f16(<7 x half> %a) {
1046; CHECK-SD-NOFP16-LABEL: roundeven_v7f16:
1047; CHECK-SD-NOFP16:       // %bb.0: // %entry
1048; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1049; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
1050; CHECK-SD-NOFP16-NEXT:    frintn v1.4s, v1.4s
1051; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1052; CHECK-SD-NOFP16-NEXT:    frintn v1.4s, v2.4s
1053; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
1054; CHECK-SD-NOFP16-NEXT:    ret
1055;
1056; CHECK-SD-FP16-LABEL: roundeven_v7f16:
1057; CHECK-SD-FP16:       // %bb.0: // %entry
1058; CHECK-SD-FP16-NEXT:    frintn v0.8h, v0.8h
1059; CHECK-SD-FP16-NEXT:    ret
1060;
1061; CHECK-GI-NOFP16-LABEL: roundeven_v7f16:
1062; CHECK-GI-NOFP16:       // %bb.0: // %entry
1063; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1064; CHECK-GI-NOFP16-NEXT:    mov v2.h[0], v0.h[4]
1065; CHECK-GI-NOFP16-NEXT:    frintn v1.4s, v1.4s
1066; CHECK-GI-NOFP16-NEXT:    mov v2.h[1], v0.h[5]
1067; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
1068; CHECK-GI-NOFP16-NEXT:    mov v2.h[2], v0.h[6]
1069; CHECK-GI-NOFP16-NEXT:    mov v0.h[0], v1.h[0]
1070; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v2.4h
1071; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v1.h[1]
1072; CHECK-GI-NOFP16-NEXT:    frintn v2.4s, v2.4s
1073; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v1.h[2]
1074; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v2.4s
1075; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v1.h[3]
1076; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v2.h[0]
1077; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[1]
1078; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v2.h[2]
1079; CHECK-GI-NOFP16-NEXT:    ret
1080;
1081; CHECK-GI-FP16-LABEL: roundeven_v7f16:
1082; CHECK-GI-FP16:       // %bb.0: // %entry
1083; CHECK-GI-FP16-NEXT:    frintn v0.8h, v0.8h
1084; CHECK-GI-FP16-NEXT:    ret
1085entry:
1086  %c = call <7 x half> @llvm.roundeven.v7f16(<7 x half> %a)
1087  ret <7 x half> %c
1088}
1089
1090define <4 x half> @roundeven_v4f16(<4 x half> %a) {
1091; CHECK-SD-NOFP16-LABEL: roundeven_v4f16:
1092; CHECK-SD-NOFP16:       // %bb.0: // %entry
1093; CHECK-SD-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
1094; CHECK-SD-NOFP16-NEXT:    frintn v0.4s, v0.4s
1095; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
1096; CHECK-SD-NOFP16-NEXT:    ret
1097;
1098; CHECK-SD-FP16-LABEL: roundeven_v4f16:
1099; CHECK-SD-FP16:       // %bb.0: // %entry
1100; CHECK-SD-FP16-NEXT:    frintn v0.4h, v0.4h
1101; CHECK-SD-FP16-NEXT:    ret
1102;
1103; CHECK-GI-NOFP16-LABEL: roundeven_v4f16:
1104; CHECK-GI-NOFP16:       // %bb.0: // %entry
1105; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
1106; CHECK-GI-NOFP16-NEXT:    frintn v0.4s, v0.4s
1107; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
1108; CHECK-GI-NOFP16-NEXT:    ret
1109;
1110; CHECK-GI-FP16-LABEL: roundeven_v4f16:
1111; CHECK-GI-FP16:       // %bb.0: // %entry
1112; CHECK-GI-FP16-NEXT:    frintn v0.4h, v0.4h
1113; CHECK-GI-FP16-NEXT:    ret
1114entry:
1115  %c = call <4 x half> @llvm.roundeven.v4f16(<4 x half> %a)
1116  ret <4 x half> %c
1117}
1118
1119define <8 x half> @roundeven_v8f16(<8 x half> %a) {
1120; CHECK-SD-NOFP16-LABEL: roundeven_v8f16:
1121; CHECK-SD-NOFP16:       // %bb.0: // %entry
1122; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1123; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
1124; CHECK-SD-NOFP16-NEXT:    frintn v1.4s, v1.4s
1125; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1126; CHECK-SD-NOFP16-NEXT:    frintn v1.4s, v2.4s
1127; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
1128; CHECK-SD-NOFP16-NEXT:    ret
1129;
1130; CHECK-SD-FP16-LABEL: roundeven_v8f16:
1131; CHECK-SD-FP16:       // %bb.0: // %entry
1132; CHECK-SD-FP16-NEXT:    frintn v0.8h, v0.8h
1133; CHECK-SD-FP16-NEXT:    ret
1134;
1135; CHECK-GI-NOFP16-LABEL: roundeven_v8f16:
1136; CHECK-GI-NOFP16:       // %bb.0: // %entry
1137; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1138; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
1139; CHECK-GI-NOFP16-NEXT:    frintn v1.4s, v1.4s
1140; CHECK-GI-NOFP16-NEXT:    frintn v2.4s, v0.4s
1141; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1142; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
1143; CHECK-GI-NOFP16-NEXT:    ret
1144;
1145; CHECK-GI-FP16-LABEL: roundeven_v8f16:
1146; CHECK-GI-FP16:       // %bb.0: // %entry
1147; CHECK-GI-FP16-NEXT:    frintn v0.8h, v0.8h
1148; CHECK-GI-FP16-NEXT:    ret
1149entry:
1150  %c = call <8 x half> @llvm.roundeven.v8f16(<8 x half> %a)
1151  ret <8 x half> %c
1152}
1153
1154define <16 x half> @roundeven_v16f16(<16 x half> %a) {
1155; CHECK-SD-NOFP16-LABEL: roundeven_v16f16:
1156; CHECK-SD-NOFP16:       // %bb.0: // %entry
1157; CHECK-SD-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
1158; CHECK-SD-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
1159; CHECK-SD-NOFP16-NEXT:    fcvtl2 v4.4s, v0.8h
1160; CHECK-SD-NOFP16-NEXT:    fcvtl2 v5.4s, v1.8h
1161; CHECK-SD-NOFP16-NEXT:    frintn v2.4s, v2.4s
1162; CHECK-SD-NOFP16-NEXT:    frintn v1.4s, v3.4s
1163; CHECK-SD-NOFP16-NEXT:    frintn v3.4s, v5.4s
1164; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
1165; CHECK-SD-NOFP16-NEXT:    frintn v2.4s, v4.4s
1166; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
1167; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
1168; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v3.4s
1169; CHECK-SD-NOFP16-NEXT:    ret
1170;
1171; CHECK-SD-FP16-LABEL: roundeven_v16f16:
1172; CHECK-SD-FP16:       // %bb.0: // %entry
1173; CHECK-SD-FP16-NEXT:    frintn v0.8h, v0.8h
1174; CHECK-SD-FP16-NEXT:    frintn v1.8h, v1.8h
1175; CHECK-SD-FP16-NEXT:    ret
1176;
1177; CHECK-GI-NOFP16-LABEL: roundeven_v16f16:
1178; CHECK-GI-NOFP16:       // %bb.0: // %entry
1179; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
1180; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
1181; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
1182; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
1183; CHECK-GI-NOFP16-NEXT:    frintn v2.4s, v2.4s
1184; CHECK-GI-NOFP16-NEXT:    frintn v3.4s, v3.4s
1185; CHECK-GI-NOFP16-NEXT:    frintn v4.4s, v0.4s
1186; CHECK-GI-NOFP16-NEXT:    frintn v5.4s, v1.4s
1187; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
1188; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
1189; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
1190; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
1191; CHECK-GI-NOFP16-NEXT:    ret
1192;
1193; CHECK-GI-FP16-LABEL: roundeven_v16f16:
1194; CHECK-GI-FP16:       // %bb.0: // %entry
1195; CHECK-GI-FP16-NEXT:    frintn v0.8h, v0.8h
1196; CHECK-GI-FP16-NEXT:    frintn v1.8h, v1.8h
1197; CHECK-GI-FP16-NEXT:    ret
1198entry:
1199  %c = call <16 x half> @llvm.roundeven.v16f16(<16 x half> %a)
1200  ret <16 x half> %c
1201}
1202
1203define double @rint_f64(double %a) {
1204; CHECK-LABEL: rint_f64:
1205; CHECK:       // %bb.0: // %entry
1206; CHECK-NEXT:    frintx d0, d0
1207; CHECK-NEXT:    ret
1208entry:
1209  %c = call double @llvm.rint.f64(double %a)
1210  ret double %c
1211}
1212
1213define float @rint_f32(float %a) {
1214; CHECK-LABEL: rint_f32:
1215; CHECK:       // %bb.0: // %entry
1216; CHECK-NEXT:    frintx s0, s0
1217; CHECK-NEXT:    ret
1218entry:
1219  %c = call float @llvm.rint.f32(float %a)
1220  ret float %c
1221}
1222
1223define half @rint_f16(half %a) {
1224; CHECK-SD-NOFP16-LABEL: rint_f16:
1225; CHECK-SD-NOFP16:       // %bb.0: // %entry
1226; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
1227; CHECK-SD-NOFP16-NEXT:    frintx s0, s0
1228; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1229; CHECK-SD-NOFP16-NEXT:    ret
1230;
1231; CHECK-SD-FP16-LABEL: rint_f16:
1232; CHECK-SD-FP16:       // %bb.0: // %entry
1233; CHECK-SD-FP16-NEXT:    frintx h0, h0
1234; CHECK-SD-FP16-NEXT:    ret
1235;
1236; CHECK-GI-NOFP16-LABEL: rint_f16:
1237; CHECK-GI-NOFP16:       // %bb.0: // %entry
1238; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
1239; CHECK-GI-NOFP16-NEXT:    frintx s0, s0
1240; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
1241; CHECK-GI-NOFP16-NEXT:    ret
1242;
1243; CHECK-GI-FP16-LABEL: rint_f16:
1244; CHECK-GI-FP16:       // %bb.0: // %entry
1245; CHECK-GI-FP16-NEXT:    frintx h0, h0
1246; CHECK-GI-FP16-NEXT:    ret
1247entry:
1248  %c = call half @llvm.rint.f16(half %a)
1249  ret half %c
1250}
1251
1252define <2 x double> @rint_v2f64(<2 x double> %a) {
1253; CHECK-LABEL: rint_v2f64:
1254; CHECK:       // %bb.0: // %entry
1255; CHECK-NEXT:    frintx v0.2d, v0.2d
1256; CHECK-NEXT:    ret
1257entry:
1258  %c = call <2 x double> @llvm.rint.v2f64(<2 x double> %a)
1259  ret <2 x double> %c
1260}
1261
1262define <3 x double> @rint_v3f64(<3 x double> %a) {
1263; CHECK-SD-LABEL: rint_v3f64:
1264; CHECK-SD:       // %bb.0: // %entry
1265; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1266; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1267; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
1268; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1269; CHECK-SD-NEXT:    frintx v2.2d, v2.2d
1270; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
1271; CHECK-SD-NEXT:    frintx v0.2d, v0.2d
1272; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1273; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
1274; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
1275; CHECK-SD-NEXT:    ret
1276;
1277; CHECK-GI-LABEL: rint_v3f64:
1278; CHECK-GI:       // %bb.0: // %entry
1279; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1280; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
1281; CHECK-GI-NEXT:    frintx d2, d2
1282; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
1283; CHECK-GI-NEXT:    frintx v0.2d, v0.2d
1284; CHECK-GI-NEXT:    mov d1, v0.d[1]
1285; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
1286; CHECK-GI-NEXT:    ret
1287entry:
1288  %c = call <3 x double> @llvm.rint.v3f64(<3 x double> %a)
1289  ret <3 x double> %c
1290}
1291
1292define <4 x double> @rint_v4f64(<4 x double> %a) {
1293; CHECK-LABEL: rint_v4f64:
1294; CHECK:       // %bb.0: // %entry
1295; CHECK-NEXT:    frintx v0.2d, v0.2d
1296; CHECK-NEXT:    frintx v1.2d, v1.2d
1297; CHECK-NEXT:    ret
1298entry:
1299  %c = call <4 x double> @llvm.rint.v4f64(<4 x double> %a)
1300  ret <4 x double> %c
1301}
1302
1303define <2 x float> @rint_v2f32(<2 x float> %a) {
1304; CHECK-LABEL: rint_v2f32:
1305; CHECK:       // %bb.0: // %entry
1306; CHECK-NEXT:    frintx v0.2s, v0.2s
1307; CHECK-NEXT:    ret
1308entry:
1309  %c = call <2 x float> @llvm.rint.v2f32(<2 x float> %a)
1310  ret <2 x float> %c
1311}
1312
1313define <3 x float> @rint_v3f32(<3 x float> %a) {
1314; CHECK-LABEL: rint_v3f32:
1315; CHECK:       // %bb.0: // %entry
1316; CHECK-NEXT:    frintx v0.4s, v0.4s
1317; CHECK-NEXT:    ret
1318entry:
1319  %c = call <3 x float> @llvm.rint.v3f32(<3 x float> %a)
1320  ret <3 x float> %c
1321}
1322
1323define <4 x float> @rint_v4f32(<4 x float> %a) {
1324; CHECK-LABEL: rint_v4f32:
1325; CHECK:       // %bb.0: // %entry
1326; CHECK-NEXT:    frintx v0.4s, v0.4s
1327; CHECK-NEXT:    ret
1328entry:
1329  %c = call <4 x float> @llvm.rint.v4f32(<4 x float> %a)
1330  ret <4 x float> %c
1331}
1332
1333define <8 x float> @rint_v8f32(<8 x float> %a) {
1334; CHECK-LABEL: rint_v8f32:
1335; CHECK:       // %bb.0: // %entry
1336; CHECK-NEXT:    frintx v0.4s, v0.4s
1337; CHECK-NEXT:    frintx v1.4s, v1.4s
1338; CHECK-NEXT:    ret
1339entry:
1340  %c = call <8 x float> @llvm.rint.v8f32(<8 x float> %a)
1341  ret <8 x float> %c
1342}
1343
1344define <7 x half> @rint_v7f16(<7 x half> %a) {
1345; CHECK-SD-NOFP16-LABEL: rint_v7f16:
1346; CHECK-SD-NOFP16:       // %bb.0: // %entry
1347; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1348; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
1349; CHECK-SD-NOFP16-NEXT:    frintx v1.4s, v1.4s
1350; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1351; CHECK-SD-NOFP16-NEXT:    frintx v1.4s, v2.4s
1352; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
1353; CHECK-SD-NOFP16-NEXT:    ret
1354;
1355; CHECK-SD-FP16-LABEL: rint_v7f16:
1356; CHECK-SD-FP16:       // %bb.0: // %entry
1357; CHECK-SD-FP16-NEXT:    frintx v0.8h, v0.8h
1358; CHECK-SD-FP16-NEXT:    ret
1359;
1360; CHECK-GI-NOFP16-LABEL: rint_v7f16:
1361; CHECK-GI-NOFP16:       // %bb.0: // %entry
1362; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1363; CHECK-GI-NOFP16-NEXT:    mov v2.h[0], v0.h[4]
1364; CHECK-GI-NOFP16-NEXT:    frintx v1.4s, v1.4s
1365; CHECK-GI-NOFP16-NEXT:    mov v2.h[1], v0.h[5]
1366; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
1367; CHECK-GI-NOFP16-NEXT:    mov v2.h[2], v0.h[6]
1368; CHECK-GI-NOFP16-NEXT:    mov v0.h[0], v1.h[0]
1369; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v2.4h
1370; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v1.h[1]
1371; CHECK-GI-NOFP16-NEXT:    frintx v2.4s, v2.4s
1372; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v1.h[2]
1373; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v2.4s
1374; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v1.h[3]
1375; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v2.h[0]
1376; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[1]
1377; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v2.h[2]
1378; CHECK-GI-NOFP16-NEXT:    ret
1379;
1380; CHECK-GI-FP16-LABEL: rint_v7f16:
1381; CHECK-GI-FP16:       // %bb.0: // %entry
1382; CHECK-GI-FP16-NEXT:    frintx v0.8h, v0.8h
1383; CHECK-GI-FP16-NEXT:    ret
1384entry:
1385  %c = call <7 x half> @llvm.rint.v7f16(<7 x half> %a)
1386  ret <7 x half> %c
1387}
1388
1389define <4 x half> @rint_v4f16(<4 x half> %a) {
1390; CHECK-SD-NOFP16-LABEL: rint_v4f16:
1391; CHECK-SD-NOFP16:       // %bb.0: // %entry
1392; CHECK-SD-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
1393; CHECK-SD-NOFP16-NEXT:    frintx v0.4s, v0.4s
1394; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
1395; CHECK-SD-NOFP16-NEXT:    ret
1396;
1397; CHECK-SD-FP16-LABEL: rint_v4f16:
1398; CHECK-SD-FP16:       // %bb.0: // %entry
1399; CHECK-SD-FP16-NEXT:    frintx v0.4h, v0.4h
1400; CHECK-SD-FP16-NEXT:    ret
1401;
1402; CHECK-GI-NOFP16-LABEL: rint_v4f16:
1403; CHECK-GI-NOFP16:       // %bb.0: // %entry
1404; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
1405; CHECK-GI-NOFP16-NEXT:    frintx v0.4s, v0.4s
1406; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
1407; CHECK-GI-NOFP16-NEXT:    ret
1408;
1409; CHECK-GI-FP16-LABEL: rint_v4f16:
1410; CHECK-GI-FP16:       // %bb.0: // %entry
1411; CHECK-GI-FP16-NEXT:    frintx v0.4h, v0.4h
1412; CHECK-GI-FP16-NEXT:    ret
1413entry:
1414  %c = call <4 x half> @llvm.rint.v4f16(<4 x half> %a)
1415  ret <4 x half> %c
1416}
1417
1418define <8 x half> @rint_v8f16(<8 x half> %a) {
1419; CHECK-SD-NOFP16-LABEL: rint_v8f16:
1420; CHECK-SD-NOFP16:       // %bb.0: // %entry
1421; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1422; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
1423; CHECK-SD-NOFP16-NEXT:    frintx v1.4s, v1.4s
1424; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1425; CHECK-SD-NOFP16-NEXT:    frintx v1.4s, v2.4s
1426; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
1427; CHECK-SD-NOFP16-NEXT:    ret
1428;
1429; CHECK-SD-FP16-LABEL: rint_v8f16:
1430; CHECK-SD-FP16:       // %bb.0: // %entry
1431; CHECK-SD-FP16-NEXT:    frintx v0.8h, v0.8h
1432; CHECK-SD-FP16-NEXT:    ret
1433;
1434; CHECK-GI-NOFP16-LABEL: rint_v8f16:
1435; CHECK-GI-NOFP16:       // %bb.0: // %entry
1436; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1437; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
1438; CHECK-GI-NOFP16-NEXT:    frintx v1.4s, v1.4s
1439; CHECK-GI-NOFP16-NEXT:    frintx v2.4s, v0.4s
1440; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1441; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
1442; CHECK-GI-NOFP16-NEXT:    ret
1443;
1444; CHECK-GI-FP16-LABEL: rint_v8f16:
1445; CHECK-GI-FP16:       // %bb.0: // %entry
1446; CHECK-GI-FP16-NEXT:    frintx v0.8h, v0.8h
1447; CHECK-GI-FP16-NEXT:    ret
1448entry:
1449  %c = call <8 x half> @llvm.rint.v8f16(<8 x half> %a)
1450  ret <8 x half> %c
1451}
1452
1453define <16 x half> @rint_v16f16(<16 x half> %a) {
1454; CHECK-SD-NOFP16-LABEL: rint_v16f16:
1455; CHECK-SD-NOFP16:       // %bb.0: // %entry
1456; CHECK-SD-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
1457; CHECK-SD-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
1458; CHECK-SD-NOFP16-NEXT:    fcvtl2 v4.4s, v0.8h
1459; CHECK-SD-NOFP16-NEXT:    fcvtl2 v5.4s, v1.8h
1460; CHECK-SD-NOFP16-NEXT:    frintx v2.4s, v2.4s
1461; CHECK-SD-NOFP16-NEXT:    frintx v1.4s, v3.4s
1462; CHECK-SD-NOFP16-NEXT:    frintx v3.4s, v5.4s
1463; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
1464; CHECK-SD-NOFP16-NEXT:    frintx v2.4s, v4.4s
1465; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
1466; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
1467; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v3.4s
1468; CHECK-SD-NOFP16-NEXT:    ret
1469;
1470; CHECK-SD-FP16-LABEL: rint_v16f16:
1471; CHECK-SD-FP16:       // %bb.0: // %entry
1472; CHECK-SD-FP16-NEXT:    frintx v0.8h, v0.8h
1473; CHECK-SD-FP16-NEXT:    frintx v1.8h, v1.8h
1474; CHECK-SD-FP16-NEXT:    ret
1475;
1476; CHECK-GI-NOFP16-LABEL: rint_v16f16:
1477; CHECK-GI-NOFP16:       // %bb.0: // %entry
1478; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
1479; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
1480; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
1481; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
1482; CHECK-GI-NOFP16-NEXT:    frintx v2.4s, v2.4s
1483; CHECK-GI-NOFP16-NEXT:    frintx v3.4s, v3.4s
1484; CHECK-GI-NOFP16-NEXT:    frintx v4.4s, v0.4s
1485; CHECK-GI-NOFP16-NEXT:    frintx v5.4s, v1.4s
1486; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
1487; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
1488; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
1489; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
1490; CHECK-GI-NOFP16-NEXT:    ret
1491;
1492; CHECK-GI-FP16-LABEL: rint_v16f16:
1493; CHECK-GI-FP16:       // %bb.0: // %entry
1494; CHECK-GI-FP16-NEXT:    frintx v0.8h, v0.8h
1495; CHECK-GI-FP16-NEXT:    frintx v1.8h, v1.8h
1496; CHECK-GI-FP16-NEXT:    ret
1497entry:
1498  %c = call <16 x half> @llvm.rint.v16f16(<16 x half> %a)
1499  ret <16 x half> %c
1500}
1501
1502define double @round_f64(double %a) {
1503; CHECK-LABEL: round_f64:
1504; CHECK:       // %bb.0: // %entry
1505; CHECK-NEXT:    frinta d0, d0
1506; CHECK-NEXT:    ret
1507entry:
1508  %c = call double @llvm.round.f64(double %a)
1509  ret double %c
1510}
1511
1512define float @round_f32(float %a) {
1513; CHECK-LABEL: round_f32:
1514; CHECK:       // %bb.0: // %entry
1515; CHECK-NEXT:    frinta s0, s0
1516; CHECK-NEXT:    ret
1517entry:
1518  %c = call float @llvm.round.f32(float %a)
1519  ret float %c
1520}
1521
1522define half @round_f16(half %a) {
1523; CHECK-SD-NOFP16-LABEL: round_f16:
1524; CHECK-SD-NOFP16:       // %bb.0: // %entry
1525; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
1526; CHECK-SD-NOFP16-NEXT:    frinta s0, s0
1527; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1528; CHECK-SD-NOFP16-NEXT:    ret
1529;
1530; CHECK-SD-FP16-LABEL: round_f16:
1531; CHECK-SD-FP16:       // %bb.0: // %entry
1532; CHECK-SD-FP16-NEXT:    frinta h0, h0
1533; CHECK-SD-FP16-NEXT:    ret
1534;
1535; CHECK-GI-NOFP16-LABEL: round_f16:
1536; CHECK-GI-NOFP16:       // %bb.0: // %entry
1537; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
1538; CHECK-GI-NOFP16-NEXT:    frinta s0, s0
1539; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
1540; CHECK-GI-NOFP16-NEXT:    ret
1541;
1542; CHECK-GI-FP16-LABEL: round_f16:
1543; CHECK-GI-FP16:       // %bb.0: // %entry
1544; CHECK-GI-FP16-NEXT:    frinta h0, h0
1545; CHECK-GI-FP16-NEXT:    ret
1546entry:
1547  %c = call half @llvm.round.f16(half %a)
1548  ret half %c
1549}
1550
1551define <2 x double> @round_v2f64(<2 x double> %a) {
1552; CHECK-LABEL: round_v2f64:
1553; CHECK:       // %bb.0: // %entry
1554; CHECK-NEXT:    frinta v0.2d, v0.2d
1555; CHECK-NEXT:    ret
1556entry:
1557  %c = call <2 x double> @llvm.round.v2f64(<2 x double> %a)
1558  ret <2 x double> %c
1559}
1560
1561define <3 x double> @round_v3f64(<3 x double> %a) {
1562; CHECK-SD-LABEL: round_v3f64:
1563; CHECK-SD:       // %bb.0: // %entry
1564; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1565; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1566; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
1567; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1568; CHECK-SD-NEXT:    frinta v2.2d, v2.2d
1569; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
1570; CHECK-SD-NEXT:    frinta v0.2d, v0.2d
1571; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1572; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
1573; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
1574; CHECK-SD-NEXT:    ret
1575;
1576; CHECK-GI-LABEL: round_v3f64:
1577; CHECK-GI:       // %bb.0: // %entry
1578; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1579; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
1580; CHECK-GI-NEXT:    frinta d2, d2
1581; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
1582; CHECK-GI-NEXT:    frinta v0.2d, v0.2d
1583; CHECK-GI-NEXT:    mov d1, v0.d[1]
1584; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
1585; CHECK-GI-NEXT:    ret
1586entry:
1587  %c = call <3 x double> @llvm.round.v3f64(<3 x double> %a)
1588  ret <3 x double> %c
1589}
1590
1591define <4 x double> @round_v4f64(<4 x double> %a) {
1592; CHECK-LABEL: round_v4f64:
1593; CHECK:       // %bb.0: // %entry
1594; CHECK-NEXT:    frinta v0.2d, v0.2d
1595; CHECK-NEXT:    frinta v1.2d, v1.2d
1596; CHECK-NEXT:    ret
1597entry:
1598  %c = call <4 x double> @llvm.round.v4f64(<4 x double> %a)
1599  ret <4 x double> %c
1600}
1601
1602define <2 x float> @round_v2f32(<2 x float> %a) {
1603; CHECK-LABEL: round_v2f32:
1604; CHECK:       // %bb.0: // %entry
1605; CHECK-NEXT:    frinta v0.2s, v0.2s
1606; CHECK-NEXT:    ret
1607entry:
1608  %c = call <2 x float> @llvm.round.v2f32(<2 x float> %a)
1609  ret <2 x float> %c
1610}
1611
1612define <3 x float> @round_v3f32(<3 x float> %a) {
1613; CHECK-LABEL: round_v3f32:
1614; CHECK:       // %bb.0: // %entry
1615; CHECK-NEXT:    frinta v0.4s, v0.4s
1616; CHECK-NEXT:    ret
1617entry:
1618  %c = call <3 x float> @llvm.round.v3f32(<3 x float> %a)
1619  ret <3 x float> %c
1620}
1621
1622define <4 x float> @round_v4f32(<4 x float> %a) {
1623; CHECK-LABEL: round_v4f32:
1624; CHECK:       // %bb.0: // %entry
1625; CHECK-NEXT:    frinta v0.4s, v0.4s
1626; CHECK-NEXT:    ret
1627entry:
1628  %c = call <4 x float> @llvm.round.v4f32(<4 x float> %a)
1629  ret <4 x float> %c
1630}
1631
1632define <8 x float> @round_v8f32(<8 x float> %a) {
1633; CHECK-LABEL: round_v8f32:
1634; CHECK:       // %bb.0: // %entry
1635; CHECK-NEXT:    frinta v0.4s, v0.4s
1636; CHECK-NEXT:    frinta v1.4s, v1.4s
1637; CHECK-NEXT:    ret
1638entry:
1639  %c = call <8 x float> @llvm.round.v8f32(<8 x float> %a)
1640  ret <8 x float> %c
1641}
1642
1643define <7 x half> @round_v7f16(<7 x half> %a) {
1644; CHECK-SD-NOFP16-LABEL: round_v7f16:
1645; CHECK-SD-NOFP16:       // %bb.0: // %entry
1646; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1647; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
1648; CHECK-SD-NOFP16-NEXT:    frinta v1.4s, v1.4s
1649; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1650; CHECK-SD-NOFP16-NEXT:    frinta v1.4s, v2.4s
1651; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
1652; CHECK-SD-NOFP16-NEXT:    ret
1653;
1654; CHECK-SD-FP16-LABEL: round_v7f16:
1655; CHECK-SD-FP16:       // %bb.0: // %entry
1656; CHECK-SD-FP16-NEXT:    frinta v0.8h, v0.8h
1657; CHECK-SD-FP16-NEXT:    ret
1658;
1659; CHECK-GI-NOFP16-LABEL: round_v7f16:
1660; CHECK-GI-NOFP16:       // %bb.0: // %entry
1661; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1662; CHECK-GI-NOFP16-NEXT:    mov v2.h[0], v0.h[4]
1663; CHECK-GI-NOFP16-NEXT:    frinta v1.4s, v1.4s
1664; CHECK-GI-NOFP16-NEXT:    mov v2.h[1], v0.h[5]
1665; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
1666; CHECK-GI-NOFP16-NEXT:    mov v2.h[2], v0.h[6]
1667; CHECK-GI-NOFP16-NEXT:    mov v0.h[0], v1.h[0]
1668; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v2.4h
1669; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v1.h[1]
1670; CHECK-GI-NOFP16-NEXT:    frinta v2.4s, v2.4s
1671; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v1.h[2]
1672; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v2.4s
1673; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v1.h[3]
1674; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v2.h[0]
1675; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[1]
1676; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v2.h[2]
1677; CHECK-GI-NOFP16-NEXT:    ret
1678;
1679; CHECK-GI-FP16-LABEL: round_v7f16:
1680; CHECK-GI-FP16:       // %bb.0: // %entry
1681; CHECK-GI-FP16-NEXT:    frinta v0.8h, v0.8h
1682; CHECK-GI-FP16-NEXT:    ret
1683entry:
1684  %c = call <7 x half> @llvm.round.v7f16(<7 x half> %a)
1685  ret <7 x half> %c
1686}
1687
1688define <4 x half> @round_v4f16(<4 x half> %a) {
1689; CHECK-SD-NOFP16-LABEL: round_v4f16:
1690; CHECK-SD-NOFP16:       // %bb.0: // %entry
1691; CHECK-SD-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
1692; CHECK-SD-NOFP16-NEXT:    frinta v0.4s, v0.4s
1693; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
1694; CHECK-SD-NOFP16-NEXT:    ret
1695;
1696; CHECK-SD-FP16-LABEL: round_v4f16:
1697; CHECK-SD-FP16:       // %bb.0: // %entry
1698; CHECK-SD-FP16-NEXT:    frinta v0.4h, v0.4h
1699; CHECK-SD-FP16-NEXT:    ret
1700;
1701; CHECK-GI-NOFP16-LABEL: round_v4f16:
1702; CHECK-GI-NOFP16:       // %bb.0: // %entry
1703; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
1704; CHECK-GI-NOFP16-NEXT:    frinta v0.4s, v0.4s
1705; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
1706; CHECK-GI-NOFP16-NEXT:    ret
1707;
1708; CHECK-GI-FP16-LABEL: round_v4f16:
1709; CHECK-GI-FP16:       // %bb.0: // %entry
1710; CHECK-GI-FP16-NEXT:    frinta v0.4h, v0.4h
1711; CHECK-GI-FP16-NEXT:    ret
1712entry:
1713  %c = call <4 x half> @llvm.round.v4f16(<4 x half> %a)
1714  ret <4 x half> %c
1715}
1716
1717define <8 x half> @round_v8f16(<8 x half> %a) {
1718; CHECK-SD-NOFP16-LABEL: round_v8f16:
1719; CHECK-SD-NOFP16:       // %bb.0: // %entry
1720; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1721; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
1722; CHECK-SD-NOFP16-NEXT:    frinta v1.4s, v1.4s
1723; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1724; CHECK-SD-NOFP16-NEXT:    frinta v1.4s, v2.4s
1725; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
1726; CHECK-SD-NOFP16-NEXT:    ret
1727;
1728; CHECK-SD-FP16-LABEL: round_v8f16:
1729; CHECK-SD-FP16:       // %bb.0: // %entry
1730; CHECK-SD-FP16-NEXT:    frinta v0.8h, v0.8h
1731; CHECK-SD-FP16-NEXT:    ret
1732;
1733; CHECK-GI-NOFP16-LABEL: round_v8f16:
1734; CHECK-GI-NOFP16:       // %bb.0: // %entry
1735; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1736; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
1737; CHECK-GI-NOFP16-NEXT:    frinta v1.4s, v1.4s
1738; CHECK-GI-NOFP16-NEXT:    frinta v2.4s, v0.4s
1739; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1740; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
1741; CHECK-GI-NOFP16-NEXT:    ret
1742;
1743; CHECK-GI-FP16-LABEL: round_v8f16:
1744; CHECK-GI-FP16:       // %bb.0: // %entry
1745; CHECK-GI-FP16-NEXT:    frinta v0.8h, v0.8h
1746; CHECK-GI-FP16-NEXT:    ret
1747entry:
1748  %c = call <8 x half> @llvm.round.v8f16(<8 x half> %a)
1749  ret <8 x half> %c
1750}
1751
1752define <16 x half> @round_v16f16(<16 x half> %a) {
1753; CHECK-SD-NOFP16-LABEL: round_v16f16:
1754; CHECK-SD-NOFP16:       // %bb.0: // %entry
1755; CHECK-SD-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
1756; CHECK-SD-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
1757; CHECK-SD-NOFP16-NEXT:    fcvtl2 v4.4s, v0.8h
1758; CHECK-SD-NOFP16-NEXT:    fcvtl2 v5.4s, v1.8h
1759; CHECK-SD-NOFP16-NEXT:    frinta v2.4s, v2.4s
1760; CHECK-SD-NOFP16-NEXT:    frinta v1.4s, v3.4s
1761; CHECK-SD-NOFP16-NEXT:    frinta v3.4s, v5.4s
1762; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
1763; CHECK-SD-NOFP16-NEXT:    frinta v2.4s, v4.4s
1764; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
1765; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
1766; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v3.4s
1767; CHECK-SD-NOFP16-NEXT:    ret
1768;
1769; CHECK-SD-FP16-LABEL: round_v16f16:
1770; CHECK-SD-FP16:       // %bb.0: // %entry
1771; CHECK-SD-FP16-NEXT:    frinta v0.8h, v0.8h
1772; CHECK-SD-FP16-NEXT:    frinta v1.8h, v1.8h
1773; CHECK-SD-FP16-NEXT:    ret
1774;
1775; CHECK-GI-NOFP16-LABEL: round_v16f16:
1776; CHECK-GI-NOFP16:       // %bb.0: // %entry
1777; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
1778; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
1779; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
1780; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
1781; CHECK-GI-NOFP16-NEXT:    frinta v2.4s, v2.4s
1782; CHECK-GI-NOFP16-NEXT:    frinta v3.4s, v3.4s
1783; CHECK-GI-NOFP16-NEXT:    frinta v4.4s, v0.4s
1784; CHECK-GI-NOFP16-NEXT:    frinta v5.4s, v1.4s
1785; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
1786; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
1787; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
1788; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
1789; CHECK-GI-NOFP16-NEXT:    ret
1790;
1791; CHECK-GI-FP16-LABEL: round_v16f16:
1792; CHECK-GI-FP16:       // %bb.0: // %entry
1793; CHECK-GI-FP16-NEXT:    frinta v0.8h, v0.8h
1794; CHECK-GI-FP16-NEXT:    frinta v1.8h, v1.8h
1795; CHECK-GI-FP16-NEXT:    ret
1796entry:
1797  %c = call <16 x half> @llvm.round.v16f16(<16 x half> %a)
1798  ret <16 x half> %c
1799}
1800
1801define double @trunc_f64(double %a) {
1802; CHECK-LABEL: trunc_f64:
1803; CHECK:       // %bb.0: // %entry
1804; CHECK-NEXT:    frintz d0, d0
1805; CHECK-NEXT:    ret
1806entry:
1807  %c = call double @llvm.trunc.f64(double %a)
1808  ret double %c
1809}
1810
1811define float @trunc_f32(float %a) {
1812; CHECK-LABEL: trunc_f32:
1813; CHECK:       // %bb.0: // %entry
1814; CHECK-NEXT:    frintz s0, s0
1815; CHECK-NEXT:    ret
1816entry:
1817  %c = call float @llvm.trunc.f32(float %a)
1818  ret float %c
1819}
1820
1821define half @trunc_f16(half %a) {
1822; CHECK-SD-NOFP16-LABEL: trunc_f16:
1823; CHECK-SD-NOFP16:       // %bb.0: // %entry
1824; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
1825; CHECK-SD-NOFP16-NEXT:    frintz s0, s0
1826; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1827; CHECK-SD-NOFP16-NEXT:    ret
1828;
1829; CHECK-SD-FP16-LABEL: trunc_f16:
1830; CHECK-SD-FP16:       // %bb.0: // %entry
1831; CHECK-SD-FP16-NEXT:    frintz h0, h0
1832; CHECK-SD-FP16-NEXT:    ret
1833;
1834; CHECK-GI-NOFP16-LABEL: trunc_f16:
1835; CHECK-GI-NOFP16:       // %bb.0: // %entry
1836; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
1837; CHECK-GI-NOFP16-NEXT:    frintz s0, s0
1838; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
1839; CHECK-GI-NOFP16-NEXT:    ret
1840;
1841; CHECK-GI-FP16-LABEL: trunc_f16:
1842; CHECK-GI-FP16:       // %bb.0: // %entry
1843; CHECK-GI-FP16-NEXT:    frintz h0, h0
1844; CHECK-GI-FP16-NEXT:    ret
1845entry:
1846  %c = call half @llvm.trunc.f16(half %a)
1847  ret half %c
1848}
1849
1850define <2 x double> @trunc_v2f64(<2 x double> %a) {
1851; CHECK-LABEL: trunc_v2f64:
1852; CHECK:       // %bb.0: // %entry
1853; CHECK-NEXT:    frintz v0.2d, v0.2d
1854; CHECK-NEXT:    ret
1855entry:
1856  %c = call <2 x double> @llvm.trunc.v2f64(<2 x double> %a)
1857  ret <2 x double> %c
1858}
1859
1860define <3 x double> @trunc_v3f64(<3 x double> %a) {
1861; CHECK-SD-LABEL: trunc_v3f64:
1862; CHECK-SD:       // %bb.0: // %entry
1863; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1864; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1865; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
1866; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1867; CHECK-SD-NEXT:    frintz v2.2d, v2.2d
1868; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
1869; CHECK-SD-NEXT:    frintz v0.2d, v0.2d
1870; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1871; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
1872; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
1873; CHECK-SD-NEXT:    ret
1874;
1875; CHECK-GI-LABEL: trunc_v3f64:
1876; CHECK-GI:       // %bb.0: // %entry
1877; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1878; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
1879; CHECK-GI-NEXT:    frintz d2, d2
1880; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
1881; CHECK-GI-NEXT:    frintz v0.2d, v0.2d
1882; CHECK-GI-NEXT:    mov d1, v0.d[1]
1883; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
1884; CHECK-GI-NEXT:    ret
1885entry:
1886  %c = call <3 x double> @llvm.trunc.v3f64(<3 x double> %a)
1887  ret <3 x double> %c
1888}
1889
1890define <4 x double> @trunc_v4f64(<4 x double> %a) {
1891; CHECK-LABEL: trunc_v4f64:
1892; CHECK:       // %bb.0: // %entry
1893; CHECK-NEXT:    frintz v0.2d, v0.2d
1894; CHECK-NEXT:    frintz v1.2d, v1.2d
1895; CHECK-NEXT:    ret
1896entry:
1897  %c = call <4 x double> @llvm.trunc.v4f64(<4 x double> %a)
1898  ret <4 x double> %c
1899}
1900
1901define <2 x float> @trunc_v2f32(<2 x float> %a) {
1902; CHECK-LABEL: trunc_v2f32:
1903; CHECK:       // %bb.0: // %entry
1904; CHECK-NEXT:    frintz v0.2s, v0.2s
1905; CHECK-NEXT:    ret
1906entry:
1907  %c = call <2 x float> @llvm.trunc.v2f32(<2 x float> %a)
1908  ret <2 x float> %c
1909}
1910
1911define <3 x float> @trunc_v3f32(<3 x float> %a) {
1912; CHECK-LABEL: trunc_v3f32:
1913; CHECK:       // %bb.0: // %entry
1914; CHECK-NEXT:    frintz v0.4s, v0.4s
1915; CHECK-NEXT:    ret
1916entry:
1917  %c = call <3 x float> @llvm.trunc.v3f32(<3 x float> %a)
1918  ret <3 x float> %c
1919}
1920
1921define <4 x float> @trunc_v4f32(<4 x float> %a) {
1922; CHECK-LABEL: trunc_v4f32:
1923; CHECK:       // %bb.0: // %entry
1924; CHECK-NEXT:    frintz v0.4s, v0.4s
1925; CHECK-NEXT:    ret
1926entry:
1927  %c = call <4 x float> @llvm.trunc.v4f32(<4 x float> %a)
1928  ret <4 x float> %c
1929}
1930
1931define <8 x float> @trunc_v8f32(<8 x float> %a) {
1932; CHECK-LABEL: trunc_v8f32:
1933; CHECK:       // %bb.0: // %entry
1934; CHECK-NEXT:    frintz v0.4s, v0.4s
1935; CHECK-NEXT:    frintz v1.4s, v1.4s
1936; CHECK-NEXT:    ret
1937entry:
1938  %c = call <8 x float> @llvm.trunc.v8f32(<8 x float> %a)
1939  ret <8 x float> %c
1940}
1941
1942define <7 x half> @trunc_v7f16(<7 x half> %a) {
1943; CHECK-SD-NOFP16-LABEL: trunc_v7f16:
1944; CHECK-SD-NOFP16:       // %bb.0: // %entry
1945; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1946; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
1947; CHECK-SD-NOFP16-NEXT:    frintz v1.4s, v1.4s
1948; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1949; CHECK-SD-NOFP16-NEXT:    frintz v1.4s, v2.4s
1950; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
1951; CHECK-SD-NOFP16-NEXT:    ret
1952;
1953; CHECK-SD-FP16-LABEL: trunc_v7f16:
1954; CHECK-SD-FP16:       // %bb.0: // %entry
1955; CHECK-SD-FP16-NEXT:    frintz v0.8h, v0.8h
1956; CHECK-SD-FP16-NEXT:    ret
1957;
1958; CHECK-GI-NOFP16-LABEL: trunc_v7f16:
1959; CHECK-GI-NOFP16:       // %bb.0: // %entry
1960; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1961; CHECK-GI-NOFP16-NEXT:    mov v2.h[0], v0.h[4]
1962; CHECK-GI-NOFP16-NEXT:    frintz v1.4s, v1.4s
1963; CHECK-GI-NOFP16-NEXT:    mov v2.h[1], v0.h[5]
1964; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
1965; CHECK-GI-NOFP16-NEXT:    mov v2.h[2], v0.h[6]
1966; CHECK-GI-NOFP16-NEXT:    mov v0.h[0], v1.h[0]
1967; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v2.4h
1968; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v1.h[1]
1969; CHECK-GI-NOFP16-NEXT:    frintz v2.4s, v2.4s
1970; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v1.h[2]
1971; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v2.4s
1972; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v1.h[3]
1973; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v2.h[0]
1974; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[1]
1975; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v2.h[2]
1976; CHECK-GI-NOFP16-NEXT:    ret
1977;
1978; CHECK-GI-FP16-LABEL: trunc_v7f16:
1979; CHECK-GI-FP16:       // %bb.0: // %entry
1980; CHECK-GI-FP16-NEXT:    frintz v0.8h, v0.8h
1981; CHECK-GI-FP16-NEXT:    ret
1982entry:
1983  %c = call <7 x half> @llvm.trunc.v7f16(<7 x half> %a)
1984  ret <7 x half> %c
1985}
1986
1987define <4 x half> @trunc_v4f16(<4 x half> %a) {
1988; CHECK-SD-NOFP16-LABEL: trunc_v4f16:
1989; CHECK-SD-NOFP16:       // %bb.0: // %entry
1990; CHECK-SD-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
1991; CHECK-SD-NOFP16-NEXT:    frintz v0.4s, v0.4s
1992; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
1993; CHECK-SD-NOFP16-NEXT:    ret
1994;
1995; CHECK-SD-FP16-LABEL: trunc_v4f16:
1996; CHECK-SD-FP16:       // %bb.0: // %entry
1997; CHECK-SD-FP16-NEXT:    frintz v0.4h, v0.4h
1998; CHECK-SD-FP16-NEXT:    ret
1999;
2000; CHECK-GI-NOFP16-LABEL: trunc_v4f16:
2001; CHECK-GI-NOFP16:       // %bb.0: // %entry
2002; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
2003; CHECK-GI-NOFP16-NEXT:    frintz v0.4s, v0.4s
2004; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
2005; CHECK-GI-NOFP16-NEXT:    ret
2006;
2007; CHECK-GI-FP16-LABEL: trunc_v4f16:
2008; CHECK-GI-FP16:       // %bb.0: // %entry
2009; CHECK-GI-FP16-NEXT:    frintz v0.4h, v0.4h
2010; CHECK-GI-FP16-NEXT:    ret
2011entry:
2012  %c = call <4 x half> @llvm.trunc.v4f16(<4 x half> %a)
2013  ret <4 x half> %c
2014}
2015
2016define <8 x half> @trunc_v8f16(<8 x half> %a) {
2017; CHECK-SD-NOFP16-LABEL: trunc_v8f16:
2018; CHECK-SD-NOFP16:       // %bb.0: // %entry
2019; CHECK-SD-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
2020; CHECK-SD-NOFP16-NEXT:    fcvtl2 v2.4s, v0.8h
2021; CHECK-SD-NOFP16-NEXT:    frintz v1.4s, v1.4s
2022; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
2023; CHECK-SD-NOFP16-NEXT:    frintz v1.4s, v2.4s
2024; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
2025; CHECK-SD-NOFP16-NEXT:    ret
2026;
2027; CHECK-SD-FP16-LABEL: trunc_v8f16:
2028; CHECK-SD-FP16:       // %bb.0: // %entry
2029; CHECK-SD-FP16-NEXT:    frintz v0.8h, v0.8h
2030; CHECK-SD-FP16-NEXT:    ret
2031;
2032; CHECK-GI-NOFP16-LABEL: trunc_v8f16:
2033; CHECK-GI-NOFP16:       // %bb.0: // %entry
2034; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
2035; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
2036; CHECK-GI-NOFP16-NEXT:    frintz v1.4s, v1.4s
2037; CHECK-GI-NOFP16-NEXT:    frintz v2.4s, v0.4s
2038; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
2039; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
2040; CHECK-GI-NOFP16-NEXT:    ret
2041;
2042; CHECK-GI-FP16-LABEL: trunc_v8f16:
2043; CHECK-GI-FP16:       // %bb.0: // %entry
2044; CHECK-GI-FP16-NEXT:    frintz v0.8h, v0.8h
2045; CHECK-GI-FP16-NEXT:    ret
2046entry:
2047  %c = call <8 x half> @llvm.trunc.v8f16(<8 x half> %a)
2048  ret <8 x half> %c
2049}
2050
2051define <16 x half> @trunc_v16f16(<16 x half> %a) {
2052; CHECK-SD-NOFP16-LABEL: trunc_v16f16:
2053; CHECK-SD-NOFP16:       // %bb.0: // %entry
2054; CHECK-SD-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
2055; CHECK-SD-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
2056; CHECK-SD-NOFP16-NEXT:    fcvtl2 v4.4s, v0.8h
2057; CHECK-SD-NOFP16-NEXT:    fcvtl2 v5.4s, v1.8h
2058; CHECK-SD-NOFP16-NEXT:    frintz v2.4s, v2.4s
2059; CHECK-SD-NOFP16-NEXT:    frintz v1.4s, v3.4s
2060; CHECK-SD-NOFP16-NEXT:    frintz v3.4s, v5.4s
2061; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
2062; CHECK-SD-NOFP16-NEXT:    frintz v2.4s, v4.4s
2063; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
2064; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
2065; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v3.4s
2066; CHECK-SD-NOFP16-NEXT:    ret
2067;
2068; CHECK-SD-FP16-LABEL: trunc_v16f16:
2069; CHECK-SD-FP16:       // %bb.0: // %entry
2070; CHECK-SD-FP16-NEXT:    frintz v0.8h, v0.8h
2071; CHECK-SD-FP16-NEXT:    frintz v1.8h, v1.8h
2072; CHECK-SD-FP16-NEXT:    ret
2073;
2074; CHECK-GI-NOFP16-LABEL: trunc_v16f16:
2075; CHECK-GI-NOFP16:       // %bb.0: // %entry
2076; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
2077; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
2078; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
2079; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
2080; CHECK-GI-NOFP16-NEXT:    frintz v2.4s, v2.4s
2081; CHECK-GI-NOFP16-NEXT:    frintz v3.4s, v3.4s
2082; CHECK-GI-NOFP16-NEXT:    frintz v4.4s, v0.4s
2083; CHECK-GI-NOFP16-NEXT:    frintz v5.4s, v1.4s
2084; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
2085; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
2086; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
2087; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
2088; CHECK-GI-NOFP16-NEXT:    ret
2089;
2090; CHECK-GI-FP16-LABEL: trunc_v16f16:
2091; CHECK-GI-FP16:       // %bb.0: // %entry
2092; CHECK-GI-FP16-NEXT:    frintz v0.8h, v0.8h
2093; CHECK-GI-FP16-NEXT:    frintz v1.8h, v1.8h
2094; CHECK-GI-FP16-NEXT:    ret
2095entry:
2096  %c = call <16 x half> @llvm.trunc.v16f16(<16 x half> %a)
2097  ret <16 x half> %c
2098}
2099
2100declare <16 x half> @llvm.ceil.v16f16(<16 x half>)
2101declare <16 x half> @llvm.floor.v16f16(<16 x half>)
2102declare <16 x half> @llvm.nearbyint.v16f16(<16 x half>)
2103declare <16 x half> @llvm.rint.v16f16(<16 x half>)
2104declare <16 x half> @llvm.round.v16f16(<16 x half>)
2105declare <16 x half> @llvm.roundeven.v16f16(<16 x half>)
2106declare <16 x half> @llvm.trunc.v16f16(<16 x half>)
2107declare <2 x double> @llvm.ceil.v2f64(<2 x double>)
2108declare <2 x double> @llvm.floor.v2f64(<2 x double>)
2109declare <2 x double> @llvm.nearbyint.v2f64(<2 x double>)
2110declare <2 x double> @llvm.rint.v2f64(<2 x double>)
2111declare <2 x double> @llvm.round.v2f64(<2 x double>)
2112declare <2 x double> @llvm.roundeven.v2f64(<2 x double>)
2113declare <2 x double> @llvm.trunc.v2f64(<2 x double>)
2114declare <2 x float> @llvm.ceil.v2f32(<2 x float>)
2115declare <2 x float> @llvm.floor.v2f32(<2 x float>)
2116declare <2 x float> @llvm.nearbyint.v2f32(<2 x float>)
2117declare <2 x float> @llvm.rint.v2f32(<2 x float>)
2118declare <2 x float> @llvm.round.v2f32(<2 x float>)
2119declare <2 x float> @llvm.roundeven.v2f32(<2 x float>)
2120declare <2 x float> @llvm.trunc.v2f32(<2 x float>)
2121declare <3 x double> @llvm.ceil.v3f64(<3 x double>)
2122declare <3 x double> @llvm.floor.v3f64(<3 x double>)
2123declare <3 x double> @llvm.nearbyint.v3f64(<3 x double>)
2124declare <3 x double> @llvm.rint.v3f64(<3 x double>)
2125declare <3 x double> @llvm.round.v3f64(<3 x double>)
2126declare <3 x double> @llvm.roundeven.v3f64(<3 x double>)
2127declare <3 x double> @llvm.trunc.v3f64(<3 x double>)
2128declare <3 x float> @llvm.ceil.v3f32(<3 x float>)
2129declare <3 x float> @llvm.floor.v3f32(<3 x float>)
2130declare <3 x float> @llvm.nearbyint.v3f32(<3 x float>)
2131declare <3 x float> @llvm.rint.v3f32(<3 x float>)
2132declare <3 x float> @llvm.round.v3f32(<3 x float>)
2133declare <3 x float> @llvm.roundeven.v3f32(<3 x float>)
2134declare <3 x float> @llvm.trunc.v3f32(<3 x float>)
2135declare <4 x double> @llvm.ceil.v4f64(<4 x double>)
2136declare <4 x double> @llvm.floor.v4f64(<4 x double>)
2137declare <4 x double> @llvm.nearbyint.v4f64(<4 x double>)
2138declare <4 x double> @llvm.rint.v4f64(<4 x double>)
2139declare <4 x double> @llvm.round.v4f64(<4 x double>)
2140declare <4 x double> @llvm.roundeven.v4f64(<4 x double>)
2141declare <4 x double> @llvm.trunc.v4f64(<4 x double>)
2142declare <4 x float> @llvm.ceil.v4f32(<4 x float>)
2143declare <4 x float> @llvm.floor.v4f32(<4 x float>)
2144declare <4 x float> @llvm.nearbyint.v4f32(<4 x float>)
2145declare <4 x float> @llvm.rint.v4f32(<4 x float>)
2146declare <4 x float> @llvm.round.v4f32(<4 x float>)
2147declare <4 x float> @llvm.roundeven.v4f32(<4 x float>)
2148declare <4 x float> @llvm.trunc.v4f32(<4 x float>)
2149declare <4 x half> @llvm.ceil.v4f16(<4 x half>)
2150declare <4 x half> @llvm.floor.v4f16(<4 x half>)
2151declare <4 x half> @llvm.nearbyint.v4f16(<4 x half>)
2152declare <4 x half> @llvm.rint.v4f16(<4 x half>)
2153declare <4 x half> @llvm.round.v4f16(<4 x half>)
2154declare <4 x half> @llvm.roundeven.v4f16(<4 x half>)
2155declare <4 x half> @llvm.trunc.v4f16(<4 x half>)
2156declare <7 x half> @llvm.ceil.v7f16(<7 x half>)
2157declare <7 x half> @llvm.floor.v7f16(<7 x half>)
2158declare <7 x half> @llvm.nearbyint.v7f16(<7 x half>)
2159declare <7 x half> @llvm.rint.v7f16(<7 x half>)
2160declare <7 x half> @llvm.round.v7f16(<7 x half>)
2161declare <7 x half> @llvm.roundeven.v7f16(<7 x half>)
2162declare <7 x half> @llvm.trunc.v7f16(<7 x half>)
2163declare <8 x float> @llvm.ceil.v8f32(<8 x float>)
2164declare <8 x float> @llvm.floor.v8f32(<8 x float>)
2165declare <8 x float> @llvm.nearbyint.v8f32(<8 x float>)
2166declare <8 x float> @llvm.rint.v8f32(<8 x float>)
2167declare <8 x float> @llvm.round.v8f32(<8 x float>)
2168declare <8 x float> @llvm.roundeven.v8f32(<8 x float>)
2169declare <8 x float> @llvm.trunc.v8f32(<8 x float>)
2170declare <8 x half> @llvm.ceil.v8f16(<8 x half>)
2171declare <8 x half> @llvm.floor.v8f16(<8 x half>)
2172declare <8 x half> @llvm.nearbyint.v8f16(<8 x half>)
2173declare <8 x half> @llvm.rint.v8f16(<8 x half>)
2174declare <8 x half> @llvm.round.v8f16(<8 x half>)
2175declare <8 x half> @llvm.roundeven.v8f16(<8 x half>)
2176declare <8 x half> @llvm.trunc.v8f16(<8 x half>)
2177declare double @llvm.ceil.f64(double)
2178declare double @llvm.floor.f64(double)
2179declare double @llvm.nearbyint.f64(double)
2180declare double @llvm.rint.f64(double)
2181declare double @llvm.round.f64(double)
2182declare double @llvm.roundeven.f64(double)
2183declare double @llvm.trunc.f64(double)
2184declare float @llvm.ceil.f32(float)
2185declare float @llvm.floor.f32(float)
2186declare float @llvm.nearbyint.f32(float)
2187declare float @llvm.rint.f32(float)
2188declare float @llvm.round.f32(float)
2189declare float @llvm.roundeven.f32(float)
2190declare float @llvm.trunc.f32(float)
2191declare half @llvm.ceil.f16(half)
2192declare half @llvm.floor.f16(half)
2193declare half @llvm.nearbyint.f16(half)
2194declare half @llvm.rint.f16(half)
2195declare half @llvm.round.f16(half)
2196declare half @llvm.roundeven.f16(half)
2197declare half @llvm.trunc.f16(half)
2198