[Vectorizer] Extend fpmin/fpmax tests to test semantic variants

This extends the test cases in argmin-argmax-fp to test for the semantic
variants of fpmin/fpmax operations. This test will now also cover
fpminimum/fpmaximum and fpminimum_num/fpmaximum_num.

Change-Id: I33b4b63a3bec60d002a42e3fe14a1abda518d3b0
diff --git a/SingleSource/UnitTests/Vectorizer/argmin-argmax-fp.cpp b/SingleSource/UnitTests/Vectorizer/argmin-argmax-fp.cpp
index 4abf26f..716356f 100644
--- a/SingleSource/UnitTests/Vectorizer/argmin-argmax-fp.cpp
+++ b/SingleSource/UnitTests/Vectorizer/argmin-argmax-fp.cpp
@@ -58,6 +58,62 @@
       } return MaxIdx;                                                         \
       , Suf)
 
+// Test using fminimum for floating point argmin.
+#define T_FMINIMUM(Op, M, I, Start, Inc, InitVal, InitIdx, Suf)                \
+  TEST(                                                                        \
+      Op, M, I, M Min = InitVal; I MinIdx = InitIdx;                           \
+      ,                                                                        \
+      for (unsigned i = Start; i < TC; i += Inc) {                             \
+        M NewMin = fminimum(A[i], Min);                                        \
+        if (NewMin != Min) {                                                   \
+          Min = NewMin;                                                        \
+          MinIdx = i;                                                          \
+        }                                                                      \
+      } return MinIdx;                                                         \
+      , Suf)
+
+// Test using fmaximum for floating point argmax.
+#define T_FMAXIMUM(Op, M, I, Start, Inc, InitVal, InitIdx, Suf)                \
+  TEST(                                                                        \
+      Op, M, I, M Max = InitVal; I MaxIdx = InitIdx;                           \
+      ,                                                                        \
+      for (unsigned i = Start; i < TC; i += Inc) {                             \
+        M NewMax = fmaximum(A[i], Max);                                        \
+        if (NewMax != Max) {                                                   \
+          Max = NewMax;                                                        \
+          MaxIdx = i;                                                          \
+        }                                                                      \
+      } return MaxIdx;                                                         \
+      , Suf)
+
+// Test using fminimum_num for floating point argmin.
+#define T_FMINIMUMNUM(Op, M, I, Start, Inc, InitVal, InitIdx, Suf)             \
+  TEST(                                                                        \
+      Op, M, I, M Min = InitVal; I MinIdx = InitIdx;                           \
+      ,                                                                        \
+      for (unsigned i = Start; i < TC; i += Inc) {                             \
+        M NewMin = fminimum_num(A[i], Min);                                    \
+        if (NewMin != Min) {                                                   \
+          Min = NewMin;                                                        \
+          MinIdx = i;                                                          \
+        }                                                                      \
+      } return MinIdx;                                                         \
+      , Suf)
+
+// Test using fmaximum_num for floating point argmax.
+#define T_FMAXIMUMNUM(Op, M, I, Start, Inc, InitVal, InitIdx, Suf)             \
+  TEST(                                                                        \
+      Op, M, I, M Max = InitVal; I MaxIdx = InitIdx;                           \
+      ,                                                                        \
+      for (unsigned i = Start; i < TC; i += Inc) {                             \
+        M NewMax = fmaximum_num(A[i], Max);                                    \
+        if (NewMax != Max) {                                                   \
+          Max = NewMax;                                                        \
+          MaxIdx = i;                                                          \
+        }                                                                      \
+      } return MaxIdx;                                                         \
+      , Suf)
+
 // Run tests using std::fmin/std::fmax for floating point types.
 #define RUN_FMIN_FMAX_TESTS_FOR_TYPE(M, I)                                     \
   T_FMIN("min", M, I, 0, 1, std::numeric_limits<M>::max(), 0, "_fmin_start_0") \
@@ -69,8 +125,7 @@
   T_FMIN("min", M, I, 0, 1, M(0.0), 0, "_fmin_start_pos_zero")                 \
   T_FMIN("min", M, I, 0, 2, std::numeric_limits<M>::max(), 0,                  \
          "_fmin_start_0_inc_2")                                                \
