[Instrumentation] Fix a warning
[llvm-project.git] / llvm / test / CodeGen / AArch64 / fcopysign.ll
bloba42ec8e253be29be0c7260d17025ef0c70237c74
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3 ; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
5 define double @copysign_f64(double %a, double %b) {
6 ; CHECK-LABEL: copysign_f64:
7 ; CHECK:       // %bb.0: // %entry
8 ; CHECK-NEXT:    movi v2.2d, #0xffffffffffffffff
9 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
10 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
11 ; CHECK-NEXT:    fneg v2.2d, v2.2d
12 ; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b
13 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
14 ; CHECK-NEXT:    ret
15 entry:
16   %c = call double @llvm.copysign.f64(double %a, double %b)
17   ret double %c
20 define float @copysign_f32(float %a, float %b) {
21 ; CHECK-SD-LABEL: copysign_f32:
22 ; CHECK-SD:       // %bb.0: // %entry
23 ; CHECK-SD-NEXT:    mvni v2.4s, #128, lsl #24
24 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
25 ; CHECK-SD-NEXT:    // kill: def $s1 killed $s1 def $q1
26 ; CHECK-SD-NEXT:    bif v0.16b, v1.16b, v2.16b
27 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
28 ; CHECK-SD-NEXT:    ret
30 ; CHECK-GI-LABEL: copysign_f32:
31 ; CHECK-GI:       // %bb.0: // %entry
32 ; CHECK-GI-NEXT:    mvni v2.2s, #128, lsl #24
33 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $d0
34 ; CHECK-GI-NEXT:    // kill: def $s1 killed $s1 def $d1
35 ; CHECK-GI-NEXT:    bif v0.8b, v1.8b, v2.8b
36 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $d0
37 ; CHECK-GI-NEXT:    ret
38 entry:
39   %c = call float @llvm.copysign.f32(float %a, float %b)
40   ret float %c
43 define half @copysign_f16(half %a, half %b) {
44 ; CHECK-SD-LABEL: copysign_f16:
45 ; CHECK-SD:       // %bb.0: // %entry
46 ; CHECK-SD-NEXT:    fcvt s1, h1
47 ; CHECK-SD-NEXT:    fcvt s0, h0
48 ; CHECK-SD-NEXT:    mvni v2.4s, #128, lsl #24
49 ; CHECK-SD-NEXT:    bif v0.16b, v1.16b, v2.16b
50 ; CHECK-SD-NEXT:    fcvt h0, s0
51 ; CHECK-SD-NEXT:    ret
53 ; CHECK-GI-LABEL: copysign_f16:
54 ; CHECK-GI:       // %bb.0: // %entry
55 ; CHECK-GI-NEXT:    mvni v2.4h, #128, lsl #8
56 ; CHECK-GI-NEXT:    // kill: def $h0 killed $h0 def $d0
57 ; CHECK-GI-NEXT:    // kill: def $h1 killed $h1 def $d1
58 ; CHECK-GI-NEXT:    bif v0.8b, v1.8b, v2.8b
59 ; CHECK-GI-NEXT:    // kill: def $h0 killed $h0 killed $d0
60 ; CHECK-GI-NEXT:    ret
61 entry:
62   %c = call half @llvm.copysign.f16(half %a, half %b)
63   ret half %c
66 define <2 x double> @copysign_v2f64(<2 x double> %a, <2 x double> %b) {
67 ; CHECK-LABEL: copysign_v2f64:
68 ; CHECK:       // %bb.0: // %entry
69 ; CHECK-NEXT:    movi v2.2d, #0xffffffffffffffff
70 ; CHECK-NEXT:    fneg v2.2d, v2.2d
71 ; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b
72 ; CHECK-NEXT:    ret
73 entry:
74   %c = call <2 x double> @llvm.copysign.v2f64(<2 x double> %a, <2 x double> %b)
75   ret <2 x double> %c
78 define <3 x double> @copysign_v3f64(<3 x double> %a, <3 x double> %b) {
79 ; CHECK-SD-LABEL: copysign_v3f64:
80 ; CHECK-SD:       // %bb.0: // %entry
81 ; CHECK-SD-NEXT:    movi v6.2d, #0xffffffffffffffff
82 ; CHECK-SD-NEXT:    // kill: def $d3 killed $d3 def $q3
83 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
84 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
85 ; CHECK-SD-NEXT:    // kill: def $d4 killed $d4 def $q4
86 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
87 ; CHECK-SD-NEXT:    // kill: def $d5 killed $d5 def $q5
88 ; CHECK-SD-NEXT:    mov v3.d[1], v4.d[0]
89 ; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
90 ; CHECK-SD-NEXT:    fneg v1.2d, v6.2d
91 ; CHECK-SD-NEXT:    bif v0.16b, v3.16b, v1.16b
92 ; CHECK-SD-NEXT:    bif v2.16b, v5.16b, v1.16b
93 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
94 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
95 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
96 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
97 ; CHECK-SD-NEXT:    ret
99 ; CHECK-GI-LABEL: copysign_v3f64:
100 ; CHECK-GI:       // %bb.0: // %entry
101 ; CHECK-GI-NEXT:    movi v6.2d, #0xffffffffffffffff
102 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
103 ; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
104 ; CHECK-GI-NEXT:    // kill: def $d3 killed $d3 def $q3
105 ; CHECK-GI-NEXT:    // kill: def $d4 killed $d4 def $q4
106 ; CHECK-GI-NEXT:    fmov x8, d2
107 ; CHECK-GI-NEXT:    fmov x9, d5
108 ; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
109 ; CHECK-GI-NEXT:    mov v3.d[1], v4.d[0]
110 ; CHECK-GI-NEXT:    and x8, x8, #0x7fffffffffffffff
111 ; CHECK-GI-NEXT:    and x9, x9, #0x8000000000000000
112 ; CHECK-GI-NEXT:    fneg v1.2d, v6.2d
113 ; CHECK-GI-NEXT:    orr x8, x8, x9
114 ; CHECK-GI-NEXT:    fmov d2, x8
115 ; CHECK-GI-NEXT:    bif v0.16b, v3.16b, v1.16b
116 ; CHECK-GI-NEXT:    mov d1, v0.d[1]
117 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
118 ; CHECK-GI-NEXT:    ret
119 entry:
120   %c = call <3 x double> @llvm.copysign.v3f64(<3 x double> %a, <3 x double> %b)
121   ret <3 x double> %c
124 define <4 x double> @copysign_v4f64(<4 x double> %a, <4 x double> %b) {
125 ; CHECK-LABEL: copysign_v4f64:
126 ; CHECK:       // %bb.0: // %entry
127 ; CHECK-NEXT:    movi v4.2d, #0xffffffffffffffff
128 ; CHECK-NEXT:    fneg v4.2d, v4.2d
129 ; CHECK-NEXT:    bif v0.16b, v2.16b, v4.16b
130 ; CHECK-NEXT:    bif v1.16b, v3.16b, v4.16b
131 ; CHECK-NEXT:    ret
132 entry:
133   %c = call <4 x double> @llvm.copysign.v4f64(<4 x double> %a, <4 x double> %b)
134   ret <4 x double> %c
137 define <2 x float> @copysign_v2f32(<2 x float> %a, <2 x float> %b) {
138 ; CHECK-LABEL: copysign_v2f32:
139 ; CHECK:       // %bb.0: // %entry
140 ; CHECK-NEXT:    mvni v2.2s, #128, lsl #24
141 ; CHECK-NEXT:    bif v0.8b, v1.8b, v2.8b
142 ; CHECK-NEXT:    ret
143 entry:
144   %c = call <2 x float> @llvm.copysign.v2f32(<2 x float> %a, <2 x float> %b)
145   ret <2 x float> %c
148 define <3 x float> @copysign_v3f32(<3 x float> %a, <3 x float> %b) {
149 ; CHECK-SD-LABEL: copysign_v3f32:
150 ; CHECK-SD:       // %bb.0: // %entry
151 ; CHECK-SD-NEXT:    mvni v2.4s, #128, lsl #24
152 ; CHECK-SD-NEXT:    bif v0.16b, v1.16b, v2.16b
153 ; CHECK-SD-NEXT:    ret
155 ; CHECK-GI-LABEL: copysign_v3f32:
156 ; CHECK-GI:       // %bb.0: // %entry
157 ; CHECK-GI-NEXT:    mov w8, #-2147483648 // =0x80000000
158 ; CHECK-GI-NEXT:    mov w9, #2147483647 // =0x7fffffff
159 ; CHECK-GI-NEXT:    mov v2.s[0], w9
160 ; CHECK-GI-NEXT:    mov v3.s[0], w8
161 ; CHECK-GI-NEXT:    mov v2.s[1], w9
162 ; CHECK-GI-NEXT:    mov v3.s[1], w8
163 ; CHECK-GI-NEXT:    mov v2.s[2], w9
164 ; CHECK-GI-NEXT:    mov v3.s[2], w8
165 ; CHECK-GI-NEXT:    and v0.16b, v0.16b, v2.16b
166 ; CHECK-GI-NEXT:    and v1.16b, v1.16b, v3.16b
167 ; CHECK-GI-NEXT:    orr v0.16b, v0.16b, v1.16b
168 ; CHECK-GI-NEXT:    ret
169 entry:
170   %c = call <3 x float> @llvm.copysign.v3f32(<3 x float> %a, <3 x float> %b)
171   ret <3 x float> %c
174 define <4 x float> @copysign_v4f32(<4 x float> %a, <4 x float> %b) {
175 ; CHECK-LABEL: copysign_v4f32:
176 ; CHECK:       // %bb.0: // %entry
177 ; CHECK-NEXT:    mvni v2.4s, #128, lsl #24
178 ; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b
179 ; CHECK-NEXT:    ret
180 entry:
181   %c = call <4 x float> @llvm.copysign.v4f32(<4 x float> %a, <4 x float> %b)
182   ret <4 x float> %c
185 define <8 x float> @copysign_v8f32(<8 x float> %a, <8 x float> %b) {
186 ; CHECK-LABEL: copysign_v8f32:
187 ; CHECK:       // %bb.0: // %entry
188 ; CHECK-NEXT:    mvni v4.4s, #128, lsl #24
189 ; CHECK-NEXT:    bif v0.16b, v2.16b, v4.16b
190 ; CHECK-NEXT:    bif v1.16b, v3.16b, v4.16b
191 ; CHECK-NEXT:    ret
192 entry:
193   %c = call <8 x float> @llvm.copysign.v8f32(<8 x float> %a, <8 x float> %b)
194   ret <8 x float> %c
197 define <7 x half> @copysign_v7f16(<7 x half> %a, <7 x half> %b) {
198 ; CHECK-SD-LABEL: copysign_v7f16:
199 ; CHECK-SD:       // %bb.0: // %entry
200 ; CHECK-SD-NEXT:    mvni v2.8h, #128, lsl #8
201 ; CHECK-SD-NEXT:    bif v0.16b, v1.16b, v2.16b
202 ; CHECK-SD-NEXT:    ret
204 ; CHECK-GI-LABEL: copysign_v7f16:
205 ; CHECK-GI:       // %bb.0: // %entry
206 ; CHECK-GI-NEXT:    mov w8, #32768 // =0x8000
207 ; CHECK-GI-NEXT:    mov w9, #32767 // =0x7fff
208 ; CHECK-GI-NEXT:    fmov s2, w9
209 ; CHECK-GI-NEXT:    fmov s3, w8
210 ; CHECK-GI-NEXT:    mov v2.h[1], w9
211 ; CHECK-GI-NEXT:    mov v3.h[1], w8
212 ; CHECK-GI-NEXT:    mov v2.h[2], w9
213 ; CHECK-GI-NEXT:    mov v3.h[2], w8
214 ; CHECK-GI-NEXT:    mov v2.h[3], w9
215 ; CHECK-GI-NEXT:    mov v3.h[3], w8
216 ; CHECK-GI-NEXT:    mov v2.h[4], w9
217 ; CHECK-GI-NEXT:    mov v3.h[4], w8
218 ; CHECK-GI-NEXT:    mov v2.h[5], w9
219 ; CHECK-GI-NEXT:    mov v3.h[5], w8
220 ; CHECK-GI-NEXT:    mov v2.h[6], w9
221 ; CHECK-GI-NEXT:    mov v3.h[6], w8
222 ; CHECK-GI-NEXT:    and v0.16b, v0.16b, v2.16b
223 ; CHECK-GI-NEXT:    and v1.16b, v1.16b, v3.16b
224 ; CHECK-GI-NEXT:    orr v0.16b, v0.16b, v1.16b
225 ; CHECK-GI-NEXT:    ret
226 entry:
227   %c = call <7 x half> @llvm.copysign.v7f16(<7 x half> %a, <7 x half> %b)
228   ret <7 x half> %c
231 define <4 x half> @copysign_v4f16(<4 x half> %a, <4 x half> %b) {
232 ; CHECK-LABEL: copysign_v4f16:
233 ; CHECK:       // %bb.0: // %entry
234 ; CHECK-NEXT:    mvni v2.4h, #128, lsl #8
235 ; CHECK-NEXT:    bif v0.8b, v1.8b, v2.8b
236 ; CHECK-NEXT:    ret
237 entry:
238   %c = call <4 x half> @llvm.copysign.v4f16(<4 x half> %a, <4 x half> %b)
239   ret <4 x half> %c
242 define <8 x half> @copysign_v8f16(<8 x half> %a, <8 x half> %b) {
243 ; CHECK-LABEL: copysign_v8f16:
244 ; CHECK:       // %bb.0: // %entry
245 ; CHECK-NEXT:    mvni v2.8h, #128, lsl #8
246 ; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b
247 ; CHECK-NEXT:    ret
248 entry:
249   %c = call <8 x half> @llvm.copysign.v8f16(<8 x half> %a, <8 x half> %b)
250   ret <8 x half> %c
253 define <16 x half> @copysign_v16f16(<16 x half> %a, <16 x half> %b) {
254 ; CHECK-LABEL: copysign_v16f16:
255 ; CHECK:       // %bb.0: // %entry
256 ; CHECK-NEXT:    mvni v4.8h, #128, lsl #8
257 ; CHECK-NEXT:    bif v0.16b, v2.16b, v4.16b
258 ; CHECK-NEXT:    bif v1.16b, v3.16b, v4.16b
259 ; CHECK-NEXT:    ret
260 entry:
261   %c = call <16 x half> @llvm.copysign.v16f16(<16 x half> %a, <16 x half> %b)
262   ret <16 x half> %c
265 declare <16 x half> @llvm.copysign.v16f16(<16 x half>, <16 x half>)
266 declare <2 x double> @llvm.copysign.v2f64(<2 x double>, <2 x double>)
267 declare <2 x float> @llvm.copysign.v2f32(<2 x float>, <2 x float>)
268 declare <3 x double> @llvm.copysign.v3f64(<3 x double>, <3 x double>)
269 declare <3 x float> @llvm.copysign.v3f32(<3 x float>, <3 x float>)
270 declare <4 x double> @llvm.copysign.v4f64(<4 x double>, <4 x double>)
271 declare <4 x float> @llvm.copysign.v4f32(<4 x float>, <4 x float>)
272 declare <4 x half> @llvm.copysign.v4f16(<4 x half>, <4 x half>)
273 declare <7 x half> @llvm.copysign.v7f16(<7 x half>, <7 x half>)
274 declare <8 x float> @llvm.copysign.v8f32(<8 x float>, <8 x float>)
275 declare <8 x half> @llvm.copysign.v8f16(<8 x half>, <8 x half>)
276 declare double @llvm.copysign.f64(double, double)
277 declare float @llvm.copysign.f32(float, float)
278 declare half @llvm.copysign.f16(half, half)