278 lines · plain
1// RUN: mlir-opt -verify-diagnostics -split-input-file %s | mlir-opt | FileCheck %s2 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]xi327 %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]xi318 %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]xi3229 %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]xi340 %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_usmmla(%a: vector<[16]xi8>,48 %b: vector<[16]xi8>,49 %c: vector<[4]xi32>) -> vector<[4]xi32> {50 // CHECK: arm_sve.usmmla {{.*}}: vector<[16]xi8> to vector<[4]xi351 %0 = arm_sve.usmmla %c, %a, %b :52 vector<[16]xi8> to vector<[4]xi32>53 return %0 : vector<[4]xi32>54}55 56// -----57 58func.func @arm_sve_bfmmla(%a: vector<[8]xbf16>,59 %b: vector<[8]xbf16>,60 %c: vector<[4]xf32>) -> vector<[4]xf32> {61 // CHECK: arm_sve.intr.bfmmla {{.*}}: vector<[8]xbf16> to vector<[4]xf32>62 %0 = arm_sve.intr.bfmmla %c, %a, %b : vector<[8]xbf16> to vector<[4]xf32>63 return %0 : vector<[4]xf32>64}65 66// -----67 68func.func @arm_sve_masked_arithi(%a: vector<[4]xi32>,69 %b: vector<[4]xi32>,70 %c: vector<[4]xi32>,71 %d: vector<[4]xi32>,72 %e: vector<[4]xi32>,73 %mask: vector<[4]xi1>)74 -> vector<[4]xi32> {75 // CHECK: arm_sve.masked.muli {{.*}}: vector<[4]xi1>, vector<76 %0 = arm_sve.masked.muli %mask, %a, %b : vector<[4]xi1>,77 vector<[4]xi32>78 // CHECK: arm_sve.masked.addi {{.*}}: vector<[4]xi1>, vector<79 %1 = arm_sve.masked.addi %mask, %0, %c : vector<[4]xi1>,80 vector<[4]xi32>81 // CHECK: arm_sve.masked.subi {{.*}}: vector<[4]xi1>, vector<82 %2 = arm_sve.masked.subi %mask, %1, %d : vector<[4]xi1>,83 vector<[4]xi32>84 // CHECK: arm_sve.masked.divi_signed85 %3 = arm_sve.masked.divi_signed %mask, %2, %e : vector<[4]xi1>,86 vector<[4]xi32>87 // CHECK: arm_sve.masked.divi_unsigned88 %4 = arm_sve.masked.divi_unsigned %mask, %3, %e : vector<[4]xi1>,89 vector<[4]xi32>90 return %2 : vector<[4]xi32>91}92 93// -----94 95func.func @arm_sve_masked_arithf(%a: vector<[4]xf32>,96 %b: vector<[4]xf32>,97 %c: vector<[4]xf32>,98 %d: vector<[4]xf32>,99 %e: vector<[4]xf32>,100 %mask: vector<[4]xi1>)101 -> vector<[4]xf32> {102 // CHECK: arm_sve.masked.mulf {{.*}}: vector<[4]xi1>, vector<103 %0 = arm_sve.masked.mulf %mask, %a, %b : vector<[4]xi1>,104 vector<[4]xf32>105 // CHECK: arm_sve.masked.addf {{.*}}: vector<[4]xi1>, vector<106 %1 = arm_sve.masked.addf %mask, %0, %c : vector<[4]xi1>,107 vector<[4]xf32>108 // CHECK: arm_sve.masked.subf {{.*}}: vector<[4]xi1>, vector<109 %2 = arm_sve.masked.subf %mask, %1, %d : vector<[4]xi1>,110 vector<[4]xf32>111 // CHECK: arm_sve.masked.divf {{.*}}: vector<[4]xi1>, vector<112 %3 = arm_sve.masked.divf %mask, %2, %e : vector<[4]xi1>,113 vector<[4]xf32>114 return %3 : vector<[4]xf32>115}116 117// -----118 119func.func @arm_sve_convert_to_svbool(%a: vector<[1]xi1>,120 %b: vector<[2]xi1>,121 %c: vector<[4]xi1>,122 %d: vector<[8]xi1>,123 %e: vector<2x3x[1]xi1>,124 %f: vector<4x[2]xi1>,125 %g: vector<1x1x1x2x[4]xi1>,126 %h: vector<100x[8]xi1>) {127 // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<[1]xi1>128 %1 = arm_sve.convert_to_svbool %a : vector<[1]xi1>129 130 // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<[2]xi1>131 %2 = arm_sve.convert_to_svbool %b : vector<[2]xi1>132 133 // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<[4]xi1>134 %3 = arm_sve.convert_to_svbool %c : vector<[4]xi1>135 136 // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<[8]xi1>137 %4 = arm_sve.convert_to_svbool %d : vector<[8]xi1>138 139 // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<2x3x[1]xi1>140 %5 = arm_sve.convert_to_svbool %e : vector<2x3x[1]xi1>141 142 // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<4x[2]xi1>143 %6 = arm_sve.convert_to_svbool %f : vector<4x[2]xi1>144 145 // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<1x1x1x2x[4]xi1>146 %7 = arm_sve.convert_to_svbool %g : vector<1x1x1x2x[4]xi1>147 148 // CHECK: arm_sve.convert_to_svbool %{{.*}} : vector<100x[8]xi1>149 %8 = arm_sve.convert_to_svbool %h : vector<100x[8]xi1>150 151 return152}153 154// -----155 156func.func @arm_sve_convert_from_svbool(%a: vector<[16]xi1>,157 %b: vector<2x3x[16]xi1>,158 %c: vector<4x[16]xi1>,159 %d: vector<1x1x1x1x[16]xi1>,160 %e: vector<32x[16]xi1>) {161 // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<[1]xi1>162 %1 = arm_sve.convert_from_svbool %a : vector<[1]xi1>163 164 // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<[2]xi1>165 %2 = arm_sve.convert_from_svbool %a : vector<[2]xi1>166 167 // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<[4]xi1>168 %3 = arm_sve.convert_from_svbool %a : vector<[4]xi1>169 170 // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<[8]xi1>171 %4 = arm_sve.convert_from_svbool %a : vector<[8]xi1>172 173 // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<2x3x[1]xi1>174 %5 = arm_sve.convert_from_svbool %b : vector<2x3x[1]xi1>175 176 // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<4x[2]xi1>177 %6 = arm_sve.convert_from_svbool %c : vector<4x[2]xi1>178 179 // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<1x1x1x1x[4]xi1>180 %7 = arm_sve.convert_from_svbool %d : vector<1x1x1x1x[4]xi1>181 182 // CHECK: arm_sve.convert_from_svbool %{{.*}} : vector<32x[8]xi1>183 %8 = arm_sve.convert_from_svbool %e : vector<32x[8]xi1>184 185 return186}187 188// -----189 190func.func @arm_sve_zip_x2(191 %v1: vector<[2]xi64>,192 %v2: vector<[2]xf64>,193 %v3: vector<[4]xi32>,194 %v4: vector<[4]xf32>,195 %v5: vector<[8]xi16>,196 %v6: vector<[8]xf16>,197 %v7: vector<[8]xbf16>,198 %v8: vector<[16]xi8>199) {200 // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[2]xi64>201 %a1, %b1 = arm_sve.zip.x2 %v1, %v1 : vector<[2]xi64>202 // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[2]xf64>203 %a2, %b2 = arm_sve.zip.x2 %v2, %v2 : vector<[2]xf64>204 // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[4]xi32>205 %a3, %b3 = arm_sve.zip.x2 %v3, %v3 : vector<[4]xi32>206 // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[4]xf32>207 %a4, %b4 = arm_sve.zip.x2 %v4, %v4 : vector<[4]xf32>208 // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[8]xi16>209 %a5, %b5 = arm_sve.zip.x2 %v5, %v5 : vector<[8]xi16>210 // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[8]xf16>211 %a6, %b6 = arm_sve.zip.x2 %v6, %v6 : vector<[8]xf16>212 // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[8]xbf16>213 %a7, %b7 = arm_sve.zip.x2 %v7, %v7 : vector<[8]xbf16>214 // CHECK: arm_sve.zip.x2 %{{.*}} : vector<[16]xi8>215 %a8, %b8 = arm_sve.zip.x2 %v8, %v8 : vector<[16]xi8>216 return217}218 219// -----220 221func.func @arm_sve_zip_x4(222 %v1: vector<[2]xi64>,223 %v2: vector<[2]xf64>,224 %v3: vector<[4]xi32>,225 %v4: vector<[4]xf32>,226 %v5: vector<[8]xi16>,227 %v6: vector<[8]xf16>,228 %v7: vector<[8]xbf16>,229 %v8: vector<[16]xi8>230) {231 // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[2]xi64>232 %a1, %b1, %c1, %d1 = arm_sve.zip.x4 %v1, %v1, %v1, %v1 : vector<[2]xi64>233 // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[2]xf64>234 %a2, %b2, %c2, %d2 = arm_sve.zip.x4 %v2, %v2, %v2, %v2 : vector<[2]xf64>235 // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[4]xi32>236 %a3, %b3, %c3, %d3 = arm_sve.zip.x4 %v3, %v3, %v3, %v3 : vector<[4]xi32>237 // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[4]xf32>238 %a4, %b4, %c4, %d4 = arm_sve.zip.x4 %v4, %v4, %v4, %v4 : vector<[4]xf32>239 // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[8]xi16>240 %a5, %b5, %c5, %d5 = arm_sve.zip.x4 %v5, %v5, %v5, %v5 : vector<[8]xi16>241 // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[8]xf16>242 %a6, %b6, %c6, %d6 = arm_sve.zip.x4 %v6, %v6, %v6, %v6 : vector<[8]xf16>243 // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[8]xbf16>244 %a7, %b7, %c7, %d7 = arm_sve.zip.x4 %v7, %v7, %v7, %v7 : vector<[8]xbf16>245 // CHECK: arm_sve.zip.x4 %{{.*}} : vector<[16]xi8>246 %a8, %b8, %c8, %d8 = arm_sve.zip.x4 %v8, %v8, %v8, %v8 : vector<[16]xi8>247 return248}249 250// -----251 252func.func @arm_sve_psel(253 %p0: vector<[2]xi1>,254 %p1: vector<[4]xi1>,255 %p2: vector<[8]xi1>,256 %p3: vector<[16]xi1>,257 %index: index258) {259 // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[2]xi1>, vector<[2]xi1>260 %0 = arm_sve.psel %p0, %p0[%index] : vector<[2]xi1>, vector<[2]xi1>261 // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[4]xi1>, vector<[4]xi1>262 %1 = arm_sve.psel %p1, %p1[%index] : vector<[4]xi1>, vector<[4]xi1>263 // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[8]xi1>, vector<[8]xi1>264 %2 = arm_sve.psel %p2, %p2[%index] : vector<[8]xi1>, vector<[8]xi1>265 // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[16]xi1>, vector<[16]xi1>266 %3 = arm_sve.psel %p3, %p3[%index] : vector<[16]xi1>, vector<[16]xi1>267 /// Some mixed predicate type examples:268 // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[2]xi1>, vector<[4]xi1>269 %4 = arm_sve.psel %p0, %p1[%index] : vector<[2]xi1>, vector<[4]xi1>270 // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[4]xi1>, vector<[8]xi1>271 %5 = arm_sve.psel %p1, %p2[%index] : vector<[4]xi1>, vector<[8]xi1>272 // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[8]xi1>, vector<[16]xi1>273 %6 = arm_sve.psel %p2, %p3[%index] : vector<[8]xi1>, vector<[16]xi1>274 // CHECK: arm_sve.psel %{{.*}}, %{{.*}}[%{{.*}}] : vector<[16]xi1>, vector<[2]xi1>275 %7 = arm_sve.psel %p3, %p0[%index] : vector<[16]xi1>, vector<[2]xi1>276 return277}278