[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / vector-fcopysign.ll
blobc7134508883b113cd9311a63c33532e44935b96e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple aarch64-apple-darwin | FileCheck --check-prefixes=CHECK,NOFP16 %s
3 ; RUN: llc < %s -mtriple aarch64-apple-darwin -mattr=+v8.2a,+fullfp16 | FileCheck --check-prefixes=CHECK,FP16 %s
5 target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
7 ;============ v1f32
9 ; WidenVecRes same
10 define <1 x float> @test_copysign_v1f32_v1f32(<1 x float> %a, <1 x float> %b) #0 {
11 ; CHECK-LABEL: test_copysign_v1f32_v1f32:
12 ; CHECK:       ; %bb.0:
13 ; CHECK-NEXT:    mvni.2s v2, #128, lsl #24
14 ; CHECK-NEXT:    bif.8b v0, v1, v2
15 ; CHECK-NEXT:    ret
16   %r = call <1 x float> @llvm.copysign.v1f32(<1 x float> %a, <1 x float> %b)
17   ret <1 x float> %r
20 ; WidenVecRes mismatched
21 define <1 x float> @test_copysign_v1f32_v1f64(<1 x float> %a, <1 x double> %b) #0 {
22 ; CHECK-LABEL: test_copysign_v1f32_v1f64:
23 ; CHECK:       ; %bb.0:
24 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 def $q1
25 ; CHECK-NEXT:    mvni.2s v2, #128, lsl #24
26 ; CHECK-NEXT:    fcvtn v1.2s, v1.2d
27 ; CHECK-NEXT:    bif.8b v0, v1, v2
28 ; CHECK-NEXT:    ret
29   %tmp0 = fptrunc <1 x double> %b to <1 x float>
30   %r = call <1 x float> @llvm.copysign.v1f32(<1 x float> %a, <1 x float> %tmp0)
31   ret <1 x float> %r
34 declare <1 x float> @llvm.copysign.v1f32(<1 x float> %a, <1 x float> %b) #0
36 ;============ v1f64
38 ; WidenVecOp #1
39 define <1 x double> @test_copysign_v1f64_v1f32(<1 x double> %a, <1 x float> %b) #0 {
40 ; CHECK-LABEL: test_copysign_v1f64_v1f32:
41 ; CHECK:       ; %bb.0:
42 ; CHECK-NEXT:    movi.2d v2, #0xffffffffffffffff
43 ; CHECK-NEXT:    fcvtl v1.2d, v1.2s
44 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
45 ; CHECK-NEXT:    fneg.2d v2, v2
46 ; CHECK-NEXT:    bif.16b v0, v1, v2
47 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
48 ; CHECK-NEXT:    ret
49   %tmp0 = fpext <1 x float> %b to <1 x double>
50   %r = call <1 x double> @llvm.copysign.v1f64(<1 x double> %a, <1 x double> %tmp0)
51   ret <1 x double> %r
54 define <1 x double> @test_copysign_v1f64_v1f64(<1 x double> %a, <1 x double> %b) #0 {
55 ; CHECK-LABEL: test_copysign_v1f64_v1f64:
56 ; CHECK:       ; %bb.0:
57 ; CHECK-NEXT:    movi.2d v2, #0xffffffffffffffff
58 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
59 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 def $q1
60 ; CHECK-NEXT:    fneg.2d v2, v2
61 ; CHECK-NEXT:    bif.16b v0, v1, v2
62 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
63 ; CHECK-NEXT:    ret
64   %r = call <1 x double> @llvm.copysign.v1f64(<1 x double> %a, <1 x double> %b)
65   ret <1 x double> %r
68 declare <1 x double> @llvm.copysign.v1f64(<1 x double> %a, <1 x double> %b) #0
70 ;============ v2f32
72 define <2 x float> @test_copysign_v2f32_v2f32(<2 x float> %a, <2 x float> %b) #0 {
73 ; CHECK-LABEL: test_copysign_v2f32_v2f32:
74 ; CHECK:       ; %bb.0:
75 ; CHECK-NEXT:    mvni.2s v2, #128, lsl #24
76 ; CHECK-NEXT:    bif.8b v0, v1, v2
77 ; CHECK-NEXT:    ret
78   %r = call <2 x float> @llvm.copysign.v2f32(<2 x float> %a, <2 x float> %b)
79   ret <2 x float> %r
82 define <2 x float> @test_copysign_v2f32_v2f64(<2 x float> %a, <2 x double> %b) #0 {
83 ; CHECK-LABEL: test_copysign_v2f32_v2f64:
84 ; CHECK:       ; %bb.0:
85 ; CHECK-NEXT:    fcvtn v1.2s, v1.2d
86 ; CHECK-NEXT:    mvni.2s v2, #128, lsl #24
87 ; CHECK-NEXT:    bif.8b v0, v1, v2
88 ; CHECK-NEXT:    ret
89   %tmp0 = fptrunc <2 x double> %b to <2 x float>
90   %r = call <2 x float> @llvm.copysign.v2f32(<2 x float> %a, <2 x float> %tmp0)
91   ret <2 x float> %r
94 declare <2 x float> @llvm.copysign.v2f32(<2 x float> %a, <2 x float> %b) #0
96 ;============ v4f32
98 define <4 x float> @test_copysign_v4f32_v4f32(<4 x float> %a, <4 x float> %b) #0 {
99 ; CHECK-LABEL: test_copysign_v4f32_v4f32:
100 ; CHECK:       ; %bb.0:
101 ; CHECK-NEXT:    mvni.4s v2, #128, lsl #24
102 ; CHECK-NEXT:    bif.16b v0, v1, v2
103 ; CHECK-NEXT:    ret
104   %r = call <4 x float> @llvm.copysign.v4f32(<4 x float> %a, <4 x float> %b)
105   ret <4 x float> %r
108 ; SplitVecOp #1
109 define <4 x float> @test_copysign_v4f32_v4f64(<4 x float> %a, <4 x double> %b) #0 {
110 ; CHECK-LABEL: test_copysign_v4f32_v4f64:
111 ; CHECK:       ; %bb.0:
112 ; CHECK-NEXT:    fcvtn v1.2s, v1.2d
113 ; CHECK-NEXT:    fcvtn2 v1.4s, v2.2d
114 ; CHECK-NEXT:    mvni.4s v2, #128, lsl #24
115 ; CHECK-NEXT:    bif.16b v0, v1, v2
116 ; CHECK-NEXT:    ret
117   %tmp0 = fptrunc <4 x double> %b to <4 x float>
118   %r = call <4 x float> @llvm.copysign.v4f32(<4 x float> %a, <4 x float> %tmp0)
119   ret <4 x float> %r
122 declare <4 x float> @llvm.copysign.v4f32(<4 x float> %a, <4 x float> %b) #0
124 ;============ v2f64
126 define <2 x double> @test_copysign_v2f64_v232(<2 x double> %a, <2 x float> %b) #0 {
127 ; CHECK-LABEL: test_copysign_v2f64_v232:
128 ; CHECK:       ; %bb.0:
129 ; CHECK-NEXT:    movi.2d v2, #0xffffffffffffffff
130 ; CHECK-NEXT:    fcvtl v1.2d, v1.2s
131 ; CHECK-NEXT:    fneg.2d v2, v2
132 ; CHECK-NEXT:    bif.16b v0, v1, v2
133 ; CHECK-NEXT:    ret
134   %tmp0 = fpext <2 x float> %b to <2 x double>
135   %r = call <2 x double> @llvm.copysign.v2f64(<2 x double> %a, <2 x double> %tmp0)
136   ret <2 x double> %r
139 define <2 x double> @test_copysign_v2f64_v2f64(<2 x double> %a, <2 x double> %b) #0 {
140 ; CHECK-LABEL: test_copysign_v2f64_v2f64:
141 ; CHECK:       ; %bb.0:
142 ; CHECK-NEXT:    movi.2d v2, #0xffffffffffffffff
143 ; CHECK-NEXT:    fneg.2d v2, v2
144 ; CHECK-NEXT:    bif.16b v0, v1, v2
145 ; CHECK-NEXT:    ret
146   %r = call <2 x double> @llvm.copysign.v2f64(<2 x double> %a, <2 x double> %b)
147   ret <2 x double> %r
150 declare <2 x double> @llvm.copysign.v2f64(<2 x double> %a, <2 x double> %b) #0
152 ;============ v4f64
154 ; SplitVecRes mismatched
155 define <4 x double> @test_copysign_v4f64_v4f32(<4 x double> %a, <4 x float> %b) #0 {
156 ; CHECK-LABEL: test_copysign_v4f64_v4f32:
157 ; CHECK:       ; %bb.0:
158 ; CHECK-NEXT:    movi.2d v3, #0xffffffffffffffff
159 ; CHECK-NEXT:    fcvtl v4.2d, v2.2s
160 ; CHECK-NEXT:    fcvtl2 v2.2d, v2.4s
161 ; CHECK-NEXT:    fneg.2d v3, v3
162 ; CHECK-NEXT:    bif.16b v1, v2, v3
163 ; CHECK-NEXT:    bif.16b v0, v4, v3
164 ; CHECK-NEXT:    ret
165   %tmp0 = fpext <4 x float> %b to <4 x double>
166   %r = call <4 x double> @llvm.copysign.v4f64(<4 x double> %a, <4 x double> %tmp0)
167   ret <4 x double> %r
170 ; SplitVecRes same
171 define <4 x double> @test_copysign_v4f64_v4f64(<4 x double> %a, <4 x double> %b) #0 {
172 ; CHECK-LABEL: test_copysign_v4f64_v4f64:
173 ; CHECK:       ; %bb.0:
174 ; CHECK-NEXT:    movi.2d v4, #0xffffffffffffffff
175 ; CHECK-NEXT:    fneg.2d v4, v4
176 ; CHECK-NEXT:    bif.16b v0, v2, v4
177 ; CHECK-NEXT:    bif.16b v1, v3, v4
178 ; CHECK-NEXT:    ret
179   %r = call <4 x double> @llvm.copysign.v4f64(<4 x double> %a, <4 x double> %b)
180   ret <4 x double> %r
183 declare <4 x double> @llvm.copysign.v4f64(<4 x double> %a, <4 x double> %b) #0
185 ;============ v4f16
187 define <4 x half> @test_copysign_v4f16_v4f16(<4 x half> %a, <4 x half> %b) #0 {
188 ; NOFP16-LABEL: test_copysign_v4f16_v4f16:
189 ; NOFP16:       ; %bb.0:
190 ; NOFP16-NEXT:    ; kill: def $d1 killed $d1 def $q1
191 ; NOFP16-NEXT:    ; kill: def $d0 killed $d0 def $q0
192 ; NOFP16-NEXT:    mov h3, v1[1]
193 ; NOFP16-NEXT:    mov h4, v0[1]
194 ; NOFP16-NEXT:    mov h5, v1[2]
195 ; NOFP16-NEXT:    mov h6, v0[2]
196 ; NOFP16-NEXT:    mvni.4s v2, #128, lsl #24
197 ; NOFP16-NEXT:    fcvt s7, h1
198 ; NOFP16-NEXT:    fcvt s16, h0
199 ; NOFP16-NEXT:    mov h1, v1[3]
200 ; NOFP16-NEXT:    fcvt s3, h3
201 ; NOFP16-NEXT:    fcvt s4, h4
202 ; NOFP16-NEXT:    fcvt s1, h1
203 ; NOFP16-NEXT:    bit.16b v3, v4, v2
204 ; NOFP16-NEXT:    fcvt s4, h5
205 ; NOFP16-NEXT:    fcvt s5, h6
206 ; NOFP16-NEXT:    mov.16b v6, v2
207 ; NOFP16-NEXT:    bsl.16b v6, v16, v7
208 ; NOFP16-NEXT:    mov h7, v0[3]
209 ; NOFP16-NEXT:    bit.16b v4, v5, v2
210 ; NOFP16-NEXT:    fcvt h3, s3
211 ; NOFP16-NEXT:    fcvt h0, s6
212 ; NOFP16-NEXT:    fcvt s5, h7
213 ; NOFP16-NEXT:    mov.h v0[1], v3[0]
214 ; NOFP16-NEXT:    fcvt h3, s4
215 ; NOFP16-NEXT:    bit.16b v1, v5, v2
216 ; NOFP16-NEXT:    mov.h v0[2], v3[0]
217 ; NOFP16-NEXT:    fcvt h1, s1
218 ; NOFP16-NEXT:    mov.h v0[3], v1[0]
219 ; NOFP16-NEXT:    ; kill: def $d0 killed $d0 killed $q0
220 ; NOFP16-NEXT:    ret
222 ; FP16-LABEL: test_copysign_v4f16_v4f16:
223 ; FP16:       ; %bb.0:
224 ; FP16-NEXT:    mvni.4h v2, #128, lsl #8
225 ; FP16-NEXT:    bif.8b v0, v1, v2
226 ; FP16-NEXT:    ret
227   %r = call <4 x half> @llvm.copysign.v4f16(<4 x half> %a, <4 x half> %b)
228   ret <4 x half> %r
231 define <4 x half> @test_copysign_v4f16_v4f32(<4 x half> %a, <4 x float> %b) #0 {
232 ; NOFP16-LABEL: test_copysign_v4f16_v4f32:
233 ; NOFP16:       ; %bb.0:
234 ; NOFP16-NEXT:    fcvtn v1.4h, v1.4s
235 ; NOFP16-NEXT:    ; kill: def $d0 killed $d0 def $q0
236 ; NOFP16-NEXT:    mov h3, v0[1]
237 ; NOFP16-NEXT:    mov h5, v0[2]
238 ; NOFP16-NEXT:    mvni.4s v2, #128, lsl #24
239 ; NOFP16-NEXT:    fcvt s7, h0
240 ; NOFP16-NEXT:    mov h4, v1[1]
241 ; NOFP16-NEXT:    fcvt s3, h3
242 ; NOFP16-NEXT:    mov h6, v1[2]
243 ; NOFP16-NEXT:    fcvt s16, h1
244 ; NOFP16-NEXT:    mov h1, v1[3]
245 ; NOFP16-NEXT:    fcvt s4, h4
246 ; NOFP16-NEXT:    fcvt s1, h1
247 ; NOFP16-NEXT:    bif.16b v3, v4, v2
248 ; NOFP16-NEXT:    fcvt s4, h5
249 ; NOFP16-NEXT:    fcvt s5, h6
250 ; NOFP16-NEXT:    mov.16b v6, v2
251 ; NOFP16-NEXT:    bsl.16b v6, v7, v16
252 ; NOFP16-NEXT:    mov h7, v0[3]
253 ; NOFP16-NEXT:    bif.16b v4, v5, v2
254 ; NOFP16-NEXT:    fcvt h3, s3
255 ; NOFP16-NEXT:    fcvt h0, s6
256 ; NOFP16-NEXT:    fcvt s5, h7
257 ; NOFP16-NEXT:    mov.h v0[1], v3[0]
258 ; NOFP16-NEXT:    fcvt h3, s4
259 ; NOFP16-NEXT:    bit.16b v1, v5, v2
260 ; NOFP16-NEXT:    mov.h v0[2], v3[0]
261 ; NOFP16-NEXT:    fcvt h1, s1
262 ; NOFP16-NEXT:    mov.h v0[3], v1[0]
263 ; NOFP16-NEXT:    ; kill: def $d0 killed $d0 killed $q0
264 ; NOFP16-NEXT:    ret
266 ; FP16-LABEL: test_copysign_v4f16_v4f32:
267 ; FP16:       ; %bb.0:
268 ; FP16-NEXT:    fcvtn v1.4h, v1.4s
269 ; FP16-NEXT:    mvni.4h v2, #128, lsl #8
270 ; FP16-NEXT:    bif.8b v0, v1, v2
271 ; FP16-NEXT:    ret
272   %tmp0 = fptrunc <4 x float> %b to <4 x half>
273   %r = call <4 x half> @llvm.copysign.v4f16(<4 x half> %a, <4 x half> %tmp0)
274   ret <4 x half> %r
277 define <4 x half> @test_copysign_v4f16_v4f64(<4 x half> %a, <4 x double> %b) #0 {
278 ; NOFP16-LABEL: test_copysign_v4f16_v4f64:
279 ; NOFP16:       ; %bb.0:
280 ; NOFP16-NEXT:    ; kill: def $d0 killed $d0 def $q0
281 ; NOFP16-NEXT:    mov d3, v1[1]
282 ; NOFP16-NEXT:    mov h4, v0[1]
283 ; NOFP16-NEXT:    fcvt s1, d1
284 ; NOFP16-NEXT:    fcvt s5, h0
285 ; NOFP16-NEXT:    mov h7, v0[2]
286 ; NOFP16-NEXT:    mvni.4s v6, #128, lsl #24
287 ; NOFP16-NEXT:    fcvt s3, d3
288 ; NOFP16-NEXT:    fcvt s4, h4
289 ; NOFP16-NEXT:    bit.16b v1, v5, v6
290 ; NOFP16-NEXT:    fcvt s7, h7
291 ; NOFP16-NEXT:    mov h5, v0[3]
292 ; NOFP16-NEXT:    bit.16b v3, v4, v6
293 ; NOFP16-NEXT:    mov d4, v2[1]
294 ; NOFP16-NEXT:    fcvt s2, d2
295 ; NOFP16-NEXT:    fcvt h0, s1
296 ; NOFP16-NEXT:    fcvt h1, s3
297 ; NOFP16-NEXT:    bit.16b v2, v7, v6
298 ; NOFP16-NEXT:    fcvt s3, d4
299 ; NOFP16-NEXT:    fcvt s4, h5
300 ; NOFP16-NEXT:    mov.h v0[1], v1[0]
301 ; NOFP16-NEXT:    fcvt h1, s2
302 ; NOFP16-NEXT:    mov.16b v2, v6
303 ; NOFP16-NEXT:    bsl.16b v2, v4, v3
304 ; NOFP16-NEXT:    mov.h v0[2], v1[0]
305 ; NOFP16-NEXT:    fcvt h1, s2
306 ; NOFP16-NEXT:    mov.h v0[3], v1[0]
307 ; NOFP16-NEXT:    ; kill: def $d0 killed $d0 killed $q0
308 ; NOFP16-NEXT:    ret
310 ; FP16-LABEL: test_copysign_v4f16_v4f64:
311 ; FP16:       ; %bb.0:
312 ; FP16-NEXT:    mov d3, v1[1]
313 ; FP16-NEXT:    fcvt h1, d1
314 ; FP16-NEXT:    fcvt h3, d3
315 ; FP16-NEXT:    mov.h v1[1], v3[0]
316 ; FP16-NEXT:    fcvt h3, d2
317 ; FP16-NEXT:    mov d2, v2[1]
318 ; FP16-NEXT:    mov.h v1[2], v3[0]
319 ; FP16-NEXT:    fcvt h2, d2
320 ; FP16-NEXT:    mov.h v1[3], v2[0]
321 ; FP16-NEXT:    mvni.4h v2, #128, lsl #8
322 ; FP16-NEXT:    bif.8b v0, v1, v2
323 ; FP16-NEXT:    ret
324   %tmp0 = fptrunc <4 x double> %b to <4 x half>
325   %r = call <4 x half> @llvm.copysign.v4f16(<4 x half> %a, <4 x half> %tmp0)
326   ret <4 x half> %r
329 declare <4 x half> @llvm.copysign.v4f16(<4 x half> %a, <4 x half> %b) #0
331 ;============ v8f16
333 define <8 x half> @test_copysign_v8f16_v8f16(<8 x half> %a, <8 x half> %b) #0 {
334 ; NOFP16-LABEL: test_copysign_v8f16_v8f16:
335 ; NOFP16:       ; %bb.0:
336 ; NOFP16-NEXT:    mov h2, v1[1]
337 ; NOFP16-NEXT:    mov h4, v0[1]
338 ; NOFP16-NEXT:    fcvt s5, h1
339 ; NOFP16-NEXT:    fcvt s6, h0
340 ; NOFP16-NEXT:    mvni.4s v3, #128, lsl #24
341 ; NOFP16-NEXT:    mov h7, v1[2]
342 ; NOFP16-NEXT:    mov h16, v0[2]
343 ; NOFP16-NEXT:    mov h17, v1[3]
344 ; NOFP16-NEXT:    fcvt s2, h2
345 ; NOFP16-NEXT:    fcvt s4, h4
346 ; NOFP16-NEXT:    bit.16b v5, v6, v3
347 ; NOFP16-NEXT:    mov h6, v0[3]
348 ; NOFP16-NEXT:    fcvt s7, h7
349 ; NOFP16-NEXT:    fcvt s16, h16
350 ; NOFP16-NEXT:    fcvt s17, h17
351 ; NOFP16-NEXT:    bif.16b v4, v2, v3
352 ; NOFP16-NEXT:    fcvt h2, s5
353 ; NOFP16-NEXT:    mov.16b v5, v3
354 ; NOFP16-NEXT:    fcvt s6, h6
355 ; NOFP16-NEXT:    bsl.16b v5, v16, v7
356 ; NOFP16-NEXT:    fcvt h4, s4
357 ; NOFP16-NEXT:    mov h7, v1[4]
358 ; NOFP16-NEXT:    mov h16, v0[4]
359 ; NOFP16-NEXT:    bif.16b v6, v17, v3
360 ; NOFP16-NEXT:    mov h17, v0[5]
361 ; NOFP16-NEXT:    fcvt h5, s5
362 ; NOFP16-NEXT:    mov.h v2[1], v4[0]
363 ; NOFP16-NEXT:    fcvt s4, h7
364 ; NOFP16-NEXT:    fcvt s7, h16
365 ; NOFP16-NEXT:    mov h16, v1[5]
366 ; NOFP16-NEXT:    fcvt h6, s6
367 ; NOFP16-NEXT:    fcvt s17, h17
368 ; NOFP16-NEXT:    mov.h v2[2], v5[0]
369 ; NOFP16-NEXT:    mov h5, v1[6]
370 ; NOFP16-NEXT:    mov h1, v1[7]
371 ; NOFP16-NEXT:    bit.16b v4, v7, v3
372 ; NOFP16-NEXT:    mov h7, v0[6]
373 ; NOFP16-NEXT:    fcvt s16, h16
374 ; NOFP16-NEXT:    mov h0, v0[7]
375 ; NOFP16-NEXT:    mov.h v2[3], v6[0]
376 ; NOFP16-NEXT:    fcvt s5, h5
377 ; NOFP16-NEXT:    fcvt s1, h1
378 ; NOFP16-NEXT:    fcvt s6, h7
379 ; NOFP16-NEXT:    mov.16b v7, v3
380 ; NOFP16-NEXT:    fcvt h4, s4
381 ; NOFP16-NEXT:    fcvt s0, h0
382 ; NOFP16-NEXT:    bsl.16b v7, v17, v16
383 ; NOFP16-NEXT:    bit.16b v5, v6, v3
384 ; NOFP16-NEXT:    mov.h v2[4], v4[0]
385 ; NOFP16-NEXT:    bif.16b v0, v1, v3
386 ; NOFP16-NEXT:    fcvt h4, s7
387 ; NOFP16-NEXT:    fcvt h0, s0
388 ; NOFP16-NEXT:    mov.h v2[5], v4[0]
389 ; NOFP16-NEXT:    fcvt h4, s5
390 ; NOFP16-NEXT:    mov.h v2[6], v4[0]
391 ; NOFP16-NEXT:    mov.h v2[7], v0[0]
392 ; NOFP16-NEXT:    mov.16b v0, v2
393 ; NOFP16-NEXT:    ret
395 ; FP16-LABEL: test_copysign_v8f16_v8f16:
396 ; FP16:       ; %bb.0:
397 ; FP16-NEXT:    mvni.8h v2, #128, lsl #8
398 ; FP16-NEXT:    bif.16b v0, v1, v2
399 ; FP16-NEXT:    ret
400   %r = call <8 x half> @llvm.copysign.v8f16(<8 x half> %a, <8 x half> %b)
401   ret <8 x half> %r
404 define <8 x half> @test_copysign_v8f16_v8f32(<8 x half> %a, <8 x float> %b) #0 {
405 ; NOFP16-LABEL: test_copysign_v8f16_v8f32:
406 ; NOFP16:       ; %bb.0:
407 ; NOFP16-NEXT:    fcvtn v1.4h, v1.4s
408 ; NOFP16-NEXT:    mov h4, v0[1]
409 ; NOFP16-NEXT:    fcvt s6, h0
410 ; NOFP16-NEXT:    mvni.4s v3, #128, lsl #24
411 ; NOFP16-NEXT:    mov h7, v0[2]
412 ; NOFP16-NEXT:    fcvtn v2.4h, v2.4s
413 ; NOFP16-NEXT:    mov h5, v1[1]
414 ; NOFP16-NEXT:    fcvt s16, h1
415 ; NOFP16-NEXT:    fcvt s4, h4
416 ; NOFP16-NEXT:    mov h17, v1[2]
417 ; NOFP16-NEXT:    mov h1, v1[3]
418 ; NOFP16-NEXT:    fcvt s7, h7
419 ; NOFP16-NEXT:    fcvt s5, h5
420 ; NOFP16-NEXT:    bif.16b v6, v16, v3
421 ; NOFP16-NEXT:    mov h16, v0[3]
422 ; NOFP16-NEXT:    fcvt s17, h17
423 ; NOFP16-NEXT:    fcvt s18, h1
424 ; NOFP16-NEXT:    bif.16b v4, v5, v3
425 ; NOFP16-NEXT:    fcvt h1, s6
426 ; NOFP16-NEXT:    mov.16b v6, v3
427 ; NOFP16-NEXT:    mov h5, v0[4]
428 ; NOFP16-NEXT:    fcvt s16, h16
429 ; NOFP16-NEXT:    bsl.16b v6, v7, v17
430 ; NOFP16-NEXT:    mov h7, v0[5]
431 ; NOFP16-NEXT:    mov h17, v2[1]
432 ; NOFP16-NEXT:    fcvt h4, s4
433 ; NOFP16-NEXT:    fcvt s5, h5
434 ; NOFP16-NEXT:    bif.16b v16, v18, v3
435 ; NOFP16-NEXT:    fcvt h6, s6
436 ; NOFP16-NEXT:    fcvt s7, h7
437 ; NOFP16-NEXT:    fcvt s17, h17
438 ; NOFP16-NEXT:    mov.h v1[1], v4[0]
439 ; NOFP16-NEXT:    fcvt s4, h2
440 ; NOFP16-NEXT:    bif.16b v7, v17, v3
441 ; NOFP16-NEXT:    bit.16b v4, v5, v3
442 ; NOFP16-NEXT:    fcvt h5, s16
443 ; NOFP16-NEXT:    mov.h v1[2], v6[0]
444 ; NOFP16-NEXT:    mov h6, v0[6]
445 ; NOFP16-NEXT:    mov h16, v2[2]
446 ; NOFP16-NEXT:    mov h0, v0[7]
447 ; NOFP16-NEXT:    mov h2, v2[3]
448 ; NOFP16-NEXT:    mov.h v1[3], v5[0]
449 ; NOFP16-NEXT:    fcvt h4, s4
450 ; NOFP16-NEXT:    fcvt s5, h6
451 ; NOFP16-NEXT:    fcvt s6, h16
452 ; NOFP16-NEXT:    fcvt s0, h0
453 ; NOFP16-NEXT:    fcvt s2, h2
454 ; NOFP16-NEXT:    mov.h v1[4], v4[0]
455 ; NOFP16-NEXT:    fcvt h4, s7
456 ; NOFP16-NEXT:    bif.16b v5, v6, v3
457 ; NOFP16-NEXT:    bif.16b v0, v2, v3
458 ; NOFP16-NEXT:    mov.h v1[5], v4[0]
459 ; NOFP16-NEXT:    fcvt h4, s5
460 ; NOFP16-NEXT:    fcvt h0, s0
461 ; NOFP16-NEXT:    mov.h v1[6], v4[0]
462 ; NOFP16-NEXT:    mov.h v1[7], v0[0]
463 ; NOFP16-NEXT:    mov.16b v0, v1
464 ; NOFP16-NEXT:    ret
466 ; FP16-LABEL: test_copysign_v8f16_v8f32:
467 ; FP16:       ; %bb.0:
468 ; FP16-NEXT:    fcvtn v1.4h, v1.4s
469 ; FP16-NEXT:    fcvtn2 v1.8h, v2.4s
470 ; FP16-NEXT:    mvni.8h v2, #128, lsl #8
471 ; FP16-NEXT:    bif.16b v0, v1, v2
472 ; FP16-NEXT:    ret
473   %tmp0 = fptrunc <8 x float> %b to <8 x half>
474   %r = call <8 x half> @llvm.copysign.v8f16(<8 x half> %a, <8 x half> %tmp0)
475   ret <8 x half> %r
478 declare <8 x half> @llvm.copysign.v8f16(<8 x half> %a, <8 x half> %b) #0
480 attributes #0 = { nounwind }