-  T_FMIN("min", M, I, 3, 1, std::numeric_limits<M>::max(), 3,                  \
-         "_fmin_start_3")                                                      \
+  T_FMIN("min", M, I, 3, 1, std::numeric_limits<M>::max(), 3, "_fmin_start_3") \
   T_FMIN_ADD("min", M, I, 0, 1, std::numeric_limits<M>::max(), 0,              \
              "_fmin_add_start_0")                                              \
   T_FMIN_ADD("min", M, I, 0, 2, std::numeric_limits<M>::max(), 0,              \
@@ -90,7 +145,55 @@
   T_FMAX_ADD("max", M, I, 0, 1, std::numeric_limits<M>::lowest(), 0,           \
              "_fmax_add_start_0")                                              \
   T_FMAX_ADD("max", M, I, 0, 2, std::numeric_limits<M>::lowest(), 0,           \
-             "_fmax_add_start_0_inc_2")
+             "_fmax_add_start_0_inc_2")                                        \
+  T_FMINIMUM("minimum", M, I, 0, 1, std::numeric_limits<M>::max(), 0,          \
+             "_fminimum_start_0")                                              \
+  T_FMINIMUM("minimum", M, I, 0, 1, std::numeric_limits<M>::infinity(), 0,     \
+             "_fminimum_start_inf")                                            \
+  T_FMINIMUM("minimum", M, I, 0, 1, M(-0.0), 0, "_fminimum_start_neg_zero")    \
+  T_FMINIMUM("minimum", M, I, 0, 1, M(0.0), 0, "_fminimum_start_pos_zero")     \
+  T_FMINIMUM("minimum", M, I, 0, 2, std::numeric_limits<M>::max(), 0,          \
+             "_fminimum_start_0_inc_2")                                        \
+  T_FMINIMUM("minimum", M, I, 3, 1, std::numeric_limits<M>::max(), 3,          \
+             "_fminimum_start_3")                                              \
+  T_FMAXIMUM("maximum", M, I, 0, 1, std::numeric_limits<M>::lowest(), 0,       \
+             "_fmaximum_start_0")                                              \
+  T_FMAXIMUM("maximum", M, I, 0, 1, -std::numeric_limits<M>::infinity(), 0,    \
+             "_fmaximum_start_neg_inf")                                        \
+  T_FMAXIMUM("maximum", M, I, 0, 1, M(-0.0), 0, "_fmaximum_start_neg_zero")    \
+  T_FMAXIMUM("maximum", M, I, 0, 1, M(0.0), 0, "_fmaximum_start_pos_zero")     \
+  T_FMAXIMUM("maximum", M, I, 0, 2, std::numeric_limits<M>::lowest(), 0,       \
+             "_fmaximum_start_0_inc_2")                                        \
+  T_FMAXIMUM("maximum", M, I, 3, 1, std::numeric_limits<M>::lowest(), 3,       \
+             "_fmaximum_start_3")                                              \
+  T_FMINIMUMNUM("minimumnum", M, I, 0, 1, std::numeric_limits<M>::max(), 0,    \
+                "_fminimumnum_start_0")                                        \
+  T_FMINIMUMNUM("minimumnum", M, I, 0, 1, std::numeric_limits<M>::infinity(),  \
+                0, "_fminimumnum_start_inf")                                   \
+  T_FMINIMUMNUM("minimumnum", M, I, 0, 1, std::numeric_limits<M>::quiet_NaN(), \
+                0, "_fminimumnum_start_nan")                                   \
+  T_FMINIMUMNUM("minimumnum", M, I, 0, 1, M(-0.0), 0,                          \
+                "_fminimumnum_start_neg_zero")                                 \
+  T_FMINIMUMNUM("minimumnum", M, I, 0, 1, M(0.0), 0,                           \
+                "_fminimumnum_start_pos_zero")                                 \
+  T_FMINIMUMNUM("minimumnum", M, I, 0, 2, std::numeric_limits<M>::max(), 0,    \
+                "_fminimumnum_start_0_inc_2")                                  \
+  T_FMINIMUMNUM("minimumnum", M, I, 3, 1, std::numeric_limits<M>::max(), 3,    \
+                "_fminimumnum_start_3")                                        \
+  T_FMAXIMUMNUM("maximumnum", M, I, 0, 1, std::numeric_limits<M>::lowest(), 0, \
+                "_fmaximumnum_start_0")                                        \
+  T_FMAXIMUMNUM("maximumnum", M, I, 0, 1, -std::numeric_limits<M>::infinity(), \
+                0, "_fmaximumnum_start_neg_inf")                               \
+  T_FMAXIMUMNUM("maximumnum", M, I, 0, 1, std::numeric_limits<M>::quiet_NaN(), \
+                0, "_fmaximumnum_start_nan")                                   \
+  T_FMAXIMUMNUM("maximumnum", M, I, 0, 1, M(-0.0), 0,                          \
+                "_fmaximumnum_start_neg_zero")                                 \
+  T_FMAXIMUMNUM("maximumnum", M, I, 0, 1, M(0.0), 0,                           \
+                "_fmaximumnum_start_pos_zero")                                 \
+  T_FMAXIMUMNUM("maximumnum", M, I, 0, 2, std::numeric_limits<M>::lowest(), 0, \
+                "_fmaximumnum_start_0_inc_2")                                  \
+  T_FMAXIMUMNUM("maximumnum", M, I, 3, 1, std::numeric_limits<M>::lowest(), 3, \
+                "_fmaximumnum_start_3")
 
 int main(void) {
   rng = std::mt19937(15);
diff --git a/SingleSource/UnitTests/Vectorizer/argmin-argmax-fp.reference_output b/SingleSource/UnitTests/Vectorizer/argmin-argmax-fp.reference_output
index ff7acf8..a7ed852 100644
--- a/SingleSource/UnitTests/Vectorizer/argmin-argmax-fp.reference_output
+++ b/SingleSource/UnitTests/Vectorizer/argmin-argmax-fp.reference_output
@@ -32,6 +32,32 @@
 Checking argmax_float_uint32_t_fmax_start_3
 Checking argmax_float_uint32_t_fmax_add_start_0
 Checking argmax_float_uint32_t_fmax_add_start_0_inc_2
+Checking argminimum_float_uint32_t_fminimum_start_0
+Checking argminimum_float_uint32_t_fminimum_start_inf
+Checking argminimum_float_uint32_t_fminimum_start_neg_zero
+Checking argminimum_float_uint32_t_fminimum_start_pos_zero
+Checking argminimum_float_uint32_t_fminimum_start_0_inc_2
+Checking argminimum_float_uint32_t_fminimum_start_3
+Checking argmaximum_float_uint32_t_fmaximum_start_0
+Checking argmaximum_float_uint32_t_fmaximum_start_neg_inf
+Checking argmaximum_float_uint32_t_fmaximum_start_neg_zero
+Checking argmaximum_float_uint32_t_fmaximum_start_pos_zero
+Checking argmaximum_float_uint32_t_fmaximum_start_0_inc_2
+Checking argmaximum_float_uint32_t_fmaximum_start_3
+Checking argminimumnum_float_uint32_t_fminimumnum_start_0
+Checking argminimumnum_float_uint32_t_fminimumnum_start_inf
+Checking argminimumnum_float_uint32_t_fminimumnum_start_nan
+Checking argminimumnum_float_uint32_t_fminimumnum_start_neg_zero
+Checking argminimumnum_float_uint32_t_fminimumnum_start_pos_zero
+Checking argminimumnum_float_uint32_t_fminimumnum_start_0_inc_2
+Checking argminimumnum_float_uint32_t_fminimumnum_start_3
+Checking argmaximumnum_float_uint32_t_fmaximumnum_start_0
+Checking argmaximumnum_float_uint32_t_fmaximumnum_start_neg_inf
+Checking argmaximumnum_float_uint32_t_fmaximumnum_start_nan
+Checking argmaximumnum_float_uint32_t_fmaximumnum_start_neg_zero
+Checking argmaximumnum_float_uint32_t_fmaximumnum_start_pos_zero
+Checking argmaximumnum_float_uint32_t_fmaximumnum_start_0_inc_2
+Checking argmaximumnum_float_uint32_t_fmaximumnum_start_3
 Checking argmin_float_int32_t_start_0
 Checking argmin_float_int32_t_start_0_inc_2
 Checking argmin_float_int32_t_start_2
@@ -64,6 +90,32 @@
 Checking argmax_float_int32_t_fmax_start_3
 Checking argmax_float_int32_t_fmax_add_start_0
 Checking argmax_float_int32_t_fmax_add_start_0_inc_2
+Checking argminimum_float_int32_t_fminimum_start_0
+Checking argminimum_float_int32_t_fminimum_start_inf
+Checking argminimum_float_int32_t_fminimum_start_neg_zero
+Checking argminimum_float_int32_t_fminimum_start_pos_zero
+Checking argminimum_float_int32_t_fminimum_start_0_inc_2
+Checking argminimum_float_int32_t_fminimum_start_3
+Checking argmaximum_float_int32_t_fmaximum_start_0
+Checking argmaximum_float_int32_t_fmaximum_start_neg_inf
+Checking argmaximum_float_int32_t_fmaximum_start_neg_zero
+Checking argmaximum_float_int32_t_fmaximum_start_pos_zero
+Checking argmaximum_float_int32_t_fmaximum_start_0_inc_2
+Checking argmaximum_float_int32_t_fmaximum_start_3
+Checking argminimumnum_float_int32_t_fminimumnum_start_0
+Checking argminimumnum_float_int32_t_fminimumnum_start_inf
+Checking argminimumnum_float_int32_t_fminimumnum_start_nan
+Checking argminimumnum_float_int32_t_fminimumnum_start_neg_zero
+Checking argminimumnum_float_int32_t_fminimumnum_start_pos_zero
+Checking argminimumnum_float_int32_t_fminimumnum_start_0_inc_2
+Checking argminimumnum_float_int32_t_fminimumnum_start_3
+Checking argmaximumnum_float_int32_t_fmaximumnum_start_0
+Checking argmaximumnum_float_int32_t_fmaximumnum_start_neg_inf
+Checking argmaximumnum_float_int32_t_fmaximumnum_start_nan
+Checking argmaximumnum_float_int32_t_fmaximumnum_start_neg_zero
+Checking argmaximumnum_float_int32_t_fmaximumnum_start_pos_zero
+Checking argmaximumnum_float_int32_t_fmaximumnum_start_0_inc_2
+Checking argmaximumnum_float_int32_t_fmaximumnum_start_3
 Checking argmin_double_uint64_t_start_0
 Checking argmin_double_uint64_t_start_0_inc_2
 Checking argmin_double_uint64_t_start_2
@@ -98,6 +150,32 @@
 Checking argmax_double_uint64_t_fmax_start_3
 Checking argmax_double_uint64_t_fmax_add_start_0
 Checking argmax_double_uint64_t_fmax_add_start_0_inc_2
+Checking argminimum_double_uint64_t_fminimum_start_0
+Checking argminimum_double_uint64_t_fminimum_start_inf
+Checking argminimum_double_uint64_t_fminimum_start_neg_zero
+Checking argminimum_double_uint64_t_fminimum_start_pos_zero
+Checking argminimum_double_uint64_t_fminimum_start_0_inc_2
+Checking argminimum_double_uint64_t_fminimum_start_3
+Checking argmaximum_double_uint64_t_fmaximum_start_0
+Checking argmaximum_double_uint64_t_fmaximum_start_neg_inf
+Checking argmaximum_double_uint64_t_fmaximum_start_neg_zero
+Checking argmaximum_double_uint64_t_fmaximum_start_pos_zero
+Checking argmaximum_double_uint64_t_fmaximum_start_0_inc_2
+Checking argmaximum_double_uint64_t_fmaximum_start_3
+Checking argminimumnum_double_uint64_t_fminimumnum_start_0
+Checking argminimumnum_double_uint64_t_fminimumnum_start_inf
+Checking argminimumnum_double_uint64_t_fminimumnum_start_nan
+Checking argminimumnum_double_uint64_t_fminimumnum_start_neg_zero
+Checking argminimumnum_double_uint64_t_fminimumnum_start_pos_zero
+Checking argminimumnum_double_uint64_t_fminimumnum_start_0_inc_2
+Checking argminimumnum_double_uint64_t_fminimumnum_start_3
+Checking argmaximumnum_double_uint64_t_fmaximumnum_start_0
+Checking argmaximumnum_double_uint64_t_fmaximumnum_start_neg_inf
+Checking argmaximumnum_double_uint64_t_fmaximumnum_start_nan
+Checking argmaximumnum_double_uint64_t_fmaximumnum_start_neg_zero
+Checking argmaximumnum_double_uint64_t_fmaximumnum_start_pos_zero
+Checking argmaximumnum_double_uint64_t_fmaximumnum_start_0_inc_2
+Checking argmaximumnum_double_uint64_t_fmaximumnum_start_3
 Checking argmin_double_int64_t_start_0
 Checking argmin_double_int64_t_start_0_inc_2
 Checking argmin_double_int64_t_start_2
@@ -130,6 +208,32 @@
 Checking argmax_double_int64_t_fmax_start_3
 Checking argmax_double_int64_t_fmax_add_start_0
 Checking argmax_double_int64_t_fmax_add_start_0_inc_2
+Checking argminimum_double_int64_t_fminimum_start_0
+Checking argminimum_double_int64_t_fminimum_start_inf
+Checking argminimum_double_int64_t_fminimum_start_neg_zero
+Checking argminimum_double_int64_t_fminimum_start_pos_zero
+Checking argminimum_double_int64_t_fminimum_start_0_inc_2
+Checking argminimum_double_int64_t_fminimum_start_3
+Checking argmaximum_double_int64_t_fmaximum_start_0
+Checking argmaximum_double_int64_t_fmaximum_start_neg_inf
+Checking argmaximum_double_int64_t_fmaximum_start_neg_zero
+Checking argmaximum_double_int64_t_fmaximum_start_pos_zero
+Checking argmaximum_double_int64_t_fmaximum_start_0_inc_2
+Checking argmaximum_double_int64_t_fmaximum_start_3
+Checking argminimumnum_double_int64_t_fminimumnum_start_0
+Checking argminimumnum_double_int64_t_fminimumnum_start_inf
+Checking argminimumnum_double_int64_t_fminimumnum_start_nan
+Checking argminimumnum_double_int64_t_fminimumnum_start_neg_zero
+Checking argminimumnum_double_int64_t_fminimumnum_start_pos_zero
+Checking argminimumnum_double_int64_t_fminimumnum_start_0_inc_2
+Checking argminimumnum_double_int64_t_fminimumnum_start_3
+Checking argmaximumnum_double_int64_t_fmaximumnum_start_0
+Checking argmaximumnum_double_int64_t_fmaximumnum_start_neg_inf
+Checking argmaximumnum_double_int64_t_fmaximumnum_start_nan
+Checking argmaximumnum_double_int64_t_fmaximumnum_start_neg_zero
+Checking argmaximumnum_double_int64_t_fmaximumnum_start_pos_zero
+Checking argmaximumnum_double_int64_t_fmaximumnum_start_0_inc_2
+Checking argmaximumnum_double_int64_t_fmaximumnum_start_3
 Checking argmin_double_uint32_t_start_0
 Checking argmin_double_uint32_t_start_0_inc_2
 Checking argmin_double_uint32_t_start_2
@@ -162,6 +266,32 @@
 Checking argmax_double_uint32_t_fmax_start_3
 Checking argmax_double_uint32_t_fmax_add_start_0
 Checking argmax_double_uint32_t_fmax_add_start_0_inc_2
+Checking argminimum_double_uint32_t_fminimum_start_0
+Checking argminimum_double_uint32_t_fminimum_start_inf
+Checking argminimum_double_uint32_t_fminimum_start_neg_zero
+Checking argminimum_double_uint32_t_fminimum_start_pos_zero
+Checking argminimum_double_uint32_t_fminimum_start_0_inc_2
+Checking argminimum_double_uint32_t_fminimum_start_3
+Checking argmaximum_double_uint32_t_fmaximum_start_0
+Checking argmaximum_double_uint32_t_fmaximum_start_neg_inf
+Checking argmaximum_double_uint32_t_fmaximum_start_neg_zero
+Checking argmaximum_double_uint32_t_fmaximum_start_pos_zero
+Checking argmaximum_double_uint32_t_fmaximum_start_0_inc_2
+Checking argmaximum_double_uint32_t_fmaximum_start_3
+Checking argminimumnum_double_uint32_t_fminimumnum_start_0
+Checking argminimumnum_double_uint32_t_fminimumnum_start_inf
+Checking argminimumnum_double_uint32_t_fminimumnum_start_nan
+Checking argminimumnum_double_uint32_t_fminimumnum_start_neg_zero
+Checking argminimumnum_double_uint32_t_fminimumnum_start_pos_zero
+Checking argminimumnum_double_uint32_t_fminimumnum_start_0_inc_2
+Checking argminimumnum_double_uint32_t_fminimumnum_start_3
+Checking argmaximumnum_double_uint32_t_fmaximumnum_start_0
+Checking argmaximumnum_double_uint32_t_fmaximumnum_start_neg_inf
+Checking argmaximumnum_double_uint32_t_fmaximumnum_start_nan
+Checking argmaximumnum_double_uint32_t_fmaximumnum_start_neg_zero
+Checking argmaximumnum_double_uint32_t_fmaximumnum_start_pos_zero
+Checking argmaximumnum_double_uint32_t_fmaximumnum_start_0_inc_2
+Checking argmaximumnum_double_uint32_t_fmaximumnum_start_3
 Checking argmin_double_int32_t_start_0
 Checking argmin_double_int32_t_start_0_inc_2
 Checking argmin_double_int32_t_start_2
@@ -194,4 +324,30 @@
 Checking argmax_double_int32_t_fmax_start_3
 Checking argmax_double_int32_t_fmax_add_start_0
 Checking argmax_double_int32_t_fmax_add_start_0_inc_2
+Checking argminimum_double_int32_t_fminimum_start_0
+Checking argminimum_double_int32_t_fminimum_start_inf
+Checking argminimum_double_int32_t_fminimum_start_neg_zero
+Checking argminimum_double_int32_t_fminimum_start_pos_zero
+Checking argminimum_double_int32_t_fminimum_start_0_inc_2
+Checking argminimum_double_int32_t_fminimum_start_3
+Checking argmaximum_double_int32_t_fmaximum_start_0
+Checking argmaximum_double_int32_t_fmaximum_start_neg_inf
+Checking argmaximum_double_int32_t_fmaximum_start_neg_zero
+Checking argmaximum_double_int32_t_fmaximum_start_pos_zero
+Checking argmaximum_double_int32_t_fmaximum_start_0_inc_2
+Checking argmaximum_double_int32_t_fmaximum_start_3
+Checking argminimumnum_double_int32_t_fminimumnum_start_0
+Checking argminimumnum_double_int32_t_fminimumnum_start_inf
+Checking argminimumnum_double_int32_t_fminimumnum_start_nan
+Checking argminimumnum_double_int32_t_fminimumnum_start_neg_zero
+Checking argminimumnum_double_int32_t_fminimumnum_start_pos_zero
+Checking argminimumnum_double_int32_t_fminimumnum_start_0_inc_2
+Checking argminimumnum_double_int32_t_fminimumnum_start_3
+Checking argmaximumnum_double_int32_t_fmaximumnum_start_0
+Checking argmaximumnum_double_int32_t_fmaximumnum_start_neg_inf
+Checking argmaximumnum_double_int32_t_fmaximumnum_start_nan
+Checking argmaximumnum_double_int32_t_fmaximumnum_start_neg_zero
+Checking argmaximumnum_double_int32_t_fmaximumnum_start_pos_zero
+Checking argmaximumnum_double_int32_t_fmaximumnum_start_0_inc_2
+Checking argmaximumnum_double_int32_t_fmaximumnum_start_3
 exit 0