[AArch64] Add test for scalar copysign. NFC · llvm/llvm-project@fcd0ad2 (original) (raw)
`@@ -8,6 +8,234 @@ target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
`
8
8
``
9
9
`target triple = "aarch64-unknown-linux-gnu"
`
10
10
``
``
11
`+
define void @test_copysign_f16(ptr %ap, ptr %bp) {
`
``
12
`+
; SVE-LABEL: test_copysign_f16:
`
``
13
`+
; SVE: // %bb.0:
`
``
14
`+
; SVE-NEXT: adrp x8, .LCPI0_0
`
``
15
`+
; SVE-NEXT: ldr h1, [x0]
`
``
16
`+
; SVE-NEXT: ldr h2, [x1]
`
``
17
`+
; SVE-NEXT: ldr q0, [x8, :lo12:.LCPI0_0]
`
``
18
`+
; SVE-NEXT: adrp x8, .LCPI0_1
`
``
19
`+
; SVE-NEXT: ldr q4, [x8, :lo12:.LCPI0_1]
`
``
20
`+
; SVE-NEXT: mov z3.d, z0.d
`
``
21
`+
; SVE-NEXT: fmov s0, s1
`
``
22
`+
; SVE-NEXT: fmov s3, s2
`
``
23
`+
; SVE-NEXT: bif v0.16b, v3.16b, v4.16b
`
``
24
`+
; SVE-NEXT: str h0, [x0]
`
``
25
`+
; SVE-NEXT: ret
`
``
26
`+
;
`
``
27
`+
; SVE2-LABEL: test_copysign_f16:
`
``
28
`+
; SVE2: // %bb.0:
`
``
29
`+
; SVE2-NEXT: adrp x8, .LCPI0_0
`
``
30
`+
; SVE2-NEXT: ldr h1, [x0]
`
``
31
`+
; SVE2-NEXT: ldr h2, [x1]
`
``
32
`+
; SVE2-NEXT: ldr q0, [x8, :lo12:.LCPI0_0]
`
``
33
`+
; SVE2-NEXT: adrp x8, .LCPI0_1
`
``
34
`+
; SVE2-NEXT: ldr q4, [x8, :lo12:.LCPI0_1]
`
``
35
`+
; SVE2-NEXT: mov z3.d, z0.d
`
``
36
`+
; SVE2-NEXT: fmov s0, s1
`
``
37
`+
; SVE2-NEXT: fmov s3, s2
`
``
38
`+
; SVE2-NEXT: bif v0.16b, v3.16b, v4.16b
`
``
39
`+
; SVE2-NEXT: str h0, [x0]
`
``
40
`+
; SVE2-NEXT: ret
`
``
41
`+
;
`
``
42
`+
; NONEON-NOSVE-LABEL: test_copysign_f16:
`
``
43
`+
; NONEON-NOSVE: // %bb.0:
`
``
44
`+
; NONEON-NOSVE-NEXT: sub sp, sp, #16
`
``
45
`+
; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
`
``
46
`+
; NONEON-NOSVE-NEXT: ldr h0, [x0]
`
``
47
`+
; NONEON-NOSVE-NEXT: ldr h1, [x1]
`
``
48
`+
; NONEON-NOSVE-NEXT: fcvt s0, h0
`
``
49
`+
; NONEON-NOSVE-NEXT: str h1, [sp, #12]
`
``
50
`+
; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13]
`
``
51
`+
; NONEON-NOSVE-NEXT: tst w8, #0x80
`
``
52
`+
; NONEON-NOSVE-NEXT: fabs s0, s0
`
``
53
`+
; NONEON-NOSVE-NEXT: fneg s1, s0
`
``
54
`+
; NONEON-NOSVE-NEXT: fcsel s0, s1, s0, ne
`
``
55
`+
; NONEON-NOSVE-NEXT: fcvt h0, s0
`
``
56
`+
; NONEON-NOSVE-NEXT: str h0, [x0]
`
``
57
`+
; NONEON-NOSVE-NEXT: add sp, sp, #16
`
``
58
`+
; NONEON-NOSVE-NEXT: ret
`
``
59
`+
%a = load half, ptr %ap
`
``
60
`+
%b = load half, ptr %bp
`
``
61
`+
%r = call half @llvm.copysign.f16(half %a, half %b)
`
``
62
`+
store half %r, ptr %ap
`
``
63
`+
ret void
`
``
64
`+
}
`
``
65
+
``
66
`+
define void @test_copysign_bf16(ptr %ap, ptr %bp) {
`
``
67
`+
; SVE-LABEL: test_copysign_bf16:
`
``
68
`+
; SVE: // %bb.0:
`
``
69
`+
; SVE-NEXT: adrp x8, .LCPI1_0
`
``
70
`+
; SVE-NEXT: ldr h1, [x0]
`
``
71
`+
; SVE-NEXT: ldr h2, [x1]
`
``
72
`+
; SVE-NEXT: ldr q0, [x8, :lo12:.LCPI1_0]
`
``
73
`+
; SVE-NEXT: adrp x8, .LCPI1_1
`
``
74
`+
; SVE-NEXT: ldr q4, [x8, :lo12:.LCPI1_1]
`
``
75
`+
; SVE-NEXT: mov z3.d, z0.d
`
``
76
`+
; SVE-NEXT: fmov s0, s1
`
``
77
`+
; SVE-NEXT: fmov s3, s2
`
``
78
`+
; SVE-NEXT: bif v0.16b, v3.16b, v4.16b
`
``
79
`+
; SVE-NEXT: str h0, [x0]
`
``
80
`+
; SVE-NEXT: ret
`
``
81
`+
;
`
``
82
`+
; SVE2-LABEL: test_copysign_bf16:
`
``
83
`+
; SVE2: // %bb.0:
`
``
84
`+
; SVE2-NEXT: adrp x8, .LCPI1_0
`
``
85
`+
; SVE2-NEXT: ldr h1, [x0]
`
``
86
`+
; SVE2-NEXT: ldr h2, [x1]
`
``
87
`+
; SVE2-NEXT: ldr q0, [x8, :lo12:.LCPI1_0]
`
``
88
`+
; SVE2-NEXT: adrp x8, .LCPI1_1
`
``
89
`+
; SVE2-NEXT: ldr q4, [x8, :lo12:.LCPI1_1]
`
``
90
`+
; SVE2-NEXT: mov z3.d, z0.d
`
``
91
`+
; SVE2-NEXT: fmov s0, s1
`
``
92
`+
; SVE2-NEXT: fmov s3, s2
`
``
93
`+
; SVE2-NEXT: bif v0.16b, v3.16b, v4.16b
`
``
94
`+
; SVE2-NEXT: str h0, [x0]
`
``
95
`+
; SVE2-NEXT: ret
`
``
96
`+
;
`
``
97
`+
; NONEON-NOSVE-LABEL: test_copysign_bf16:
`
``
98
`+
; NONEON-NOSVE: // %bb.0:
`
``
99
`+
; NONEON-NOSVE-NEXT: sub sp, sp, #80
`
``
100
`+
; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80
`
``
101
`+
; NONEON-NOSVE-NEXT: ldr h0, [x0]
`
``
102
`+
; NONEON-NOSVE-NEXT: ldr h1, [x1]
`
``
103
`+
; NONEON-NOSVE-NEXT: str h0, [sp, #40]
`
``
104
`+
; NONEON-NOSVE-NEXT: ldr d0, [sp, #40]
`
``
105
`+
; NONEON-NOSVE-NEXT: str h1, [sp, #76]
`
``
106
`+
; NONEON-NOSVE-NEXT: ushll v0.4s, v0.4h, #0
`
``
107
`+
; NONEON-NOSVE-NEXT: str q0, [sp]
`
``
108
`+
; NONEON-NOSVE-NEXT: ldr w8, [sp, #12]
`
``
109
`+
; NONEON-NOSVE-NEXT: lsl w9, w8, #16
`
``
110
`+
; NONEON-NOSVE-NEXT: ldr w8, [sp, #8]
`
``
111
`+
; NONEON-NOSVE-NEXT: lsl w8, w8, #16
`
``
112
`+
; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24]
`
``
113
`+
; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]
`
``
114
`+
; NONEON-NOSVE-NEXT: lsl w9, w8, #16
`
``
115
`+
; NONEON-NOSVE-NEXT: ldr w8, [sp]
`
``
116
`+
; NONEON-NOSVE-NEXT: lsl w8, w8, #16
`
``
117
`+
; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16]
`
``
118
`+
; NONEON-NOSVE-NEXT: ldrb w8, [sp, #77]
`
``
119
`+
; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]
`
``
120
`+
; NONEON-NOSVE-NEXT: tst w8, #0x80
`
``
121
`+
; NONEON-NOSVE-NEXT: str q0, [sp, #48]
`
``
122
`+
; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]
`
``
123
`+
; NONEON-NOSVE-NEXT: fabs s0, s0
`
``
124
`+
; NONEON-NOSVE-NEXT: fneg s1, s0
`
``
125
`+
; NONEON-NOSVE-NEXT: fcsel s0, s1, s0, ne
`
``
126
`+
; NONEON-NOSVE-NEXT: fmov w8, s0
`
``
127
`+
; NONEON-NOSVE-NEXT: lsr w8, w8, #16
`
``
128
`+
; NONEON-NOSVE-NEXT: fmov s0, w8
`
``
129
`+
; NONEON-NOSVE-NEXT: str h0, [x0]
`
``
130
`+
; NONEON-NOSVE-NEXT: add sp, sp, #80
`
``
131
`+
; NONEON-NOSVE-NEXT: ret
`
``
132
`+
%a = load bfloat, ptr %ap
`
``
133
`+
%b = load bfloat, ptr %bp
`
``
134
`+
%r = call bfloat @llvm.copysign.bf16(bfloat %a, bfloat %b)
`
``
135
`+
store bfloat %r, ptr %ap
`
``
136
`+
ret void
`
``
137
`+
}
`
``
138
+
``
139
`+
define void @test_copysign_f32(ptr %ap, ptr %bp) {
`
``
140
`+
; SVE-LABEL: test_copysign_f32:
`
``
141
`+
; SVE: // %bb.0:
`
``
142
`+
; SVE-NEXT: adrp x8, .LCPI2_0
`
``
143
`+
; SVE-NEXT: ldr s1, [x0]
`
``
144
`+
; SVE-NEXT: ldr s2, [x1]
`
``
145
`+
; SVE-NEXT: ldr q0, [x8, :lo12:.LCPI2_0]
`
``
146
`+
; SVE-NEXT: adrp x8, .LCPI2_1
`
``
147
`+
; SVE-NEXT: ldr q4, [x8, :lo12:.LCPI2_1]
`
``
148
`+
; SVE-NEXT: mov z3.d, z0.d
`
``
149
`+
; SVE-NEXT: fmov s0, s1
`
``
150
`+
; SVE-NEXT: fmov s3, s2
`
``
151
`+
; SVE-NEXT: bif v0.16b, v3.16b, v4.16b
`
``
152
`+
; SVE-NEXT: str s0, [x0]
`
``
153
`+
; SVE-NEXT: ret
`
``
154
`+
;
`
``
155
`+
; SVE2-LABEL: test_copysign_f32:
`
``
156
`+
; SVE2: // %bb.0:
`
``
157
`+
; SVE2-NEXT: adrp x8, .LCPI2_0
`
``
158
`+
; SVE2-NEXT: ldr s1, [x0]
`
``
159
`+
; SVE2-NEXT: ldr s2, [x1]
`
``
160
`+
; SVE2-NEXT: ldr q0, [x8, :lo12:.LCPI2_0]
`
``
161
`+
; SVE2-NEXT: adrp x8, .LCPI2_1
`
``
162
`+
; SVE2-NEXT: ldr q4, [x8, :lo12:.LCPI2_1]
`
``
163
`+
; SVE2-NEXT: mov z3.d, z0.d
`
``
164
`+
; SVE2-NEXT: fmov s0, s1
`
``
165
`+
; SVE2-NEXT: fmov s3, s2
`
``
166
`+
; SVE2-NEXT: bif v0.16b, v3.16b, v4.16b
`
``
167
`+
; SVE2-NEXT: str s0, [x0]
`
``
168
`+
; SVE2-NEXT: ret
`
``
169
`+
;
`
``
170
`+
; NONEON-NOSVE-LABEL: test_copysign_f32:
`
``
171
`+
; NONEON-NOSVE: // %bb.0:
`
``
172
`+
; NONEON-NOSVE-NEXT: ldr s0, [x0]
`
``
173
`+
; NONEON-NOSVE-NEXT: ldr w8, [x1]
`
``
174
`+
; NONEON-NOSVE-NEXT: fabs s0, s0
`
``
175
`+
; NONEON-NOSVE-NEXT: tst w8, #0x80000000
`
``
176
`+
; NONEON-NOSVE-NEXT: fneg s1, s0
`
``
177
`+
; NONEON-NOSVE-NEXT: fcsel s0, s1, s0, ne
`
``
178
`+
; NONEON-NOSVE-NEXT: str s0, [x0]
`
``
179
`+
; NONEON-NOSVE-NEXT: ret
`
``
180
`+
%a = load float, ptr %ap
`
``
181
`+
%b = load float, ptr %bp
`
``
182
`+
%r = call float @llvm.copysign.f32(float %a, float %b)
`
``
183
`+
store float %r, ptr %ap
`
``
184
`+
ret void
`
``
185
`+
}
`
``
186
+
``
187
`+
define void @test_copysign_f64(ptr %ap, ptr %bp) {
`
``
188
`+
; SVE-LABEL: test_copysign_f64:
`
``
189
`+
; SVE: // %bb.0:
`
``
190
`+
; SVE-NEXT: adrp x8, .LCPI3_1
`
``
191
`+
; SVE-NEXT: ptrue p0.d, vl2
`
``
192
`+
; SVE-NEXT: ldr d2, [x0]
`
``
193
`+
; SVE-NEXT: ldr q0, [x8, :lo12:.LCPI3_1]
`
``
194
`+
; SVE-NEXT: adrp x8, .LCPI3_0
`
``
195
`+
; SVE-NEXT: ldr d3, [x1]
`
``
196
`+
; SVE-NEXT: ldr q1, [x8, :lo12:.LCPI3_0]
`
``
197
`+
; SVE-NEXT: fneg z0.d, p0/m, z0.d
`
``
198
`+
; SVE-NEXT: mov z4.d, z1.d
`
``
199
`+
; SVE-NEXT: fmov d1, d2
`
``
200
`+
; SVE-NEXT: fmov d4, d3
`
``
201
`+
; SVE-NEXT: bsl v0.16b, v1.16b, v4.16b
`
``
202
`+
; SVE-NEXT: str d0, [x0]
`
``
203
`+
; SVE-NEXT: ret
`
``
204
`+
;
`
``
205
`+
; SVE2-LABEL: test_copysign_f64:
`
``
206
`+
; SVE2: // %bb.0:
`
``
207
`+
; SVE2-NEXT: adrp x8, .LCPI3_1
`
``
208
`+
; SVE2-NEXT: ptrue p0.d, vl2
`
``
209
`+
; SVE2-NEXT: ldr d2, [x0]
`
``
210
`+
; SVE2-NEXT: ldr q0, [x8, :lo12:.LCPI3_1]
`
``
211
`+
; SVE2-NEXT: adrp x8, .LCPI3_0
`
``
212
`+
; SVE2-NEXT: ldr d3, [x1]
`
``
213
`+
; SVE2-NEXT: ldr q1, [x8, :lo12:.LCPI3_0]
`
``
214
`+
; SVE2-NEXT: fneg z0.d, p0/m, z0.d
`
``
215
`+
; SVE2-NEXT: mov z4.d, z1.d
`
``
216
`+
; SVE2-NEXT: fmov d1, d2
`
``
217
`+
; SVE2-NEXT: fmov d4, d3
`
``
218
`+
; SVE2-NEXT: bsl v0.16b, v1.16b, v4.16b
`
``
219
`+
; SVE2-NEXT: str d0, [x0]
`
``
220
`+
; SVE2-NEXT: ret
`
``
221
`+
;
`
``
222
`+
; NONEON-NOSVE-LABEL: test_copysign_f64:
`
``
223
`+
; NONEON-NOSVE: // %bb.0:
`
``
224
`+
; NONEON-NOSVE-NEXT: ldr d0, [x0]
`
``
225
`+
; NONEON-NOSVE-NEXT: ldr x8, [x1]
`
``
226
`+
; NONEON-NOSVE-NEXT: fabs d0, d0
`
``
227
`+
; NONEON-NOSVE-NEXT: tst x8, #0x8000000000000000
`
``
228
`+
; NONEON-NOSVE-NEXT: fneg d1, d0
`
``
229
`+
; NONEON-NOSVE-NEXT: fcsel d0, d1, d0, ne
`
``
230
`+
; NONEON-NOSVE-NEXT: str d0, [x0]
`
``
231
`+
; NONEON-NOSVE-NEXT: ret
`
``
232
`+
%a = load double, ptr %ap
`
``
233
`+
%b = load double, ptr %bp
`
``
234
`+
%r = call double @llvm.copysign.f64(double %a, double %b)
`
``
235
`+
store double %r, ptr %ap
`
``
236
`+
ret void
`
``
237
`+
}
`
``
238
+
11
239
`;============ f16
`
12
240
``
13
241
`define void @test_copysign_v4f16_v4f16(ptr %ap, ptr %bp) {
`