Couple of reference model fixes

- comparison ops could have different type of input/output
- add SUBGRAPH_ERROR_IF() when operator doesn't have any output tensor

Signed-off-by: Kevin Cheng <kevin.cheng@arm.com>
Change-Id: I10f2c10f92de1c7a979221a421fa8e86b26fcc72
diff --git a/reference_model/src/ops/ewise_binary.cc b/reference_model/src/ops/ewise_binary.cc
index a11d855..023158c 100644
--- a/reference_model/src/ops/ewise_binary.cc
+++ b/reference_model/src/ops/ewise_binary.cc
@@ -60,24 +60,25 @@
         return 1;
     }
 
-    // Input and output rank must match
-    // If it's not MUL, type also needs to match as well.
-    if (nodeType != Op_MUL)
-    {
-        if (inputs[0]->matchRankType(*outputs[0]))
-        {
-            printNodeValidationError("Binary operators (except MUL) input and output rank and type must match");
-            return 1;
-        }
-    }
-    else
+    // In some ops, only rank of input and output tensor needs to match
+    if (nodeType == Op_MUL || nodeType == Op_GREATER || nodeType == Op_EQUAL || nodeType == Op_GREATER_EQUAL)
     {
         if (inputs[0]->matchRank(*outputs[0]))
         {
-            printNodeValidationError("MUL operator input and output rank must match");
+            std::string err =
+                "Binary operators " + std::string(EnumNamesOp()[nodeType]) + " input and output rank must match";
+            printNodeValidationError(err.c_str());
             return 1;
         }
     }
+    // Otherwise both rand/type of input and output must match
+    else if (inputs[0]->matchRankType(*outputs[0]))
+    {
+        std::string err =
+            "Binary operators " + std::string(EnumNamesOp()[nodeType]) + " input and output rank and type must match";
+        printNodeValidationError(err.c_str());
+        return 1;
+    }
 
     a      = dynamic_cast<TosaReference::TensorTemplate<TIn>*>(inputs[0]);
     b      = dynamic_cast<TosaReference::TensorTemplate<TIn>*>(inputs[1]);