diff --git a/mlir/include/mlir/Dialect/StandardOps/EDSC/Intrinsics.h b/mlir/include/mlir/Dialect/StandardOps/EDSC/Intrinsics.h --- a/mlir/include/mlir/Dialect/StandardOps/EDSC/Intrinsics.h +++ b/mlir/include/mlir/Dialect/StandardOps/EDSC/Intrinsics.h @@ -25,6 +25,8 @@ using std_constant_index = ValueBuilder; using std_constant_int = ValueBuilder; using std_dealloc = OperationBuilder; +using std_divis = ValueBuilder; +using std_diviu = ValueBuilder; using std_dim = ValueBuilder; using std_extract_element = ValueBuilder; using std_im = ValueBuilder; diff --git a/mlir/include/mlir/Dialect/Vector/EDSC/Intrinsics.h b/mlir/include/mlir/Dialect/Vector/EDSC/Intrinsics.h --- a/mlir/include/mlir/Dialect/Vector/EDSC/Intrinsics.h +++ b/mlir/include/mlir/Dialect/Vector/EDSC/Intrinsics.h @@ -19,6 +19,7 @@ using vector_insert = ValueBuilder; using vector_fma = ValueBuilder; using vector_extract = ValueBuilder; +using vector_extractelement = ValueBuilder; using vector_matmul = ValueBuilder; using vector_outerproduct = ValueBuilder; using vector_print = OperationBuilder; @@ -26,9 +27,6 @@ using vector_transfer_write = OperationBuilder; using vector_transpose = ValueBuilder; using vector_type_cast = ValueBuilder; -using vector_insert = ValueBuilder; -using vector_fma = ValueBuilder; -using vector_extract = ValueBuilder; using vector_extract_slices = ValueBuilder; using vector_insert_slices = ValueBuilder; using vector_extract_strided_slice = diff --git a/mlir/test/EDSC/builder-api-test.cpp b/mlir/test/EDSC/builder-api-test.cpp --- a/mlir/test/EDSC/builder-api-test.cpp +++ b/mlir/test/EDSC/builder-api-test.cpp @@ -419,6 +419,44 @@ f.erase(); } +TEST_FUNC(divis_op_i32) { + using namespace edsc::op; + auto f = makeFunction("divis_op", {}, {}); + + OpBuilder builder(f.getBody()); + ScopedContext scope(builder, f.getLoc()); + auto i32Type = builder.getI32Type(); + std_divis(std_constant_int(10, i32Type), std_constant_int(2, i32Type)); + + // clang-format off + // CHECK-LABEL: @divis_op + // CHECK-DAG: {{.*}} = constant 10 + // CHECK-DAG: {{.*}} = constant 2 + // CHECK-NEXT: {{.*}} = divi_signed + // clang-format on + f.print(llvm::outs()); + f.erase(); +} + +TEST_FUNC(diviu_op_i32) { + using namespace edsc::op; + auto f = makeFunction("diviu_op", {}, {}); + + OpBuilder builder(f.getBody()); + ScopedContext scope(builder, f.getLoc()); + auto i32Type = builder.getI32Type(); + std_diviu(std_constant_int(10, i32Type), std_constant_int(2, i32Type)); + + // clang-format off + // CHECK-LABEL: @diviu_op + // CHECK-DAG: {{.*}} = constant 10 + // CHECK-DAG: {{.*}} = constant 2 + // CHECK-NEXT: {{.*}} = divi_unsigned + // clang-format on + f.print(llvm::outs()); + f.erase(); +} + TEST_FUNC(select_op_i32) { using namespace edsc::op; auto f32Type = FloatType::getF32(&globalContext()); @@ -924,6 +962,28 @@ f.erase(); } +TEST_FUNC(vector_extractelement_op_i32) { + using namespace edsc::op; + auto f = makeFunction("vector_extractelement_op", {}, {}); + + OpBuilder builder(f.getBody()); + ScopedContext scope(builder, f.getLoc()); + auto i32Type = builder.getI32Type(); + auto vectorType = VectorType::get(/*shape=*/{8}, i32Type); + vector_extractelement( + i32Type, std_constant(vectorType, builder.getI32VectorAttr({10})), + std_constant_int(0, i32Type)); + + // clang-format off + // CHECK-LABEL: @vector_extractelement_op + // CHECK-DAG: {{.*}} = constant dense<10> + // CHECK-DAG: {{.*}} = constant 0 + // CHECK-NEXT: {{.*}} = vector.extractelement + // clang-format on + f.print(llvm::outs()); + f.erase(); +} + // CHECK-LABEL: func @memref_vector_matmul_test( // CHECK-SAME: %[[A:.*]]: memref>, // CHECK-SAME: %[[B:.*]]: memref>,