301 lines · plain
1// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s2 3// This test covers the Integer Dot Product ops defined in the4// SPV_KHR_integer_dot_product extension.5 6//===----------------------------------------------------------------------===//7// spirv.SDot8//===----------------------------------------------------------------------===//9 10// CHECK: @sdot_scalar_i3211func.func @sdot_scalar_i32(%a: i32, %b: i32) -> i32 {12 // CHECK-NEXT: spirv.SDot13 %r = spirv.SDot %a, %b, <PackedVectorFormat4x8Bit> : i32 -> i3214 return %r : i3215}16 17// CHECK: @sdot_scalar_i6418func.func @sdot_scalar_i64(%a: i32, %b: i32) -> i64 {19 // CHECK-NEXT: spirv.SDot20 %r = spirv.SDot %a, %b, <PackedVectorFormat4x8Bit> : i32 -> i6421 return %r : i6422}23 24// CHECK: @sdot_vector_4xi825func.func @sdot_vector_4xi8(%a: vector<4xi8>, %b: vector<4xi8>) -> i32 {26 // CHECK-NEXT: spirv.SDot27 %r = spirv.SDot %a, %b : vector<4xi8> -> i3228 return %r : i3229}30 31// CHECK: @sdot_vector_4xi1632func.func @sdot_vector_4xi16(%a: vector<4xi16>, %b: vector<4xi16>) -> i64 {33 // CHECK-NEXT: spirv.SDot34 %r = spirv.SDot %a, %b : vector<4xi16> -> i6435 return %r : i6436}37 38// CHECK: @sdot_vector_8xi839func.func @sdot_vector_8xi8(%a: vector<8xi8>, %b: vector<8xi8>) -> i64 {40 // CHECK-NEXT: spirv.SDot41 %r = spirv.SDot %a, %b : vector<8xi8> -> i6442 return %r : i6443}44 45// -----46 47// expected-note @+1 {{prior use here}}48func.func @sdot_scalar_bad_types(%a: i32, %b: i64) -> i32 {49 // expected-error @+1 {{use of value '%b' expects different type than prior uses: 'i32' vs 'i64'}}50 %r = spirv.SDot %a, %b : i32 -> i3251 return %r : i3252}53// -----54 55func.func @sdot_vector_4xi8_bad_attr(%a: vector<4xi8>, %b: vector<4xi8>) -> i32 {56 // expected-error @+1 {{op with invalid format attribute for vector operands of type 'vector<4xi8>'}}57 %r = spirv.SDot %a, %b, <PackedVectorFormat4x8Bit> : vector<4xi8> -> i3258 return %r : i3259}60 61// -----62 63func.func @sdot_scalar_bad_types(%a: i32, %b: i32) -> i16 {64 // expected-error @+1 {{op result type has insufficient bit-width (16 bits) for the specified vector operand type (32 bits)}}65 %r = spirv.SDot %a, %b, <PackedVectorFormat4x8Bit> : i32 -> i1666 return %r : i1667}68 69// -----70 71func.func @sdot_scalar_bad_types(%a: i64, %b: i64) -> i64 {72 // expected-error @+1 {{op with specified Packed Vector Format (PackedVectorFormat4x8Bit) requires integer vector operands to be 32-bits wide}}73 %r = spirv.SDot %a, %b, <PackedVectorFormat4x8Bit> : i64 -> i6474 return %r : i6475}76 77// -----78 79//===----------------------------------------------------------------------===//80// spirv.SUDot81//===----------------------------------------------------------------------===//82 83// CHECK: @sudot_scalar_i3284func.func @sudot_scalar_i32(%a: i32, %b: i32) -> i32 {85 // CHECK-NEXT: spirv.SUDot86 %r = spirv.SUDot %a, %b, <PackedVectorFormat4x8Bit> : i32 -> i3287 return %r : i3288}89 90// CHECK: @sudot_scalar_i6491func.func @sudot_scalar_i64(%a: i32, %b: i32) -> i64 {92 // CHECK-NEXT: spirv.SUDot93 %r = spirv.SUDot %a, %b, <PackedVectorFormat4x8Bit> : i32 -> i6494 return %r : i6495}96 97// CHECK: @sudot_vector_4xi898func.func @sudot_vector_4xi8(%a: vector<4xi8>, %b: vector<4xi8>) -> i32 {99 // CHECK-NEXT: spirv.SUDot100 %r = spirv.SUDot %a, %b : vector<4xi8> -> i32101 return %r : i32102}103 104// CHECK: @sudot_vector_4xi16105func.func @sudot_vector_4xi16(%a: vector<4xi16>, %b: vector<4xi16>) -> i64 {106 // CHECK-NEXT: spirv.SUDot107 %r = spirv.SUDot %a, %b : vector<4xi16> -> i64108 return %r : i64109}110 111// CHECK: @sudot_vector_8xi8112func.func @sudot_vector_8xi8(%a: vector<8xi8>, %b: vector<8xi8>) -> i64 {113 // CHECK-NEXT: spirv.SUDot114 %r = spirv.SUDot %a, %b : vector<8xi8> -> i64115 return %r : i64116}117 118// -----119 120//===----------------------------------------------------------------------===//121// spirv.UDot122//===----------------------------------------------------------------------===//123 124// CHECK: @udot_scalar_i32125func.func @udot_scalar_i32(%a: i32, %b: i32) -> i32 {126 // CHECK-NEXT: spirv.UDot127 %r = spirv.UDot %a, %b, <PackedVectorFormat4x8Bit> : i32 -> i32128 return %r : i32129}130 131// CHECK: @udot_scalar_i64132func.func @udot_scalar_i64(%a: i32, %b: i32) -> i64 {133 // CHECK-NEXT: spirv.UDot134 %r = spirv.UDot %a, %b, <PackedVectorFormat4x8Bit> : i32 -> i64135 return %r : i64136}137 138// CHECK: @udot_vector_4xi8139func.func @udot_vector_4xi8(%a: vector<4xi8>, %b: vector<4xi8>) -> i32 {140 // CHECK-NEXT: spirv.UDot141 %r = spirv.UDot %a, %b : vector<4xi8> -> i32142 return %r : i32143}144 145// -----146 147//===----------------------------------------------------------------------===//148// spirv.SDotAccSat149//===----------------------------------------------------------------------===//150 151// CHECK: @sdot_acc_sat_scalar_i32152func.func @sdot_acc_sat_scalar_i32(%a: i32, %b: i32, %acc : i32) -> i32 {153 // CHECK-NEXT: spirv.SDotAccSat154 %r = spirv.SDotAccSat %a, %b, %acc, <PackedVectorFormat4x8Bit> : i32 -> i32155 return %r : i32156}157 158// CHECK: @sdot_acc_sat_scalar_i64159func.func @sdot_acc_sat_scalar_i64(%a: i32, %b: i32, %acc : i64) -> i64 {160 // CHECK-NEXT: spirv.SDotAccSat161 %r = spirv.SDotAccSat %a, %b, %acc, <PackedVectorFormat4x8Bit> : i32 -> i64162 return %r : i64163}164 165// CHECK: @sdot_acc_sat_vector_4xi8166func.func @sdot_acc_sat_vector_4xi8(%a: vector<4xi8>, %b: vector<4xi8>, %acc : i32) -> i32 {167 // CHECK-NEXT: spirv.SDotAccSat168 %r = spirv.SDotAccSat %a, %b, %acc : vector<4xi8> -> i32169 return %r : i32170}171 172// CHECK: @sdot_acc_sat_vector_4xi16173func.func @sdot_acc_sat_vector_4xi16(%a: vector<4xi16>, %b: vector<4xi16>, %acc : i64) -> i64 {174 // CHECK-NEXT: spirv.SDotAccSat175 %r = spirv.SDotAccSat %a, %b, %acc : vector<4xi16> -> i64176 return %r : i64177}178 179// CHECK: @sdot_acc_sat_vector_8xi8180func.func @sdot_acc_sat_vector_8xi8(%a: vector<8xi8>, %b: vector<8xi8>, %acc : i64) -> i64 {181 // CHECK-NEXT: spirv.SDotAccSat182 %r = spirv.SDotAccSat %a, %b, %acc : vector<8xi8> -> i64183 return %r : i64184}185 186// -----187 188// expected-note @+1 {{prior use here}}189func.func @sdot_acc_sat_scalar_bad_types(%a: i32, %b: i64, %acc : i32) -> i32 {190 // expected-error @+1 {{use of value '%b' expects different type than prior uses: 'i32' vs 'i64'}}191 %r = spirv.SDotAccSat %a, %b, %acc, <PackedVectorFormat4x8Bit> : i32 -> i32192 return %r : i32193}194 195// -----196 197func.func @sdot_acc_sat_scalar_bad_types(%a: i32, %b: i32, %acc : i16) -> i16 {198 // expected-error @+1 {{op result type has insufficient bit-width (16 bits) for the specified vector operand type (32 bits)}}199 %r = spirv.SDotAccSat %a, %b, %acc, <PackedVectorFormat4x8Bit> : i32 -> i16200 return %r : i16201}202 203// -----204 205func.func @sdot_acc_sat_scalar_bad_types(%a: i64, %b: i64, %acc : i64) -> i64 {206 // expected-error @+1 {{op with specified Packed Vector Format (PackedVectorFormat4x8Bit) requires integer vector operands to be 32-bits wide}}207 %r = spirv.SDotAccSat %a, %b, %acc, <PackedVectorFormat4x8Bit> : i64 -> i64208 return %r : i64209}210 211// -----212 213// expected-note @+1 {{prior use here}}214func.func @sdot_acc_sat_scalar_bad_accumulator(%a: i32, %b: i32, %acc : i32) -> i64 {215 // expected-error @+1 {{use of value '%acc' expects different type than prior uses: 'i64' vs 'i32'}}216 %r = spirv.SDotAccSat %a, %b, %acc, <PackedVectorFormat4x8Bit> : i32 -> i64217 return %r : i64218}219 220// -----221 222//===----------------------------------------------------------------------===//223// spirv.SUDotAccSat224//===----------------------------------------------------------------------===//225 226// CHECK: @sudot_acc_sat_scalar_i32227func.func @sudot_acc_sat_scalar_i32(%a: i32, %b: i32, %acc : i32) -> i32 {228 // CHECK-NEXT: spirv.SUDotAccSat229 %r = spirv.SUDotAccSat %a, %b, %acc, <PackedVectorFormat4x8Bit> : i32 -> i32230 return %r : i32231}232 233// CHECK: @sudot_acc_sat_scalar_i64234func.func @sudot_acc_sat_scalar_i64(%a: i32, %b: i32, %acc : i64) -> i64 {235 // CHECK-NEXT: spirv.SUDotAccSat236 %r = spirv.SUDotAccSat %a, %b, %acc, <PackedVectorFormat4x8Bit> : i32 -> i64237 return %r : i64238}239 240// CHECK: @sudot_acc_sat_vector_4xi8241func.func @sudot_acc_sat_vector_4xi8(%a: vector<4xi8>, %b: vector<4xi8>, %acc : i32) -> i32 {242 // CHECK-NEXT: spirv.SUDotAccSat243 %r = spirv.SUDotAccSat %a, %b, %acc : vector<4xi8> -> i32244 return %r : i32245}246 247// CHECK: @sudot_acc_sat_vector_4xi16248func.func @sudot_acc_sat_vector_4xi16(%a: vector<4xi16>, %b: vector<4xi16>, %acc : i64) -> i64 {249 // CHECK-NEXT: spirv.SUDotAccSat250 %r = spirv.SUDotAccSat %a, %b, %acc : vector<4xi16> -> i64251 return %r : i64252}253 254// CHECK: @sudot_acc_sat_vector_8xi8255func.func @sudot_acc_sat_vector_8xi8(%a: vector<8xi8>, %b: vector<8xi8>, %acc : i64) -> i64 {256 // CHECK-NEXT: spirv.SUDotAccSat257 %r = spirv.SUDotAccSat %a, %b, %acc : vector<8xi8> -> i64258 return %r : i64259}260 261// -----262 263//===----------------------------------------------------------------------===//264// spirv.UDotAccSat265//===----------------------------------------------------------------------===//266 267// CHECK: @udot_acc_sat_scalar_i32268func.func @udot_acc_sat_scalar_i32(%a: i32, %b: i32, %acc : i32) -> i32 {269 // CHECK-NEXT: spirv.UDotAccSat270 %r = spirv.UDotAccSat %a, %b, %acc, <PackedVectorFormat4x8Bit> : i32 -> i32271 return %r : i32272}273 274// CHECK: @udot_acc_sat_scalar_i64275func.func @udot_acc_sat_scalar_i64(%a: i32, %b: i32, %acc : i64) -> i64 {276 // CHECK-NEXT: spirv.UDotAccSat277 %r = spirv.UDotAccSat %a, %b, %acc, <PackedVectorFormat4x8Bit> : i32 -> i64278 return %r : i64279}280 281// CHECK: @udot_acc_sat_vector_4xi8282func.func @udot_acc_sat_vector_4xi8(%a: vector<4xi8>, %b: vector<4xi8>, %acc : i32) -> i32 {283 // CHECK-NEXT: spirv.UDotAccSat284 %r = spirv.UDotAccSat %a, %b, %acc : vector<4xi8> -> i32285 return %r : i32286}287 288// CHECK: @udot_acc_sat_vector_4xi16289func.func @udot_acc_sat_vector_4xi16(%a: vector<4xi16>, %b: vector<4xi16>, %acc : i64) -> i64 {290 // CHECK-NEXT: spirv.UDotAccSat291 %r = spirv.UDotAccSat %a, %b, %acc : vector<4xi16> -> i64292 return %r : i64293}294 295// CHECK: @udot_acc_sat_vector_8xi8296func.func @udot_acc_sat_vector_8xi8(%a: vector<8xi8>, %b: vector<8xi8>, %acc : i64) -> i64 {297 // CHECK-NEXT: spirv.UDotAccSat298 %r = spirv.UDotAccSat %a, %b, %acc : vector<8xi8> -> i64299 return %r : i64300}301