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