219 lines · plain
1// RUN: mlir-opt -test-convert-to-spirv="run-signature-conversion=false run-vector-unrolling=false" -split-input-file %s | FileCheck %s2 3//===----------------------------------------------------------------------===//4// arithmetic ops5//===----------------------------------------------------------------------===//6 7// CHECK-LABEL: @int32_scalar8func.func @int32_scalar(%lhs: i32, %rhs: i32) {9 // CHECK: spirv.IAdd %{{.*}}, %{{.*}}: i3210 %0 = arith.addi %lhs, %rhs: i3211 // CHECK: spirv.ISub %{{.*}}, %{{.*}}: i3212 %1 = arith.subi %lhs, %rhs: i3213 // CHECK: spirv.IMul %{{.*}}, %{{.*}}: i3214 %2 = arith.muli %lhs, %rhs: i3215 // CHECK: spirv.SDiv %{{.*}}, %{{.*}}: i3216 %3 = arith.divsi %lhs, %rhs: i3217 // CHECK: spirv.UDiv %{{.*}}, %{{.*}}: i3218 %4 = arith.divui %lhs, %rhs: i3219 // CHECK: spirv.UMod %{{.*}}, %{{.*}}: i3220 %5 = arith.remui %lhs, %rhs: i3221 return22}23 24// CHECK-LABEL: @int32_scalar_srem25// CHECK-SAME: (%[[LHS:.+]]: i32, %[[RHS:.+]]: i32)26func.func @int32_scalar_srem(%lhs: i32, %rhs: i32) {27 // CHECK: %[[LABS:.+]] = spirv.GL.SAbs %[[LHS]] : i3228 // CHECK: %[[RABS:.+]] = spirv.GL.SAbs %[[RHS]] : i3229 // CHECK: %[[ABS:.+]] = spirv.UMod %[[LABS]], %[[RABS]] : i3230 // CHECK: %[[POS:.+]] = spirv.IEqual %[[LHS]], %[[LABS]] : i3231 // CHECK: %[[NEG:.+]] = spirv.SNegate %[[ABS]] : i3232 // CHECK: %{{.+}} = spirv.Select %[[POS]], %[[ABS]], %[[NEG]] : i1, i3233 %0 = arith.remsi %lhs, %rhs: i3234 return35}36 37// -----38 39//===----------------------------------------------------------------------===//40// arith bit ops41//===----------------------------------------------------------------------===//42 43// CHECK-LABEL: @bitwise_scalar44func.func @bitwise_scalar(%arg0 : i32, %arg1 : i32) {45 // CHECK: spirv.BitwiseAnd46 %0 = arith.andi %arg0, %arg1 : i3247 // CHECK: spirv.BitwiseOr48 %1 = arith.ori %arg0, %arg1 : i3249 // CHECK: spirv.BitwiseXor50 %2 = arith.xori %arg0, %arg1 : i3251 return52}53 54// CHECK-LABEL: @bitwise_vector55func.func @bitwise_vector(%arg0 : vector<4xi32>, %arg1 : vector<4xi32>) {56 // CHECK: spirv.BitwiseAnd57 %0 = arith.andi %arg0, %arg1 : vector<4xi32>58 // CHECK: spirv.BitwiseOr59 %1 = arith.ori %arg0, %arg1 : vector<4xi32>60 // CHECK: spirv.BitwiseXor61 %2 = arith.xori %arg0, %arg1 : vector<4xi32>62 return63}64 65// CHECK-LABEL: @logical_scalar66func.func @logical_scalar(%arg0 : i1, %arg1 : i1) {67 // CHECK: spirv.LogicalAnd68 %0 = arith.andi %arg0, %arg1 : i169 // CHECK: spirv.LogicalOr70 %1 = arith.ori %arg0, %arg1 : i171 // CHECK: spirv.LogicalNotEqual72 %2 = arith.xori %arg0, %arg1 : i173 return74}75 76// CHECK-LABEL: @logical_vector77func.func @logical_vector(%arg0 : vector<4xi1>, %arg1 : vector<4xi1>) {78 // CHECK: spirv.LogicalAnd79 %0 = arith.andi %arg0, %arg1 : vector<4xi1>80 // CHECK: spirv.LogicalOr81 %1 = arith.ori %arg0, %arg1 : vector<4xi1>82 // CHECK: spirv.LogicalNotEqual83 %2 = arith.xori %arg0, %arg1 : vector<4xi1>84 return85}86 87// CHECK-LABEL: @shift_scalar88func.func @shift_scalar(%arg0 : i32, %arg1 : i32) {89 // CHECK: spirv.ShiftLeftLogical90 %0 = arith.shli %arg0, %arg1 : i3291 // CHECK: spirv.ShiftRightArithmetic92 %1 = arith.shrsi %arg0, %arg1 : i3293 // CHECK: spirv.ShiftRightLogical94 %2 = arith.shrui %arg0, %arg1 : i3295 return96}97 98// CHECK-LABEL: @shift_vector99func.func @shift_vector(%arg0 : vector<4xi32>, %arg1 : vector<4xi32>) {100 // CHECK: spirv.ShiftLeftLogical101 %0 = arith.shli %arg0, %arg1 : vector<4xi32>102 // CHECK: spirv.ShiftRightArithmetic103 %1 = arith.shrsi %arg0, %arg1 : vector<4xi32>104 // CHECK: spirv.ShiftRightLogical105 %2 = arith.shrui %arg0, %arg1 : vector<4xi32>106 return107}108 109// -----110 111//===----------------------------------------------------------------------===//112// arith.cmpf113//===----------------------------------------------------------------------===//114 115// CHECK-LABEL: @cmpf116func.func @cmpf(%arg0 : f32, %arg1 : f32) {117 // CHECK: spirv.FOrdEqual118 %1 = arith.cmpf oeq, %arg0, %arg1 : f32119 return120}121 122// CHECK-LABEL: @vec1cmpf123func.func @vec1cmpf(%arg0 : vector<1xf32>, %arg1 : vector<1xf32>) {124 // CHECK: spirv.FOrdGreaterThan125 %0 = arith.cmpf ogt, %arg0, %arg1 : vector<1xf32>126 // CHECK: spirv.FUnordLessThan127 %1 = arith.cmpf ult, %arg0, %arg1 : vector<1xf32>128 return129}130 131// -----132 133//===----------------------------------------------------------------------===//134// arith.cmpi135//===----------------------------------------------------------------------===//136 137// CHECK-LABEL: @cmpi138func.func @cmpi(%arg0 : i32, %arg1 : i32) {139 // CHECK: spirv.IEqual140 %0 = arith.cmpi eq, %arg0, %arg1 : i32141 return142}143 144// CHECK-LABEL: @indexcmpi145func.func @indexcmpi(%arg0 : index, %arg1 : index) {146 // CHECK: spirv.IEqual147 %0 = arith.cmpi eq, %arg0, %arg1 : index148 return149}150 151// CHECK-LABEL: @vec1cmpi152func.func @vec1cmpi(%arg0 : vector<1xi32>, %arg1 : vector<1xi32>) {153 // CHECK: spirv.ULessThan154 %0 = arith.cmpi ult, %arg0, %arg1 : vector<1xi32>155 // CHECK: spirv.SGreaterThan156 %1 = arith.cmpi sgt, %arg0, %arg1 : vector<1xi32>157 return158}159 160// CHECK-LABEL: @boolcmpi_equality161func.func @boolcmpi_equality(%arg0 : i1, %arg1 : i1) {162 // CHECK: spirv.LogicalEqual163 %0 = arith.cmpi eq, %arg0, %arg1 : i1164 // CHECK: spirv.LogicalNotEqual165 %1 = arith.cmpi ne, %arg0, %arg1 : i1166 return167}168 169// CHECK-LABEL: @boolcmpi_unsigned170func.func @boolcmpi_unsigned(%arg0 : i1, %arg1 : i1) {171 // CHECK-COUNT-2: spirv.Select172 // CHECK: spirv.UGreaterThanEqual173 %0 = arith.cmpi uge, %arg0, %arg1 : i1174 // CHECK-COUNT-2: spirv.Select175 // CHECK: spirv.ULessThan176 %1 = arith.cmpi ult, %arg0, %arg1 : i1177 return178}179 180// CHECK-LABEL: @vec1boolcmpi_equality181func.func @vec1boolcmpi_equality(%arg0 : vector<1xi1>, %arg1 : vector<1xi1>) {182 // CHECK: spirv.LogicalEqual183 %0 = arith.cmpi eq, %arg0, %arg1 : vector<1xi1>184 // CHECK: spirv.LogicalNotEqual185 %1 = arith.cmpi ne, %arg0, %arg1 : vector<1xi1>186 return187}188 189// CHECK-LABEL: @vec1boolcmpi_unsigned190func.func @vec1boolcmpi_unsigned(%arg0 : vector<1xi1>, %arg1 : vector<1xi1>) {191 // CHECK-COUNT-2: spirv.Select192 // CHECK: spirv.UGreaterThanEqual193 %0 = arith.cmpi uge, %arg0, %arg1 : vector<1xi1>194 // CHECK-COUNT-2: spirv.Select195 // CHECK: spirv.ULessThan196 %1 = arith.cmpi ult, %arg0, %arg1 : vector<1xi1>197 return198}199 200// CHECK-LABEL: @vecboolcmpi_equality201func.func @vecboolcmpi_equality(%arg0 : vector<4xi1>, %arg1 : vector<4xi1>) {202 // CHECK: spirv.LogicalEqual203 %0 = arith.cmpi eq, %arg0, %arg1 : vector<4xi1>204 // CHECK: spirv.LogicalNotEqual205 %1 = arith.cmpi ne, %arg0, %arg1 : vector<4xi1>206 return207}208 209// CHECK-LABEL: @vecboolcmpi_unsigned210func.func @vecboolcmpi_unsigned(%arg0 : vector<3xi1>, %arg1 : vector<3xi1>) {211 // CHECK-COUNT-2: spirv.Select212 // CHECK: spirv.UGreaterThanEqual213 %0 = arith.cmpi uge, %arg0, %arg1 : vector<3xi1>214 // CHECK-COUNT-2: spirv.Select215 // CHECK: spirv.ULessThan216 %1 = arith.cmpi ult, %arg0, %arg1 : vector<3xi1>217 return218}219