OLD | NEW |
(Empty) | |
| 1 // abtest.py --test=test_fcmp.pnacl.ll --driver=test_fcmp_main.cpp --prefix=Subz
ero_ --output=test_fcmp |
| 2 |
| 3 #include <stdio.h> |
| 4 #include <float.h> |
| 5 #include <math.h> |
| 6 #include <assert.h> |
| 7 |
| 8 extern "C" { |
| 9 |
| 10 bool fcmpFalseFloat(float a, float b); |
| 11 bool fcmpOeqFloat(float a, float b); |
| 12 bool fcmpOgtFloat(float a, float b); |
| 13 bool fcmpOgeFloat(float a, float b); |
| 14 bool fcmpOltFloat(float a, float b); |
| 15 bool fcmpOleFloat(float a, float b); |
| 16 bool fcmpOneFloat(float a, float b); |
| 17 bool fcmpOrdFloat(float a, float b); |
| 18 bool fcmpUeqFloat(float a, float b); |
| 19 bool fcmpUgtFloat(float a, float b); |
| 20 bool fcmpUgeFloat(float a, float b); |
| 21 bool fcmpUltFloat(float a, float b); |
| 22 bool fcmpUleFloat(float a, float b); |
| 23 bool fcmpUneFloat(float a, float b); |
| 24 bool fcmpUnoFloat(float a, float b); |
| 25 bool fcmpTrueFloat(float a, float b); |
| 26 |
| 27 bool fcmpFalseDouble(double a, double b); |
| 28 bool fcmpOeqDouble(double a, double b); |
| 29 bool fcmpOgtDouble(double a, double b); |
| 30 bool fcmpOgeDouble(double a, double b); |
| 31 bool fcmpOltDouble(double a, double b); |
| 32 bool fcmpOleDouble(double a, double b); |
| 33 bool fcmpOneDouble(double a, double b); |
| 34 bool fcmpOrdDouble(double a, double b); |
| 35 bool fcmpUeqDouble(double a, double b); |
| 36 bool fcmpUgtDouble(double a, double b); |
| 37 bool fcmpUgeDouble(double a, double b); |
| 38 bool fcmpUltDouble(double a, double b); |
| 39 bool fcmpUleDouble(double a, double b); |
| 40 bool fcmpUneDouble(double a, double b); |
| 41 bool fcmpUnoDouble(double a, double b); |
| 42 bool fcmpTrueDouble(double a, double b); |
| 43 |
| 44 bool Subzero_fcmpFalseFloat(float a, float b); |
| 45 bool Subzero_fcmpOeqFloat(float a, float b); |
| 46 bool Subzero_fcmpOgtFloat(float a, float b); |
| 47 bool Subzero_fcmpOgeFloat(float a, float b); |
| 48 bool Subzero_fcmpOltFloat(float a, float b); |
| 49 bool Subzero_fcmpOleFloat(float a, float b); |
| 50 bool Subzero_fcmpOneFloat(float a, float b); |
| 51 bool Subzero_fcmpOrdFloat(float a, float b); |
| 52 bool Subzero_fcmpUeqFloat(float a, float b); |
| 53 bool Subzero_fcmpUgtFloat(float a, float b); |
| 54 bool Subzero_fcmpUgeFloat(float a, float b); |
| 55 bool Subzero_fcmpUltFloat(float a, float b); |
| 56 bool Subzero_fcmpUleFloat(float a, float b); |
| 57 bool Subzero_fcmpUneFloat(float a, float b); |
| 58 bool Subzero_fcmpUnoFloat(float a, float b); |
| 59 bool Subzero_fcmpTrueFloat(float a, float b); |
| 60 |
| 61 bool Subzero_fcmpFalseDouble(double a, double b); |
| 62 bool Subzero_fcmpOeqDouble(double a, double b); |
| 63 bool Subzero_fcmpOgtDouble(double a, double b); |
| 64 bool Subzero_fcmpOgeDouble(double a, double b); |
| 65 bool Subzero_fcmpOltDouble(double a, double b); |
| 66 bool Subzero_fcmpOleDouble(double a, double b); |
| 67 bool Subzero_fcmpOneDouble(double a, double b); |
| 68 bool Subzero_fcmpOrdDouble(double a, double b); |
| 69 bool Subzero_fcmpUeqDouble(double a, double b); |
| 70 bool Subzero_fcmpUgtDouble(double a, double b); |
| 71 bool Subzero_fcmpUgeDouble(double a, double b); |
| 72 bool Subzero_fcmpUltDouble(double a, double b); |
| 73 bool Subzero_fcmpUleDouble(double a, double b); |
| 74 bool Subzero_fcmpUneDouble(double a, double b); |
| 75 bool Subzero_fcmpUnoDouble(double a, double b); |
| 76 bool Subzero_fcmpTrueDouble(double a, double b); |
| 77 } |
| 78 |
| 79 int main(int argc, char **argv) { |
| 80 static const float FloatNegInf = -1.0 / 0.0; |
| 81 static const float FloatZero = 0.0; |
| 82 static const float FloatTen = 10.0; |
| 83 static const float FloatPosInf = 1.0 / 0.0; |
| 84 static const float FloatNan = 0.0 / 0.0; |
| 85 assert(fpclassify(FloatNegInf) == FP_INFINITE); |
| 86 assert(fpclassify(FloatPosInf) == FP_INFINITE); |
| 87 assert(fpclassify(FloatNan) == FP_NAN); |
| 88 assert(FloatNegInf < FloatZero); |
| 89 assert(FloatNegInf < FloatPosInf); |
| 90 assert(FloatZero < FloatPosInf); |
| 91 |
| 92 static const double DoubleNegInf = -1.0 / 0.0; |
| 93 static const double DoubleZero = 0.0; |
| 94 static const double DoubleTen = 10.0; |
| 95 static const double DoublePosInf = 1.0 / 0.0; |
| 96 static const double DoubleNan = 0.0 / 0.0; |
| 97 assert(fpclassify(DoubleNegInf) == FP_INFINITE); |
| 98 assert(fpclassify(DoublePosInf) == FP_INFINITE); |
| 99 assert(fpclassify(DoubleNan) == FP_NAN); |
| 100 assert(DoubleNegInf < DoubleZero); |
| 101 assert(DoubleNegInf < DoublePosInf); |
| 102 assert(DoubleZero < DoublePosInf); |
| 103 |
| 104 static float FloatValues[] = { FloatNegInf, FloatZero, FLT_MIN, FloatTen, |
| 105 FLT_MAX, FloatPosInf, FloatNan, }; |
| 106 const static unsigned NumFloatValues = |
| 107 sizeof(FloatValues) / sizeof(*FloatValues); |
| 108 |
| 109 static double DoubleValues[] = { DoubleNegInf, DoubleZero, DBL_MIN, |
| 110 DoubleTen, DBL_MAX, DoublePosInf, |
| 111 DoubleNan, }; |
| 112 const static unsigned NumDoubleValues = |
| 113 sizeof(DoubleValues) / sizeof(*DoubleValues); |
| 114 |
| 115 typedef bool (*FuncTypeFloat)(float, float); |
| 116 static struct { |
| 117 const char *Name; |
| 118 FuncTypeFloat FuncSz; |
| 119 FuncTypeFloat FuncLlc; |
| 120 } FuncFloat[] = { |
| 121 { "fcmpFalseFloat", Subzero_fcmpFalseFloat, fcmpFalseFloat }, |
| 122 { "fcmpOeqFloat", Subzero_fcmpOeqFloat, fcmpOeqFloat }, |
| 123 { "fcmpOgtFloat", Subzero_fcmpOgtFloat, fcmpOgtFloat }, |
| 124 { "fcmpOgeFloat", Subzero_fcmpOgeFloat, fcmpOgeFloat }, |
| 125 { "fcmpOltFloat", Subzero_fcmpOltFloat, fcmpOltFloat }, |
| 126 { "fcmpOleFloat", Subzero_fcmpOleFloat, fcmpOleFloat }, |
| 127 { "fcmpOneFloat", Subzero_fcmpOneFloat, fcmpOneFloat }, |
| 128 { "fcmpOrdFloat", Subzero_fcmpOrdFloat, fcmpOrdFloat }, |
| 129 { "fcmpUeqFloat", Subzero_fcmpUeqFloat, fcmpUeqFloat }, |
| 130 { "fcmpUgtFloat", Subzero_fcmpUgtFloat, fcmpUgtFloat }, |
| 131 { "fcmpUgeFloat", Subzero_fcmpUgeFloat, fcmpUgeFloat }, |
| 132 { "fcmpUltFloat", Subzero_fcmpUltFloat, fcmpUltFloat }, |
| 133 { "fcmpUleFloat", Subzero_fcmpUleFloat, fcmpUleFloat }, |
| 134 { "fcmpUneFloat", Subzero_fcmpUneFloat, fcmpUneFloat }, |
| 135 { "fcmpUnoFloat", Subzero_fcmpUnoFloat, fcmpUnoFloat }, |
| 136 { "fcmpTrueFloat", Subzero_fcmpTrueFloat, fcmpTrueFloat }, |
| 137 }; |
| 138 const static unsigned NumFuncFloat = sizeof(FuncFloat) / sizeof(*FuncFloat); |
| 139 |
| 140 typedef bool (*FuncTypeDouble)(double, double); |
| 141 static struct { |
| 142 const char *Name; |
| 143 FuncTypeDouble FuncSz; |
| 144 FuncTypeDouble FuncLlc; |
| 145 } FuncDouble[] = { |
| 146 { "fcmpFalseDouble", Subzero_fcmpFalseDouble, fcmpFalseDouble }, |
| 147 { "fcmpOeqDouble", Subzero_fcmpOeqDouble, fcmpOeqDouble }, |
| 148 { "fcmpOgtDouble", Subzero_fcmpOgtDouble, fcmpOgtDouble }, |
| 149 { "fcmpOgeDouble", Subzero_fcmpOgeDouble, fcmpOgeDouble }, |
| 150 { "fcmpOltDouble", Subzero_fcmpOltDouble, fcmpOltDouble }, |
| 151 { "fcmpOleDouble", Subzero_fcmpOleDouble, fcmpOleDouble }, |
| 152 { "fcmpOneDouble", Subzero_fcmpOneDouble, fcmpOneDouble }, |
| 153 { "fcmpOrdDouble", Subzero_fcmpOrdDouble, fcmpOrdDouble }, |
| 154 { "fcmpUeqDouble", Subzero_fcmpUeqDouble, fcmpUeqDouble }, |
| 155 { "fcmpUgtDouble", Subzero_fcmpUgtDouble, fcmpUgtDouble }, |
| 156 { "fcmpUgeDouble", Subzero_fcmpUgeDouble, fcmpUgeDouble }, |
| 157 { "fcmpUltDouble", Subzero_fcmpUltDouble, fcmpUltDouble }, |
| 158 { "fcmpUleDouble", Subzero_fcmpUleDouble, fcmpUleDouble }, |
| 159 { "fcmpUneDouble", Subzero_fcmpUneDouble, fcmpUneDouble }, |
| 160 { "fcmpUnoDouble", Subzero_fcmpUnoDouble, fcmpUnoDouble }, |
| 161 { "fcmpTrueDouble", Subzero_fcmpTrueDouble, fcmpTrueDouble }, |
| 162 }; |
| 163 const static unsigned NumFuncDouble = |
| 164 sizeof(FuncDouble) / sizeof(*FuncDouble); |
| 165 |
| 166 bool ResultSz, ResultLlc; |
| 167 |
| 168 unsigned TotalTests = 0; |
| 169 unsigned Passes = 0; |
| 170 unsigned Failures = 0; |
| 171 |
| 172 for (unsigned f = 0; f < NumFuncFloat; ++f) { |
| 173 for (unsigned i = 0; i < NumFloatValues; ++i) { |
| 174 for (unsigned j = 0; j < NumFloatValues; ++j) { |
| 175 ++TotalTests; |
| 176 ResultSz = FuncFloat[f].FuncSz(FloatValues[i], FloatValues[j]); |
| 177 ResultLlc = FuncFloat[f].FuncLlc(FloatValues[i], FloatValues[j]); |
| 178 if (ResultSz == ResultLlc) { |
| 179 ++Passes; |
| 180 } else { |
| 181 ++Failures; |
| 182 printf("%s(%g, %g): sz=%d llc=%d\n", FuncFloat[f].Name, |
| 183 FloatValues[i], FloatValues[j], ResultSz, ResultLlc); |
| 184 } |
| 185 } |
| 186 } |
| 187 } |
| 188 |
| 189 for (unsigned f = 0; f < NumFuncDouble; ++f) { |
| 190 for (unsigned i = 0; i < NumDoubleValues; ++i) { |
| 191 for (unsigned j = 0; j < NumDoubleValues; ++j) { |
| 192 ++TotalTests; |
| 193 ResultSz = FuncDouble[f].FuncSz(DoubleValues[i], DoubleValues[j]); |
| 194 ResultLlc = FuncDouble[f].FuncLlc(DoubleValues[i], DoubleValues[j]); |
| 195 if (ResultSz == ResultLlc) { |
| 196 ++Passes; |
| 197 } else { |
| 198 ++Failures; |
| 199 printf("%s(%g, %g): sz=%d llc=%d\n", FuncDouble[f].Name, |
| 200 DoubleValues[i], DoubleValues[j], ResultSz, ResultLlc); |
| 201 } |
| 202 } |
| 203 } |
| 204 } |
| 205 |
| 206 printf("TotalTests=%u Passes=%u Failures=%u\n", TotalTests, Passes, Failures); |
| 207 return Failures; |
| 208 } |
OLD | NEW |