[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / fcvt.ll
blobce38bebf7635452633e892084a48ceb9b0653a00
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -mtriple=aarch64-none-eabi -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-NOFP16
3 ; RUN: llc -mtriple=aarch64-none-eabi -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-FP16
4 ; RUN: llc -mtriple=aarch64-none-eabi -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-NOFP16
5 ; RUN: llc -mtriple=aarch64-none-eabi -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16
7 define 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
12 entry:
13   %c = call double @llvm.ceil.f64(double %a)
14   ret double %c
17 define 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
22 entry:
23   %c = call float @llvm.ceil.f32(float %a)
24   ret float %c
27 define 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
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
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
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
51 entry:
52   %c = call half @llvm.ceil.f16(half %a)
53   ret half %c
56 define <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
61 entry:
62   %c = call <2 x double> @llvm.ceil.v2f64(<2 x double> %a)
63   ret <2 x double> %c
66 define <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
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
91 entry:
92   %c = call <3 x double> @llvm.ceil.v3f64(<3 x double> %a)
93   ret <3 x double> %c
96 define <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
102 entry:
103   %c = call <4 x double> @llvm.ceil.v4f64(<4 x double> %a)
104   ret <4 x double> %c
107 define <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
112 entry:
113   %c = call <2 x float> @llvm.ceil.v2f32(<2 x float> %a)
114   ret <2 x float> %c
117 define <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
122 entry:
123   %c = call <3 x float> @llvm.ceil.v3f32(<3 x float> %a)
124   ret <3 x float> %c
127 define <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
132 entry:
133   %c = call <4 x float> @llvm.ceil.v4f32(<4 x float> %a)
134   ret <4 x float> %c
137 define <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
143 entry:
144   %c = call <8 x float> @llvm.ceil.v8f32(<8 x float> %a)
145   ret <8 x float> %c
148 define <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:    mov h1, v0.h[1]
152 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
153 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
154 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
155 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
156 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
157 ; CHECK-SD-NOFP16-NEXT:    frintp s2, s2
158 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
159 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
160 ; CHECK-SD-NOFP16-NEXT:    frintp s5, s1
161 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
162 ; CHECK-SD-NOFP16-NEXT:    frintp s2, s3
163 ; CHECK-SD-NOFP16-NEXT:    frintp s4, s4
164 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
165 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
166 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
167 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
168 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
169 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
170 ; CHECK-SD-NOFP16-NEXT:    frintp s5, s5
171 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
172 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
173 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
174 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
175 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
176 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
177 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
178 ; CHECK-SD-NOFP16-NEXT:    frintp s3, s3
179 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
180 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
181 ; CHECK-SD-NOFP16-NEXT:    frintp s2, s2
182 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
183 ; CHECK-SD-NOFP16-NEXT:    frintp s0, s0
184 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
185 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
186 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
187 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
188 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
189 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
190 ; CHECK-SD-NOFP16-NEXT:    ret
192 ; CHECK-SD-FP16-LABEL: ceil_v7f16:
193 ; CHECK-SD-FP16:       // %bb.0: // %entry
194 ; CHECK-SD-FP16-NEXT:    frintp v0.8h, v0.8h
195 ; CHECK-SD-FP16-NEXT:    ret
197 ; CHECK-GI-NOFP16-LABEL: ceil_v7f16:
198 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
199 ; CHECK-GI-NOFP16-NEXT:    mov h1, v0.h[4]
200 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[5]
201 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v0.4h
202 ; CHECK-GI-NOFP16-NEXT:    mov h0, v0.h[6]
203 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[1], v2.h[0]
204 ; CHECK-GI-NOFP16-NEXT:    frintp v2.4s, v3.4s
205 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[2], v0.h[0]
206 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
207 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[3], v0.h[0]
208 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[1]
209 ; CHECK-GI-NOFP16-NEXT:    mov h3, v0.h[2]
210 ; CHECK-GI-NOFP16-NEXT:    mov h4, v0.h[3]
211 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v1.4h
212 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v2.h[0]
213 ; CHECK-GI-NOFP16-NEXT:    frintp v1.4s, v1.4s
214 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v3.h[0]
215 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
216 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v4.h[0]
217 ; CHECK-GI-NOFP16-NEXT:    mov h2, v1.h[1]
218 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v1.h[0]
219 ; CHECK-GI-NOFP16-NEXT:    mov h1, v1.h[2]
220 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[0]
221 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v1.h[0]
222 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[7], v0.h[0]
223 ; CHECK-GI-NOFP16-NEXT:    ret
225 ; CHECK-GI-FP16-LABEL: ceil_v7f16:
226 ; CHECK-GI-FP16:       // %bb.0: // %entry
227 ; CHECK-GI-FP16-NEXT:    frintp v0.8h, v0.8h
228 ; CHECK-GI-FP16-NEXT:    ret
229 entry:
230   %c = call <7 x half> @llvm.ceil.v7f16(<7 x half> %a)
231   ret <7 x half> %c
234 define <4 x half> @ceil_v4f16(<4 x half> %a) {
235 ; CHECK-SD-NOFP16-LABEL: ceil_v4f16:
236 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
237 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
238 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
239 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
240 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
241 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
242 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
243 ; CHECK-SD-NOFP16-NEXT:    frintp s0, s2
244 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h3
245 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h4
246 ; CHECK-SD-NOFP16-NEXT:    frintp s1, s1
247 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
248 ; CHECK-SD-NOFP16-NEXT:    frintp s2, s2
249 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
250 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
251 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
252 ; CHECK-SD-NOFP16-NEXT:    frintp s2, s3
253 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[2], v1.h[0]
254 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
255 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[3], v1.h[0]
256 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
257 ; CHECK-SD-NOFP16-NEXT:    ret
259 ; CHECK-SD-FP16-LABEL: ceil_v4f16:
260 ; CHECK-SD-FP16:       // %bb.0: // %entry
261 ; CHECK-SD-FP16-NEXT:    frintp v0.4h, v0.4h
262 ; CHECK-SD-FP16-NEXT:    ret
264 ; CHECK-GI-NOFP16-LABEL: ceil_v4f16:
265 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
266 ; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
267 ; CHECK-GI-NOFP16-NEXT:    frintp v0.4s, v0.4s
268 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
269 ; CHECK-GI-NOFP16-NEXT:    ret
271 ; CHECK-GI-FP16-LABEL: ceil_v4f16:
272 ; CHECK-GI-FP16:       // %bb.0: // %entry
273 ; CHECK-GI-FP16-NEXT:    frintp v0.4h, v0.4h
274 ; CHECK-GI-FP16-NEXT:    ret
275 entry:
276   %c = call <4 x half> @llvm.ceil.v4f16(<4 x half> %a)
277   ret <4 x half> %c
280 define <8 x half> @ceil_v8f16(<8 x half> %a) {
281 ; CHECK-SD-NOFP16-LABEL: ceil_v8f16:
282 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
283 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
284 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
285 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
286 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
287 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
288 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
289 ; CHECK-SD-NOFP16-NEXT:    frintp s2, s2
290 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
291 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
292 ; CHECK-SD-NOFP16-NEXT:    frintp s5, s1
293 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
294 ; CHECK-SD-NOFP16-NEXT:    frintp s2, s3
295 ; CHECK-SD-NOFP16-NEXT:    frintp s4, s4
296 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
297 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
298 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
299 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
300 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
301 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
302 ; CHECK-SD-NOFP16-NEXT:    frintp s5, s5
303 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
304 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
305 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
306 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
307 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
308 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
309 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
310 ; CHECK-SD-NOFP16-NEXT:    frintp s3, s3
311 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
312 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
313 ; CHECK-SD-NOFP16-NEXT:    frintp s2, s2
314 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
315 ; CHECK-SD-NOFP16-NEXT:    frintp s0, s0
316 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
317 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
318 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
319 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
320 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
321 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
322 ; CHECK-SD-NOFP16-NEXT:    ret
324 ; CHECK-SD-FP16-LABEL: ceil_v8f16:
325 ; CHECK-SD-FP16:       // %bb.0: // %entry
326 ; CHECK-SD-FP16-NEXT:    frintp v0.8h, v0.8h
327 ; CHECK-SD-FP16-NEXT:    ret
329 ; CHECK-GI-NOFP16-LABEL: ceil_v8f16:
330 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
331 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
332 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
333 ; CHECK-GI-NOFP16-NEXT:    frintp v1.4s, v1.4s
334 ; CHECK-GI-NOFP16-NEXT:    frintp v2.4s, v0.4s
335 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
336 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
337 ; CHECK-GI-NOFP16-NEXT:    ret
339 ; CHECK-GI-FP16-LABEL: ceil_v8f16:
340 ; CHECK-GI-FP16:       // %bb.0: // %entry
341 ; CHECK-GI-FP16-NEXT:    frintp v0.8h, v0.8h
342 ; CHECK-GI-FP16-NEXT:    ret
343 entry:
344   %c = call <8 x half> @llvm.ceil.v8f16(<8 x half> %a)
345   ret <8 x half> %c
348 define <16 x half> @ceil_v16f16(<16 x half> %a) {
349 ; CHECK-SD-NOFP16-LABEL: ceil_v16f16:
350 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
351 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[1]
352 ; CHECK-SD-NOFP16-NEXT:    mov h3, v1.h[1]
353 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h0
354 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[2]
355 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h1
356 ; CHECK-SD-NOFP16-NEXT:    mov h7, v1.h[2]
357 ; CHECK-SD-NOFP16-NEXT:    mov h16, v0.h[3]
358 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[3]
359 ; CHECK-SD-NOFP16-NEXT:    mov h20, v0.h[4]
360 ; CHECK-SD-NOFP16-NEXT:    mov h21, v1.h[4]
361 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
362 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
363 ; CHECK-SD-NOFP16-NEXT:    frintp s4, s4
364 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
365 ; CHECK-SD-NOFP16-NEXT:    frintp s6, s6
366 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
367 ; CHECK-SD-NOFP16-NEXT:    fcvt s16, h16
368 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
369 ; CHECK-SD-NOFP16-NEXT:    frintp s18, s2
370 ; CHECK-SD-NOFP16-NEXT:    frintp s19, s3
371 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s4
372 ; CHECK-SD-NOFP16-NEXT:    frintp s4, s5
373 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s6
374 ; CHECK-SD-NOFP16-NEXT:    frintp s6, s7
375 ; CHECK-SD-NOFP16-NEXT:    frintp s16, s16
376 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
377 ; CHECK-SD-NOFP16-NEXT:    fcvt h7, s19
378 ; CHECK-SD-NOFP16-NEXT:    fcvt s18, h20
379 ; CHECK-SD-NOFP16-NEXT:    fcvt s19, h21
380 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
381 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s6
382 ; CHECK-SD-NOFP16-NEXT:    fcvt h16, s16
383 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[1], v5.h[0]
384 ; CHECK-SD-NOFP16-NEXT:    frintp s5, s17
385 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[1], v7.h[0]
386 ; CHECK-SD-NOFP16-NEXT:    mov h7, v0.h[5]
387 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[5]
388 ; CHECK-SD-NOFP16-NEXT:    frintp s18, s18
389 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[2], v4.h[0]
390 ; CHECK-SD-NOFP16-NEXT:    frintp s4, s19
391 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s5
392 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[2], v6.h[0]
393 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[6]
394 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
395 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
396 ; CHECK-SD-NOFP16-NEXT:    mov h19, v1.h[6]
397 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
398 ; CHECK-SD-NOFP16-NEXT:    mov h1, v1.h[7]
399 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[3], v16.h[0]
400 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
401 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[3], v5.h[0]
402 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
403 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h6
404 ; CHECK-SD-NOFP16-NEXT:    frintp s7, s7
405 ; CHECK-SD-NOFP16-NEXT:    frintp s16, s17
406 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h19
407 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
408 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
409 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[4], v5.h[0]
410 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[4], v4.h[0]
411 ; CHECK-SD-NOFP16-NEXT:    frintp s4, s6
412 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
413 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s16
414 ; CHECK-SD-NOFP16-NEXT:    frintp s7, s17
415 ; CHECK-SD-NOFP16-NEXT:    frintp s0, s0
416 ; CHECK-SD-NOFP16-NEXT:    frintp s1, s1
417 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
418 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[5], v5.h[0]
419 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[5], v6.h[0]
420 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
421 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
422 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
423 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[6], v4.h[0]
424 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[6], v5.h[0]
425 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[7], v0.h[0]
426 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[7], v1.h[0]
427 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v2.16b
428 ; CHECK-SD-NOFP16-NEXT:    mov v1.16b, v3.16b
429 ; CHECK-SD-NOFP16-NEXT:    ret
431 ; CHECK-SD-FP16-LABEL: ceil_v16f16:
432 ; CHECK-SD-FP16:       // %bb.0: // %entry
433 ; CHECK-SD-FP16-NEXT:    frintp v0.8h, v0.8h
434 ; CHECK-SD-FP16-NEXT:    frintp v1.8h, v1.8h
435 ; CHECK-SD-FP16-NEXT:    ret
437 ; CHECK-GI-NOFP16-LABEL: ceil_v16f16:
438 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
439 ; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
440 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
441 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
442 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
443 ; CHECK-GI-NOFP16-NEXT:    frintp v2.4s, v2.4s
444 ; CHECK-GI-NOFP16-NEXT:    frintp v3.4s, v3.4s
445 ; CHECK-GI-NOFP16-NEXT:    frintp v4.4s, v0.4s
446 ; CHECK-GI-NOFP16-NEXT:    frintp v5.4s, v1.4s
447 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
448 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
449 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
450 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
451 ; CHECK-GI-NOFP16-NEXT:    ret
453 ; CHECK-GI-FP16-LABEL: ceil_v16f16:
454 ; CHECK-GI-FP16:       // %bb.0: // %entry
455 ; CHECK-GI-FP16-NEXT:    frintp v0.8h, v0.8h
456 ; CHECK-GI-FP16-NEXT:    frintp v1.8h, v1.8h
457 ; CHECK-GI-FP16-NEXT:    ret
458 entry:
459   %c = call <16 x half> @llvm.ceil.v16f16(<16 x half> %a)
460   ret <16 x half> %c
463 define double @floor_f64(double %a) {
464 ; CHECK-LABEL: floor_f64:
465 ; CHECK:       // %bb.0: // %entry
466 ; CHECK-NEXT:    frintm d0, d0
467 ; CHECK-NEXT:    ret
468 entry:
469   %c = call double @llvm.floor.f64(double %a)
470   ret double %c
473 define float @floor_f32(float %a) {
474 ; CHECK-LABEL: floor_f32:
475 ; CHECK:       // %bb.0: // %entry
476 ; CHECK-NEXT:    frintm s0, s0
477 ; CHECK-NEXT:    ret
478 entry:
479   %c = call float @llvm.floor.f32(float %a)
480   ret float %c
483 define half @floor_f16(half %a) {
484 ; CHECK-SD-NOFP16-LABEL: floor_f16:
485 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
486 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
487 ; CHECK-SD-NOFP16-NEXT:    frintm s0, s0
488 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
489 ; CHECK-SD-NOFP16-NEXT:    ret
491 ; CHECK-SD-FP16-LABEL: floor_f16:
492 ; CHECK-SD-FP16:       // %bb.0: // %entry
493 ; CHECK-SD-FP16-NEXT:    frintm h0, h0
494 ; CHECK-SD-FP16-NEXT:    ret
496 ; CHECK-GI-NOFP16-LABEL: floor_f16:
497 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
498 ; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
499 ; CHECK-GI-NOFP16-NEXT:    frintm s0, s0
500 ; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
501 ; CHECK-GI-NOFP16-NEXT:    ret
503 ; CHECK-GI-FP16-LABEL: floor_f16:
504 ; CHECK-GI-FP16:       // %bb.0: // %entry
505 ; CHECK-GI-FP16-NEXT:    frintm h0, h0
506 ; CHECK-GI-FP16-NEXT:    ret
507 entry:
508   %c = call half @llvm.floor.f16(half %a)
509   ret half %c
512 define <2 x double> @floor_v2f64(<2 x double> %a) {
513 ; CHECK-LABEL: floor_v2f64:
514 ; CHECK:       // %bb.0: // %entry
515 ; CHECK-NEXT:    frintm v0.2d, v0.2d
516 ; CHECK-NEXT:    ret
517 entry:
518   %c = call <2 x double> @llvm.floor.v2f64(<2 x double> %a)
519   ret <2 x double> %c
522 define <3 x double> @floor_v3f64(<3 x double> %a) {
523 ; CHECK-SD-LABEL: floor_v3f64:
524 ; CHECK-SD:       // %bb.0: // %entry
525 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
526 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
527 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
528 ; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
529 ; CHECK-SD-NEXT:    frintm v2.2d, v2.2d
530 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
531 ; CHECK-SD-NEXT:    frintm v0.2d, v0.2d
532 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
533 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
534 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
535 ; CHECK-SD-NEXT:    ret
537 ; CHECK-GI-LABEL: floor_v3f64:
538 ; CHECK-GI:       // %bb.0: // %entry
539 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
540 ; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
541 ; CHECK-GI-NEXT:    frintm d2, d2
542 ; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
543 ; CHECK-GI-NEXT:    frintm v0.2d, v0.2d
544 ; CHECK-GI-NEXT:    mov d1, v0.d[1]
545 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
546 ; CHECK-GI-NEXT:    ret
547 entry:
548   %c = call <3 x double> @llvm.floor.v3f64(<3 x double> %a)
549   ret <3 x double> %c
552 define <4 x double> @floor_v4f64(<4 x double> %a) {
553 ; CHECK-LABEL: floor_v4f64:
554 ; CHECK:       // %bb.0: // %entry
555 ; CHECK-NEXT:    frintm v0.2d, v0.2d
556 ; CHECK-NEXT:    frintm v1.2d, v1.2d
557 ; CHECK-NEXT:    ret
558 entry:
559   %c = call <4 x double> @llvm.floor.v4f64(<4 x double> %a)
560   ret <4 x double> %c
563 define <2 x float> @floor_v2f32(<2 x float> %a) {
564 ; CHECK-LABEL: floor_v2f32:
565 ; CHECK:       // %bb.0: // %entry
566 ; CHECK-NEXT:    frintm v0.2s, v0.2s
567 ; CHECK-NEXT:    ret
568 entry:
569   %c = call <2 x float> @llvm.floor.v2f32(<2 x float> %a)
570   ret <2 x float> %c
573 define <3 x float> @floor_v3f32(<3 x float> %a) {
574 ; CHECK-LABEL: floor_v3f32:
575 ; CHECK:       // %bb.0: // %entry
576 ; CHECK-NEXT:    frintm v0.4s, v0.4s
577 ; CHECK-NEXT:    ret
578 entry:
579   %c = call <3 x float> @llvm.floor.v3f32(<3 x float> %a)
580   ret <3 x float> %c
583 define <4 x float> @floor_v4f32(<4 x float> %a) {
584 ; CHECK-LABEL: floor_v4f32:
585 ; CHECK:       // %bb.0: // %entry
586 ; CHECK-NEXT:    frintm v0.4s, v0.4s
587 ; CHECK-NEXT:    ret
588 entry:
589   %c = call <4 x float> @llvm.floor.v4f32(<4 x float> %a)
590   ret <4 x float> %c
593 define <8 x float> @floor_v8f32(<8 x float> %a) {
594 ; CHECK-LABEL: floor_v8f32:
595 ; CHECK:       // %bb.0: // %entry
596 ; CHECK-NEXT:    frintm v0.4s, v0.4s
597 ; CHECK-NEXT:    frintm v1.4s, v1.4s
598 ; CHECK-NEXT:    ret
599 entry:
600   %c = call <8 x float> @llvm.floor.v8f32(<8 x float> %a)
601   ret <8 x float> %c
604 define <7 x half> @floor_v7f16(<7 x half> %a) {
605 ; CHECK-SD-NOFP16-LABEL: floor_v7f16:
606 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
607 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
608 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
609 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
610 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
611 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
612 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
613 ; CHECK-SD-NOFP16-NEXT:    frintm s2, s2
614 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
615 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
616 ; CHECK-SD-NOFP16-NEXT:    frintm s5, s1
617 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
618 ; CHECK-SD-NOFP16-NEXT:    frintm s2, s3
619 ; CHECK-SD-NOFP16-NEXT:    frintm s4, s4
620 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
621 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
622 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
623 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
624 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
625 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
626 ; CHECK-SD-NOFP16-NEXT:    frintm s5, s5
627 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
628 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
629 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
630 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
631 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
632 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
633 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
634 ; CHECK-SD-NOFP16-NEXT:    frintm s3, s3
635 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
636 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
637 ; CHECK-SD-NOFP16-NEXT:    frintm s2, s2
638 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
639 ; CHECK-SD-NOFP16-NEXT:    frintm s0, s0
640 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
641 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
642 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
643 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
644 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
645 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
646 ; CHECK-SD-NOFP16-NEXT:    ret
648 ; CHECK-SD-FP16-LABEL: floor_v7f16:
649 ; CHECK-SD-FP16:       // %bb.0: // %entry
650 ; CHECK-SD-FP16-NEXT:    frintm v0.8h, v0.8h
651 ; CHECK-SD-FP16-NEXT:    ret
653 ; CHECK-GI-NOFP16-LABEL: floor_v7f16:
654 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
655 ; CHECK-GI-NOFP16-NEXT:    mov h1, v0.h[4]
656 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[5]
657 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v0.4h
658 ; CHECK-GI-NOFP16-NEXT:    mov h0, v0.h[6]
659 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[1], v2.h[0]
660 ; CHECK-GI-NOFP16-NEXT:    frintm v2.4s, v3.4s
661 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[2], v0.h[0]
662 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
663 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[3], v0.h[0]
664 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[1]
665 ; CHECK-GI-NOFP16-NEXT:    mov h3, v0.h[2]
666 ; CHECK-GI-NOFP16-NEXT:    mov h4, v0.h[3]
667 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v1.4h
668 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v2.h[0]
669 ; CHECK-GI-NOFP16-NEXT:    frintm v1.4s, v1.4s
670 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v3.h[0]
671 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
672 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v4.h[0]
673 ; CHECK-GI-NOFP16-NEXT:    mov h2, v1.h[1]
674 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v1.h[0]
675 ; CHECK-GI-NOFP16-NEXT:    mov h1, v1.h[2]
676 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[0]
677 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v1.h[0]
678 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[7], v0.h[0]
679 ; CHECK-GI-NOFP16-NEXT:    ret
681 ; CHECK-GI-FP16-LABEL: floor_v7f16:
682 ; CHECK-GI-FP16:       // %bb.0: // %entry
683 ; CHECK-GI-FP16-NEXT:    frintm v0.8h, v0.8h
684 ; CHECK-GI-FP16-NEXT:    ret
685 entry:
686   %c = call <7 x half> @llvm.floor.v7f16(<7 x half> %a)
687   ret <7 x half> %c
690 define <4 x half> @floor_v4f16(<4 x half> %a) {
691 ; CHECK-SD-NOFP16-LABEL: floor_v4f16:
692 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
693 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
694 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
695 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
696 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
697 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
698 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
699 ; CHECK-SD-NOFP16-NEXT:    frintm s0, s2
700 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h3
701 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h4
702 ; CHECK-SD-NOFP16-NEXT:    frintm s1, s1
703 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
704 ; CHECK-SD-NOFP16-NEXT:    frintm s2, s2
705 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
706 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
707 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
708 ; CHECK-SD-NOFP16-NEXT:    frintm s2, s3
709 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[2], v1.h[0]
710 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
711 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[3], v1.h[0]
712 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
713 ; CHECK-SD-NOFP16-NEXT:    ret
715 ; CHECK-SD-FP16-LABEL: floor_v4f16:
716 ; CHECK-SD-FP16:       // %bb.0: // %entry
717 ; CHECK-SD-FP16-NEXT:    frintm v0.4h, v0.4h
718 ; CHECK-SD-FP16-NEXT:    ret
720 ; CHECK-GI-NOFP16-LABEL: floor_v4f16:
721 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
722 ; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
723 ; CHECK-GI-NOFP16-NEXT:    frintm v0.4s, v0.4s
724 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
725 ; CHECK-GI-NOFP16-NEXT:    ret
727 ; CHECK-GI-FP16-LABEL: floor_v4f16:
728 ; CHECK-GI-FP16:       // %bb.0: // %entry
729 ; CHECK-GI-FP16-NEXT:    frintm v0.4h, v0.4h
730 ; CHECK-GI-FP16-NEXT:    ret
731 entry:
732   %c = call <4 x half> @llvm.floor.v4f16(<4 x half> %a)
733   ret <4 x half> %c
736 define <8 x half> @floor_v8f16(<8 x half> %a) {
737 ; CHECK-SD-NOFP16-LABEL: floor_v8f16:
738 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
739 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
740 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
741 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
742 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
743 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
744 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
745 ; CHECK-SD-NOFP16-NEXT:    frintm s2, s2
746 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
747 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
748 ; CHECK-SD-NOFP16-NEXT:    frintm s5, s1
749 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
750 ; CHECK-SD-NOFP16-NEXT:    frintm s2, s3
751 ; CHECK-SD-NOFP16-NEXT:    frintm s4, s4
752 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
753 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
754 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
755 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
756 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
757 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
758 ; CHECK-SD-NOFP16-NEXT:    frintm s5, s5
759 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
760 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
761 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
762 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
763 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
764 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
765 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
766 ; CHECK-SD-NOFP16-NEXT:    frintm s3, s3
767 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
768 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
769 ; CHECK-SD-NOFP16-NEXT:    frintm s2, s2
770 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
771 ; CHECK-SD-NOFP16-NEXT:    frintm s0, s0
772 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
773 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
774 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
775 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
776 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
777 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
778 ; CHECK-SD-NOFP16-NEXT:    ret
780 ; CHECK-SD-FP16-LABEL: floor_v8f16:
781 ; CHECK-SD-FP16:       // %bb.0: // %entry
782 ; CHECK-SD-FP16-NEXT:    frintm v0.8h, v0.8h
783 ; CHECK-SD-FP16-NEXT:    ret
785 ; CHECK-GI-NOFP16-LABEL: floor_v8f16:
786 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
787 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
788 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
789 ; CHECK-GI-NOFP16-NEXT:    frintm v1.4s, v1.4s
790 ; CHECK-GI-NOFP16-NEXT:    frintm v2.4s, v0.4s
791 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
792 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
793 ; CHECK-GI-NOFP16-NEXT:    ret
795 ; CHECK-GI-FP16-LABEL: floor_v8f16:
796 ; CHECK-GI-FP16:       // %bb.0: // %entry
797 ; CHECK-GI-FP16-NEXT:    frintm v0.8h, v0.8h
798 ; CHECK-GI-FP16-NEXT:    ret
799 entry:
800   %c = call <8 x half> @llvm.floor.v8f16(<8 x half> %a)
801   ret <8 x half> %c
804 define <16 x half> @floor_v16f16(<16 x half> %a) {
805 ; CHECK-SD-NOFP16-LABEL: floor_v16f16:
806 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
807 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[1]
808 ; CHECK-SD-NOFP16-NEXT:    mov h3, v1.h[1]
809 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h0
810 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[2]
811 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h1
812 ; CHECK-SD-NOFP16-NEXT:    mov h7, v1.h[2]
813 ; CHECK-SD-NOFP16-NEXT:    mov h16, v0.h[3]
814 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[3]
815 ; CHECK-SD-NOFP16-NEXT:    mov h20, v0.h[4]
816 ; CHECK-SD-NOFP16-NEXT:    mov h21, v1.h[4]
817 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
818 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
819 ; CHECK-SD-NOFP16-NEXT:    frintm s4, s4
820 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
821 ; CHECK-SD-NOFP16-NEXT:    frintm s6, s6
822 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
823 ; CHECK-SD-NOFP16-NEXT:    fcvt s16, h16
824 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
825 ; CHECK-SD-NOFP16-NEXT:    frintm s18, s2
826 ; CHECK-SD-NOFP16-NEXT:    frintm s19, s3
827 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s4
828 ; CHECK-SD-NOFP16-NEXT:    frintm s4, s5
829 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s6
830 ; CHECK-SD-NOFP16-NEXT:    frintm s6, s7
831 ; CHECK-SD-NOFP16-NEXT:    frintm s16, s16
832 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
833 ; CHECK-SD-NOFP16-NEXT:    fcvt h7, s19
834 ; CHECK-SD-NOFP16-NEXT:    fcvt s18, h20
835 ; CHECK-SD-NOFP16-NEXT:    fcvt s19, h21
836 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
837 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s6
838 ; CHECK-SD-NOFP16-NEXT:    fcvt h16, s16
839 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[1], v5.h[0]
840 ; CHECK-SD-NOFP16-NEXT:    frintm s5, s17
841 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[1], v7.h[0]
842 ; CHECK-SD-NOFP16-NEXT:    mov h7, v0.h[5]
843 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[5]
844 ; CHECK-SD-NOFP16-NEXT:    frintm s18, s18
845 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[2], v4.h[0]
846 ; CHECK-SD-NOFP16-NEXT:    frintm s4, s19
847 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s5
848 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[2], v6.h[0]
849 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[6]
850 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
851 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
852 ; CHECK-SD-NOFP16-NEXT:    mov h19, v1.h[6]
853 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
854 ; CHECK-SD-NOFP16-NEXT:    mov h1, v1.h[7]
855 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[3], v16.h[0]
856 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
857 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[3], v5.h[0]
858 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
859 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h6
860 ; CHECK-SD-NOFP16-NEXT:    frintm s7, s7
861 ; CHECK-SD-NOFP16-NEXT:    frintm s16, s17
862 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h19
863 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
864 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
865 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[4], v5.h[0]
866 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[4], v4.h[0]
867 ; CHECK-SD-NOFP16-NEXT:    frintm s4, s6
868 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
869 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s16
870 ; CHECK-SD-NOFP16-NEXT:    frintm s7, s17
871 ; CHECK-SD-NOFP16-NEXT:    frintm s0, s0
872 ; CHECK-SD-NOFP16-NEXT:    frintm s1, s1
873 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
874 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[5], v5.h[0]
875 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[5], v6.h[0]
876 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
877 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
878 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
879 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[6], v4.h[0]
880 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[6], v5.h[0]
881 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[7], v0.h[0]
882 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[7], v1.h[0]
883 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v2.16b
884 ; CHECK-SD-NOFP16-NEXT:    mov v1.16b, v3.16b
885 ; CHECK-SD-NOFP16-NEXT:    ret
887 ; CHECK-SD-FP16-LABEL: floor_v16f16:
888 ; CHECK-SD-FP16:       // %bb.0: // %entry
889 ; CHECK-SD-FP16-NEXT:    frintm v0.8h, v0.8h
890 ; CHECK-SD-FP16-NEXT:    frintm v1.8h, v1.8h
891 ; CHECK-SD-FP16-NEXT:    ret
893 ; CHECK-GI-NOFP16-LABEL: floor_v16f16:
894 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
895 ; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
896 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
897 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
898 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
899 ; CHECK-GI-NOFP16-NEXT:    frintm v2.4s, v2.4s
900 ; CHECK-GI-NOFP16-NEXT:    frintm v3.4s, v3.4s
901 ; CHECK-GI-NOFP16-NEXT:    frintm v4.4s, v0.4s
902 ; CHECK-GI-NOFP16-NEXT:    frintm v5.4s, v1.4s
903 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
904 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
905 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
906 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
907 ; CHECK-GI-NOFP16-NEXT:    ret
909 ; CHECK-GI-FP16-LABEL: floor_v16f16:
910 ; CHECK-GI-FP16:       // %bb.0: // %entry
911 ; CHECK-GI-FP16-NEXT:    frintm v0.8h, v0.8h
912 ; CHECK-GI-FP16-NEXT:    frintm v1.8h, v1.8h
913 ; CHECK-GI-FP16-NEXT:    ret
914 entry:
915   %c = call <16 x half> @llvm.floor.v16f16(<16 x half> %a)
916   ret <16 x half> %c
919 define double @nearbyint_f64(double %a) {
920 ; CHECK-LABEL: nearbyint_f64:
921 ; CHECK:       // %bb.0: // %entry
922 ; CHECK-NEXT:    frinti d0, d0
923 ; CHECK-NEXT:    ret
924 entry:
925   %c = call double @llvm.nearbyint.f64(double %a)
926   ret double %c
929 define float @nearbyint_f32(float %a) {
930 ; CHECK-LABEL: nearbyint_f32:
931 ; CHECK:       // %bb.0: // %entry
932 ; CHECK-NEXT:    frinti s0, s0
933 ; CHECK-NEXT:    ret
934 entry:
935   %c = call float @llvm.nearbyint.f32(float %a)
936   ret float %c
939 define half @nearbyint_f16(half %a) {
940 ; CHECK-SD-NOFP16-LABEL: nearbyint_f16:
941 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
942 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
943 ; CHECK-SD-NOFP16-NEXT:    frinti s0, s0
944 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
945 ; CHECK-SD-NOFP16-NEXT:    ret
947 ; CHECK-SD-FP16-LABEL: nearbyint_f16:
948 ; CHECK-SD-FP16:       // %bb.0: // %entry
949 ; CHECK-SD-FP16-NEXT:    frinti h0, h0
950 ; CHECK-SD-FP16-NEXT:    ret
952 ; CHECK-GI-NOFP16-LABEL: nearbyint_f16:
953 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
954 ; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
955 ; CHECK-GI-NOFP16-NEXT:    frinti s0, s0
956 ; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
957 ; CHECK-GI-NOFP16-NEXT:    ret
959 ; CHECK-GI-FP16-LABEL: nearbyint_f16:
960 ; CHECK-GI-FP16:       // %bb.0: // %entry
961 ; CHECK-GI-FP16-NEXT:    frinti h0, h0
962 ; CHECK-GI-FP16-NEXT:    ret
963 entry:
964   %c = call half @llvm.nearbyint.f16(half %a)
965   ret half %c
968 define <2 x double> @nearbyint_v2f64(<2 x double> %a) {
969 ; CHECK-LABEL: nearbyint_v2f64:
970 ; CHECK:       // %bb.0: // %entry
971 ; CHECK-NEXT:    frinti v0.2d, v0.2d
972 ; CHECK-NEXT:    ret
973 entry:
974   %c = call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %a)
975   ret <2 x double> %c
978 define <3 x double> @nearbyint_v3f64(<3 x double> %a) {
979 ; CHECK-SD-LABEL: nearbyint_v3f64:
980 ; CHECK-SD:       // %bb.0: // %entry
981 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
982 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
983 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
984 ; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
985 ; CHECK-SD-NEXT:    frinti v2.2d, v2.2d
986 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
987 ; CHECK-SD-NEXT:    frinti v0.2d, v0.2d
988 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
989 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
990 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
991 ; CHECK-SD-NEXT:    ret
993 ; CHECK-GI-LABEL: nearbyint_v3f64:
994 ; CHECK-GI:       // %bb.0: // %entry
995 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
996 ; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
997 ; CHECK-GI-NEXT:    frinti d2, d2
998 ; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
999 ; CHECK-GI-NEXT:    frinti v0.2d, v0.2d
1000 ; CHECK-GI-NEXT:    mov d1, v0.d[1]
1001 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
1002 ; CHECK-GI-NEXT:    ret
1003 entry:
1004   %c = call <3 x double> @llvm.nearbyint.v3f64(<3 x double> %a)
1005   ret <3 x double> %c
1008 define <4 x double> @nearbyint_v4f64(<4 x double> %a) {
1009 ; CHECK-LABEL: nearbyint_v4f64:
1010 ; CHECK:       // %bb.0: // %entry
1011 ; CHECK-NEXT:    frinti v0.2d, v0.2d
1012 ; CHECK-NEXT:    frinti v1.2d, v1.2d
1013 ; CHECK-NEXT:    ret
1014 entry:
1015   %c = call <4 x double> @llvm.nearbyint.v4f64(<4 x double> %a)
1016   ret <4 x double> %c
1019 define <2 x float> @nearbyint_v2f32(<2 x float> %a) {
1020 ; CHECK-LABEL: nearbyint_v2f32:
1021 ; CHECK:       // %bb.0: // %entry
1022 ; CHECK-NEXT:    frinti v0.2s, v0.2s
1023 ; CHECK-NEXT:    ret
1024 entry:
1025   %c = call <2 x float> @llvm.nearbyint.v2f32(<2 x float> %a)
1026   ret <2 x float> %c
1029 define <3 x float> @nearbyint_v3f32(<3 x float> %a) {
1030 ; CHECK-LABEL: nearbyint_v3f32:
1031 ; CHECK:       // %bb.0: // %entry
1032 ; CHECK-NEXT:    frinti v0.4s, v0.4s
1033 ; CHECK-NEXT:    ret
1034 entry:
1035   %c = call <3 x float> @llvm.nearbyint.v3f32(<3 x float> %a)
1036   ret <3 x float> %c
1039 define <4 x float> @nearbyint_v4f32(<4 x float> %a) {
1040 ; CHECK-LABEL: nearbyint_v4f32:
1041 ; CHECK:       // %bb.0: // %entry
1042 ; CHECK-NEXT:    frinti v0.4s, v0.4s
1043 ; CHECK-NEXT:    ret
1044 entry:
1045   %c = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %a)
1046   ret <4 x float> %c
1049 define <8 x float> @nearbyint_v8f32(<8 x float> %a) {
1050 ; CHECK-LABEL: nearbyint_v8f32:
1051 ; CHECK:       // %bb.0: // %entry
1052 ; CHECK-NEXT:    frinti v0.4s, v0.4s
1053 ; CHECK-NEXT:    frinti v1.4s, v1.4s
1054 ; CHECK-NEXT:    ret
1055 entry:
1056   %c = call <8 x float> @llvm.nearbyint.v8f32(<8 x float> %a)
1057   ret <8 x float> %c
1060 define <7 x half> @nearbyint_v7f16(<7 x half> %a) {
1061 ; CHECK-SD-NOFP16-LABEL: nearbyint_v7f16:
1062 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
1063 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
1064 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
1065 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
1066 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
1067 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
1068 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
1069 ; CHECK-SD-NOFP16-NEXT:    frinti s2, s2
1070 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1071 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
1072 ; CHECK-SD-NOFP16-NEXT:    frinti s5, s1
1073 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
1074 ; CHECK-SD-NOFP16-NEXT:    frinti s2, s3
1075 ; CHECK-SD-NOFP16-NEXT:    frinti s4, s4
1076 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
1077 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
1078 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
1079 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
1080 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
1081 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
1082 ; CHECK-SD-NOFP16-NEXT:    frinti s5, s5
1083 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
1084 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
1085 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1086 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
1087 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
1088 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
1089 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
1090 ; CHECK-SD-NOFP16-NEXT:    frinti s3, s3
1091 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
1092 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
1093 ; CHECK-SD-NOFP16-NEXT:    frinti s2, s2
1094 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
1095 ; CHECK-SD-NOFP16-NEXT:    frinti s0, s0
1096 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
1097 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
1098 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1099 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
1100 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
1101 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
1102 ; CHECK-SD-NOFP16-NEXT:    ret
1104 ; CHECK-SD-FP16-LABEL: nearbyint_v7f16:
1105 ; CHECK-SD-FP16:       // %bb.0: // %entry
1106 ; CHECK-SD-FP16-NEXT:    frinti v0.8h, v0.8h
1107 ; CHECK-SD-FP16-NEXT:    ret
1109 ; CHECK-GI-NOFP16-LABEL: nearbyint_v7f16:
1110 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
1111 ; CHECK-GI-NOFP16-NEXT:    mov h1, v0.h[4]
1112 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[5]
1113 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v0.4h
1114 ; CHECK-GI-NOFP16-NEXT:    mov h0, v0.h[6]
1115 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[1], v2.h[0]
1116 ; CHECK-GI-NOFP16-NEXT:    frinti v2.4s, v3.4s
1117 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[2], v0.h[0]
1118 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
1119 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[3], v0.h[0]
1120 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[1]
1121 ; CHECK-GI-NOFP16-NEXT:    mov h3, v0.h[2]
1122 ; CHECK-GI-NOFP16-NEXT:    mov h4, v0.h[3]
1123 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v1.4h
1124 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v2.h[0]
1125 ; CHECK-GI-NOFP16-NEXT:    frinti v1.4s, v1.4s
1126 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v3.h[0]
1127 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
1128 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v4.h[0]
1129 ; CHECK-GI-NOFP16-NEXT:    mov h2, v1.h[1]
1130 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v1.h[0]
1131 ; CHECK-GI-NOFP16-NEXT:    mov h1, v1.h[2]
1132 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[0]
1133 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v1.h[0]
1134 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[7], v0.h[0]
1135 ; CHECK-GI-NOFP16-NEXT:    ret
1137 ; CHECK-GI-FP16-LABEL: nearbyint_v7f16:
1138 ; CHECK-GI-FP16:       // %bb.0: // %entry
1139 ; CHECK-GI-FP16-NEXT:    frinti v0.8h, v0.8h
1140 ; CHECK-GI-FP16-NEXT:    ret
1141 entry:
1142   %c = call <7 x half> @llvm.nearbyint.v7f16(<7 x half> %a)
1143   ret <7 x half> %c
1146 define <4 x half> @nearbyint_v4f16(<4 x half> %a) {
1147 ; CHECK-SD-NOFP16-LABEL: nearbyint_v4f16:
1148 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
1149 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
1150 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
1151 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
1152 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
1153 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
1154 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
1155 ; CHECK-SD-NOFP16-NEXT:    frinti s0, s2
1156 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h3
1157 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h4
1158 ; CHECK-SD-NOFP16-NEXT:    frinti s1, s1
1159 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1160 ; CHECK-SD-NOFP16-NEXT:    frinti s2, s2
1161 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
1162 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
1163 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
1164 ; CHECK-SD-NOFP16-NEXT:    frinti s2, s3
1165 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[2], v1.h[0]
1166 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
1167 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[3], v1.h[0]
1168 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
1169 ; CHECK-SD-NOFP16-NEXT:    ret
1171 ; CHECK-SD-FP16-LABEL: nearbyint_v4f16:
1172 ; CHECK-SD-FP16:       // %bb.0: // %entry
1173 ; CHECK-SD-FP16-NEXT:    frinti v0.4h, v0.4h
1174 ; CHECK-SD-FP16-NEXT:    ret
1176 ; CHECK-GI-NOFP16-LABEL: nearbyint_v4f16:
1177 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
1178 ; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
1179 ; CHECK-GI-NOFP16-NEXT:    frinti v0.4s, v0.4s
1180 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
1181 ; CHECK-GI-NOFP16-NEXT:    ret
1183 ; CHECK-GI-FP16-LABEL: nearbyint_v4f16:
1184 ; CHECK-GI-FP16:       // %bb.0: // %entry
1185 ; CHECK-GI-FP16-NEXT:    frinti v0.4h, v0.4h
1186 ; CHECK-GI-FP16-NEXT:    ret
1187 entry:
1188   %c = call <4 x half> @llvm.nearbyint.v4f16(<4 x half> %a)
1189   ret <4 x half> %c
1192 define <8 x half> @nearbyint_v8f16(<8 x half> %a) {
1193 ; CHECK-SD-NOFP16-LABEL: nearbyint_v8f16:
1194 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
1195 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
1196 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
1197 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
1198 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
1199 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
1200 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
1201 ; CHECK-SD-NOFP16-NEXT:    frinti s2, s2
1202 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1203 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
1204 ; CHECK-SD-NOFP16-NEXT:    frinti s5, s1
1205 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
1206 ; CHECK-SD-NOFP16-NEXT:    frinti s2, s3
1207 ; CHECK-SD-NOFP16-NEXT:    frinti s4, s4
1208 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
1209 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
1210 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
1211 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
1212 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
1213 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
1214 ; CHECK-SD-NOFP16-NEXT:    frinti s5, s5
1215 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
1216 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
1217 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1218 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
1219 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
1220 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
1221 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
1222 ; CHECK-SD-NOFP16-NEXT:    frinti s3, s3
1223 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
1224 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
1225 ; CHECK-SD-NOFP16-NEXT:    frinti s2, s2
1226 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
1227 ; CHECK-SD-NOFP16-NEXT:    frinti s0, s0
1228 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
1229 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
1230 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1231 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
1232 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
1233 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
1234 ; CHECK-SD-NOFP16-NEXT:    ret
1236 ; CHECK-SD-FP16-LABEL: nearbyint_v8f16:
1237 ; CHECK-SD-FP16:       // %bb.0: // %entry
1238 ; CHECK-SD-FP16-NEXT:    frinti v0.8h, v0.8h
1239 ; CHECK-SD-FP16-NEXT:    ret
1241 ; CHECK-GI-NOFP16-LABEL: nearbyint_v8f16:
1242 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
1243 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1244 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
1245 ; CHECK-GI-NOFP16-NEXT:    frinti v1.4s, v1.4s
1246 ; CHECK-GI-NOFP16-NEXT:    frinti v2.4s, v0.4s
1247 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1248 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
1249 ; CHECK-GI-NOFP16-NEXT:    ret
1251 ; CHECK-GI-FP16-LABEL: nearbyint_v8f16:
1252 ; CHECK-GI-FP16:       // %bb.0: // %entry
1253 ; CHECK-GI-FP16-NEXT:    frinti v0.8h, v0.8h
1254 ; CHECK-GI-FP16-NEXT:    ret
1255 entry:
1256   %c = call <8 x half> @llvm.nearbyint.v8f16(<8 x half> %a)
1257   ret <8 x half> %c
1260 define <16 x half> @nearbyint_v16f16(<16 x half> %a) {
1261 ; CHECK-SD-NOFP16-LABEL: nearbyint_v16f16:
1262 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
1263 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[1]
1264 ; CHECK-SD-NOFP16-NEXT:    mov h3, v1.h[1]
1265 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h0
1266 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[2]
1267 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h1
1268 ; CHECK-SD-NOFP16-NEXT:    mov h7, v1.h[2]
1269 ; CHECK-SD-NOFP16-NEXT:    mov h16, v0.h[3]
1270 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[3]
1271 ; CHECK-SD-NOFP16-NEXT:    mov h20, v0.h[4]
1272 ; CHECK-SD-NOFP16-NEXT:    mov h21, v1.h[4]
1273 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
1274 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1275 ; CHECK-SD-NOFP16-NEXT:    frinti s4, s4
1276 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
1277 ; CHECK-SD-NOFP16-NEXT:    frinti s6, s6
1278 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
1279 ; CHECK-SD-NOFP16-NEXT:    fcvt s16, h16
1280 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
1281 ; CHECK-SD-NOFP16-NEXT:    frinti s18, s2
1282 ; CHECK-SD-NOFP16-NEXT:    frinti s19, s3
1283 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s4
1284 ; CHECK-SD-NOFP16-NEXT:    frinti s4, s5
1285 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s6
1286 ; CHECK-SD-NOFP16-NEXT:    frinti s6, s7
1287 ; CHECK-SD-NOFP16-NEXT:    frinti s16, s16
1288 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
1289 ; CHECK-SD-NOFP16-NEXT:    fcvt h7, s19
1290 ; CHECK-SD-NOFP16-NEXT:    fcvt s18, h20
1291 ; CHECK-SD-NOFP16-NEXT:    fcvt s19, h21
1292 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
1293 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s6
1294 ; CHECK-SD-NOFP16-NEXT:    fcvt h16, s16
1295 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[1], v5.h[0]
1296 ; CHECK-SD-NOFP16-NEXT:    frinti s5, s17
1297 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[1], v7.h[0]
1298 ; CHECK-SD-NOFP16-NEXT:    mov h7, v0.h[5]
1299 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[5]
1300 ; CHECK-SD-NOFP16-NEXT:    frinti s18, s18
1301 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[2], v4.h[0]
1302 ; CHECK-SD-NOFP16-NEXT:    frinti s4, s19
1303 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s5
1304 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[2], v6.h[0]
1305 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[6]
1306 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
1307 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
1308 ; CHECK-SD-NOFP16-NEXT:    mov h19, v1.h[6]
1309 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
1310 ; CHECK-SD-NOFP16-NEXT:    mov h1, v1.h[7]
1311 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[3], v16.h[0]
1312 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
1313 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[3], v5.h[0]
1314 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
1315 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h6
1316 ; CHECK-SD-NOFP16-NEXT:    frinti s7, s7
1317 ; CHECK-SD-NOFP16-NEXT:    frinti s16, s17
1318 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h19
1319 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
1320 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
1321 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[4], v5.h[0]
1322 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[4], v4.h[0]
1323 ; CHECK-SD-NOFP16-NEXT:    frinti s4, s6
1324 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
1325 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s16
1326 ; CHECK-SD-NOFP16-NEXT:    frinti s7, s17
1327 ; CHECK-SD-NOFP16-NEXT:    frinti s0, s0
1328 ; CHECK-SD-NOFP16-NEXT:    frinti s1, s1
1329 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
1330 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[5], v5.h[0]
1331 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[5], v6.h[0]
1332 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
1333 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1334 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
1335 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[6], v4.h[0]
1336 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[6], v5.h[0]
1337 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[7], v0.h[0]
1338 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[7], v1.h[0]
1339 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v2.16b
1340 ; CHECK-SD-NOFP16-NEXT:    mov v1.16b, v3.16b
1341 ; CHECK-SD-NOFP16-NEXT:    ret
1343 ; CHECK-SD-FP16-LABEL: nearbyint_v16f16:
1344 ; CHECK-SD-FP16:       // %bb.0: // %entry
1345 ; CHECK-SD-FP16-NEXT:    frinti v0.8h, v0.8h
1346 ; CHECK-SD-FP16-NEXT:    frinti v1.8h, v1.8h
1347 ; CHECK-SD-FP16-NEXT:    ret
1349 ; CHECK-GI-NOFP16-LABEL: nearbyint_v16f16:
1350 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
1351 ; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
1352 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
1353 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
1354 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
1355 ; CHECK-GI-NOFP16-NEXT:    frinti v2.4s, v2.4s
1356 ; CHECK-GI-NOFP16-NEXT:    frinti v3.4s, v3.4s
1357 ; CHECK-GI-NOFP16-NEXT:    frinti v4.4s, v0.4s
1358 ; CHECK-GI-NOFP16-NEXT:    frinti v5.4s, v1.4s
1359 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
1360 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
1361 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
1362 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
1363 ; CHECK-GI-NOFP16-NEXT:    ret
1365 ; CHECK-GI-FP16-LABEL: nearbyint_v16f16:
1366 ; CHECK-GI-FP16:       // %bb.0: // %entry
1367 ; CHECK-GI-FP16-NEXT:    frinti v0.8h, v0.8h
1368 ; CHECK-GI-FP16-NEXT:    frinti v1.8h, v1.8h
1369 ; CHECK-GI-FP16-NEXT:    ret
1370 entry:
1371   %c = call <16 x half> @llvm.nearbyint.v16f16(<16 x half> %a)
1372   ret <16 x half> %c
1375 define double @roundeven_f64(double %a) {
1376 ; CHECK-LABEL: roundeven_f64:
1377 ; CHECK:       // %bb.0: // %entry
1378 ; CHECK-NEXT:    frintn d0, d0
1379 ; CHECK-NEXT:    ret
1380 entry:
1381   %c = call double @llvm.roundeven.f64(double %a)
1382   ret double %c
1385 define float @roundeven_f32(float %a) {
1386 ; CHECK-LABEL: roundeven_f32:
1387 ; CHECK:       // %bb.0: // %entry
1388 ; CHECK-NEXT:    frintn s0, s0
1389 ; CHECK-NEXT:    ret
1390 entry:
1391   %c = call float @llvm.roundeven.f32(float %a)
1392   ret float %c
1395 define half @roundeven_f16(half %a) {
1396 ; CHECK-SD-NOFP16-LABEL: roundeven_f16:
1397 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
1398 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
1399 ; CHECK-SD-NOFP16-NEXT:    frintn s0, s0
1400 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1401 ; CHECK-SD-NOFP16-NEXT:    ret
1403 ; CHECK-SD-FP16-LABEL: roundeven_f16:
1404 ; CHECK-SD-FP16:       // %bb.0: // %entry
1405 ; CHECK-SD-FP16-NEXT:    frintn h0, h0
1406 ; CHECK-SD-FP16-NEXT:    ret
1408 ; CHECK-GI-NOFP16-LABEL: roundeven_f16:
1409 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
1410 ; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
1411 ; CHECK-GI-NOFP16-NEXT:    frintn s0, s0
1412 ; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
1413 ; CHECK-GI-NOFP16-NEXT:    ret
1415 ; CHECK-GI-FP16-LABEL: roundeven_f16:
1416 ; CHECK-GI-FP16:       // %bb.0: // %entry
1417 ; CHECK-GI-FP16-NEXT:    frintn h0, h0
1418 ; CHECK-GI-FP16-NEXT:    ret
1419 entry:
1420   %c = call half @llvm.roundeven.f16(half %a)
1421   ret half %c
1424 define <2 x double> @roundeven_v2f64(<2 x double> %a) {
1425 ; CHECK-LABEL: roundeven_v2f64:
1426 ; CHECK:       // %bb.0: // %entry
1427 ; CHECK-NEXT:    frintn v0.2d, v0.2d
1428 ; CHECK-NEXT:    ret
1429 entry:
1430   %c = call <2 x double> @llvm.roundeven.v2f64(<2 x double> %a)
1431   ret <2 x double> %c
1434 define <3 x double> @roundeven_v3f64(<3 x double> %a) {
1435 ; CHECK-SD-LABEL: roundeven_v3f64:
1436 ; CHECK-SD:       // %bb.0: // %entry
1437 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1438 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1439 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
1440 ; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1441 ; CHECK-SD-NEXT:    frintn v2.2d, v2.2d
1442 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
1443 ; CHECK-SD-NEXT:    frintn v0.2d, v0.2d
1444 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1445 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
1446 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
1447 ; CHECK-SD-NEXT:    ret
1449 ; CHECK-GI-LABEL: roundeven_v3f64:
1450 ; CHECK-GI:       // %bb.0: // %entry
1451 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1452 ; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
1453 ; CHECK-GI-NEXT:    frintn d2, d2
1454 ; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
1455 ; CHECK-GI-NEXT:    frintn v0.2d, v0.2d
1456 ; CHECK-GI-NEXT:    mov d1, v0.d[1]
1457 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
1458 ; CHECK-GI-NEXT:    ret
1459 entry:
1460   %c = call <3 x double> @llvm.roundeven.v3f64(<3 x double> %a)
1461   ret <3 x double> %c
1464 define <4 x double> @roundeven_v4f64(<4 x double> %a) {
1465 ; CHECK-LABEL: roundeven_v4f64:
1466 ; CHECK:       // %bb.0: // %entry
1467 ; CHECK-NEXT:    frintn v0.2d, v0.2d
1468 ; CHECK-NEXT:    frintn v1.2d, v1.2d
1469 ; CHECK-NEXT:    ret
1470 entry:
1471   %c = call <4 x double> @llvm.roundeven.v4f64(<4 x double> %a)
1472   ret <4 x double> %c
1475 define <2 x float> @roundeven_v2f32(<2 x float> %a) {
1476 ; CHECK-LABEL: roundeven_v2f32:
1477 ; CHECK:       // %bb.0: // %entry
1478 ; CHECK-NEXT:    frintn v0.2s, v0.2s
1479 ; CHECK-NEXT:    ret
1480 entry:
1481   %c = call <2 x float> @llvm.roundeven.v2f32(<2 x float> %a)
1482   ret <2 x float> %c
1485 define <3 x float> @roundeven_v3f32(<3 x float> %a) {
1486 ; CHECK-LABEL: roundeven_v3f32:
1487 ; CHECK:       // %bb.0: // %entry
1488 ; CHECK-NEXT:    frintn v0.4s, v0.4s
1489 ; CHECK-NEXT:    ret
1490 entry:
1491   %c = call <3 x float> @llvm.roundeven.v3f32(<3 x float> %a)
1492   ret <3 x float> %c
1495 define <4 x float> @roundeven_v4f32(<4 x float> %a) {
1496 ; CHECK-LABEL: roundeven_v4f32:
1497 ; CHECK:       // %bb.0: // %entry
1498 ; CHECK-NEXT:    frintn v0.4s, v0.4s
1499 ; CHECK-NEXT:    ret
1500 entry:
1501   %c = call <4 x float> @llvm.roundeven.v4f32(<4 x float> %a)
1502   ret <4 x float> %c
1505 define <8 x float> @roundeven_v8f32(<8 x float> %a) {
1506 ; CHECK-LABEL: roundeven_v8f32:
1507 ; CHECK:       // %bb.0: // %entry
1508 ; CHECK-NEXT:    frintn v0.4s, v0.4s
1509 ; CHECK-NEXT:    frintn v1.4s, v1.4s
1510 ; CHECK-NEXT:    ret
1511 entry:
1512   %c = call <8 x float> @llvm.roundeven.v8f32(<8 x float> %a)
1513   ret <8 x float> %c
1516 define <7 x half> @roundeven_v7f16(<7 x half> %a) {
1517 ; CHECK-SD-NOFP16-LABEL: roundeven_v7f16:
1518 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
1519 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
1520 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
1521 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
1522 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
1523 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
1524 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
1525 ; CHECK-SD-NOFP16-NEXT:    frintn s2, s2
1526 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1527 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
1528 ; CHECK-SD-NOFP16-NEXT:    frintn s5, s1
1529 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
1530 ; CHECK-SD-NOFP16-NEXT:    frintn s2, s3
1531 ; CHECK-SD-NOFP16-NEXT:    frintn s4, s4
1532 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
1533 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
1534 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
1535 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
1536 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
1537 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
1538 ; CHECK-SD-NOFP16-NEXT:    frintn s5, s5
1539 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
1540 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
1541 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1542 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
1543 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
1544 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
1545 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
1546 ; CHECK-SD-NOFP16-NEXT:    frintn s3, s3
1547 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
1548 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
1549 ; CHECK-SD-NOFP16-NEXT:    frintn s2, s2
1550 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
1551 ; CHECK-SD-NOFP16-NEXT:    frintn s0, s0
1552 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
1553 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
1554 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1555 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
1556 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
1557 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
1558 ; CHECK-SD-NOFP16-NEXT:    ret
1560 ; CHECK-SD-FP16-LABEL: roundeven_v7f16:
1561 ; CHECK-SD-FP16:       // %bb.0: // %entry
1562 ; CHECK-SD-FP16-NEXT:    frintn v0.8h, v0.8h
1563 ; CHECK-SD-FP16-NEXT:    ret
1565 ; CHECK-GI-NOFP16-LABEL: roundeven_v7f16:
1566 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
1567 ; CHECK-GI-NOFP16-NEXT:    mov h1, v0.h[4]
1568 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[5]
1569 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v0.4h
1570 ; CHECK-GI-NOFP16-NEXT:    mov h0, v0.h[6]
1571 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[1], v2.h[0]
1572 ; CHECK-GI-NOFP16-NEXT:    frintn v2.4s, v3.4s
1573 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[2], v0.h[0]
1574 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
1575 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[3], v0.h[0]
1576 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[1]
1577 ; CHECK-GI-NOFP16-NEXT:    mov h3, v0.h[2]
1578 ; CHECK-GI-NOFP16-NEXT:    mov h4, v0.h[3]
1579 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v1.4h
1580 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v2.h[0]
1581 ; CHECK-GI-NOFP16-NEXT:    frintn v1.4s, v1.4s
1582 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v3.h[0]
1583 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
1584 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v4.h[0]
1585 ; CHECK-GI-NOFP16-NEXT:    mov h2, v1.h[1]
1586 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v1.h[0]
1587 ; CHECK-GI-NOFP16-NEXT:    mov h1, v1.h[2]
1588 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[0]
1589 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v1.h[0]
1590 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[7], v0.h[0]
1591 ; CHECK-GI-NOFP16-NEXT:    ret
1593 ; CHECK-GI-FP16-LABEL: roundeven_v7f16:
1594 ; CHECK-GI-FP16:       // %bb.0: // %entry
1595 ; CHECK-GI-FP16-NEXT:    frintn v0.8h, v0.8h
1596 ; CHECK-GI-FP16-NEXT:    ret
1597 entry:
1598   %c = call <7 x half> @llvm.roundeven.v7f16(<7 x half> %a)
1599   ret <7 x half> %c
1602 define <4 x half> @roundeven_v4f16(<4 x half> %a) {
1603 ; CHECK-SD-NOFP16-LABEL: roundeven_v4f16:
1604 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
1605 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
1606 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
1607 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
1608 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
1609 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
1610 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
1611 ; CHECK-SD-NOFP16-NEXT:    frintn s0, s2
1612 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h3
1613 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h4
1614 ; CHECK-SD-NOFP16-NEXT:    frintn s1, s1
1615 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1616 ; CHECK-SD-NOFP16-NEXT:    frintn s2, s2
1617 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
1618 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
1619 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
1620 ; CHECK-SD-NOFP16-NEXT:    frintn s2, s3
1621 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[2], v1.h[0]
1622 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
1623 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[3], v1.h[0]
1624 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
1625 ; CHECK-SD-NOFP16-NEXT:    ret
1627 ; CHECK-SD-FP16-LABEL: roundeven_v4f16:
1628 ; CHECK-SD-FP16:       // %bb.0: // %entry
1629 ; CHECK-SD-FP16-NEXT:    frintn v0.4h, v0.4h
1630 ; CHECK-SD-FP16-NEXT:    ret
1632 ; CHECK-GI-NOFP16-LABEL: roundeven_v4f16:
1633 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
1634 ; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
1635 ; CHECK-GI-NOFP16-NEXT:    frintn v0.4s, v0.4s
1636 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
1637 ; CHECK-GI-NOFP16-NEXT:    ret
1639 ; CHECK-GI-FP16-LABEL: roundeven_v4f16:
1640 ; CHECK-GI-FP16:       // %bb.0: // %entry
1641 ; CHECK-GI-FP16-NEXT:    frintn v0.4h, v0.4h
1642 ; CHECK-GI-FP16-NEXT:    ret
1643 entry:
1644   %c = call <4 x half> @llvm.roundeven.v4f16(<4 x half> %a)
1645   ret <4 x half> %c
1648 define <8 x half> @roundeven_v8f16(<8 x half> %a) {
1649 ; CHECK-SD-NOFP16-LABEL: roundeven_v8f16:
1650 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
1651 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
1652 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
1653 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
1654 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
1655 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
1656 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
1657 ; CHECK-SD-NOFP16-NEXT:    frintn s2, s2
1658 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1659 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
1660 ; CHECK-SD-NOFP16-NEXT:    frintn s5, s1
1661 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
1662 ; CHECK-SD-NOFP16-NEXT:    frintn s2, s3
1663 ; CHECK-SD-NOFP16-NEXT:    frintn s4, s4
1664 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
1665 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
1666 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
1667 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
1668 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
1669 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
1670 ; CHECK-SD-NOFP16-NEXT:    frintn s5, s5
1671 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
1672 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
1673 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1674 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
1675 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
1676 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
1677 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
1678 ; CHECK-SD-NOFP16-NEXT:    frintn s3, s3
1679 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
1680 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
1681 ; CHECK-SD-NOFP16-NEXT:    frintn s2, s2
1682 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
1683 ; CHECK-SD-NOFP16-NEXT:    frintn s0, s0
1684 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
1685 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
1686 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1687 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
1688 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
1689 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
1690 ; CHECK-SD-NOFP16-NEXT:    ret
1692 ; CHECK-SD-FP16-LABEL: roundeven_v8f16:
1693 ; CHECK-SD-FP16:       // %bb.0: // %entry
1694 ; CHECK-SD-FP16-NEXT:    frintn v0.8h, v0.8h
1695 ; CHECK-SD-FP16-NEXT:    ret
1697 ; CHECK-GI-NOFP16-LABEL: roundeven_v8f16:
1698 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
1699 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
1700 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
1701 ; CHECK-GI-NOFP16-NEXT:    frintn v1.4s, v1.4s
1702 ; CHECK-GI-NOFP16-NEXT:    frintn v2.4s, v0.4s
1703 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
1704 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
1705 ; CHECK-GI-NOFP16-NEXT:    ret
1707 ; CHECK-GI-FP16-LABEL: roundeven_v8f16:
1708 ; CHECK-GI-FP16:       // %bb.0: // %entry
1709 ; CHECK-GI-FP16-NEXT:    frintn v0.8h, v0.8h
1710 ; CHECK-GI-FP16-NEXT:    ret
1711 entry:
1712   %c = call <8 x half> @llvm.roundeven.v8f16(<8 x half> %a)
1713   ret <8 x half> %c
1716 define <16 x half> @roundeven_v16f16(<16 x half> %a) {
1717 ; CHECK-SD-NOFP16-LABEL: roundeven_v16f16:
1718 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
1719 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[1]
1720 ; CHECK-SD-NOFP16-NEXT:    mov h3, v1.h[1]
1721 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h0
1722 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[2]
1723 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h1
1724 ; CHECK-SD-NOFP16-NEXT:    mov h7, v1.h[2]
1725 ; CHECK-SD-NOFP16-NEXT:    mov h16, v0.h[3]
1726 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[3]
1727 ; CHECK-SD-NOFP16-NEXT:    mov h20, v0.h[4]
1728 ; CHECK-SD-NOFP16-NEXT:    mov h21, v1.h[4]
1729 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
1730 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1731 ; CHECK-SD-NOFP16-NEXT:    frintn s4, s4
1732 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
1733 ; CHECK-SD-NOFP16-NEXT:    frintn s6, s6
1734 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
1735 ; CHECK-SD-NOFP16-NEXT:    fcvt s16, h16
1736 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
1737 ; CHECK-SD-NOFP16-NEXT:    frintn s18, s2
1738 ; CHECK-SD-NOFP16-NEXT:    frintn s19, s3
1739 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s4
1740 ; CHECK-SD-NOFP16-NEXT:    frintn s4, s5
1741 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s6
1742 ; CHECK-SD-NOFP16-NEXT:    frintn s6, s7
1743 ; CHECK-SD-NOFP16-NEXT:    frintn s16, s16
1744 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
1745 ; CHECK-SD-NOFP16-NEXT:    fcvt h7, s19
1746 ; CHECK-SD-NOFP16-NEXT:    fcvt s18, h20
1747 ; CHECK-SD-NOFP16-NEXT:    fcvt s19, h21
1748 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
1749 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s6
1750 ; CHECK-SD-NOFP16-NEXT:    fcvt h16, s16
1751 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[1], v5.h[0]
1752 ; CHECK-SD-NOFP16-NEXT:    frintn s5, s17
1753 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[1], v7.h[0]
1754 ; CHECK-SD-NOFP16-NEXT:    mov h7, v0.h[5]
1755 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[5]
1756 ; CHECK-SD-NOFP16-NEXT:    frintn s18, s18
1757 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[2], v4.h[0]
1758 ; CHECK-SD-NOFP16-NEXT:    frintn s4, s19
1759 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s5
1760 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[2], v6.h[0]
1761 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[6]
1762 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
1763 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
1764 ; CHECK-SD-NOFP16-NEXT:    mov h19, v1.h[6]
1765 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
1766 ; CHECK-SD-NOFP16-NEXT:    mov h1, v1.h[7]
1767 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[3], v16.h[0]
1768 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
1769 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[3], v5.h[0]
1770 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
1771 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h6
1772 ; CHECK-SD-NOFP16-NEXT:    frintn s7, s7
1773 ; CHECK-SD-NOFP16-NEXT:    frintn s16, s17
1774 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h19
1775 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
1776 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
1777 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[4], v5.h[0]
1778 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[4], v4.h[0]
1779 ; CHECK-SD-NOFP16-NEXT:    frintn s4, s6
1780 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
1781 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s16
1782 ; CHECK-SD-NOFP16-NEXT:    frintn s7, s17
1783 ; CHECK-SD-NOFP16-NEXT:    frintn s0, s0
1784 ; CHECK-SD-NOFP16-NEXT:    frintn s1, s1
1785 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
1786 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[5], v5.h[0]
1787 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[5], v6.h[0]
1788 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
1789 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1790 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
1791 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[6], v4.h[0]
1792 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[6], v5.h[0]
1793 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[7], v0.h[0]
1794 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[7], v1.h[0]
1795 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v2.16b
1796 ; CHECK-SD-NOFP16-NEXT:    mov v1.16b, v3.16b
1797 ; CHECK-SD-NOFP16-NEXT:    ret
1799 ; CHECK-SD-FP16-LABEL: roundeven_v16f16:
1800 ; CHECK-SD-FP16:       // %bb.0: // %entry
1801 ; CHECK-SD-FP16-NEXT:    frintn v0.8h, v0.8h
1802 ; CHECK-SD-FP16-NEXT:    frintn v1.8h, v1.8h
1803 ; CHECK-SD-FP16-NEXT:    ret
1805 ; CHECK-GI-NOFP16-LABEL: roundeven_v16f16:
1806 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
1807 ; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
1808 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
1809 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
1810 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
1811 ; CHECK-GI-NOFP16-NEXT:    frintn v2.4s, v2.4s
1812 ; CHECK-GI-NOFP16-NEXT:    frintn v3.4s, v3.4s
1813 ; CHECK-GI-NOFP16-NEXT:    frintn v4.4s, v0.4s
1814 ; CHECK-GI-NOFP16-NEXT:    frintn v5.4s, v1.4s
1815 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
1816 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
1817 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
1818 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
1819 ; CHECK-GI-NOFP16-NEXT:    ret
1821 ; CHECK-GI-FP16-LABEL: roundeven_v16f16:
1822 ; CHECK-GI-FP16:       // %bb.0: // %entry
1823 ; CHECK-GI-FP16-NEXT:    frintn v0.8h, v0.8h
1824 ; CHECK-GI-FP16-NEXT:    frintn v1.8h, v1.8h
1825 ; CHECK-GI-FP16-NEXT:    ret
1826 entry:
1827   %c = call <16 x half> @llvm.roundeven.v16f16(<16 x half> %a)
1828   ret <16 x half> %c
1831 define double @rint_f64(double %a) {
1832 ; CHECK-LABEL: rint_f64:
1833 ; CHECK:       // %bb.0: // %entry
1834 ; CHECK-NEXT:    frintx d0, d0
1835 ; CHECK-NEXT:    ret
1836 entry:
1837   %c = call double @llvm.rint.f64(double %a)
1838   ret double %c
1841 define float @rint_f32(float %a) {
1842 ; CHECK-LABEL: rint_f32:
1843 ; CHECK:       // %bb.0: // %entry
1844 ; CHECK-NEXT:    frintx s0, s0
1845 ; CHECK-NEXT:    ret
1846 entry:
1847   %c = call float @llvm.rint.f32(float %a)
1848   ret float %c
1851 define half @rint_f16(half %a) {
1852 ; CHECK-SD-NOFP16-LABEL: rint_f16:
1853 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
1854 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
1855 ; CHECK-SD-NOFP16-NEXT:    frintx s0, s0
1856 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
1857 ; CHECK-SD-NOFP16-NEXT:    ret
1859 ; CHECK-SD-FP16-LABEL: rint_f16:
1860 ; CHECK-SD-FP16:       // %bb.0: // %entry
1861 ; CHECK-SD-FP16-NEXT:    frintx h0, h0
1862 ; CHECK-SD-FP16-NEXT:    ret
1864 ; CHECK-GI-NOFP16-LABEL: rint_f16:
1865 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
1866 ; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
1867 ; CHECK-GI-NOFP16-NEXT:    frintx s0, s0
1868 ; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
1869 ; CHECK-GI-NOFP16-NEXT:    ret
1871 ; CHECK-GI-FP16-LABEL: rint_f16:
1872 ; CHECK-GI-FP16:       // %bb.0: // %entry
1873 ; CHECK-GI-FP16-NEXT:    frintx h0, h0
1874 ; CHECK-GI-FP16-NEXT:    ret
1875 entry:
1876   %c = call half @llvm.rint.f16(half %a)
1877   ret half %c
1880 define <2 x double> @rint_v2f64(<2 x double> %a) {
1881 ; CHECK-LABEL: rint_v2f64:
1882 ; CHECK:       // %bb.0: // %entry
1883 ; CHECK-NEXT:    frintx v0.2d, v0.2d
1884 ; CHECK-NEXT:    ret
1885 entry:
1886   %c = call <2 x double> @llvm.rint.v2f64(<2 x double> %a)
1887   ret <2 x double> %c
1890 define <3 x double> @rint_v3f64(<3 x double> %a) {
1891 ; CHECK-SD-LABEL: rint_v3f64:
1892 ; CHECK-SD:       // %bb.0: // %entry
1893 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1894 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1895 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
1896 ; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1897 ; CHECK-SD-NEXT:    frintx v2.2d, v2.2d
1898 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
1899 ; CHECK-SD-NEXT:    frintx v0.2d, v0.2d
1900 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1901 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
1902 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
1903 ; CHECK-SD-NEXT:    ret
1905 ; CHECK-GI-LABEL: rint_v3f64:
1906 ; CHECK-GI:       // %bb.0: // %entry
1907 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1908 ; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
1909 ; CHECK-GI-NEXT:    frintx d2, d2
1910 ; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
1911 ; CHECK-GI-NEXT:    frintx v0.2d, v0.2d
1912 ; CHECK-GI-NEXT:    mov d1, v0.d[1]
1913 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
1914 ; CHECK-GI-NEXT:    ret
1915 entry:
1916   %c = call <3 x double> @llvm.rint.v3f64(<3 x double> %a)
1917   ret <3 x double> %c
1920 define <4 x double> @rint_v4f64(<4 x double> %a) {
1921 ; CHECK-LABEL: rint_v4f64:
1922 ; CHECK:       // %bb.0: // %entry
1923 ; CHECK-NEXT:    frintx v0.2d, v0.2d
1924 ; CHECK-NEXT:    frintx v1.2d, v1.2d
1925 ; CHECK-NEXT:    ret
1926 entry:
1927   %c = call <4 x double> @llvm.rint.v4f64(<4 x double> %a)
1928   ret <4 x double> %c
1931 define <2 x float> @rint_v2f32(<2 x float> %a) {
1932 ; CHECK-LABEL: rint_v2f32:
1933 ; CHECK:       // %bb.0: // %entry
1934 ; CHECK-NEXT:    frintx v0.2s, v0.2s
1935 ; CHECK-NEXT:    ret
1936 entry:
1937   %c = call <2 x float> @llvm.rint.v2f32(<2 x float> %a)
1938   ret <2 x float> %c
1941 define <3 x float> @rint_v3f32(<3 x float> %a) {
1942 ; CHECK-LABEL: rint_v3f32:
1943 ; CHECK:       // %bb.0: // %entry
1944 ; CHECK-NEXT:    frintx v0.4s, v0.4s
1945 ; CHECK-NEXT:    ret
1946 entry:
1947   %c = call <3 x float> @llvm.rint.v3f32(<3 x float> %a)
1948   ret <3 x float> %c
1951 define <4 x float> @rint_v4f32(<4 x float> %a) {
1952 ; CHECK-LABEL: rint_v4f32:
1953 ; CHECK:       // %bb.0: // %entry
1954 ; CHECK-NEXT:    frintx v0.4s, v0.4s
1955 ; CHECK-NEXT:    ret
1956 entry:
1957   %c = call <4 x float> @llvm.rint.v4f32(<4 x float> %a)
1958   ret <4 x float> %c
1961 define <8 x float> @rint_v8f32(<8 x float> %a) {
1962 ; CHECK-LABEL: rint_v8f32:
1963 ; CHECK:       // %bb.0: // %entry
1964 ; CHECK-NEXT:    frintx v0.4s, v0.4s
1965 ; CHECK-NEXT:    frintx v1.4s, v1.4s
1966 ; CHECK-NEXT:    ret
1967 entry:
1968   %c = call <8 x float> @llvm.rint.v8f32(<8 x float> %a)
1969   ret <8 x float> %c
1972 define <7 x half> @rint_v7f16(<7 x half> %a) {
1973 ; CHECK-SD-NOFP16-LABEL: rint_v7f16:
1974 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
1975 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
1976 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
1977 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
1978 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
1979 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
1980 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
1981 ; CHECK-SD-NOFP16-NEXT:    frintx s2, s2
1982 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1983 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
1984 ; CHECK-SD-NOFP16-NEXT:    frintx s5, s1
1985 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
1986 ; CHECK-SD-NOFP16-NEXT:    frintx s2, s3
1987 ; CHECK-SD-NOFP16-NEXT:    frintx s4, s4
1988 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
1989 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
1990 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
1991 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
1992 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
1993 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
1994 ; CHECK-SD-NOFP16-NEXT:    frintx s5, s5
1995 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
1996 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
1997 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
1998 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
1999 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
2000 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
2001 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
2002 ; CHECK-SD-NOFP16-NEXT:    frintx s3, s3
2003 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
2004 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
2005 ; CHECK-SD-NOFP16-NEXT:    frintx s2, s2
2006 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
2007 ; CHECK-SD-NOFP16-NEXT:    frintx s0, s0
2008 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
2009 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
2010 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2011 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
2012 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
2013 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
2014 ; CHECK-SD-NOFP16-NEXT:    ret
2016 ; CHECK-SD-FP16-LABEL: rint_v7f16:
2017 ; CHECK-SD-FP16:       // %bb.0: // %entry
2018 ; CHECK-SD-FP16-NEXT:    frintx v0.8h, v0.8h
2019 ; CHECK-SD-FP16-NEXT:    ret
2021 ; CHECK-GI-NOFP16-LABEL: rint_v7f16:
2022 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
2023 ; CHECK-GI-NOFP16-NEXT:    mov h1, v0.h[4]
2024 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[5]
2025 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v0.4h
2026 ; CHECK-GI-NOFP16-NEXT:    mov h0, v0.h[6]
2027 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[1], v2.h[0]
2028 ; CHECK-GI-NOFP16-NEXT:    frintx v2.4s, v3.4s
2029 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[2], v0.h[0]
2030 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
2031 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[3], v0.h[0]
2032 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[1]
2033 ; CHECK-GI-NOFP16-NEXT:    mov h3, v0.h[2]
2034 ; CHECK-GI-NOFP16-NEXT:    mov h4, v0.h[3]
2035 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v1.4h
2036 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v2.h[0]
2037 ; CHECK-GI-NOFP16-NEXT:    frintx v1.4s, v1.4s
2038 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v3.h[0]
2039 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
2040 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v4.h[0]
2041 ; CHECK-GI-NOFP16-NEXT:    mov h2, v1.h[1]
2042 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v1.h[0]
2043 ; CHECK-GI-NOFP16-NEXT:    mov h1, v1.h[2]
2044 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[0]
2045 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v1.h[0]
2046 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[7], v0.h[0]
2047 ; CHECK-GI-NOFP16-NEXT:    ret
2049 ; CHECK-GI-FP16-LABEL: rint_v7f16:
2050 ; CHECK-GI-FP16:       // %bb.0: // %entry
2051 ; CHECK-GI-FP16-NEXT:    frintx v0.8h, v0.8h
2052 ; CHECK-GI-FP16-NEXT:    ret
2053 entry:
2054   %c = call <7 x half> @llvm.rint.v7f16(<7 x half> %a)
2055   ret <7 x half> %c
2058 define <4 x half> @rint_v4f16(<4 x half> %a) {
2059 ; CHECK-SD-NOFP16-LABEL: rint_v4f16:
2060 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
2061 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
2062 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
2063 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
2064 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
2065 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
2066 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
2067 ; CHECK-SD-NOFP16-NEXT:    frintx s0, s2
2068 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h3
2069 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h4
2070 ; CHECK-SD-NOFP16-NEXT:    frintx s1, s1
2071 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2072 ; CHECK-SD-NOFP16-NEXT:    frintx s2, s2
2073 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
2074 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
2075 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
2076 ; CHECK-SD-NOFP16-NEXT:    frintx s2, s3
2077 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[2], v1.h[0]
2078 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
2079 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[3], v1.h[0]
2080 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
2081 ; CHECK-SD-NOFP16-NEXT:    ret
2083 ; CHECK-SD-FP16-LABEL: rint_v4f16:
2084 ; CHECK-SD-FP16:       // %bb.0: // %entry
2085 ; CHECK-SD-FP16-NEXT:    frintx v0.4h, v0.4h
2086 ; CHECK-SD-FP16-NEXT:    ret
2088 ; CHECK-GI-NOFP16-LABEL: rint_v4f16:
2089 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
2090 ; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
2091 ; CHECK-GI-NOFP16-NEXT:    frintx v0.4s, v0.4s
2092 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
2093 ; CHECK-GI-NOFP16-NEXT:    ret
2095 ; CHECK-GI-FP16-LABEL: rint_v4f16:
2096 ; CHECK-GI-FP16:       // %bb.0: // %entry
2097 ; CHECK-GI-FP16-NEXT:    frintx v0.4h, v0.4h
2098 ; CHECK-GI-FP16-NEXT:    ret
2099 entry:
2100   %c = call <4 x half> @llvm.rint.v4f16(<4 x half> %a)
2101   ret <4 x half> %c
2104 define <8 x half> @rint_v8f16(<8 x half> %a) {
2105 ; CHECK-SD-NOFP16-LABEL: rint_v8f16:
2106 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
2107 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
2108 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
2109 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
2110 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
2111 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
2112 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
2113 ; CHECK-SD-NOFP16-NEXT:    frintx s2, s2
2114 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
2115 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
2116 ; CHECK-SD-NOFP16-NEXT:    frintx s5, s1
2117 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
2118 ; CHECK-SD-NOFP16-NEXT:    frintx s2, s3
2119 ; CHECK-SD-NOFP16-NEXT:    frintx s4, s4
2120 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
2121 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
2122 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
2123 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
2124 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
2125 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
2126 ; CHECK-SD-NOFP16-NEXT:    frintx s5, s5
2127 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
2128 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
2129 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
2130 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
2131 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
2132 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
2133 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
2134 ; CHECK-SD-NOFP16-NEXT:    frintx s3, s3
2135 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
2136 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
2137 ; CHECK-SD-NOFP16-NEXT:    frintx s2, s2
2138 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
2139 ; CHECK-SD-NOFP16-NEXT:    frintx s0, s0
2140 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
2141 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
2142 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2143 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
2144 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
2145 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
2146 ; CHECK-SD-NOFP16-NEXT:    ret
2148 ; CHECK-SD-FP16-LABEL: rint_v8f16:
2149 ; CHECK-SD-FP16:       // %bb.0: // %entry
2150 ; CHECK-SD-FP16-NEXT:    frintx v0.8h, v0.8h
2151 ; CHECK-SD-FP16-NEXT:    ret
2153 ; CHECK-GI-NOFP16-LABEL: rint_v8f16:
2154 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
2155 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
2156 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
2157 ; CHECK-GI-NOFP16-NEXT:    frintx v1.4s, v1.4s
2158 ; CHECK-GI-NOFP16-NEXT:    frintx v2.4s, v0.4s
2159 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
2160 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
2161 ; CHECK-GI-NOFP16-NEXT:    ret
2163 ; CHECK-GI-FP16-LABEL: rint_v8f16:
2164 ; CHECK-GI-FP16:       // %bb.0: // %entry
2165 ; CHECK-GI-FP16-NEXT:    frintx v0.8h, v0.8h
2166 ; CHECK-GI-FP16-NEXT:    ret
2167 entry:
2168   %c = call <8 x half> @llvm.rint.v8f16(<8 x half> %a)
2169   ret <8 x half> %c
2172 define <16 x half> @rint_v16f16(<16 x half> %a) {
2173 ; CHECK-SD-NOFP16-LABEL: rint_v16f16:
2174 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
2175 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[1]
2176 ; CHECK-SD-NOFP16-NEXT:    mov h3, v1.h[1]
2177 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h0
2178 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[2]
2179 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h1
2180 ; CHECK-SD-NOFP16-NEXT:    mov h7, v1.h[2]
2181 ; CHECK-SD-NOFP16-NEXT:    mov h16, v0.h[3]
2182 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[3]
2183 ; CHECK-SD-NOFP16-NEXT:    mov h20, v0.h[4]
2184 ; CHECK-SD-NOFP16-NEXT:    mov h21, v1.h[4]
2185 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
2186 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
2187 ; CHECK-SD-NOFP16-NEXT:    frintx s4, s4
2188 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
2189 ; CHECK-SD-NOFP16-NEXT:    frintx s6, s6
2190 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
2191 ; CHECK-SD-NOFP16-NEXT:    fcvt s16, h16
2192 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
2193 ; CHECK-SD-NOFP16-NEXT:    frintx s18, s2
2194 ; CHECK-SD-NOFP16-NEXT:    frintx s19, s3
2195 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s4
2196 ; CHECK-SD-NOFP16-NEXT:    frintx s4, s5
2197 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s6
2198 ; CHECK-SD-NOFP16-NEXT:    frintx s6, s7
2199 ; CHECK-SD-NOFP16-NEXT:    frintx s16, s16
2200 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
2201 ; CHECK-SD-NOFP16-NEXT:    fcvt h7, s19
2202 ; CHECK-SD-NOFP16-NEXT:    fcvt s18, h20
2203 ; CHECK-SD-NOFP16-NEXT:    fcvt s19, h21
2204 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
2205 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s6
2206 ; CHECK-SD-NOFP16-NEXT:    fcvt h16, s16
2207 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[1], v5.h[0]
2208 ; CHECK-SD-NOFP16-NEXT:    frintx s5, s17
2209 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[1], v7.h[0]
2210 ; CHECK-SD-NOFP16-NEXT:    mov h7, v0.h[5]
2211 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[5]
2212 ; CHECK-SD-NOFP16-NEXT:    frintx s18, s18
2213 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[2], v4.h[0]
2214 ; CHECK-SD-NOFP16-NEXT:    frintx s4, s19
2215 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s5
2216 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[2], v6.h[0]
2217 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[6]
2218 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
2219 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
2220 ; CHECK-SD-NOFP16-NEXT:    mov h19, v1.h[6]
2221 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
2222 ; CHECK-SD-NOFP16-NEXT:    mov h1, v1.h[7]
2223 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[3], v16.h[0]
2224 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
2225 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[3], v5.h[0]
2226 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
2227 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h6
2228 ; CHECK-SD-NOFP16-NEXT:    frintx s7, s7
2229 ; CHECK-SD-NOFP16-NEXT:    frintx s16, s17
2230 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h19
2231 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
2232 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
2233 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[4], v5.h[0]
2234 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[4], v4.h[0]
2235 ; CHECK-SD-NOFP16-NEXT:    frintx s4, s6
2236 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
2237 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s16
2238 ; CHECK-SD-NOFP16-NEXT:    frintx s7, s17
2239 ; CHECK-SD-NOFP16-NEXT:    frintx s0, s0
2240 ; CHECK-SD-NOFP16-NEXT:    frintx s1, s1
2241 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
2242 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[5], v5.h[0]
2243 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[5], v6.h[0]
2244 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
2245 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2246 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
2247 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[6], v4.h[0]
2248 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[6], v5.h[0]
2249 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[7], v0.h[0]
2250 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[7], v1.h[0]
2251 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v2.16b
2252 ; CHECK-SD-NOFP16-NEXT:    mov v1.16b, v3.16b
2253 ; CHECK-SD-NOFP16-NEXT:    ret
2255 ; CHECK-SD-FP16-LABEL: rint_v16f16:
2256 ; CHECK-SD-FP16:       // %bb.0: // %entry
2257 ; CHECK-SD-FP16-NEXT:    frintx v0.8h, v0.8h
2258 ; CHECK-SD-FP16-NEXT:    frintx v1.8h, v1.8h
2259 ; CHECK-SD-FP16-NEXT:    ret
2261 ; CHECK-GI-NOFP16-LABEL: rint_v16f16:
2262 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
2263 ; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
2264 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
2265 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
2266 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
2267 ; CHECK-GI-NOFP16-NEXT:    frintx v2.4s, v2.4s
2268 ; CHECK-GI-NOFP16-NEXT:    frintx v3.4s, v3.4s
2269 ; CHECK-GI-NOFP16-NEXT:    frintx v4.4s, v0.4s
2270 ; CHECK-GI-NOFP16-NEXT:    frintx v5.4s, v1.4s
2271 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
2272 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
2273 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
2274 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
2275 ; CHECK-GI-NOFP16-NEXT:    ret
2277 ; CHECK-GI-FP16-LABEL: rint_v16f16:
2278 ; CHECK-GI-FP16:       // %bb.0: // %entry
2279 ; CHECK-GI-FP16-NEXT:    frintx v0.8h, v0.8h
2280 ; CHECK-GI-FP16-NEXT:    frintx v1.8h, v1.8h
2281 ; CHECK-GI-FP16-NEXT:    ret
2282 entry:
2283   %c = call <16 x half> @llvm.rint.v16f16(<16 x half> %a)
2284   ret <16 x half> %c
2287 define double @round_f64(double %a) {
2288 ; CHECK-LABEL: round_f64:
2289 ; CHECK:       // %bb.0: // %entry
2290 ; CHECK-NEXT:    frinta d0, d0
2291 ; CHECK-NEXT:    ret
2292 entry:
2293   %c = call double @llvm.round.f64(double %a)
2294   ret double %c
2297 define float @round_f32(float %a) {
2298 ; CHECK-LABEL: round_f32:
2299 ; CHECK:       // %bb.0: // %entry
2300 ; CHECK-NEXT:    frinta s0, s0
2301 ; CHECK-NEXT:    ret
2302 entry:
2303   %c = call float @llvm.round.f32(float %a)
2304   ret float %c
2307 define half @round_f16(half %a) {
2308 ; CHECK-SD-NOFP16-LABEL: round_f16:
2309 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
2310 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
2311 ; CHECK-SD-NOFP16-NEXT:    frinta s0, s0
2312 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2313 ; CHECK-SD-NOFP16-NEXT:    ret
2315 ; CHECK-SD-FP16-LABEL: round_f16:
2316 ; CHECK-SD-FP16:       // %bb.0: // %entry
2317 ; CHECK-SD-FP16-NEXT:    frinta h0, h0
2318 ; CHECK-SD-FP16-NEXT:    ret
2320 ; CHECK-GI-NOFP16-LABEL: round_f16:
2321 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
2322 ; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
2323 ; CHECK-GI-NOFP16-NEXT:    frinta s0, s0
2324 ; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
2325 ; CHECK-GI-NOFP16-NEXT:    ret
2327 ; CHECK-GI-FP16-LABEL: round_f16:
2328 ; CHECK-GI-FP16:       // %bb.0: // %entry
2329 ; CHECK-GI-FP16-NEXT:    frinta h0, h0
2330 ; CHECK-GI-FP16-NEXT:    ret
2331 entry:
2332   %c = call half @llvm.round.f16(half %a)
2333   ret half %c
2336 define <2 x double> @round_v2f64(<2 x double> %a) {
2337 ; CHECK-LABEL: round_v2f64:
2338 ; CHECK:       // %bb.0: // %entry
2339 ; CHECK-NEXT:    frinta v0.2d, v0.2d
2340 ; CHECK-NEXT:    ret
2341 entry:
2342   %c = call <2 x double> @llvm.round.v2f64(<2 x double> %a)
2343   ret <2 x double> %c
2346 define <3 x double> @round_v3f64(<3 x double> %a) {
2347 ; CHECK-SD-LABEL: round_v3f64:
2348 ; CHECK-SD:       // %bb.0: // %entry
2349 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
2350 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
2351 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
2352 ; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
2353 ; CHECK-SD-NEXT:    frinta v2.2d, v2.2d
2354 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
2355 ; CHECK-SD-NEXT:    frinta v0.2d, v0.2d
2356 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
2357 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
2358 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
2359 ; CHECK-SD-NEXT:    ret
2361 ; CHECK-GI-LABEL: round_v3f64:
2362 ; CHECK-GI:       // %bb.0: // %entry
2363 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
2364 ; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
2365 ; CHECK-GI-NEXT:    frinta d2, d2
2366 ; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
2367 ; CHECK-GI-NEXT:    frinta v0.2d, v0.2d
2368 ; CHECK-GI-NEXT:    mov d1, v0.d[1]
2369 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
2370 ; CHECK-GI-NEXT:    ret
2371 entry:
2372   %c = call <3 x double> @llvm.round.v3f64(<3 x double> %a)
2373   ret <3 x double> %c
2376 define <4 x double> @round_v4f64(<4 x double> %a) {
2377 ; CHECK-LABEL: round_v4f64:
2378 ; CHECK:       // %bb.0: // %entry
2379 ; CHECK-NEXT:    frinta v0.2d, v0.2d
2380 ; CHECK-NEXT:    frinta v1.2d, v1.2d
2381 ; CHECK-NEXT:    ret
2382 entry:
2383   %c = call <4 x double> @llvm.round.v4f64(<4 x double> %a)
2384   ret <4 x double> %c
2387 define <2 x float> @round_v2f32(<2 x float> %a) {
2388 ; CHECK-LABEL: round_v2f32:
2389 ; CHECK:       // %bb.0: // %entry
2390 ; CHECK-NEXT:    frinta v0.2s, v0.2s
2391 ; CHECK-NEXT:    ret
2392 entry:
2393   %c = call <2 x float> @llvm.round.v2f32(<2 x float> %a)
2394   ret <2 x float> %c
2397 define <3 x float> @round_v3f32(<3 x float> %a) {
2398 ; CHECK-LABEL: round_v3f32:
2399 ; CHECK:       // %bb.0: // %entry
2400 ; CHECK-NEXT:    frinta v0.4s, v0.4s
2401 ; CHECK-NEXT:    ret
2402 entry:
2403   %c = call <3 x float> @llvm.round.v3f32(<3 x float> %a)
2404   ret <3 x float> %c
2407 define <4 x float> @round_v4f32(<4 x float> %a) {
2408 ; CHECK-LABEL: round_v4f32:
2409 ; CHECK:       // %bb.0: // %entry
2410 ; CHECK-NEXT:    frinta v0.4s, v0.4s
2411 ; CHECK-NEXT:    ret
2412 entry:
2413   %c = call <4 x float> @llvm.round.v4f32(<4 x float> %a)
2414   ret <4 x float> %c
2417 define <8 x float> @round_v8f32(<8 x float> %a) {
2418 ; CHECK-LABEL: round_v8f32:
2419 ; CHECK:       // %bb.0: // %entry
2420 ; CHECK-NEXT:    frinta v0.4s, v0.4s
2421 ; CHECK-NEXT:    frinta v1.4s, v1.4s
2422 ; CHECK-NEXT:    ret
2423 entry:
2424   %c = call <8 x float> @llvm.round.v8f32(<8 x float> %a)
2425   ret <8 x float> %c
2428 define <7 x half> @round_v7f16(<7 x half> %a) {
2429 ; CHECK-SD-NOFP16-LABEL: round_v7f16:
2430 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
2431 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
2432 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
2433 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
2434 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
2435 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
2436 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
2437 ; CHECK-SD-NOFP16-NEXT:    frinta s2, s2
2438 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
2439 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
2440 ; CHECK-SD-NOFP16-NEXT:    frinta s5, s1
2441 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
2442 ; CHECK-SD-NOFP16-NEXT:    frinta s2, s3
2443 ; CHECK-SD-NOFP16-NEXT:    frinta s4, s4
2444 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
2445 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
2446 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
2447 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
2448 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
2449 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
2450 ; CHECK-SD-NOFP16-NEXT:    frinta s5, s5
2451 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
2452 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
2453 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
2454 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
2455 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
2456 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
2457 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
2458 ; CHECK-SD-NOFP16-NEXT:    frinta s3, s3
2459 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
2460 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
2461 ; CHECK-SD-NOFP16-NEXT:    frinta s2, s2
2462 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
2463 ; CHECK-SD-NOFP16-NEXT:    frinta s0, s0
2464 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
2465 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
2466 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2467 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
2468 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
2469 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
2470 ; CHECK-SD-NOFP16-NEXT:    ret
2472 ; CHECK-SD-FP16-LABEL: round_v7f16:
2473 ; CHECK-SD-FP16:       // %bb.0: // %entry
2474 ; CHECK-SD-FP16-NEXT:    frinta v0.8h, v0.8h
2475 ; CHECK-SD-FP16-NEXT:    ret
2477 ; CHECK-GI-NOFP16-LABEL: round_v7f16:
2478 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
2479 ; CHECK-GI-NOFP16-NEXT:    mov h1, v0.h[4]
2480 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[5]
2481 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v0.4h
2482 ; CHECK-GI-NOFP16-NEXT:    mov h0, v0.h[6]
2483 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[1], v2.h[0]
2484 ; CHECK-GI-NOFP16-NEXT:    frinta v2.4s, v3.4s
2485 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[2], v0.h[0]
2486 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
2487 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[3], v0.h[0]
2488 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[1]
2489 ; CHECK-GI-NOFP16-NEXT:    mov h3, v0.h[2]
2490 ; CHECK-GI-NOFP16-NEXT:    mov h4, v0.h[3]
2491 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v1.4h
2492 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v2.h[0]
2493 ; CHECK-GI-NOFP16-NEXT:    frinta v1.4s, v1.4s
2494 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v3.h[0]
2495 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
2496 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v4.h[0]
2497 ; CHECK-GI-NOFP16-NEXT:    mov h2, v1.h[1]
2498 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v1.h[0]
2499 ; CHECK-GI-NOFP16-NEXT:    mov h1, v1.h[2]
2500 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[0]
2501 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v1.h[0]
2502 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[7], v0.h[0]
2503 ; CHECK-GI-NOFP16-NEXT:    ret
2505 ; CHECK-GI-FP16-LABEL: round_v7f16:
2506 ; CHECK-GI-FP16:       // %bb.0: // %entry
2507 ; CHECK-GI-FP16-NEXT:    frinta v0.8h, v0.8h
2508 ; CHECK-GI-FP16-NEXT:    ret
2509 entry:
2510   %c = call <7 x half> @llvm.round.v7f16(<7 x half> %a)
2511   ret <7 x half> %c
2514 define <4 x half> @round_v4f16(<4 x half> %a) {
2515 ; CHECK-SD-NOFP16-LABEL: round_v4f16:
2516 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
2517 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
2518 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
2519 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
2520 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
2521 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
2522 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
2523 ; CHECK-SD-NOFP16-NEXT:    frinta s0, s2
2524 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h3
2525 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h4
2526 ; CHECK-SD-NOFP16-NEXT:    frinta s1, s1
2527 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2528 ; CHECK-SD-NOFP16-NEXT:    frinta s2, s2
2529 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
2530 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
2531 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
2532 ; CHECK-SD-NOFP16-NEXT:    frinta s2, s3
2533 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[2], v1.h[0]
2534 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
2535 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[3], v1.h[0]
2536 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
2537 ; CHECK-SD-NOFP16-NEXT:    ret
2539 ; CHECK-SD-FP16-LABEL: round_v4f16:
2540 ; CHECK-SD-FP16:       // %bb.0: // %entry
2541 ; CHECK-SD-FP16-NEXT:    frinta v0.4h, v0.4h
2542 ; CHECK-SD-FP16-NEXT:    ret
2544 ; CHECK-GI-NOFP16-LABEL: round_v4f16:
2545 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
2546 ; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
2547 ; CHECK-GI-NOFP16-NEXT:    frinta v0.4s, v0.4s
2548 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
2549 ; CHECK-GI-NOFP16-NEXT:    ret
2551 ; CHECK-GI-FP16-LABEL: round_v4f16:
2552 ; CHECK-GI-FP16:       // %bb.0: // %entry
2553 ; CHECK-GI-FP16-NEXT:    frinta v0.4h, v0.4h
2554 ; CHECK-GI-FP16-NEXT:    ret
2555 entry:
2556   %c = call <4 x half> @llvm.round.v4f16(<4 x half> %a)
2557   ret <4 x half> %c
2560 define <8 x half> @round_v8f16(<8 x half> %a) {
2561 ; CHECK-SD-NOFP16-LABEL: round_v8f16:
2562 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
2563 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
2564 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
2565 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
2566 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
2567 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
2568 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
2569 ; CHECK-SD-NOFP16-NEXT:    frinta s2, s2
2570 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
2571 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
2572 ; CHECK-SD-NOFP16-NEXT:    frinta s5, s1
2573 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
2574 ; CHECK-SD-NOFP16-NEXT:    frinta s2, s3
2575 ; CHECK-SD-NOFP16-NEXT:    frinta s4, s4
2576 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
2577 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
2578 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
2579 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
2580 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
2581 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
2582 ; CHECK-SD-NOFP16-NEXT:    frinta s5, s5
2583 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
2584 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
2585 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
2586 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
2587 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
2588 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
2589 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
2590 ; CHECK-SD-NOFP16-NEXT:    frinta s3, s3
2591 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
2592 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
2593 ; CHECK-SD-NOFP16-NEXT:    frinta s2, s2
2594 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
2595 ; CHECK-SD-NOFP16-NEXT:    frinta s0, s0
2596 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
2597 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
2598 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2599 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
2600 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
2601 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
2602 ; CHECK-SD-NOFP16-NEXT:    ret
2604 ; CHECK-SD-FP16-LABEL: round_v8f16:
2605 ; CHECK-SD-FP16:       // %bb.0: // %entry
2606 ; CHECK-SD-FP16-NEXT:    frinta v0.8h, v0.8h
2607 ; CHECK-SD-FP16-NEXT:    ret
2609 ; CHECK-GI-NOFP16-LABEL: round_v8f16:
2610 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
2611 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
2612 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
2613 ; CHECK-GI-NOFP16-NEXT:    frinta v1.4s, v1.4s
2614 ; CHECK-GI-NOFP16-NEXT:    frinta v2.4s, v0.4s
2615 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
2616 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
2617 ; CHECK-GI-NOFP16-NEXT:    ret
2619 ; CHECK-GI-FP16-LABEL: round_v8f16:
2620 ; CHECK-GI-FP16:       // %bb.0: // %entry
2621 ; CHECK-GI-FP16-NEXT:    frinta v0.8h, v0.8h
2622 ; CHECK-GI-FP16-NEXT:    ret
2623 entry:
2624   %c = call <8 x half> @llvm.round.v8f16(<8 x half> %a)
2625   ret <8 x half> %c
2628 define <16 x half> @round_v16f16(<16 x half> %a) {
2629 ; CHECK-SD-NOFP16-LABEL: round_v16f16:
2630 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
2631 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[1]
2632 ; CHECK-SD-NOFP16-NEXT:    mov h3, v1.h[1]
2633 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h0
2634 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[2]
2635 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h1
2636 ; CHECK-SD-NOFP16-NEXT:    mov h7, v1.h[2]
2637 ; CHECK-SD-NOFP16-NEXT:    mov h16, v0.h[3]
2638 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[3]
2639 ; CHECK-SD-NOFP16-NEXT:    mov h20, v0.h[4]
2640 ; CHECK-SD-NOFP16-NEXT:    mov h21, v1.h[4]
2641 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
2642 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
2643 ; CHECK-SD-NOFP16-NEXT:    frinta s4, s4
2644 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
2645 ; CHECK-SD-NOFP16-NEXT:    frinta s6, s6
2646 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
2647 ; CHECK-SD-NOFP16-NEXT:    fcvt s16, h16
2648 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
2649 ; CHECK-SD-NOFP16-NEXT:    frinta s18, s2
2650 ; CHECK-SD-NOFP16-NEXT:    frinta s19, s3
2651 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s4
2652 ; CHECK-SD-NOFP16-NEXT:    frinta s4, s5
2653 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s6
2654 ; CHECK-SD-NOFP16-NEXT:    frinta s6, s7
2655 ; CHECK-SD-NOFP16-NEXT:    frinta s16, s16
2656 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
2657 ; CHECK-SD-NOFP16-NEXT:    fcvt h7, s19
2658 ; CHECK-SD-NOFP16-NEXT:    fcvt s18, h20
2659 ; CHECK-SD-NOFP16-NEXT:    fcvt s19, h21
2660 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
2661 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s6
2662 ; CHECK-SD-NOFP16-NEXT:    fcvt h16, s16
2663 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[1], v5.h[0]
2664 ; CHECK-SD-NOFP16-NEXT:    frinta s5, s17
2665 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[1], v7.h[0]
2666 ; CHECK-SD-NOFP16-NEXT:    mov h7, v0.h[5]
2667 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[5]
2668 ; CHECK-SD-NOFP16-NEXT:    frinta s18, s18
2669 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[2], v4.h[0]
2670 ; CHECK-SD-NOFP16-NEXT:    frinta s4, s19
2671 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s5
2672 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[2], v6.h[0]
2673 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[6]
2674 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
2675 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
2676 ; CHECK-SD-NOFP16-NEXT:    mov h19, v1.h[6]
2677 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
2678 ; CHECK-SD-NOFP16-NEXT:    mov h1, v1.h[7]
2679 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[3], v16.h[0]
2680 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
2681 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[3], v5.h[0]
2682 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
2683 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h6
2684 ; CHECK-SD-NOFP16-NEXT:    frinta s7, s7
2685 ; CHECK-SD-NOFP16-NEXT:    frinta s16, s17
2686 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h19
2687 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
2688 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
2689 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[4], v5.h[0]
2690 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[4], v4.h[0]
2691 ; CHECK-SD-NOFP16-NEXT:    frinta s4, s6
2692 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
2693 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s16
2694 ; CHECK-SD-NOFP16-NEXT:    frinta s7, s17
2695 ; CHECK-SD-NOFP16-NEXT:    frinta s0, s0
2696 ; CHECK-SD-NOFP16-NEXT:    frinta s1, s1
2697 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
2698 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[5], v5.h[0]
2699 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[5], v6.h[0]
2700 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
2701 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2702 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
2703 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[6], v4.h[0]
2704 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[6], v5.h[0]
2705 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[7], v0.h[0]
2706 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[7], v1.h[0]
2707 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v2.16b
2708 ; CHECK-SD-NOFP16-NEXT:    mov v1.16b, v3.16b
2709 ; CHECK-SD-NOFP16-NEXT:    ret
2711 ; CHECK-SD-FP16-LABEL: round_v16f16:
2712 ; CHECK-SD-FP16:       // %bb.0: // %entry
2713 ; CHECK-SD-FP16-NEXT:    frinta v0.8h, v0.8h
2714 ; CHECK-SD-FP16-NEXT:    frinta v1.8h, v1.8h
2715 ; CHECK-SD-FP16-NEXT:    ret
2717 ; CHECK-GI-NOFP16-LABEL: round_v16f16:
2718 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
2719 ; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
2720 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
2721 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
2722 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
2723 ; CHECK-GI-NOFP16-NEXT:    frinta v2.4s, v2.4s
2724 ; CHECK-GI-NOFP16-NEXT:    frinta v3.4s, v3.4s
2725 ; CHECK-GI-NOFP16-NEXT:    frinta v4.4s, v0.4s
2726 ; CHECK-GI-NOFP16-NEXT:    frinta v5.4s, v1.4s
2727 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
2728 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
2729 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
2730 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
2731 ; CHECK-GI-NOFP16-NEXT:    ret
2733 ; CHECK-GI-FP16-LABEL: round_v16f16:
2734 ; CHECK-GI-FP16:       // %bb.0: // %entry
2735 ; CHECK-GI-FP16-NEXT:    frinta v0.8h, v0.8h
2736 ; CHECK-GI-FP16-NEXT:    frinta v1.8h, v1.8h
2737 ; CHECK-GI-FP16-NEXT:    ret
2738 entry:
2739   %c = call <16 x half> @llvm.round.v16f16(<16 x half> %a)
2740   ret <16 x half> %c
2743 define double @trunc_f64(double %a) {
2744 ; CHECK-LABEL: trunc_f64:
2745 ; CHECK:       // %bb.0: // %entry
2746 ; CHECK-NEXT:    frintz d0, d0
2747 ; CHECK-NEXT:    ret
2748 entry:
2749   %c = call double @llvm.trunc.f64(double %a)
2750   ret double %c
2753 define float @trunc_f32(float %a) {
2754 ; CHECK-LABEL: trunc_f32:
2755 ; CHECK:       // %bb.0: // %entry
2756 ; CHECK-NEXT:    frintz s0, s0
2757 ; CHECK-NEXT:    ret
2758 entry:
2759   %c = call float @llvm.trunc.f32(float %a)
2760   ret float %c
2763 define half @trunc_f16(half %a) {
2764 ; CHECK-SD-NOFP16-LABEL: trunc_f16:
2765 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
2766 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
2767 ; CHECK-SD-NOFP16-NEXT:    frintz s0, s0
2768 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2769 ; CHECK-SD-NOFP16-NEXT:    ret
2771 ; CHECK-SD-FP16-LABEL: trunc_f16:
2772 ; CHECK-SD-FP16:       // %bb.0: // %entry
2773 ; CHECK-SD-FP16-NEXT:    frintz h0, h0
2774 ; CHECK-SD-FP16-NEXT:    ret
2776 ; CHECK-GI-NOFP16-LABEL: trunc_f16:
2777 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
2778 ; CHECK-GI-NOFP16-NEXT:    fcvt s0, h0
2779 ; CHECK-GI-NOFP16-NEXT:    frintz s0, s0
2780 ; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
2781 ; CHECK-GI-NOFP16-NEXT:    ret
2783 ; CHECK-GI-FP16-LABEL: trunc_f16:
2784 ; CHECK-GI-FP16:       // %bb.0: // %entry
2785 ; CHECK-GI-FP16-NEXT:    frintz h0, h0
2786 ; CHECK-GI-FP16-NEXT:    ret
2787 entry:
2788   %c = call half @llvm.trunc.f16(half %a)
2789   ret half %c
2792 define <2 x double> @trunc_v2f64(<2 x double> %a) {
2793 ; CHECK-LABEL: trunc_v2f64:
2794 ; CHECK:       // %bb.0: // %entry
2795 ; CHECK-NEXT:    frintz v0.2d, v0.2d
2796 ; CHECK-NEXT:    ret
2797 entry:
2798   %c = call <2 x double> @llvm.trunc.v2f64(<2 x double> %a)
2799   ret <2 x double> %c
2802 define <3 x double> @trunc_v3f64(<3 x double> %a) {
2803 ; CHECK-SD-LABEL: trunc_v3f64:
2804 ; CHECK-SD:       // %bb.0: // %entry
2805 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
2806 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
2807 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
2808 ; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
2809 ; CHECK-SD-NEXT:    frintz v2.2d, v2.2d
2810 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
2811 ; CHECK-SD-NEXT:    frintz v0.2d, v0.2d
2812 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
2813 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
2814 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
2815 ; CHECK-SD-NEXT:    ret
2817 ; CHECK-GI-LABEL: trunc_v3f64:
2818 ; CHECK-GI:       // %bb.0: // %entry
2819 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
2820 ; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
2821 ; CHECK-GI-NEXT:    frintz d2, d2
2822 ; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
2823 ; CHECK-GI-NEXT:    frintz v0.2d, v0.2d
2824 ; CHECK-GI-NEXT:    mov d1, v0.d[1]
2825 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
2826 ; CHECK-GI-NEXT:    ret
2827 entry:
2828   %c = call <3 x double> @llvm.trunc.v3f64(<3 x double> %a)
2829   ret <3 x double> %c
2832 define <4 x double> @trunc_v4f64(<4 x double> %a) {
2833 ; CHECK-LABEL: trunc_v4f64:
2834 ; CHECK:       // %bb.0: // %entry
2835 ; CHECK-NEXT:    frintz v0.2d, v0.2d
2836 ; CHECK-NEXT:    frintz v1.2d, v1.2d
2837 ; CHECK-NEXT:    ret
2838 entry:
2839   %c = call <4 x double> @llvm.trunc.v4f64(<4 x double> %a)
2840   ret <4 x double> %c
2843 define <2 x float> @trunc_v2f32(<2 x float> %a) {
2844 ; CHECK-LABEL: trunc_v2f32:
2845 ; CHECK:       // %bb.0: // %entry
2846 ; CHECK-NEXT:    frintz v0.2s, v0.2s
2847 ; CHECK-NEXT:    ret
2848 entry:
2849   %c = call <2 x float> @llvm.trunc.v2f32(<2 x float> %a)
2850   ret <2 x float> %c
2853 define <3 x float> @trunc_v3f32(<3 x float> %a) {
2854 ; CHECK-LABEL: trunc_v3f32:
2855 ; CHECK:       // %bb.0: // %entry
2856 ; CHECK-NEXT:    frintz v0.4s, v0.4s
2857 ; CHECK-NEXT:    ret
2858 entry:
2859   %c = call <3 x float> @llvm.trunc.v3f32(<3 x float> %a)
2860   ret <3 x float> %c
2863 define <4 x float> @trunc_v4f32(<4 x float> %a) {
2864 ; CHECK-LABEL: trunc_v4f32:
2865 ; CHECK:       // %bb.0: // %entry
2866 ; CHECK-NEXT:    frintz v0.4s, v0.4s
2867 ; CHECK-NEXT:    ret
2868 entry:
2869   %c = call <4 x float> @llvm.trunc.v4f32(<4 x float> %a)
2870   ret <4 x float> %c
2873 define <8 x float> @trunc_v8f32(<8 x float> %a) {
2874 ; CHECK-LABEL: trunc_v8f32:
2875 ; CHECK:       // %bb.0: // %entry
2876 ; CHECK-NEXT:    frintz v0.4s, v0.4s
2877 ; CHECK-NEXT:    frintz v1.4s, v1.4s
2878 ; CHECK-NEXT:    ret
2879 entry:
2880   %c = call <8 x float> @llvm.trunc.v8f32(<8 x float> %a)
2881   ret <8 x float> %c
2884 define <7 x half> @trunc_v7f16(<7 x half> %a) {
2885 ; CHECK-SD-NOFP16-LABEL: trunc_v7f16:
2886 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
2887 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
2888 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
2889 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
2890 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
2891 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
2892 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
2893 ; CHECK-SD-NOFP16-NEXT:    frintz s2, s2
2894 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
2895 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
2896 ; CHECK-SD-NOFP16-NEXT:    frintz s5, s1
2897 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
2898 ; CHECK-SD-NOFP16-NEXT:    frintz s2, s3
2899 ; CHECK-SD-NOFP16-NEXT:    frintz s4, s4
2900 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
2901 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
2902 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
2903 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
2904 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
2905 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
2906 ; CHECK-SD-NOFP16-NEXT:    frintz s5, s5
2907 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
2908 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
2909 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
2910 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
2911 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
2912 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
2913 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
2914 ; CHECK-SD-NOFP16-NEXT:    frintz s3, s3
2915 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
2916 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
2917 ; CHECK-SD-NOFP16-NEXT:    frintz s2, s2
2918 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
2919 ; CHECK-SD-NOFP16-NEXT:    frintz s0, s0
2920 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
2921 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
2922 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2923 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
2924 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
2925 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
2926 ; CHECK-SD-NOFP16-NEXT:    ret
2928 ; CHECK-SD-FP16-LABEL: trunc_v7f16:
2929 ; CHECK-SD-FP16:       // %bb.0: // %entry
2930 ; CHECK-SD-FP16-NEXT:    frintz v0.8h, v0.8h
2931 ; CHECK-SD-FP16-NEXT:    ret
2933 ; CHECK-GI-NOFP16-LABEL: trunc_v7f16:
2934 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
2935 ; CHECK-GI-NOFP16-NEXT:    mov h1, v0.h[4]
2936 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[5]
2937 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v0.4h
2938 ; CHECK-GI-NOFP16-NEXT:    mov h0, v0.h[6]
2939 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[1], v2.h[0]
2940 ; CHECK-GI-NOFP16-NEXT:    frintz v2.4s, v3.4s
2941 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[2], v0.h[0]
2942 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
2943 ; CHECK-GI-NOFP16-NEXT:    mov v1.h[3], v0.h[0]
2944 ; CHECK-GI-NOFP16-NEXT:    mov h2, v0.h[1]
2945 ; CHECK-GI-NOFP16-NEXT:    mov h3, v0.h[2]
2946 ; CHECK-GI-NOFP16-NEXT:    mov h4, v0.h[3]
2947 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v1.4h
2948 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v2.h[0]
2949 ; CHECK-GI-NOFP16-NEXT:    frintz v1.4s, v1.4s
2950 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], v3.h[0]
2951 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v1.4s
2952 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[3], v4.h[0]
2953 ; CHECK-GI-NOFP16-NEXT:    mov h2, v1.h[1]
2954 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[4], v1.h[0]
2955 ; CHECK-GI-NOFP16-NEXT:    mov h1, v1.h[2]
2956 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[5], v2.h[0]
2957 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[6], v1.h[0]
2958 ; CHECK-GI-NOFP16-NEXT:    mov v0.h[7], v0.h[0]
2959 ; CHECK-GI-NOFP16-NEXT:    ret
2961 ; CHECK-GI-FP16-LABEL: trunc_v7f16:
2962 ; CHECK-GI-FP16:       // %bb.0: // %entry
2963 ; CHECK-GI-FP16-NEXT:    frintz v0.8h, v0.8h
2964 ; CHECK-GI-FP16-NEXT:    ret
2965 entry:
2966   %c = call <7 x half> @llvm.trunc.v7f16(<7 x half> %a)
2967   ret <7 x half> %c
2970 define <4 x half> @trunc_v4f16(<4 x half> %a) {
2971 ; CHECK-SD-NOFP16-LABEL: trunc_v4f16:
2972 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
2973 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
2974 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
2975 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
2976 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
2977 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
2978 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
2979 ; CHECK-SD-NOFP16-NEXT:    frintz s0, s2
2980 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h3
2981 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h4
2982 ; CHECK-SD-NOFP16-NEXT:    frintz s1, s1
2983 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
2984 ; CHECK-SD-NOFP16-NEXT:    frintz s2, s2
2985 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
2986 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
2987 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
2988 ; CHECK-SD-NOFP16-NEXT:    frintz s2, s3
2989 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[2], v1.h[0]
2990 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
2991 ; CHECK-SD-NOFP16-NEXT:    mov v0.h[3], v1.h[0]
2992 ; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
2993 ; CHECK-SD-NOFP16-NEXT:    ret
2995 ; CHECK-SD-FP16-LABEL: trunc_v4f16:
2996 ; CHECK-SD-FP16:       // %bb.0: // %entry
2997 ; CHECK-SD-FP16-NEXT:    frintz v0.4h, v0.4h
2998 ; CHECK-SD-FP16-NEXT:    ret
3000 ; CHECK-GI-NOFP16-LABEL: trunc_v4f16:
3001 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
3002 ; CHECK-GI-NOFP16-NEXT:    fcvtl v0.4s, v0.4h
3003 ; CHECK-GI-NOFP16-NEXT:    frintz v0.4s, v0.4s
3004 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
3005 ; CHECK-GI-NOFP16-NEXT:    ret
3007 ; CHECK-GI-FP16-LABEL: trunc_v4f16:
3008 ; CHECK-GI-FP16:       // %bb.0: // %entry
3009 ; CHECK-GI-FP16-NEXT:    frintz v0.4h, v0.4h
3010 ; CHECK-GI-FP16-NEXT:    ret
3011 entry:
3012   %c = call <4 x half> @llvm.trunc.v4f16(<4 x half> %a)
3013   ret <4 x half> %c
3016 define <8 x half> @trunc_v8f16(<8 x half> %a) {
3017 ; CHECK-SD-NOFP16-LABEL: trunc_v8f16:
3018 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
3019 ; CHECK-SD-NOFP16-NEXT:    mov h1, v0.h[1]
3020 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h0
3021 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[2]
3022 ; CHECK-SD-NOFP16-NEXT:    mov h4, v0.h[3]
3023 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[4]
3024 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
3025 ; CHECK-SD-NOFP16-NEXT:    frintz s2, s2
3026 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
3027 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h4
3028 ; CHECK-SD-NOFP16-NEXT:    frintz s5, s1
3029 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s2
3030 ; CHECK-SD-NOFP16-NEXT:    frintz s2, s3
3031 ; CHECK-SD-NOFP16-NEXT:    frintz s4, s4
3032 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s5
3033 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h6
3034 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
3035 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
3036 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[1], v3.h[0]
3037 ; CHECK-SD-NOFP16-NEXT:    mov h3, v0.h[5]
3038 ; CHECK-SD-NOFP16-NEXT:    frintz s5, s5
3039 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[2], v2.h[0]
3040 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[6]
3041 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
3042 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
3043 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[3], v4.h[0]
3044 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s5
3045 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
3046 ; CHECK-SD-NOFP16-NEXT:    frintz s3, s3
3047 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
3048 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[4], v4.h[0]
3049 ; CHECK-SD-NOFP16-NEXT:    frintz s2, s2
3050 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s3
3051 ; CHECK-SD-NOFP16-NEXT:    frintz s0, s0
3052 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s2
3053 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[5], v3.h[0]
3054 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
3055 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[6], v2.h[0]
3056 ; CHECK-SD-NOFP16-NEXT:    mov v1.h[7], v0.h[0]
3057 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v1.16b
3058 ; CHECK-SD-NOFP16-NEXT:    ret
3060 ; CHECK-SD-FP16-LABEL: trunc_v8f16:
3061 ; CHECK-SD-FP16:       // %bb.0: // %entry
3062 ; CHECK-SD-FP16-NEXT:    frintz v0.8h, v0.8h
3063 ; CHECK-SD-FP16-NEXT:    ret
3065 ; CHECK-GI-NOFP16-LABEL: trunc_v8f16:
3066 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
3067 ; CHECK-GI-NOFP16-NEXT:    fcvtl v1.4s, v0.4h
3068 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
3069 ; CHECK-GI-NOFP16-NEXT:    frintz v1.4s, v1.4s
3070 ; CHECK-GI-NOFP16-NEXT:    frintz v2.4s, v0.4s
3071 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
3072 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
3073 ; CHECK-GI-NOFP16-NEXT:    ret
3075 ; CHECK-GI-FP16-LABEL: trunc_v8f16:
3076 ; CHECK-GI-FP16:       // %bb.0: // %entry
3077 ; CHECK-GI-FP16-NEXT:    frintz v0.8h, v0.8h
3078 ; CHECK-GI-FP16-NEXT:    ret
3079 entry:
3080   %c = call <8 x half> @llvm.trunc.v8f16(<8 x half> %a)
3081   ret <8 x half> %c
3084 define <16 x half> @trunc_v16f16(<16 x half> %a) {
3085 ; CHECK-SD-NOFP16-LABEL: trunc_v16f16:
3086 ; CHECK-SD-NOFP16:       // %bb.0: // %entry
3087 ; CHECK-SD-NOFP16-NEXT:    mov h2, v0.h[1]
3088 ; CHECK-SD-NOFP16-NEXT:    mov h3, v1.h[1]
3089 ; CHECK-SD-NOFP16-NEXT:    fcvt s4, h0
3090 ; CHECK-SD-NOFP16-NEXT:    mov h5, v0.h[2]
3091 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h1
3092 ; CHECK-SD-NOFP16-NEXT:    mov h7, v1.h[2]
3093 ; CHECK-SD-NOFP16-NEXT:    mov h16, v0.h[3]
3094 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[3]
3095 ; CHECK-SD-NOFP16-NEXT:    mov h20, v0.h[4]
3096 ; CHECK-SD-NOFP16-NEXT:    mov h21, v1.h[4]
3097 ; CHECK-SD-NOFP16-NEXT:    fcvt s2, h2
3098 ; CHECK-SD-NOFP16-NEXT:    fcvt s3, h3
3099 ; CHECK-SD-NOFP16-NEXT:    frintz s4, s4
3100 ; CHECK-SD-NOFP16-NEXT:    fcvt s5, h5
3101 ; CHECK-SD-NOFP16-NEXT:    frintz s6, s6
3102 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
3103 ; CHECK-SD-NOFP16-NEXT:    fcvt s16, h16
3104 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
3105 ; CHECK-SD-NOFP16-NEXT:    frintz s18, s2
3106 ; CHECK-SD-NOFP16-NEXT:    frintz s19, s3
3107 ; CHECK-SD-NOFP16-NEXT:    fcvt h2, s4
3108 ; CHECK-SD-NOFP16-NEXT:    frintz s4, s5
3109 ; CHECK-SD-NOFP16-NEXT:    fcvt h3, s6
3110 ; CHECK-SD-NOFP16-NEXT:    frintz s6, s7
3111 ; CHECK-SD-NOFP16-NEXT:    frintz s16, s16
3112 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
3113 ; CHECK-SD-NOFP16-NEXT:    fcvt h7, s19
3114 ; CHECK-SD-NOFP16-NEXT:    fcvt s18, h20
3115 ; CHECK-SD-NOFP16-NEXT:    fcvt s19, h21
3116 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
3117 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s6
3118 ; CHECK-SD-NOFP16-NEXT:    fcvt h16, s16
3119 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[1], v5.h[0]
3120 ; CHECK-SD-NOFP16-NEXT:    frintz s5, s17
3121 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[1], v7.h[0]
3122 ; CHECK-SD-NOFP16-NEXT:    mov h7, v0.h[5]
3123 ; CHECK-SD-NOFP16-NEXT:    mov h17, v1.h[5]
3124 ; CHECK-SD-NOFP16-NEXT:    frintz s18, s18
3125 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[2], v4.h[0]
3126 ; CHECK-SD-NOFP16-NEXT:    frintz s4, s19
3127 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s5
3128 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[2], v6.h[0]
3129 ; CHECK-SD-NOFP16-NEXT:    mov h6, v0.h[6]
3130 ; CHECK-SD-NOFP16-NEXT:    fcvt s7, h7
3131 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h17
3132 ; CHECK-SD-NOFP16-NEXT:    mov h19, v1.h[6]
3133 ; CHECK-SD-NOFP16-NEXT:    mov h0, v0.h[7]
3134 ; CHECK-SD-NOFP16-NEXT:    mov h1, v1.h[7]
3135 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[3], v16.h[0]
3136 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
3137 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[3], v5.h[0]
3138 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s18
3139 ; CHECK-SD-NOFP16-NEXT:    fcvt s6, h6
3140 ; CHECK-SD-NOFP16-NEXT:    frintz s7, s7
3141 ; CHECK-SD-NOFP16-NEXT:    frintz s16, s17
3142 ; CHECK-SD-NOFP16-NEXT:    fcvt s17, h19
3143 ; CHECK-SD-NOFP16-NEXT:    fcvt s0, h0
3144 ; CHECK-SD-NOFP16-NEXT:    fcvt s1, h1
3145 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[4], v5.h[0]
3146 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[4], v4.h[0]
3147 ; CHECK-SD-NOFP16-NEXT:    frintz s4, s6
3148 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
3149 ; CHECK-SD-NOFP16-NEXT:    fcvt h6, s16
3150 ; CHECK-SD-NOFP16-NEXT:    frintz s7, s17
3151 ; CHECK-SD-NOFP16-NEXT:    frintz s0, s0
3152 ; CHECK-SD-NOFP16-NEXT:    frintz s1, s1
3153 ; CHECK-SD-NOFP16-NEXT:    fcvt h4, s4
3154 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[5], v5.h[0]
3155 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[5], v6.h[0]
3156 ; CHECK-SD-NOFP16-NEXT:    fcvt h5, s7
3157 ; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
3158 ; CHECK-SD-NOFP16-NEXT:    fcvt h1, s1
3159 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[6], v4.h[0]
3160 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[6], v5.h[0]
3161 ; CHECK-SD-NOFP16-NEXT:    mov v2.h[7], v0.h[0]
3162 ; CHECK-SD-NOFP16-NEXT:    mov v3.h[7], v1.h[0]
3163 ; CHECK-SD-NOFP16-NEXT:    mov v0.16b, v2.16b
3164 ; CHECK-SD-NOFP16-NEXT:    mov v1.16b, v3.16b
3165 ; CHECK-SD-NOFP16-NEXT:    ret
3167 ; CHECK-SD-FP16-LABEL: trunc_v16f16:
3168 ; CHECK-SD-FP16:       // %bb.0: // %entry
3169 ; CHECK-SD-FP16-NEXT:    frintz v0.8h, v0.8h
3170 ; CHECK-SD-FP16-NEXT:    frintz v1.8h, v1.8h
3171 ; CHECK-SD-FP16-NEXT:    ret
3173 ; CHECK-GI-NOFP16-LABEL: trunc_v16f16:
3174 ; CHECK-GI-NOFP16:       // %bb.0: // %entry
3175 ; CHECK-GI-NOFP16-NEXT:    fcvtl v2.4s, v0.4h
3176 ; CHECK-GI-NOFP16-NEXT:    fcvtl v3.4s, v1.4h
3177 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v0.4s, v0.8h
3178 ; CHECK-GI-NOFP16-NEXT:    fcvtl2 v1.4s, v1.8h
3179 ; CHECK-GI-NOFP16-NEXT:    frintz v2.4s, v2.4s
3180 ; CHECK-GI-NOFP16-NEXT:    frintz v3.4s, v3.4s
3181 ; CHECK-GI-NOFP16-NEXT:    frintz v4.4s, v0.4s
3182 ; CHECK-GI-NOFP16-NEXT:    frintz v5.4s, v1.4s
3183 ; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
3184 ; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
3185 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
3186 ; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
3187 ; CHECK-GI-NOFP16-NEXT:    ret
3189 ; CHECK-GI-FP16-LABEL: trunc_v16f16:
3190 ; CHECK-GI-FP16:       // %bb.0: // %entry
3191 ; CHECK-GI-FP16-NEXT:    frintz v0.8h, v0.8h
3192 ; CHECK-GI-FP16-NEXT:    frintz v1.8h, v1.8h
3193 ; CHECK-GI-FP16-NEXT:    ret
3194 entry:
3195   %c = call <16 x half> @llvm.trunc.v16f16(<16 x half> %a)
3196   ret <16 x half> %c
3199 declare <16 x half> @llvm.ceil.v16f16(<16 x half>)
3200 declare <16 x half> @llvm.floor.v16f16(<16 x half>)
3201 declare <16 x half> @llvm.nearbyint.v16f16(<16 x half>)
3202 declare <16 x half> @llvm.rint.v16f16(<16 x half>)
3203 declare <16 x half> @llvm.round.v16f16(<16 x half>)
3204 declare <16 x half> @llvm.roundeven.v16f16(<16 x half>)
3205 declare <16 x half> @llvm.trunc.v16f16(<16 x half>)
3206 declare <2 x double> @llvm.ceil.v2f64(<2 x double>)
3207 declare <2 x double> @llvm.floor.v2f64(<2 x double>)
3208 declare <2 x double> @llvm.nearbyint.v2f64(<2 x double>)
3209 declare <2 x double> @llvm.rint.v2f64(<2 x double>)
3210 declare <2 x double> @llvm.round.v2f64(<2 x double>)
3211 declare <2 x double> @llvm.roundeven.v2f64(<2 x double>)
3212 declare <2 x double> @llvm.trunc.v2f64(<2 x double>)
3213 declare <2 x float> @llvm.ceil.v2f32(<2 x float>)
3214 declare <2 x float> @llvm.floor.v2f32(<2 x float>)
3215 declare <2 x float> @llvm.nearbyint.v2f32(<2 x float>)
3216 declare <2 x float> @llvm.rint.v2f32(<2 x float>)
3217 declare <2 x float> @llvm.round.v2f32(<2 x float>)
3218 declare <2 x float> @llvm.roundeven.v2f32(<2 x float>)
3219 declare <2 x float> @llvm.trunc.v2f32(<2 x float>)
3220 declare <3 x double> @llvm.ceil.v3f64(<3 x double>)
3221 declare <3 x double> @llvm.floor.v3f64(<3 x double>)
3222 declare <3 x double> @llvm.nearbyint.v3f64(<3 x double>)
3223 declare <3 x double> @llvm.rint.v3f64(<3 x double>)
3224 declare <3 x double> @llvm.round.v3f64(<3 x double>)
3225 declare <3 x double> @llvm.roundeven.v3f64(<3 x double>)
3226 declare <3 x double> @llvm.trunc.v3f64(<3 x double>)
3227 declare <3 x float> @llvm.ceil.v3f32(<3 x float>)
3228 declare <3 x float> @llvm.floor.v3f32(<3 x float>)
3229 declare <3 x float> @llvm.nearbyint.v3f32(<3 x float>)
3230 declare <3 x float> @llvm.rint.v3f32(<3 x float>)
3231 declare <3 x float> @llvm.round.v3f32(<3 x float>)
3232 declare <3 x float> @llvm.roundeven.v3f32(<3 x float>)
3233 declare <3 x float> @llvm.trunc.v3f32(<3 x float>)
3234 declare <4 x double> @llvm.ceil.v4f64(<4 x double>)
3235 declare <4 x double> @llvm.floor.v4f64(<4 x double>)
3236 declare <4 x double> @llvm.nearbyint.v4f64(<4 x double>)
3237 declare <4 x double> @llvm.rint.v4f64(<4 x double>)
3238 declare <4 x double> @llvm.round.v4f64(<4 x double>)
3239 declare <4 x double> @llvm.roundeven.v4f64(<4 x double>)
3240 declare <4 x double> @llvm.trunc.v4f64(<4 x double>)
3241 declare <4 x float> @llvm.ceil.v4f32(<4 x float>)
3242 declare <4 x float> @llvm.floor.v4f32(<4 x float>)
3243 declare <4 x float> @llvm.nearbyint.v4f32(<4 x float>)
3244 declare <4 x float> @llvm.rint.v4f32(<4 x float>)
3245 declare <4 x float> @llvm.round.v4f32(<4 x float>)
3246 declare <4 x float> @llvm.roundeven.v4f32(<4 x float>)
3247 declare <4 x float> @llvm.trunc.v4f32(<4 x float>)
3248 declare <4 x half> @llvm.ceil.v4f16(<4 x half>)
3249 declare <4 x half> @llvm.floor.v4f16(<4 x half>)
3250 declare <4 x half> @llvm.nearbyint.v4f16(<4 x half>)
3251 declare <4 x half> @llvm.rint.v4f16(<4 x half>)
3252 declare <4 x half> @llvm.round.v4f16(<4 x half>)
3253 declare <4 x half> @llvm.roundeven.v4f16(<4 x half>)
3254 declare <4 x half> @llvm.trunc.v4f16(<4 x half>)
3255 declare <7 x half> @llvm.ceil.v7f16(<7 x half>)
3256 declare <7 x half> @llvm.floor.v7f16(<7 x half>)
3257 declare <7 x half> @llvm.nearbyint.v7f16(<7 x half>)
3258 declare <7 x half> @llvm.rint.v7f16(<7 x half>)
3259 declare <7 x half> @llvm.round.v7f16(<7 x half>)
3260 declare <7 x half> @llvm.roundeven.v7f16(<7 x half>)
3261 declare <7 x half> @llvm.trunc.v7f16(<7 x half>)
3262 declare <8 x float> @llvm.ceil.v8f32(<8 x float>)
3263 declare <8 x float> @llvm.floor.v8f32(<8 x float>)
3264 declare <8 x float> @llvm.nearbyint.v8f32(<8 x float>)
3265 declare <8 x float> @llvm.rint.v8f32(<8 x float>)
3266 declare <8 x float> @llvm.round.v8f32(<8 x float>)
3267 declare <8 x float> @llvm.roundeven.v8f32(<8 x float>)
3268 declare <8 x float> @llvm.trunc.v8f32(<8 x float>)
3269 declare <8 x half> @llvm.ceil.v8f16(<8 x half>)
3270 declare <8 x half> @llvm.floor.v8f16(<8 x half>)
3271 declare <8 x half> @llvm.nearbyint.v8f16(<8 x half>)
3272 declare <8 x half> @llvm.rint.v8f16(<8 x half>)
3273 declare <8 x half> @llvm.round.v8f16(<8 x half>)
3274 declare <8 x half> @llvm.roundeven.v8f16(<8 x half>)
3275 declare <8 x half> @llvm.trunc.v8f16(<8 x half>)
3276 declare double @llvm.ceil.f64(double)
3277 declare double @llvm.floor.f64(double)
3278 declare double @llvm.nearbyint.f64(double)
3279 declare double @llvm.rint.f64(double)
3280 declare double @llvm.round.f64(double)
3281 declare double @llvm.roundeven.f64(double)
3282 declare double @llvm.trunc.f64(double)
3283 declare float @llvm.ceil.f32(float)
3284 declare float @llvm.floor.f32(float)
3285 declare float @llvm.nearbyint.f32(float)
3286 declare float @llvm.rint.f32(float)
3287 declare float @llvm.round.f32(float)
3288 declare float @llvm.roundeven.f32(float)
3289 declare float @llvm.trunc.f32(float)
3290 declare half @llvm.ceil.f16(half)
3291 declare half @llvm.floor.f16(half)
3292 declare half @llvm.nearbyint.f16(half)
3293 declare half @llvm.rint.f16(half)
3294 declare half @llvm.round.f16(half)
3295 declare half @llvm.roundeven.f16(half)
3296 declare half @llvm.trunc.f16(half)