[Xtensa] Implement Windowed Register Option. (#124656)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sme2-fp8-intrinsics-mla.ll
blob80009d097e9a5b3a5b81a748cba0c50a15e232cc
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "// kill:" --version 4
2 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme-f8f16,+sme-f8f32 -force-streaming < %s | FileCheck %s
4 ; FMLAL (indexed)
6 define void @test_fmlal_vg2x1(i32 %slice, <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm) {
7 ; CHECK-LABEL: test_fmlal_vg2x1:
8 ; CHECK:  // %bb.0:
9 ; CHECK:    mov w8, w0
10 ; CHECK:    fmlal za.h[w8, 0:1], z0.b, z1.b[0]
11 ; CHECK:    fmlal za.h[w8, 14:15], z0.b, z1.b[15]
12 ; CHECK:    ret
13     call void @llvm.aarch64.sme.fp8.fmlal.lane.za16.vg2x1(i32 %slice,
14                                                           <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm,
15                                                           i32 0)
16     %add = add i32 %slice, 14
17     call void @llvm.aarch64.sme.fp8.fmlal.lane.za16.vg2x1(i32 %add,
18                                                           <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm,
19                                                           i32 15)
20     ret void
23 define void @test_fmlal_vg2x2(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zm) {
24 ; CHECK-LABEL: test_fmlal_vg2x2:
25 ; CHECK:  // %bb.0:
26 ; CHECK:    mov w8, w0
27 ; CHECK:    fmlal za.h[w8, 0:1, vgx2], { z0.b, z1.b }, z2.b[0]
28 ; CHECK:    fmlal za.h[w8, 6:7, vgx2], { z0.b, z1.b }, z2.b[15]
29 ; CHECK:    ret
30     call void @llvm.aarch64.sme.fp8.fmlal.lane.za16.vg2x2(i32 %slice,
31                                                           <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1,
32                                                           <vscale x 16 x i8> %zm,
33                                                           i32 0)
34     %add = add i32 %slice, 6
35     call void @llvm.aarch64.sme.fp8.fmlal.lane.za16.vg2x2(i32 %add,
36                                                           <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1,
37                                                           <vscale x 16 x i8> %zm,
38                                                           i32 15)
39     ret void
42 define void @test_fmlal_vg2x4(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zm) {
43 ; CHECK-LABEL: test_fmlal_vg2x4:
44 ; CHECK:  // %bb.0:
45 ; CHECK:    mov w8, w0
46 ; CHECK:    fmlal za.h[w8, 0:1, vgx4], { z0.b - z3.b }, z4.b[0]
47 ; CHECK:    fmlal za.h[w8, 6:7, vgx4], { z0.b - z3.b }, z4.b[15]
48 ; CHECK:    ret
49     call void @llvm.aarch64.sme.fp8.fmlal.lane.za16.vg2x4(i32 %slice,
50                                                           <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
51                                                           <vscale x 16 x i8> %zm,
52                                                           i32 0)
53     %add = add i32 %slice, 6
54     call void @llvm.aarch64.sme.fp8.fmlal.lane.za16.vg2x4(i32 %add,
55                                                           <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
56                                                           <vscale x 16 x i8> %zm,
57                                                           i32 15)
58     ret void
61 ; FMLALL (indexed)
63 define void @test_fmlall_vg4x1(i32 %slice, <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm) {
64 ; CHECK-LABEL: test_fmlall_vg4x1:
65 ; CHECK:  // %bb.0:
66 ; CHECK:    mov w8, w0
67 ; CHECK:    fmlall za.s[w8, 0:3], z0.b, z1.b[0]
68 ; CHECK:    fmlall za.s[w8, 12:15], z0.b, z1.b[15]
69 ; CHECK:    ret
70     call void @llvm.aarch64.sme.fp8.fmlall.lane.za32.vg4x1(i32 %slice,
71                                                            <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm,
72                                                            i32 0)
73     %add = add i32 %slice, 12
74     call void @llvm.aarch64.sme.fp8.fmlall.lane.za32.vg4x1(i32 %add,
75                                                            <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm,
76                                                            i32 15)
77     ret void
80 define void @test_fmlall_vg4x2(i32 %slice, <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zm) {
81 ; CHECK-LABEL: test_fmlall_vg4x2:
82 ; CHECK:  // %bb.0:
83 ; CHECK:    mov w8, w0
84 ; CHECK:    fmlall za.s[w8, 0:3, vgx2], { z0.b, z1.b }, z2.b[0]
85 ; CHECK:    fmlall za.s[w8, 4:7, vgx2], { z0.b, z1.b }, z2.b[15]
86 ; CHECK:    ret
87     call void @llvm.aarch64.sme.fp8.fmlall.lane.za32.vg4x2(i32 %slice,
88                                                            <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1,
89                                                            <vscale x 16 x i8> %zm,
90                                                            i32 0)
91     %add = add i32 %slice, 4
92     call void @llvm.aarch64.sme.fp8.fmlall.lane.za32.vg4x2(i32 %add,
93                                                            <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1,
94                                                            <vscale x 16 x i8> %zm,
95                                                            i32 15)
96     ret void
99 define void @test_fmlall_vg4x4(i32 %slice, <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zm) {
100 ; CHECK-LABEL: test_fmlall_vg4x4:
101 ; CHECK:  // %bb.0:
102 ; CHECK:    mov w8, w0
103 ; CHECK:    fmlall za.s[w8, 0:3, vgx4], { z0.b - z3.b }, z4.b[8]
104 ; CHECK:    fmlall za.s[w8, 4:7, vgx4], { z0.b - z3.b }, z4.b[15]
105 ; CHECK:    ret
106     call void @llvm.aarch64.sme.fp8.fmlall.lane.za32.vg4x4(i32 %slice,
107                                                            <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
108                                                            <vscale x 16 x i8> %zm,
109                                                            i32 8)
110      %add = add i32 %slice, 4
111     call void @llvm.aarch64.sme.fp8.fmlall.lane.za32.vg4x4(i32 %add,
112                                                            <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
113                                                            <vscale x 16 x i8> %zm,
114                                                            i32 15)
115     ret void
118 ; FMLAL (single)
120 define void @test_fmlal_single_vg2x1(i32 %slice, <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm) {
121 ; CHECK-LABEL: test_fmlal_single_vg2x1:
122 ; CHECK:  // %bb.0:
123 ; CHECK:    mov w8, w0
124 ; CHECK:    fmlal za.h[w8, 0:1], z0.b, z1.b
125 ; CHECK:    fmlal za.h[w8, 14:15], z0.b, z1.b
126 ; CHECK:    ret
127     call void @llvm.aarch64.sme.fp8.fmlal.single.za16.vg2x1(i32 %slice, <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm)
128     %add = add i32 %slice, 14
129     call void @llvm.aarch64.sme.fp8.fmlal.single.za16.vg2x1(i32 %add, <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm)
130     ret void
133 define void @test_fmlal_single_vg2x2(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zm) {
134 ; CHECK-LABEL: test_fmlal_single_vg2x2:
135 ; CHECK:  // %bb.0:
136 ; CHECK:    mov w8, w0
137 ; CHECK:    fmlal za.h[w8, 0:1, vgx2], { z0.b, z1.b }, z2.b
138 ; CHECK:    fmlal za.h[w8, 6:7, vgx2], { z0.b, z1.b }, z2.b
139 ; CHECK:    ret
140     call void @llvm.aarch64.sme.fp8.fmlal.single.za16.vg2x2(i32 %slice,
141                                                             <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1,
142                                                             <vscale x 16 x i8> %zm)
143     %add = add i32 %slice, 6
144     call void @llvm.aarch64.sme.fp8.fmlal.single.za16.vg2x2(i32 %add,
145                                                             <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1,
146                                                             <vscale x 16 x i8> %zm)
147     ret void
150 define void @test_fmlal_single_vg2x4(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zm) {
151 ; CHECK-LABEL: test_fmlal_single_vg2x4:
152 ; CHECK:  // %bb.0:
153 ; CHECK:    mov w8, w0
154 ; CHECK:    fmlal za.h[w8, 0:1, vgx4], { z0.b - z3.b }, z4.b
155 ; CHECK:    fmlal za.h[w8, 6:7, vgx4], { z0.b - z3.b }, z4.b
156 ; CHECK:    ret
157     call void @llvm.aarch64.sme.fp8.fmlal.single.za16.vg2x4(i32 %slice,
158                                                             <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
159                                                             <vscale x 16 x i8> %zm)
160     %add = add i32 %slice, 6
161     call void @llvm.aarch64.sme.fp8.fmlal.single.za16.vg2x4(i32 %add,
162                                                             <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
163                                                             <vscale x 16 x i8> %zm)
164     ret void
167 ; FMLALL (single)
169 define void @test_fmlall_single_vg4x1(i32 %slice, <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm) {
170 ; CHECK-LABEL: test_fmlall_single_vg4x1:
171 ; CHECK:  // %bb.0:
172 ; CHECK:    mov w8, w0
173 ; CHECK:    fmlall za.s[w8, 0:3], z0.b, z1.b
174 ; CHECK:    fmlall za.s[w8, 12:15], z0.b, z1.b
175 ; CHECK:    ret
176     call void @llvm.aarch64.sme.fp8.fmlall.single.za32.vg4x1(i32 %slice, <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm)
177     %add = add i32 %slice, 12
178     call void @llvm.aarch64.sme.fp8.fmlall.single.za32.vg4x1(i32 %add, <vscale x 16 x i8> %zn, <vscale x 16 x i8> %zm)
179     ret void
183 define void @test_fmlall_single_vg4x2(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zm) {
184 ; CHECK-LABEL: test_fmlall_single_vg4x2:
185 ; CHECK:  // %bb.0:
186 ; CHECK:    mov w8, w0
187 ; CHECK:    fmlall za.s[w8, 0:3, vgx2], { z0.b, z1.b }, z2.b
188 ; CHECK:    fmlall za.s[w8, 4:7, vgx2], { z0.b, z1.b }, z2.b
189 ; CHECK:    ret
190     call void @llvm.aarch64.sme.fp8.fmlall.single.za32.vg4x2(i32 %slice,
191                                                              <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1,
192                                                              <vscale x 16 x i8> %zm)
193     %add = add i32 %slice, 4
194     call void @llvm.aarch64.sme.fp8.fmlall.single.za32.vg4x2(i32 %add,
195                                                              <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1,
196                                                              <vscale x 16 x i8> %zm)
197     ret void
200 define void @test_fmlall_single_vg4x4(i32 %slice, <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3, <vscale x 16 x i8> %zm) {
201 ; CHECK-LABEL: test_fmlall_single_vg4x4:
202 ; CHECK:  // %bb.0:
203 ; CHECK:    mov w8, w0
204 ; CHECK:    fmlall za.s[w8, 0:3, vgx4], { z0.b - z3.b }, z4.b
205 ; CHECK:    fmlall za.s[w8, 4:7, vgx4], { z0.b - z3.b }, z4.b
206 ; CHECK:    ret
207     call void @llvm.aarch64.sme.fp8.fmlall.single.za32.vg4x4(i32 %slice,
208                                                              <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
209                                                              <vscale x 16 x i8> %zm)
210     %add = add i32 %slice, 4
211     call void @llvm.aarch64.sme.fp8.fmlall.single.za32.vg4x4(i32 %add,
212                                                             <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
213                                                              <vscale x 16 x i8> %zm)
214     ret void
217 ; FMLAL (multi)
219 define void @test_fmlal_multi_vg2x2(i32 %slice, <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zm0,  <vscale x 16 x i8> %zm1) {
220 ; CHECK-LABEL: test_fmlal_multi_vg2x2:
221 ; CHECK:  // %bb.0:
222 ; CHECK:    mov w8, w0
223 ; CHECK:    fmlal za.h[w8, 0:1, vgx2], { z0.b, z1.b }, { z2.b, z3.b }
224 ; CHECK:    fmlal za.h[w8, 6:7, vgx2], { z0.b, z1.b }, { z2.b, z3.b }
225 ; CHECK:    ret
226     call void @llvm.aarch64.sme.fp8.fmlal.multi.za16.vg2x2(i32 %slice,
227                                                            <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1,
228                                                            <vscale x 16 x i8> %zm0, <vscale x 16 x i8> %zm1)
229     %add = add i32 %slice, 6
230     call void @llvm.aarch64.sme.fp8.fmlal.multi.za16.vg2x2(i32 %add,
231                                                            <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1,
232                                                            <vscale x 16 x i8> %zm0, <vscale x 16 x i8> %zm1)
233     ret void
236 define void @test_fmlal_multi_vg2x4(i32 %slice,  <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
237 ; CHECK-LABEL: test_fmlal_multi_vg2x4:
238 ; CHECK:  // %bb.0:
239 ; CHECK:    mov w8, w0
240 ; CHECK:    fmlal za.h[w8, 0:1, vgx4], { z0.b - z3.b }, { z4.b - z7.b }
241 ; CHECK:    fmlal za.h[w8, 6:7, vgx4], { z0.b - z3.b }, { z4.b - z7.b }
242 ; CHECK:    ret
243                                     <vscale x 16 x i8> %zm0, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2, <vscale x 16 x i8> %zm3) {
244     call void @llvm.aarch64.sme.fp8.fmlal.multi.za16.vg2x4(i32 %slice,
245                                                            <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
246                                                            <vscale x 16 x i8> %zm0, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2, <vscale x 16 x i8> %zm3)
247     %add = add i32 %slice, 6
248     call void @llvm.aarch64.sme.fp8.fmlal.multi.za16.vg2x4(i32 %add,
249                                                            <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
250                                                            <vscale x 16 x i8> %zm0, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2, <vscale x 16 x i8> %zm3)
251     ret void
254 ; FMLALL (multi)
256 define void @test_fmlal_multi_vg4x2(i32 %slice, <vscale x 16 x i8> %zn0,  <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zm0,  <vscale x 16 x i8> %zm1) {
257 ; CHECK-LABEL: test_fmlal_multi_vg4x2:
258 ; CHECK:  // %bb.0:
259 ; CHECK:    mov w8, w0
260 ; CHECK:    fmlall za.s[w8, 0:3, vgx2], { z0.b, z1.b }, { z2.b, z3.b }
261 ; CHECK:    fmlall za.s[w8, 4:7, vgx2], { z0.b, z1.b }, { z2.b, z3.b }
262 ; CHECK:    ret
263     call void @llvm.aarch64.sme.fp8.fmlall.multi.za32.vg4x2(i32 %slice,
264                                                            <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1,
265                                                            <vscale x 16 x i8> %zm0, <vscale x 16 x i8> %zm1)
266     %add = add i32 %slice, 4
267     call void @llvm.aarch64.sme.fp8.fmlall.multi.za32.vg4x2(i32 %add,
268                                                            <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1,
269                                                            <vscale x 16 x i8> %zm0, <vscale x 16 x i8> %zm1)
270     ret void
273 define void @test_fmlal_multi_vg4x4(i32 %slice,  <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
274 ; CHECK-LABEL: test_fmlal_multi_vg4x4:
275 ; CHECK:  // %bb.0:
276 ; CHECK:    mov w8, w0
277 ; CHECK:    fmlall za.s[w8, 0:3, vgx4], { z0.b - z3.b }, { z4.b - z7.b }
278 ; CHECK:    fmlall za.s[w8, 4:7, vgx4], { z0.b - z3.b }, { z4.b - z7.b }
279 ; CHECK:    ret
280                                     <vscale x 16 x i8> %zm0, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2, <vscale x 16 x i8> %zm3) {
281     call void @llvm.aarch64.sme.fp8.fmlall.multi.za32.vg4x4(i32 %slice,
282                                                            <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
283                                                            <vscale x 16 x i8> %zm0, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2, <vscale x 16 x i8> %zm3)
284     %add = add i32 %slice, 4
285     call void @llvm.aarch64.sme.fp8.fmlall.multi.za32.vg4x4(i32 %add,
286                                                            <vscale x 16 x i8> %zn0, <vscale x 16 x i8> %zn1, <vscale x 16 x i8> %zn2, <vscale x 16 x i8> %zn3,
287                                                            <vscale x 16 x i8> %zm0, <vscale x 16 x i8> %zm1, <vscale x 16 x i8> %zm2, <vscale x 16 x i8> %zm3)
288     ret void