xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/vector-fcopysign.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple aarch64-apple-darwin -asm-verbose=false -disable-post-ra | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker;============ v1f32
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; WidenVecRes same
8*9880d681SAndroid Build Coastguard Workerdefine <1 x float> @test_copysign_v1f32_v1f32(<1 x float> %a, <1 x float> %b) #0 {
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v1f32_v1f32:
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.2s v2, #128, lsl #24
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.8b v0, v1, v2
12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
13*9880d681SAndroid Build Coastguard Worker  %r = call <1 x float> @llvm.copysign.v1f32(<1 x float> %a, <1 x float> %b)
14*9880d681SAndroid Build Coastguard Worker  ret <1 x float> %r
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; WidenVecRes mismatched
18*9880d681SAndroid Build Coastguard Workerdefine <1 x float> @test_copysign_v1f32_v1f64(<1 x float> %a, <1 x double> %b) #0 {
19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v1f32_v1f64:
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fcvt s1, d1
21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.4s v2, #128, lsl #24
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v0, v1, v2
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
24*9880d681SAndroid Build Coastguard Worker  %tmp0 = fptrunc <1 x double> %b to <1 x float>
25*9880d681SAndroid Build Coastguard Worker  %r = call <1 x float> @llvm.copysign.v1f32(<1 x float> %a, <1 x float> %tmp0)
26*9880d681SAndroid Build Coastguard Worker  ret <1 x float> %r
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdeclare <1 x float> @llvm.copysign.v1f32(<1 x float> %a, <1 x float> %b) #0
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker;============ v1f64
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker; WidenVecOp #1
34*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @test_copysign_v1f64_v1f32(<1 x double> %a, <1 x float> %b) #0 {
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v1f64_v1f32:
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fcvt d1, s1
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.2d v2, #0000000000000000
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fneg.2d v2, v2
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v0, v1, v2
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
41*9880d681SAndroid Build Coastguard Worker  %tmp0 = fpext <1 x float> %b to <1 x double>
42*9880d681SAndroid Build Coastguard Worker  %r = call <1 x double> @llvm.copysign.v1f64(<1 x double> %a, <1 x double> %tmp0)
43*9880d681SAndroid Build Coastguard Worker  ret <1 x double> %r
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @test_copysign_v1f64_v1f64(<1 x double> %a, <1 x double> %b) #0 {
47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v1f64_v1f64:
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.2d v2, #0000000000000000
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fneg.2d v2, v2
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v0, v1, v2
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
52*9880d681SAndroid Build Coastguard Worker  %r = call <1 x double> @llvm.copysign.v1f64(<1 x double> %a, <1 x double> %b)
53*9880d681SAndroid Build Coastguard Worker  ret <1 x double> %r
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdeclare <1 x double> @llvm.copysign.v1f64(<1 x double> %a, <1 x double> %b) #0
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker;============ v2f32
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_copysign_v2f32_v2f32(<2 x float> %a, <2 x float> %b) #0 {
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v2f32_v2f32:
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.2s v2, #128, lsl #24
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.8b v0, v1, v2
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
65*9880d681SAndroid Build Coastguard Worker  %r = call <2 x float> @llvm.copysign.v2f32(<2 x float> %a, <2 x float> %b)
66*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %r
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_copysign_v2f32_v2f64(<2 x float> %a, <2 x double> %b) #0 {
70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v2f32_v2f64:
71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fcvtn v1.2s, v1.2d
72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.2s v2, #128, lsl #24
73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.8b v0, v1, v2
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
75*9880d681SAndroid Build Coastguard Worker  %tmp0 = fptrunc <2 x double> %b to <2 x float>
76*9880d681SAndroid Build Coastguard Worker  %r = call <2 x float> @llvm.copysign.v2f32(<2 x float> %a, <2 x float> %tmp0)
77*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %r
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdeclare <2 x float> @llvm.copysign.v2f32(<2 x float> %a, <2 x float> %b) #0
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker;============ v4f32
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_copysign_v4f32_v4f32(<4 x float> %a, <4 x float> %b) #0 {
85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v4f32_v4f32:
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.4s v2, #128, lsl #24
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v0, v1, v2
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
89*9880d681SAndroid Build Coastguard Worker  %r = call <4 x float> @llvm.copysign.v4f32(<4 x float> %a, <4 x float> %b)
90*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %r
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker; SplitVecOp #1
94*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_copysign_v4f32_v4f64(<4 x float> %a, <4 x double> %b) #0 {
95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v4f32_v4f64:
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    mov s3, v0[1]
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.4s v4, #128, lsl #24
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fcvt s5, d1
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    mov s6, v0[2]
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    mov s7, v0[3]
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v0, v5, v4
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fcvt s5, d2
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v6, v5, v4
104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    mov d1, v1[1]
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fcvt s1, d1
106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v3, v1, v4
107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    mov d1, v2[1]
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fcvt s1, d1
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ins.s v0[1], v3[0]
110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ins.s v0[2], v6[0]
111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v7, v1, v4
112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ins.s v0[3], v7[0]
113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
114*9880d681SAndroid Build Coastguard Worker  %tmp0 = fptrunc <4 x double> %b to <4 x float>
115*9880d681SAndroid Build Coastguard Worker  %r = call <4 x float> @llvm.copysign.v4f32(<4 x float> %a, <4 x float> %tmp0)
116*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %r
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.copysign.v4f32(<4 x float> %a, <4 x float> %b) #0
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker;============ v2f64
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_copysign_v2f64_v232(<2 x double> %a, <2 x float> %b) #0 {
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v2f64_v232:
125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.2d v2, #0000000000000000
126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fneg.2d v2, v2
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fcvtl v1.2d, v1.2s
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v0, v1, v2
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
130*9880d681SAndroid Build Coastguard Worker  %tmp0 = fpext <2 x float> %b to <2 x double>
131*9880d681SAndroid Build Coastguard Worker  %r = call <2 x double> @llvm.copysign.v2f64(<2 x double> %a, <2 x double> %tmp0)
132*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %r
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_copysign_v2f64_v2f64(<2 x double> %a, <2 x double> %b) #0 {
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v2f64_v2f64:
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.2d v2, #0000000000000000
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fneg.2d v2, v2
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v0, v1, v2
140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
141*9880d681SAndroid Build Coastguard Worker  %r = call <2 x double> @llvm.copysign.v2f64(<2 x double> %a, <2 x double> %b)
142*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %r
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.copysign.v2f64(<2 x double> %a, <2 x double> %b) #0
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker;============ v4f64
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker; SplitVecRes mismatched
150*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test_copysign_v4f64_v4f32(<4 x double> %a, <4 x float> %b) #0 {
151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v4f64_v4f32:
152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.2d v3, #0000000000000000
153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fcvtl2 v4.2d, v2.4s
154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fcvtl v2.2d, v2.2s
155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fneg.2d v3, v3
156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v1, v4, v3
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v0, v2, v3
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
159*9880d681SAndroid Build Coastguard Worker  %tmp0 = fpext <4 x float> %b to <4 x double>
160*9880d681SAndroid Build Coastguard Worker  %r = call <4 x double> @llvm.copysign.v4f64(<4 x double> %a, <4 x double> %tmp0)
161*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %r
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; SplitVecRes same
165*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test_copysign_v4f64_v4f64(<4 x double> %a, <4 x double> %b) #0 {
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_copysign_v4f64_v4f64:
167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movi.2d v4, #0000000000000000
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fneg.2d v4, v4
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v0, v2, v4
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    bit.16b v1, v3, v4
171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
172*9880d681SAndroid Build Coastguard Worker  %r = call <4 x double> @llvm.copysign.v4f64(<4 x double> %a, <4 x double> %b)
173*9880d681SAndroid Build Coastguard Worker  ret <4 x double> %r
174*9880d681SAndroid Build Coastguard Worker}
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerdeclare <4 x double> @llvm.copysign.v4f64(<4 x double> %a, <4 x double> %b) #0
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
179