Index: crosstest/test_fcmp_main.cpp |
diff --git a/crosstest/test_fcmp_main.cpp b/crosstest/test_fcmp_main.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8677c48dfc7d753ef7ba2b41810cafd9a579de1e |
--- /dev/null |
+++ b/crosstest/test_fcmp_main.cpp |
@@ -0,0 +1,98 @@ |
+/* crosstest.py --test=test_fcmp.pnacl.ll --driver=test_fcmp_main.cpp \ |
+ --prefix=Subzero_ --output=test_fcmp */ |
+ |
+#include <cassert> |
+#include <cfloat> |
+#include <cmath> |
+#include <iostream> |
+ |
+#include "test_fcmp.def" |
+ |
+#define X(cmp) \ |
+ extern "C" bool fcmp##cmp##Float(float a, float b); \ |
+ extern "C" bool fcmp##cmp##Double(double a, double b); \ |
+ extern "C" bool Subzero_fcmp##cmp##Float(float a, float b); \ |
+ extern "C" bool Subzero_fcmp##cmp##Double(double a, double b); |
+FCMP_TABLE; |
+#undef X |
+ |
+int main(int argc, char **argv) { |
+ static const double NegInf = -1.0 / 0.0; |
+ static const double Zero = 0.0; |
+ static const double Ten = 10.0; |
+ static const double PosInf = 1.0 / 0.0; |
+ static const double Nan = 0.0 / 0.0; |
+ assert(std::fpclassify(NegInf) == FP_INFINITE); |
+ assert(std::fpclassify(PosInf) == FP_INFINITE); |
+ assert(std::fpclassify(Nan) == FP_NAN); |
+ assert(NegInf < Zero); |
+ assert(NegInf < PosInf); |
+ assert(Zero < PosInf); |
+ |
+ volatile double Values[] = { NegInf, Zero, DBL_MIN, FLT_MIN, Ten, |
+ FLT_MAX, DBL_MAX, PosInf, Nan, }; |
+ const static size_t NumValues = sizeof(Values) / sizeof(*Values); |
+ |
+ typedef bool (*FuncTypeFloat)(float, float); |
+ typedef bool (*FuncTypeDouble)(double, double); |
+ static struct { |
+ const char *Name; |
+ FuncTypeFloat FuncFloatSz; |
+ FuncTypeFloat FuncFloatLlc; |
+ FuncTypeDouble FuncDoubleSz; |
+ FuncTypeDouble FuncDoubleLlc; |
+ } Funcs[] = { |
+#define X(cmp) \ |
+ { \ |
+ "fcmp" STR(cmp), Subzero_fcmp##cmp##Float, fcmp##cmp##Float, \ |
+ Subzero_fcmp##cmp##Double, fcmp##cmp##Double \ |
+ } \ |
+ , |
+ FCMP_TABLE |
+#undef X |
+ }; |
+ const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs); |
+ |
+ bool ResultSz, ResultLlc; |
+ |
+ size_t TotalTests = 0; |
+ size_t Passes = 0; |
+ size_t Failures = 0; |
+ |
+ for (size_t f = 0; f < NumFuncs; ++f) { |
+ for (size_t i = 0; i < NumValues; ++i) { |
+ for (size_t j = 0; j < NumValues; ++j) { |
+ ++TotalTests; |
+ float Value1Float = Values[i]; |
+ float Value2Float = Values[j]; |
+ ResultSz = Funcs[f].FuncFloatSz(Value1Float, Value2Float); |
+ ResultLlc = Funcs[f].FuncFloatLlc(Value1Float, Value2Float); |
+ if (ResultSz == ResultLlc) { |
+ ++Passes; |
+ } else { |
+ ++Failures; |
+ std::cout << Funcs[f].Name << "Float(" << Value1Float << ", " |
+ << Value2Float << "): sz=" << ResultSz |
+ << " llc=" << ResultLlc << std::endl; |
+ } |
+ ++TotalTests; |
+ double Value1Double = Values[i]; |
+ double Value2Double = Values[j]; |
+ ResultSz = Funcs[f].FuncDoubleSz(Value1Double, Value2Double); |
+ ResultLlc = Funcs[f].FuncDoubleLlc(Value1Double, Value2Double); |
+ if (ResultSz == ResultLlc) { |
+ ++Passes; |
+ } else { |
+ ++Failures; |
+ std::cout << Funcs[f].Name << "Double(" << Value1Double << ", " |
+ << Value2Double << "): sz=" << ResultSz |
+ << " llc=" << ResultLlc << std::endl; |
+ } |
+ } |
+ } |
+ } |
+ |
+ std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes |
+ << " Failures=" << Failures << "\n"; |
+ return Failures; |
+} |