xref: /llvm-project/mlir/test/Dialect/ArmSVE/roundtrip.mlir (revision 781133037387eefa4080aa31c73554cc0452e6e6)
1// RUN: mlir-opt -verify-diagnostics -split-input-file %s | mlir-opt | FileCheck %s
2
3func.func @arm_sve_sdot(%a: vector<[16]xi8>,
4                   %b: vector<[16]xi8>,
5                   %c: vector<[4]xi32>) -> vector<[4]xi32> {
6  // CHECK: arm_sve.sdot {{.*}}: vector<[16]xi8> to vector<[4]xi32
7  %0 = arm_sve.sdot %c, %a, %b :
8             vector<[16]xi8> to vector<[4]xi32>
9  return %0 : vector<[4]xi32>
10}
11
12// -----
13
14func.func @arm_sve_smmla(%a: vector<[16]xi8>,
15                    %b: vector<[16]xi8>,
16                    %c: vector<[4]xi32>) -> vector<[4]xi32> {
17  // CHECK: arm_sve.smmla {{.*}}: vector<[16]xi8> to vector<[4]xi3
18  %0 = arm_sve.smmla %c, %a, %b :
19             vector<[16]xi8> to vector<[4]xi32>
20  return %0 : vector<[4]xi32>
21}
22
23// -----
24
25func.func @arm_sve_udot(%a: vector<[16]xi8>,
26                   %b: vector<[16]xi8>,
27                   %c: vector<[4]xi32>) -> vector<[4]xi32> {
28  // CHECK: arm_sve.udot {{.*}}: vector<[16]xi8> to vector<[4]xi32
29  %0 = arm_sve.udot %c, %a, %b :
30             vector<[16]xi8> to vector<[4]xi32>
31  return %0 : vector<[4]xi32>
32}
33
34// -----
35
36func.func @arm_sve_ummla(%a: vector<[16]xi8>,
37                    %b: vector<[16]xi8>,
38                    %c: vector<[4]xi32>) -> vector<[4]xi32> {
39  // CHECK: arm_sve.ummla {{.*}}: vector<[16]xi8> to vector<[4]xi3
40  %0 = arm_sve.ummla %c, %a, %b :
41             vector<[16]xi8> to vector<[4]xi32>
42  return %0 : vector<[4]xi32>
43}
44
45// -----
46
47func.func @arm_sve_masked_arithi(%a: vector<[4]xi32>,
48                            %b: vector<[4]xi32>,
49                            %c: vector<[4]xi32>,
50                            %d: vector<[4]xi32>,
51                            %e: vector<[4]xi32>,
52                            %mask: vector<[4]xi1>)
53                            -> vector<[4]xi32> {
54  // CHECK: arm_sve.masked.muli {{.*}}: vector<[4]xi1>, vector<
55  %0 = arm_sve.masked.muli %mask, %a, %b : vector<[4]xi1>,
56                                           vector<[4]xi32>
57  // CHECK: arm_sve.masked.addi {{.*}}: vector<[4]xi1>, vector<
58  %1 = arm_sve.masked.addi %mask, %0, %c : vector<[4]xi1>,
59                                           vector<[4]xi32>
60  // CHECK: arm_sve.masked.subi {{.*}}: vector<[4]xi1>, vector<
61  %2 = arm_sve.masked.subi %mask, %1, %d : vector<[4]xi1>,
62                                           vector<[4]xi32>
63  // CHECK: arm_sve.masked.divi_signed
64  %3 = arm_sve.masked.divi_signed %mask, %2, %e : vector<[4]xi1>,
65                                                  vector<[4]xi32>
66  // CHECK: arm_sve.masked.divi_unsigned
67  %4 = arm_sve.masked.divi_unsigned %mask, %3, %e : vector<[4]xi1>,
68                                                    vector<[4]xi32>
69  return %2 : vector<[4]xi32>
70}
71
72// -----
73
74func.func @arm_sve_masked_arithf(%a: vector<[4]xf32>,
75                            %b: vector<[4]xf32>,
76                            %c: vector<[4]xf32>,
77                            %d: vector<[4]xf32>,
78                            %e: vector<[4]xf32>,
79                            %mask: vector<[4]xi1>)
80                            -> vector<[4]xf32> {
81  // CHECK: arm_sve.masked.mulf {{.*}}: vector<[4]xi1>, vector<
82  %0 = arm_sve.masked.mulf %mask, %a, %b : vector<[4]xi1>,
83                                           vector<[4]xf32>
84  // CHECK: arm_sve.masked.addf {{.*}}: vector<[4]xi1>, vector<
85  %1 = arm_sve.masked.addf %mask, %0, %c : vector<[4]xi1>,
86                                           vector<[4]xf32>
87  // CHECK: arm_sve.masked.subf {{.*}}: vector<[4]xi1>, vector<
88  %2 = arm_sve.masked.subf %mask, %1, %d : vector<[4]xi1>,
89                                           vector<[4]xf32>
90  // CHECK: arm_sve.masked.divf {{.*}}: vector<[4]xi1>, vector<
91  %3 = arm_sve.masked.divf %mask, %2, %e : vector<[4]xi1>,
92                                           vector<[4]xf32>
93  return %3 : vector<[4]xf32>
94}
95
96// -----
97
98func.func @arm_sve_convert_to_svbool(%a: vector<[1]xi1>,
99                                     %b: vector<[2]xi1>,
100                                     %c: vector<[4]xi1>,
101                                     %d: vector<[8]xi1>,
102                                     %e: vector<2x3x[1]xi1>,
103                                     %f: vector<4x[2]xi1>,
104                                     %g: vector<1x1x1x2x[4]xi1>,
105                                     %h: vector<100x[8]xi1>) {
106  // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<[1]xi1>
107  %1 = arm_sve.convert_to_svbool %a : vector<[1]xi1>
108
109  // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<[2]xi1>
110  %2 = arm_sve.convert_to_svbool %b : vector<[2]xi1>
111
112  // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<[4]xi1>
113  %3 = arm_sve.convert_to_svbool %c : vector<[4]xi1>
114
115  // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<[8]xi1>
116  %4 = arm_sve.convert_to_svbool %d : vector<[8]xi1>
117
118  // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<2x3x[1]xi1>
119  %5 = arm_sve.convert_to_svbool %e : vector<2x3x[1]xi1>
120
121  // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<4x[2]xi1>
122  %6 = arm_sve.convert_to_svbool %f : vector<4x[2]xi1>
123
124  // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<1x1x1x2x[4]xi1>
125  %7 = arm_sve.convert_to_svbool %g : vector<1x1x1x2x[4]xi1>
126
127  // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<100x[8]xi1>
128  %8 = arm_sve.convert_to_svbool %h : vector<100x[8]xi1>
129
130  return
131}
132
133// -----
134
135func.func @arm_sve_convert_from_svbool(%a: vector<[16]xi1>,
136                                       %b: vector<2x3x[16]xi1>,
137                                       %c: vector<4x[16]xi1>,
138                                       %d: vector<1x1x1x1x[16]xi1>,
139                                       %e: vector<32x[16]xi1>) {
140  // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<[1]xi1>
141  %1 = arm_sve.convert_from_svbool %a : vector<[1]xi1>
142
143  // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<[2]xi1>
144  %2 = arm_sve.convert_from_svbool %a : vector<[2]xi1>
145
146  // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<[4]xi1>
147  %3 = arm_sve.convert_from_svbool %a : vector<[4]xi1>
148
149  // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<[8]xi1>
150  %4 = arm_sve.convert_from_svbool %a : vector<[8]xi1>
151
152  // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<2x3x[1]xi1>
153  %5 = arm_sve.convert_from_svbool %b : vector<2x3x[1]xi1>
154
155  // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<4x[2]xi1>
156  %6 = arm_sve.convert_from_svbool %c : vector<4x[2]xi1>
157
158  // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<1x1x1x1x[4]xi1>
159  %7 = arm_sve.convert_from_svbool %d : vector<1x1x1x1x[4]xi1>
160
161  // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<32x[8]xi1>
162  %8 = arm_sve.convert_from_svbool %e : vector<32x[8]xi1>
163
164  return
165}
166
167// -----
168
169func.func @arm_sve_zip_x2(
170  %v1: vector<[2]xi64>,
171  %v2: vector<[2]xf64>,
172  %v3: vector<[4]xi32>,
173  %v4: vector<[4]xf32>,
174  %v5: vector<[8]xi16>,
175  %v6: vector<[8]xf16>,
176  %v7: vector<[8]xbf16>,
177  %v8: vector<[16]xi8>
178) {
179  // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[2]xi64>
180  %a1, %b1 = arm_sve.zip.x2 %v1, %v1 : vector<[2]xi64>
181  // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[2]xf64>
182  %a2, %b2 = arm_sve.zip.x2 %v2, %v2 : vector<[2]xf64>
183  // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[4]xi32>
184  %a3, %b3 = arm_sve.zip.x2 %v3, %v3 : vector<[4]xi32>
185  // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[4]xf32>
186  %a4, %b4 = arm_sve.zip.x2 %v4, %v4 : vector<[4]xf32>
187  // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[8]xi16>
188  %a5, %b5 = arm_sve.zip.x2 %v5, %v5 : vector<[8]xi16>
189  // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[8]xf16>
190  %a6, %b6 = arm_sve.zip.x2 %v6, %v6 : vector<[8]xf16>
191  // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[8]xbf16>
192  %a7, %b7 = arm_sve.zip.x2 %v7, %v7 : vector<[8]xbf16>
193  // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[16]xi8>
194  %a8, %b8 = arm_sve.zip.x2 %v8, %v8 : vector<[16]xi8>
195  return
196}
197
198// -----
199
200func.func @arm_sve_zip_x4(
201  %v1: vector<[2]xi64>,
202  %v2: vector<[2]xf64>,
203  %v3: vector<[4]xi32>,
204  %v4: vector<[4]xf32>,
205  %v5: vector<[8]xi16>,
206  %v6: vector<[8]xf16>,
207  %v7: vector<[8]xbf16>,
208  %v8: vector<[16]xi8>
209) {
210  // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[2]xi64>
211  %a1, %b1, %c1, %d1 = arm_sve.zip.x4 %v1, %v1, %v1, %v1 : vector<[2]xi64>
212  // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[2]xf64>
213  %a2, %b2, %c2, %d2 = arm_sve.zip.x4 %v2, %v2, %v2, %v2 : vector<[2]xf64>
214  // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[4]xi32>
215  %a3, %b3, %c3, %d3 = arm_sve.zip.x4 %v3, %v3, %v3, %v3 : vector<[4]xi32>
216  // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[4]xf32>
217  %a4, %b4, %c4, %d4 = arm_sve.zip.x4 %v4, %v4, %v4, %v4 : vector<[4]xf32>
218  // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[8]xi16>
219  %a5, %b5, %c5, %d5 = arm_sve.zip.x4 %v5, %v5, %v5, %v5 : vector<[8]xi16>
220  // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[8]xf16>
221  %a6, %b6, %c6, %d6 = arm_sve.zip.x4 %v6, %v6, %v6, %v6 : vector<[8]xf16>
222  // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[8]xbf16>
223  %a7, %b7, %c7, %d7 = arm_sve.zip.x4 %v7, %v7, %v7, %v7 : vector<[8]xbf16>
224  // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[16]xi8>
225  %a8, %b8, %c8, %d8 = arm_sve.zip.x4 %v8, %v8, %v8, %v8 : vector<[16]xi8>
226  return
227}
228
229// -----
230
231func.func @arm_sve_psel(
232  %p0: vector<[2]xi1>,
233  %p1: vector<[4]xi1>,
234  %p2: vector<[8]xi1>,
235  %p3: vector<[16]xi1>,
236  %index: index
237) {
238  // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[2]xi1>, vector<[2]xi1>
239  %0 = arm_sve.psel %p0, %p0[%index] : vector<[2]xi1>, vector<[2]xi1>
240  // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[4]xi1>, vector<[4]xi1>
241  %1 = arm_sve.psel %p1, %p1[%index] : vector<[4]xi1>, vector<[4]xi1>
242  // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[8]xi1>, vector<[8]xi1>
243  %2 = arm_sve.psel %p2, %p2[%index] : vector<[8]xi1>, vector<[8]xi1>
244  // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[16]xi1>, vector<[16]xi1>
245  %3 = arm_sve.psel %p3, %p3[%index] : vector<[16]xi1>, vector<[16]xi1>
246  /// Some mixed predicate type examples:
247  // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[2]xi1>, vector<[4]xi1>
248  %4 = arm_sve.psel %p0, %p1[%index] : vector<[2]xi1>, vector<[4]xi1>
249  // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[4]xi1>, vector<[8]xi1>
250  %5 = arm_sve.psel %p1, %p2[%index] : vector<[4]xi1>, vector<[8]xi1>
251  // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[8]xi1>, vector<[16]xi1>
252  %6 = arm_sve.psel %p2, %p3[%index] : vector<[8]xi1>, vector<[16]xi1>
253  // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[16]xi1>, vector<[2]xi1>
254  %7 = arm_sve.psel %p3, %p0[%index] : vector<[16]xi1>, vector<[2]xi1>
255  return
256}
257