| Index: crosstest/test_icmp_main.cpp
|
| diff --git a/crosstest/test_icmp_main.cpp b/crosstest/test_icmp_main.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6fa2f5a2b8e48fea96394344aa34a0ae3441b1f4
|
| --- /dev/null
|
| +++ b/crosstest/test_icmp_main.cpp
|
| @@ -0,0 +1,209 @@
|
| +// abtest.py --test=test_icmp.cpp --driver=test_icmp_main.cpp --prefix=Subzero_ --output=test_icmp
|
| +
|
| +#include <stdio.h>
|
| +#include <stdint.h>
|
| +
|
| +#include "test_icmp.h"
|
| +namespace Subzero_ {
|
| +#include "test_icmp.h"
|
| +}
|
| +
|
| +int main(int argc, char **argv) {
|
| + static unsigned Values[] = {
|
| + 0x0, 0x1, 0x7ffffffe, 0x7fffffff,
|
| + 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff,
|
| + 0x7e, 0x7f, 0x80, 0x81, 0xfe, 0xff, 0x100, 0x101,
|
| + 0x7ffe, 0x7fff, 0x8000, 0x8001, 0xfffe, 0xffff, 0x10000, 0x10001,
|
| + };
|
| + const static unsigned NumValues = sizeof(Values) / sizeof(*Values);
|
| +
|
| + typedef bool (*FuncType8)(uint8_t, uint8_t);
|
| + static struct {
|
| + const char *Name;
|
| + FuncType8 FuncSz;
|
| + FuncType8 FuncLlc;
|
| + } Func8[] = { { "icmpEq8Bool", (FuncType8)Subzero_::icmpEq8Bool,
|
| + (FuncType8)icmpEq8Bool },
|
| + { "icmpNe8Bool", (FuncType8)Subzero_::icmpNe8Bool,
|
| + (FuncType8)icmpNe8Bool },
|
| + { "icmpSgt8Bool", (FuncType8)Subzero_::icmpSgt8Bool,
|
| + (FuncType8)icmpSgt8Bool },
|
| + { "icmpUgt8Bool", (FuncType8)Subzero_::icmpUgt8Bool,
|
| + (FuncType8)icmpUgt8Bool },
|
| + { "icmpSge8Bool", (FuncType8)Subzero_::icmpSge8Bool,
|
| + (FuncType8)icmpSge8Bool },
|
| + { "icmpUge8Bool", (FuncType8)Subzero_::icmpUge8Bool,
|
| + (FuncType8)icmpUge8Bool },
|
| + { "icmpSlt8Bool", (FuncType8)Subzero_::icmpSlt8Bool,
|
| + (FuncType8)icmpSlt8Bool },
|
| + { "icmpUlt8Bool", (FuncType8)Subzero_::icmpUlt8Bool,
|
| + (FuncType8)icmpUlt8Bool },
|
| + { "icmpSle8Bool", (FuncType8)Subzero_::icmpSle8Bool,
|
| + (FuncType8)icmpSle8Bool },
|
| + { "icmpUle8Bool", (FuncType8)Subzero_::icmpUle8Bool,
|
| + (FuncType8)icmpUle8Bool }, };
|
| + const static unsigned NumFunc8 = sizeof(Func8) / sizeof(*Func8);
|
| +
|
| + typedef bool (*FuncType16)(uint16_t, uint16_t);
|
| + static struct {
|
| + const char *Name;
|
| + FuncType16 FuncSz;
|
| + FuncType16 FuncLlc;
|
| + } Func16[] = { { "icmpEq16Bool", (FuncType16)Subzero_::icmpEq16Bool,
|
| + (FuncType16)icmpEq16Bool },
|
| + { "icmpNe16Bool", (FuncType16)Subzero_::icmpNe16Bool,
|
| + (FuncType16)icmpNe16Bool },
|
| + { "icmpSgt16Bool", (FuncType16)Subzero_::icmpSgt16Bool,
|
| + (FuncType16)icmpSgt16Bool },
|
| + { "icmpUgt16Bool", (FuncType16)Subzero_::icmpUgt16Bool,
|
| + (FuncType16)icmpUgt16Bool },
|
| + { "icmpSge16Bool", (FuncType16)Subzero_::icmpSge16Bool,
|
| + (FuncType16)icmpSge16Bool },
|
| + { "icmpUge16Bool", (FuncType16)Subzero_::icmpUge16Bool,
|
| + (FuncType16)icmpUge16Bool },
|
| + { "icmpSlt16Bool", (FuncType16)Subzero_::icmpSlt16Bool,
|
| + (FuncType16)icmpSlt16Bool },
|
| + { "icmpUlt16Bool", (FuncType16)Subzero_::icmpUlt16Bool,
|
| + (FuncType16)icmpUlt16Bool },
|
| + { "icmpSle16Bool", (FuncType16)Subzero_::icmpSle16Bool,
|
| + (FuncType16)icmpSle16Bool },
|
| + { "icmpUle16Bool", (FuncType16)Subzero_::icmpUle16Bool,
|
| + (FuncType16)icmpUle16Bool }, };
|
| + const static unsigned NumFunc16 = sizeof(Func16) / sizeof(*Func16);
|
| +
|
| + typedef bool (*FuncType32)(uint32_t, uint32_t);
|
| + static struct {
|
| + const char *Name;
|
| + FuncType32 FuncSz;
|
| + FuncType32 FuncLlc;
|
| + } Func32[] = { { "icmpEq32Bool", (FuncType32)Subzero_::icmpEq32Bool,
|
| + (FuncType32)icmpEq32Bool },
|
| + { "icmpNe32Bool", (FuncType32)Subzero_::icmpNe32Bool,
|
| + (FuncType32)icmpNe32Bool },
|
| + { "icmpSgt32Bool", (FuncType32)Subzero_::icmpSgt32Bool,
|
| + (FuncType32)icmpSgt32Bool },
|
| + { "icmpUgt32Bool", (FuncType32)Subzero_::icmpUgt32Bool,
|
| + (FuncType32)icmpUgt32Bool },
|
| + { "icmpSge32Bool", (FuncType32)Subzero_::icmpSge32Bool,
|
| + (FuncType32)icmpSge32Bool },
|
| + { "icmpUge32Bool", (FuncType32)Subzero_::icmpUge32Bool,
|
| + (FuncType32)icmpUge32Bool },
|
| + { "icmpSlt32Bool", (FuncType32)Subzero_::icmpSlt32Bool,
|
| + (FuncType32)icmpSlt32Bool },
|
| + { "icmpUlt32Bool", (FuncType32)Subzero_::icmpUlt32Bool,
|
| + (FuncType32)icmpUlt32Bool },
|
| + { "icmpSle32Bool", (FuncType32)Subzero_::icmpSle32Bool,
|
| + (FuncType32)icmpSle32Bool },
|
| + { "icmpUle32Bool", (FuncType32)Subzero_::icmpUle32Bool,
|
| + (FuncType32)icmpUle32Bool }, };
|
| + const static unsigned NumFunc32 = sizeof(Func32) / sizeof(*Func32);
|
| +
|
| + typedef bool (*FuncType64)(uint64_t, uint64_t);
|
| + static struct {
|
| + const char *Name;
|
| + FuncType64 FuncSz;
|
| + FuncType64 FuncLlc;
|
| + } Func64[] = { { "icmpEq64Bool", (FuncType64)Subzero_::icmpEq64Bool,
|
| + (FuncType64)icmpEq64Bool },
|
| + { "icmpNe64Bool", (FuncType64)Subzero_::icmpNe64Bool,
|
| + (FuncType64)icmpNe64Bool },
|
| + { "icmpSgt64Bool", (FuncType64)Subzero_::icmpSgt64Bool,
|
| + (FuncType64)icmpSgt64Bool },
|
| + { "icmpUgt64Bool", (FuncType64)Subzero_::icmpUgt64Bool,
|
| + (FuncType64)icmpUgt64Bool },
|
| + { "icmpSge64Bool", (FuncType64)Subzero_::icmpSge64Bool,
|
| + (FuncType64)icmpSge64Bool },
|
| + { "icmpUge64Bool", (FuncType64)Subzero_::icmpUge64Bool,
|
| + (FuncType64)icmpUge64Bool },
|
| + { "icmpSlt64Bool", (FuncType64)Subzero_::icmpSlt64Bool,
|
| + (FuncType64)icmpSlt64Bool },
|
| + { "icmpUlt64Bool", (FuncType64)Subzero_::icmpUlt64Bool,
|
| + (FuncType64)icmpUlt64Bool },
|
| + { "icmpSle64Bool", (FuncType64)Subzero_::icmpSle64Bool,
|
| + (FuncType64)icmpSle64Bool },
|
| + { "icmpUle64Bool", (FuncType64)Subzero_::icmpUle64Bool,
|
| + (FuncType64)icmpUle64Bool }, };
|
| + const static unsigned NumFunc64 = sizeof(Func64) / sizeof(*Func64);
|
| +
|
| + bool ResultSz, ResultLlc;
|
| +
|
| + unsigned TotalTests = 0;
|
| + unsigned Passes = 0;
|
| + unsigned Failures = 0;
|
| +
|
| + for (unsigned f = 0; f < NumFunc8; ++f) {
|
| + for (unsigned i = 0; i < NumValues; ++i) {
|
| + for (unsigned j = 0; j < NumValues; ++j) {
|
| + ++TotalTests;
|
| + ResultSz = Func8[f].FuncSz(Values[i], Values[j]);
|
| + ResultLlc = Func8[f].FuncLlc(Values[i], Values[j]);
|
| + if (ResultSz == ResultLlc) {
|
| + ++Passes;
|
| + } else {
|
| + ++Failures;
|
| + printf("%s(0x%08x, 0x%08x): sz=%d llc=%d\n", Func8[f].Name,
|
| + Values[i], Values[j], ResultSz, ResultLlc);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + for (unsigned f = 0; f < NumFunc16; ++f) {
|
| + for (unsigned i = 0; i < NumValues; ++i) {
|
| + for (unsigned j = 0; j < NumValues; ++j) {
|
| + ++TotalTests;
|
| + ResultSz = Func16[f].FuncSz(Values[i], Values[j]);
|
| + ResultLlc = Func16[f].FuncLlc(Values[i], Values[j]);
|
| + if (ResultSz == ResultLlc) {
|
| + ++Passes;
|
| + } else {
|
| + ++Failures;
|
| + printf("%s(0x%08x, 0x%08x): sz=%d llc=%d\n", Func16[f].Name,
|
| + Values[i], Values[j], ResultSz, ResultLlc);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + for (unsigned f = 0; f < NumFunc32; ++f) {
|
| + for (unsigned i = 0; i < NumValues; ++i) {
|
| + for (unsigned j = 0; j < NumValues; ++j) {
|
| + ++TotalTests;
|
| + ResultSz = Func32[f].FuncSz(Values[i], Values[j]);
|
| + ResultLlc = Func32[f].FuncLlc(Values[i], Values[j]);
|
| + if (ResultSz == ResultLlc) {
|
| + ++Passes;
|
| + } else {
|
| + ++Failures;
|
| + printf("%s(0x%08x, 0x%08x): sz=%d llc=%d\n", Func32[f].Name,
|
| + Values[i], Values[j], ResultSz, ResultLlc);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + for (unsigned f = 0; f < NumFunc64; ++f) {
|
| + for (unsigned iLo = 0; iLo < NumValues; ++iLo) {
|
| + for (unsigned iHi = 0; iHi < NumValues; ++iHi) {
|
| + for (unsigned jLo = 0; jLo < NumValues; ++jLo) {
|
| + for (unsigned jHi = 0; jHi < NumValues; ++jHi) {
|
| + uint64_t Value1 = (((uint64_t)Values[iHi]) << 32) + Values[iLo];
|
| + uint64_t Value2 = (((uint64_t)Values[jHi]) << 32) + Values[jLo];
|
| + ++TotalTests;
|
| + ResultLlc = Func64[f].FuncLlc(Value1, Value2);
|
| + ResultSz = Func64[f].FuncSz(Value1, Value2);
|
| + if (ResultSz == ResultLlc) {
|
| + ++Passes;
|
| + } else {
|
| + ++Failures;
|
| + printf("%s(0x%016llx, 0x%016llx): sz=%d llc=%d\n", Func64[f].Name,
|
| + Value1, Value2, ResultSz, ResultLlc);
|
| + }
|
| + }
|
| + }
|
| + }
|
| + }
|
| + }
|
| + printf("TotalTests=%u Passes=%u Failures=%u\n", TotalTests, Passes, Failures);
|
| + return Failures;
|
| +}
|
|
|