[rtsan] Add fork/execve interceptors (#117198)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sme2-intrinsics-fmlas16.ll
blob462ecd6555ef573bbc371fd9b132ab45ca929912
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "// kill:.*$" --version 4
2 ; RUN: llc -force-streaming -verify-machineinstrs < %s | FileCheck %s
4 target triple = "aarch64-linux"
6 define void @test_fmla_f16_vg2_single(i32 %slice, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1, <vscale x 8 x half> %b) #0 {
7 ; CHECK-LABEL: test_fmla_f16_vg2_single:
8 ; CHECK:  // %bb.0:
9 ; CHECK:    mov w8, w0
10 ; CHECK:    fmla za.h[w8, 0, vgx2], { z0.h, z1.h }, z2.h
11 ; CHECK:    fmla za.h[w8, 7, vgx2], { z0.h, z1.h }, z2.h
12 ; CHECK:    ret
13   call void @llvm.aarch64.sme.fmla.single.vg1x2.nxv8f16(i32 %slice, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1, <vscale x 8 x half> %b)
14   %slice.7 = add i32 %slice, 7
15   call void @llvm.aarch64.sme.fmla.single.vg1x2.nxv8f16(i32 %slice.7, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1, <vscale x 8 x half> %b)
16   ret void
19 define void @test_fmla_f16_vg4_single(i32 %slice, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
20 ; CHECK-LABEL: test_fmla_f16_vg4_single:
21 ; CHECK:  // %bb.0:
22 ; CHECK:    mov w8, w0
23 ; CHECK:    fmla za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h
24 ; CHECK:    fmla za.h[w8, 7, vgx4], { z0.h - z3.h }, z4.h
25 ; CHECK:    ret
26                                       <vscale x 8 x half> %a2, <vscale x 8 x half> %a3, <vscale x 8 x half> %b) #0 {
27   call void @llvm.aarch64.sme.fmla.single.vg1x4.nxv8f16(i32 %slice, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
28                                                         <vscale x 8 x half> %a2, <vscale x 8 x half> %a3, <vscale x 8 x half> %b)
29   %slice.7 = add i32 %slice, 7
30   call void @llvm.aarch64.sme.fmla.single.vg1x4.nxv8f16(i32 %slice.7, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
31                                                         <vscale x 8 x half> %a2, <vscale x 8 x half> %a3, <vscale x 8 x half> %b)
32   ret void
35 define void @test_fmls_f16_vg2_single(i32 %slice, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1, <vscale x 8 x half> %b) #0 {
36 ; CHECK-LABEL: test_fmls_f16_vg2_single:
37 ; CHECK:  // %bb.0:
38 ; CHECK:    mov w8, w0
39 ; CHECK:    fmls za.h[w8, 0, vgx2], { z0.h, z1.h }, z2.h
40 ; CHECK:    fmls za.h[w8, 7, vgx2], { z0.h, z1.h }, z2.h
41 ; CHECK:    ret
42   call void @llvm.aarch64.sme.fmls.single.vg1x2.nxv8f16(i32 %slice, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1, <vscale x 8 x half> %b)
43   %slice.7 = add i32 %slice, 7
44   call void @llvm.aarch64.sme.fmls.single.vg1x2.nxv8f16(i32 %slice.7, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1, <vscale x 8 x half> %b)
45   ret void
48 define void @test_fmls_f16_vg4_single(i32 %slice, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
49 ; CHECK-LABEL: test_fmls_f16_vg4_single:
50 ; CHECK:  // %bb.0:
51 ; CHECK:    mov w8, w0
52 ; CHECK:    fmls za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h
53 ; CHECK:    fmls za.h[w8, 7, vgx4], { z0.h - z3.h }, z4.h
54 ; CHECK:    ret
55                                       <vscale x 8 x half> %a2, <vscale x 8 x half> %a3, <vscale x 8 x half> %b) #0 {
56   call void @llvm.aarch64.sme.fmls.single.vg1x4.nxv8f16(i32 %slice, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
57                                                         <vscale x 8 x half> %a2, <vscale x 8 x half> %a3, <vscale x 8 x half> %b)
58   %slice.7 = add i32 %slice, 7
59   call void @llvm.aarch64.sme.fmls.single.vg1x4.nxv8f16(i32 %slice.7, <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
60                                                         <vscale x 8 x half> %a2, <vscale x 8 x half> %a3, <vscale x 8 x half> %b)
61   ret void
64 define void @test_fmla_f16_vg2_multi(i32 %slice,
65 ; CHECK-LABEL: test_fmla_f16_vg2_multi:
66 ; CHECK:  // %bb.0:
67 ; CHECK:    mov w8, w0
68 ; CHECK:    fmla za.h[w8, 0, vgx2], { z0.h, z1.h }, { z2.h, z3.h }
69 ; CHECK:    fmla za.h[w8, 7, vgx2], { z0.h, z1.h }, { z2.h, z3.h }
70 ; CHECK:    ret
71                                      <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
72                                      <vscale x 8 x half> %b0, <vscale x 8 x half> %b1) #0 {
73   call void @llvm.aarch64.sme.fmla.vg1x2.nxv8f16(i32 %slice,
74                                                 <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
75                                                 <vscale x 8 x half> %b0, <vscale x 8 x half> %b1)
76   %slice.7 = add i32 %slice, 7
77   call void @llvm.aarch64.sme.fmla.vg1x2.nxv8f16(i32 %slice.7,
78                                                  <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
79                                                  <vscale x 8 x half> %b0, <vscale x 8 x half> %b1)
80   ret void
83 define void @test_fmla_f16_vg4_multi(i32 %slice,
84 ; CHECK-LABEL: test_fmla_f16_vg4_multi:
85 ; CHECK:  // %bb.0:
86 ; CHECK:    mov w8, w0
87 ; CHECK:    fmla za.h[w8, 0, vgx4], { z0.h - z3.h }, { z4.h - z7.h }
88 ; CHECK:    fmla za.h[w8, 7, vgx4], { z0.h - z3.h }, { z4.h - z7.h }
89 ; CHECK:    ret
90                                      <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
91                                      <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
92                                      <vscale x 8 x half> %b0, <vscale x 8 x half> %b1,
93                                      <vscale x 8 x half> %b2, <vscale x 8 x half> %b3) #0 {
94   call void @llvm.aarch64.sme.fmla.vg1x4.nxv8f16(i32 %slice,
95                                                  <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
96                                                  <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
97                                                  <vscale x 8 x half> %b0, <vscale x 8 x half> %b1,
98                                                  <vscale x 8 x half> %b2, <vscale x 8 x half> %b3)
99   %slice.7 = add i32 %slice, 7
100   call void @llvm.aarch64.sme.fmla.vg1x4.nxv8f16(i32 %slice.7,
101                                                  <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
102                                                  <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
103                                                  <vscale x 8 x half> %b0, <vscale x 8 x half> %b1,
104                                                  <vscale x 8 x half> %b2, <vscale x 8 x half> %b3)
105   ret void
108 define void @test_fmls_f16_vg2_multi(i32 %slice,
109 ; CHECK-LABEL: test_fmls_f16_vg2_multi:
110 ; CHECK:  // %bb.0:
111 ; CHECK:    mov w8, w0
112 ; CHECK:    fmls za.h[w8, 0, vgx2], { z0.h, z1.h }, { z2.h, z3.h }
113 ; CHECK:    fmls za.h[w8, 7, vgx2], { z0.h, z1.h }, { z2.h, z3.h }
114 ; CHECK:    ret
115                                      <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
116                                      <vscale x 8 x half> %b0, <vscale x 8 x half> %b1) #0 {
117   call void @llvm.aarch64.sme.fmls.vg1x2.nxv8f16(i32 %slice,
118                                                 <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
119                                                 <vscale x 8 x half> %b0, <vscale x 8 x half> %b1)
120   %slice.7 = add i32 %slice, 7
121   call void @llvm.aarch64.sme.fmls.vg1x2.nxv8f16(i32 %slice.7,
122                                                  <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
123                                                  <vscale x 8 x half> %b0, <vscale x 8 x half> %b1)
124   ret void
127 define void @test_fmls_f16_vg4_multi(i32 %slice,
128 ; CHECK-LABEL: test_fmls_f16_vg4_multi:
129 ; CHECK:  // %bb.0:
130 ; CHECK:    mov w8, w0
131 ; CHECK:    fmls za.h[w8, 0, vgx4], { z0.h - z3.h }, { z4.h - z7.h }
132 ; CHECK:    fmls za.h[w8, 7, vgx4], { z0.h - z3.h }, { z4.h - z7.h }
133 ; CHECK:    ret
134                                      <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
135                                      <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
136                                      <vscale x 8 x half> %b0, <vscale x 8 x half> %b1,
137                                      <vscale x 8 x half> %b2, <vscale x 8 x half> %b3) #0 {
138   call void @llvm.aarch64.sme.fmls.vg1x4.nxv8f16(i32 %slice,
139                                                  <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
140                                                  <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
141                                                  <vscale x 8 x half> %b0, <vscale x 8 x half> %b1,
142                                                  <vscale x 8 x half> %b2, <vscale x 8 x half> %b3)
143   %slice.7 = add i32 %slice, 7
144   call void @llvm.aarch64.sme.fmls.vg1x4.nxv8f16(i32 %slice.7,
145                                                  <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
146                                                  <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
147                                                  <vscale x 8 x half> %b0, <vscale x 8 x half> %b1,
148                                                  <vscale x 8 x half> %b2, <vscale x 8 x half> %b3)
149   ret void
152 define void @test_fmla_f16_vg2_index(i32 %slice,
153 ; CHECK-LABEL: test_fmla_f16_vg2_index:
154 ; CHECK:  // %bb.0:
155 ; CHECK:    mov w8, w0
156 ; CHECK:    fmla za.h[w8, 0, vgx2], { z0.h, z1.h }, z2.h[7]
157 ; CHECK:    fmla za.h[w8, 7, vgx2], { z0.h, z1.h }, z2.h[7]
158 ; CHECK:    ret
159                                      <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
160                                      <vscale x 8 x half> %b) #0 {
161   call void @llvm.aarch64.sme.fmla.lane.vg1x2.nxv8f16(i32 %slice,
162                                                       <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
163                                                       <vscale x 8 x half> %b, i32 7);
164   %slice.7 = add i32 %slice, 7
165   call void @llvm.aarch64.sme.fmla.lane.vg1x2.nxv8f16(i32 %slice.7,
166                                                      <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
167                                                      <vscale x 8 x half> %b, i32 7);
168   ret void
171 define void @test_fmla_f16_vg4_index(i32 %slice,
172 ; CHECK-LABEL: test_fmla_f16_vg4_index:
173 ; CHECK:  // %bb.0:
174 ; CHECK:    mov w8, w0
175 ; CHECK:    fmla za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h[7]
176 ; CHECK:    fmla za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h[7]
177 ; CHECK:    ret
178                                      <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
179                                      <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
180                                      <vscale x 8 x half> %b) #0 {
181   call void @llvm.aarch64.sme.fmla.lane.vg1x4.nxv8f16(i32 %slice,
182                                                       <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
183                                                       <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
184                                                       <vscale x 8 x half> %b, i32 7);
185   %slice.7 = add i32 %slice, 7
186   call void @llvm.aarch64.sme.fmla.lane.vg1x4.nxv8f16(i32 %slice,
187                                                       <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
188                                                       <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
189                                                       <vscale x 8 x half> %b, i32 7);
190   ret void
193 define void @test_fmls_f16_vg2_index(i32 %slice,
194 ; CHECK-LABEL: test_fmls_f16_vg2_index:
195 ; CHECK:  // %bb.0:
196 ; CHECK:    mov w8, w0
197 ; CHECK:    fmls za.h[w8, 0, vgx2], { z0.h, z1.h }, z2.h[7]
198 ; CHECK:    fmls za.h[w8, 7, vgx2], { z0.h, z1.h }, z2.h[7]
199 ; CHECK:    ret
200                                      <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
201                                      <vscale x 8 x half> %b) #0 {
202   call void @llvm.aarch64.sme.fmls.lane.vg1x2.nxv8f16(i32 %slice,
203                                                       <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
204                                                       <vscale x 8 x half> %b, i32 7);
205   %slice.7 = add i32 %slice, 7
206   call void @llvm.aarch64.sme.fmls.lane.vg1x2.nxv8f16(i32 %slice.7,
207                                                      <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
208                                                      <vscale x 8 x half> %b, i32 7);
209   ret void
212 define void @test_fmls_f16_vg4_index(i32 %slice,
213 ; CHECK-LABEL: test_fmls_f16_vg4_index:
214 ; CHECK:  // %bb.0:
215 ; CHECK:    mov w8, w0
216 ; CHECK:    fmls za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h[7]
217 ; CHECK:    fmls za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h[7]
218 ; CHECK:    ret
219                                      <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
220                                      <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
221                                      <vscale x 8 x half> %b) #0 {
222   call void @llvm.aarch64.sme.fmls.lane.vg1x4.nxv8f16(i32 %slice,
223                                                       <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
224                                                       <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
225                                                       <vscale x 8 x half> %b, i32 7);
226   %slice.7 = add i32 %slice, 7
227   call void @llvm.aarch64.sme.fmls.lane.vg1x4.nxv8f16(i32 %slice,
228                                                       <vscale x 8 x half> %a0, <vscale x 8 x half> %a1,
229                                                       <vscale x 8 x half> %a2, <vscale x 8 x half> %a3,
230                                                       <vscale x 8 x half> %b, i32 7);
231   ret void
234 define void @test_fmla_bf16_vg2_single(i32 %slice, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1, <vscale x 8 x bfloat> %b) #0 {
235 ; CHECK-LABEL: test_fmla_bf16_vg2_single:
236 ; CHECK:  // %bb.0:
237 ; CHECK:    mov w8, w0
238 ; CHECK:    bfmla za.h[w8, 0, vgx2], { z0.h, z1.h }, z2.h
239 ; CHECK:    bfmla za.h[w8, 7, vgx2], { z0.h, z1.h }, z2.h
240 ; CHECK:    ret
241   call void @llvm.aarch64.sme.fmla.single.vg1x2.nxv8bf16(i32 %slice, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1, <vscale x 8 x bfloat> %b)
242   %slice.7 = add i32 %slice, 7
243   call void @llvm.aarch64.sme.fmla.single.vg1x2.nxv8bf16(i32 %slice.7, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1, <vscale x 8 x bfloat> %b)
244   ret void
247 define void @test_fmla_bf16_vg4_single(i32 %slice, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
248 ; CHECK-LABEL: test_fmla_bf16_vg4_single:
249 ; CHECK:  // %bb.0:
250 ; CHECK:    mov w8, w0
251 ; CHECK:    bfmla za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h
252 ; CHECK:    bfmla za.h[w8, 7, vgx4], { z0.h - z3.h }, z4.h
253 ; CHECK:    ret
254                                        <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3, <vscale x 8 x bfloat> %b) #0 {
255   call void @llvm.aarch64.sme.fmla.single.vg1x4.nxv8bf16(i32 %slice, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
256                                                          <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3, <vscale x 8 x bfloat> %b)
257   %slice.7 = add i32 %slice, 7
258   call void @llvm.aarch64.sme.fmla.single.vg1x4.nxv8bf16(i32 %slice.7, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
259                                                          <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3, <vscale x 8 x bfloat> %b)
260   ret void
263 define void @test_fmls_bf16_vg2_single(i32 %slice, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1, <vscale x 8 x bfloat> %b) #0 {
264 ; CHECK-LABEL: test_fmls_bf16_vg2_single:
265 ; CHECK:  // %bb.0:
266 ; CHECK:    mov w8, w0
267 ; CHECK:    bfmls za.h[w8, 0, vgx2], { z0.h, z1.h }, z2.h
268 ; CHECK:    bfmls za.h[w8, 7, vgx2], { z0.h, z1.h }, z2.h
269 ; CHECK:    ret
270   call void @llvm.aarch64.sme.fmls.single.vg1x2.nxv8bf16(i32 %slice, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1, <vscale x 8 x bfloat> %b)
271   %slice.7 = add i32 %slice, 7
272   call void @llvm.aarch64.sme.fmls.single.vg1x2.nxv8bf16(i32 %slice.7, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1, <vscale x 8 x bfloat> %b)
273   ret void
276 define void @test_fmls_bf16_vg4_single(i32 %slice, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
277 ; CHECK-LABEL: test_fmls_bf16_vg4_single:
278 ; CHECK:  // %bb.0:
279 ; CHECK:    mov w8, w0
280 ; CHECK:    bfmls za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h
281 ; CHECK:    bfmls za.h[w8, 7, vgx4], { z0.h - z3.h }, z4.h
282 ; CHECK:    ret
283                                        <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3, <vscale x 8 x bfloat> %b) #0 {
284   call void @llvm.aarch64.sme.fmls.single.vg1x4.nxv8bf16(i32 %slice, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
285                                                          <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3, <vscale x 8 x bfloat> %b)
286   %slice.7 = add i32 %slice, 7
287   call void @llvm.aarch64.sme.fmls.single.vg1x4.nxv8bf16(i32 %slice.7, <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
288                                                          <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3, <vscale x 8 x bfloat> %b)
289   ret void
292 define void @test_fmla_bf16_vg2_multi(i32 %slice,
293 ; CHECK-LABEL: test_fmla_bf16_vg2_multi:
294 ; CHECK:  // %bb.0:
295 ; CHECK:    mov w8, w0
296 ; CHECK:    bfmla za.h[w8, 0, vgx2], { z0.h, z1.h }, { z2.h, z3.h }
297 ; CHECK:    bfmla za.h[w8, 7, vgx2], { z0.h, z1.h }, { z2.h, z3.h }
298 ; CHECK:    ret
299                                       <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
300                                       <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1) #0 {
301   call void @llvm.aarch64.sme.fmla.vg1x2.nxv8bf16(i32 %slice,
302                                                  <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
303                                                  <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1)
304   %slice.7 = add i32 %slice, 7
305   call void @llvm.aarch64.sme.fmla.vg1x2.nxv8bf16(i32 %slice.7,
306                                                   <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
307                                                   <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1)
308   ret void
311 define void @test_fmla_bf16_vg4_multi(i32 %slice,
312 ; CHECK-LABEL: test_fmla_bf16_vg4_multi:
313 ; CHECK:  // %bb.0:
314 ; CHECK:    mov w8, w0
315 ; CHECK:    bfmla za.h[w8, 0, vgx4], { z0.h - z3.h }, { z4.h - z7.h }
316 ; CHECK:    bfmla za.h[w8, 7, vgx4], { z0.h - z3.h }, { z4.h - z7.h }
317 ; CHECK:    ret
318                                       <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
319                                       <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
320                                       <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1,
321                                       <vscale x 8 x bfloat> %b2, <vscale x 8 x bfloat> %b3) #0 {
322   call void @llvm.aarch64.sme.fmla.vg1x4.nxv8bf16(i32 %slice,
323                                                   <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
324                                                   <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
325                                                   <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1,
326                                                   <vscale x 8 x bfloat> %b2, <vscale x 8 x bfloat> %b3)
327   %slice.7 = add i32 %slice, 7
328   call void @llvm.aarch64.sme.fmla.vg1x4.nxv8bf16(i32 %slice.7,
329                                                   <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
330                                                   <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
331                                                   <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1,
332                                                   <vscale x 8 x bfloat> %b2, <vscale x 8 x bfloat> %b3)
333   ret void
336 define void @test_fmls_bf16_vg2_multi(i32 %slice,
337 ; CHECK-LABEL: test_fmls_bf16_vg2_multi:
338 ; CHECK:  // %bb.0:
339 ; CHECK:    mov w8, w0
340 ; CHECK:    bfmls za.h[w8, 0, vgx2], { z0.h, z1.h }, { z2.h, z3.h }
341 ; CHECK:    bfmls za.h[w8, 7, vgx2], { z0.h, z1.h }, { z2.h, z3.h }
342 ; CHECK:    ret
343                                      <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
344                                      <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1) #0 {
345   call void @llvm.aarch64.sme.fmls.vg1x2.nxv8bf16(i32 %slice,
346                                                 <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
347                                                 <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1)
348   %slice.7 = add i32 %slice, 7
349   call void @llvm.aarch64.sme.fmls.vg1x2.nxv8bf16(i32 %slice.7,
350                                                  <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
351                                                  <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1)
352   ret void
355 define void @test_fmls_bf16_vg4_multi(i32 %slice,
356 ; CHECK-LABEL: test_fmls_bf16_vg4_multi:
357 ; CHECK:  // %bb.0:
358 ; CHECK:    mov w8, w0
359 ; CHECK:    bfmls za.h[w8, 0, vgx4], { z0.h - z3.h }, { z4.h - z7.h }
360 ; CHECK:    bfmls za.h[w8, 7, vgx4], { z0.h - z3.h }, { z4.h - z7.h }
361 ; CHECK:    ret
362                                      <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
363                                      <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
364                                      <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1,
365                                      <vscale x 8 x bfloat> %b2, <vscale x 8 x bfloat> %b3) #0 {
366   call void @llvm.aarch64.sme.fmls.vg1x4.nxv8bf16(i32 %slice,
367                                                  <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
368                                                  <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
369                                                  <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1,
370                                                  <vscale x 8 x bfloat> %b2, <vscale x 8 x bfloat> %b3)
371   %slice.7 = add i32 %slice, 7
372   call void @llvm.aarch64.sme.fmls.vg1x4.nxv8bf16(i32 %slice.7,
373                                                  <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
374                                                  <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
375                                                  <vscale x 8 x bfloat> %b0, <vscale x 8 x bfloat> %b1,
376                                                  <vscale x 8 x bfloat> %b2, <vscale x 8 x bfloat> %b3)
377   ret void
380 define void @test_fmla_bf16_vg2_index(i32 %slice,
381 ; CHECK-LABEL: test_fmla_bf16_vg2_index:
382 ; CHECK:  // %bb.0:
383 ; CHECK:    mov w8, w0
384 ; CHECK:    bfmla za.h[w8, 0, vgx2], { z0.h, z1.h }, z2.h[7]
385 ; CHECK:    bfmla za.h[w8, 7, vgx2], { z0.h, z1.h }, z2.h[7]
386 ; CHECK:    ret
387                                       <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
388                                       <vscale x 8 x bfloat> %b) #0 {
389   call void @llvm.aarch64.sme.fmla.lane.vg1x2.nxv8bf16(i32 %slice,
390                                                        <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
391                                                        <vscale x 8 x bfloat> %b, i32 7);
392   %slice.7 = add i32 %slice, 7
393   call void @llvm.aarch64.sme.fmla.lane.vg1x2.nxv8bf16(i32 %slice.7,
394                                                        <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
395                                                        <vscale x 8 x bfloat> %b, i32 7);
396   ret void
399 define void @test_fmla_bf16_vg4_index(i32 %slice,
400 ; CHECK-LABEL: test_fmla_bf16_vg4_index:
401 ; CHECK:  // %bb.0:
402 ; CHECK:    mov w8, w0
403 ; CHECK:    bfmla za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h[7]
404 ; CHECK:    bfmla za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h[7]
405 ; CHECK:    ret
406                                       <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
407                                       <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
408                                       <vscale x 8 x bfloat> %b) #0 {
409   call void @llvm.aarch64.sme.fmla.lane.vg1x4.nxv8bf16(i32 %slice,
410                                                        <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
411                                                        <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
412                                                        <vscale x 8 x bfloat> %b, i32 7);
413   %slice.7 = add i32 %slice, 7
414   call void @llvm.aarch64.sme.fmla.lane.vg1x4.nxv8bf16(i32 %slice,
415                                                        <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
416                                                        <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
417                                                        <vscale x 8 x bfloat> %b, i32 7);
418   ret void
421 define void @test_fmls_bf16_vg2_index(i32 %slice,
422 ; CHECK-LABEL: test_fmls_bf16_vg2_index:
423 ; CHECK:  // %bb.0:
424 ; CHECK:    mov w8, w0
425 ; CHECK:    bfmls za.h[w8, 0, vgx2], { z0.h, z1.h }, z2.h[7]
426 ; CHECK:    bfmls za.h[w8, 7, vgx2], { z0.h, z1.h }, z2.h[7]
427 ; CHECK:    ret
428                                       <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
429                                       <vscale x 8 x bfloat> %b) #0 {
430   call void @llvm.aarch64.sme.fmls.lane.vg1x2.nxv8bf16(i32 %slice,
431                                                        <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
432                                                        <vscale x 8 x bfloat> %b, i32 7);
433   %slice.7 = add i32 %slice, 7
434   call void @llvm.aarch64.sme.fmls.lane.vg1x2.nxv8bf16(i32 %slice.7,
435                                                       <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
436                                                       <vscale x 8 x bfloat> %b, i32 7);
437   ret void
440 define void @test_fmls_bf16_vg4_index(i32 %slice,
441 ; CHECK-LABEL: test_fmls_bf16_vg4_index:
442 ; CHECK:  // %bb.0:
443 ; CHECK:    mov w8, w0
444 ; CHECK:    bfmls za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h[7]
445 ; CHECK:    bfmls za.h[w8, 0, vgx4], { z0.h - z3.h }, z4.h[7]
446 ; CHECK:    ret
447                                       <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
448                                       <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
449                                       <vscale x 8 x bfloat> %b) #0 {
450   call void @llvm.aarch64.sme.fmls.lane.vg1x4.nxv8bf16(i32 %slice,
451                                                        <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
452                                                        <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
453                                                        <vscale x 8 x bfloat> %b, i32 7);
454   %slice.7 = add i32 %slice, 7
455   call void @llvm.aarch64.sme.fmls.lane.vg1x4.nxv8bf16(i32 %slice,
456                                                        <vscale x 8 x bfloat> %a0, <vscale x 8 x bfloat> %a1,
457                                                        <vscale x 8 x bfloat> %a2, <vscale x 8 x bfloat> %a3,
458                                                        <vscale x 8 x bfloat> %b, i32 7);
459   ret void
462 attributes #0 = { nounwind "target-features"="+sme2p1,+sme-f16f16,+sme-b16b16" }