Add EmitC support for f32 conversion ops (#5858)
diff --git a/iree/compiler/Dialect/VM/Conversion/VMToEmitC/ConvertVMToEmitC.cpp b/iree/compiler/Dialect/VM/Conversion/VMToEmitC/ConvertVMToEmitC.cpp index 40de147..43c1a15 100644 --- a/iree/compiler/Dialect/VM/Conversion/VMToEmitC/ConvertVMToEmitC.cpp +++ b/iree/compiler/Dialect/VM/Conversion/VMToEmitC/ConvertVMToEmitC.cpp
@@ -722,6 +722,26 @@ patterns.insert<ConstOpConversion<IREE::VM::ConstF32Op>>(context); patterns.insert<ConstZeroOpConversion<IREE::VM::ConstF32ZeroOp>>(context); + // ExtF32: Comparison ops + patterns.insert<CallOpConversion<IREE::VM::CmpEQF32OOp>>(context, + "vm_cmp_eq_f32o"); + patterns.insert<CallOpConversion<IREE::VM::CmpEQF32UOp>>(context, + "vm_cmp_eq_f32u"); + patterns.insert<CallOpConversion<IREE::VM::CmpNEF32OOp>>(context, + "vm_cmp_ne_f32o"); + patterns.insert<CallOpConversion<IREE::VM::CmpNEF32UOp>>(context, + "vm_cmp_ne_f32u"); + patterns.insert<CallOpConversion<IREE::VM::CmpLTF32OOp>>(context, + "vm_cmp_lt_f32o"); + patterns.insert<CallOpConversion<IREE::VM::CmpLTF32UOp>>(context, + "vm_cmp_lt_f32u"); + patterns.insert<CallOpConversion<IREE::VM::CmpLTEF32OOp>>(context, + "vm_cmp_lte_f32o"); + patterns.insert<CallOpConversion<IREE::VM::CmpLTEF32UOp>>(context, + "vm_cmp_lte_f32u"); + patterns.insert<CallOpConversion<IREE::VM::CmpNaNF32Op>>(context, + "vm_cmp_nan_f32"); + // ExtI64: Constants patterns.insert<ConstOpConversion<IREE::VM::ConstI64Op>>(context); patterns.insert<ConstZeroOpConversion<IREE::VM::ConstI64ZeroOp>>(context);
diff --git a/iree/compiler/Dialect/VM/Conversion/VMToEmitC/test/comparison_ops_f32.mlir b/iree/compiler/Dialect/VM/Conversion/VMToEmitC/test/comparison_ops_f32.mlir new file mode 100644 index 0000000..002060c --- /dev/null +++ b/iree/compiler/Dialect/VM/Conversion/VMToEmitC/test/comparison_ops_f32.mlir
@@ -0,0 +1,100 @@ +// Tests printing and parsing of comparison ops. + +// RUN: iree-opt -split-input-file -pass-pipeline='vm.module(iree-convert-vm-to-emitc)' %s | IreeFileCheck %s + +vm.module @module { + // CHECK-LABEL: vm.func @cmp_eq_f32o + vm.func @cmp_eq_f32o(%arg0 : f32, %arg1 : f32) -> i32 { + // CHECK-NEXT: %0 = emitc.call "vm_cmp_eq_f32o"(%arg0, %arg1) : (f32, f32) -> i32 + %0 = vm.cmp.eq.f32.o %arg0, %arg1 : f32 + vm.return + } +} + +// ----- + +vm.module @module { + // CHECK-LABEL: vm.func @cmp_eq_f32u + vm.func @cmp_eq_f32u(%arg0 : f32, %arg1 : f32) -> i32 { + // CHECK-NEXT: %0 = emitc.call "vm_cmp_eq_f32u"(%arg0, %arg1) : (f32, f32) -> i32 + %0 = vm.cmp.eq.f32.u %arg0, %arg1 : f32 + vm.return + } +} + +// ----- + +vm.module @module { + // CHECK-LABEL: vm.func @cmp_ne_f32o + vm.func @cmp_ne_f32o(%arg0 : f32, %arg1 : f32) -> i32 { + // CHECK-NEXT: %0 = emitc.call "vm_cmp_ne_f32o"(%arg0, %arg1) : (f32, f32) -> i32 + %0 = vm.cmp.ne.f32.o %arg0, %arg1 : f32 + vm.return + } +} + +// ----- + +vm.module @module { + // CHECK-LABEL: vm.func @cmp_ne_f32u + vm.func @cmp_ne_f32u(%arg0 : f32, %arg1 : f32) -> i32 { + // CHECK-NEXT: %0 = emitc.call "vm_cmp_ne_f32u"(%arg0, %arg1) : (f32, f32) -> i32 + %0 = vm.cmp.ne.f32.u %arg0, %arg1 : f32 + vm.return + } +} + +// ----- + +vm.module @module { + // CHECK-LABEL: vm.func @cmp_lt_f32o + vm.func @cmp_lt_f32o(%arg0 : f32, %arg1 : f32) -> i32 { + // CHECK-NEXT: %0 = emitc.call "vm_cmp_lt_f32o"(%arg0, %arg1) : (f32, f32) -> i32 + %0 = vm.cmp.lt.f32.o %arg0, %arg1 : f32 + vm.return + } +} + +// ----- + +vm.module @module { + // CHECK-LABEL: vm.func @cmp_lt_f32u + vm.func @cmp_lt_f32u(%arg0 : f32, %arg1 : f32) -> i32 { + // CHECK-NEXT: %0 = emitc.call "vm_cmp_lt_f32u"(%arg0, %arg1) : (f32, f32) -> i32 + %0 = vm.cmp.lt.f32.u %arg0, %arg1 : f32 + vm.return + } +} + +// ----- + +vm.module @module { + // CHECK-LABEL: vm.func @cmp_lte_f32o + vm.func @cmp_lte_f32o(%arg0 : f32, %arg1 : f32) -> i32 { + // CHECK-NEXT: %0 = emitc.call "vm_cmp_lte_f32o"(%arg0, %arg1) : (f32, f32) -> i32 + %0 = vm.cmp.lte.f32.o %arg0, %arg1 : f32 + vm.return + } +} + +// ----- + +vm.module @module { + // CHECK-LABEL: vm.func @cmp_lte_f32u + vm.func @cmp_lte_f32u(%arg0 : f32, %arg1 : f32) -> i32 { + // CHECK-NEXT: %0 = emitc.call "vm_cmp_lte_f32u"(%arg0, %arg1) : (f32, f32) -> i32 + %0 = vm.cmp.lte.f32.u %arg0, %arg1 : f32 + vm.return + } +} + +// ----- + +vm.module @module { + // CHECK-LABEL: vm.func @cmp_nan_f32 + vm.func @cmp_nan_f32(%arg0 : f32) -> i32 { + // CHECK-NEXT: %0 = emitc.call "vm_cmp_nan_f32"(%arg0) : (f32) -> i32 + %0 = vm.cmp.nan.f32 %arg0 : f32 + vm.return + } +}
diff --git a/iree/vm/test/emitc/CMakeLists.txt b/iree/vm/test/emitc/CMakeLists.txt index abb12b3..1e9d159 100644 --- a/iree/vm/test/emitc/CMakeLists.txt +++ b/iree/vm/test/emitc/CMakeLists.txt
@@ -35,6 +35,7 @@ ::assignment_ops ::assignment_ops_i64 ::comparison_ops + ::comparison_ops_f32 ::comparison_ops_i64 ::control_flow_ops ::conversion_ops @@ -92,6 +93,15 @@ iree_c_module( NAME + comparison_ops_f32 + SRC + "../comparison_ops_f32.mlir" + H_FILE_OUTPUT + "comparison_ops_f32.h" +) + +iree_c_module( + NAME comparison_ops_i64 SRC "../comparison_ops_i64.mlir"
diff --git a/iree/vm/test/emitc/module_test.cc b/iree/vm/test/emitc/module_test.cc index 6081ca7..54ba7b5 100644 --- a/iree/vm/test/emitc/module_test.cc +++ b/iree/vm/test/emitc/module_test.cc
@@ -23,6 +23,7 @@ #include "iree/vm/test/emitc/assignment_ops.h" #include "iree/vm/test/emitc/assignment_ops_i64.h" #include "iree/vm/test/emitc/comparison_ops.h" +#include "iree/vm/test/emitc/comparison_ops_f32.h" #include "iree/vm/test/emitc/comparison_ops_i64.h" #include "iree/vm/test/emitc/control_flow_ops.h" #include "iree/vm/test/emitc/conversion_ops.h" @@ -63,6 +64,7 @@ {assignment_ops_descriptor_, assignment_ops_create}, {assignment_ops_i64_descriptor_, assignment_ops_i64_create}, {comparison_ops_descriptor_, comparison_ops_create}, + {comparison_ops_f32_descriptor_, comparison_ops_f32_create}, {comparison_ops_i64_descriptor_, comparison_ops_i64_create}, {control_flow_ops_descriptor_, control_flow_ops_create}, {conversion_ops_descriptor_, conversion_ops_create},