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},