diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/example/cpp-unit.cpp | 544 | ||||
-rw-r--r-- | test/example/cpp-unit.txt | 2 | ||||
-rw-r--r-- | test/passes/optimize-instructions_all-features.txt | 12 |
3 files changed, 533 insertions, 25 deletions
diff --git a/test/example/cpp-unit.cpp b/test/example/cpp-unit.cpp index 2ba4388d1..07c88c1c5 100644 --- a/test/example/cpp-unit.cpp +++ b/test/example/cpp-unit.cpp @@ -7,36 +7,550 @@ #include <wasm.h> using namespace wasm; +using namespace Bits; -void compare(size_t x, size_t y) { - if (x != y) { - std::cout << "comparison error!\n" << x << '\n' << y << '\n'; - abort(); +#define RESET "\x1b[0m" + +#define FG_BLACK "\x1b[30m" +#define FG_RED "\x1b[31m" +#define FG_GREEN "\x1b[32m" +#define FG_YELLOW "\x1b[33m" + +#define BG_BLACK "\x1b[40m" +#define BG_RED "\x1b[41m" + +static int failsCount = 0; + +template<typename T, typename U> +void assert_equal_(T a, U b, int line, const char* file) { + if (a != b) { + std::cerr << '\n' + << BG_RED FG_BLACK << " ASSERTION ERROR " + << ++failsCount << " " + << RESET FG_RED << "\n" + << FG_RED << " Actual: " << a << '\n' + << FG_GREEN << " Expected: " << b << "\n\n" + << FG_YELLOW << " Line: " << line << '\n' + << FG_YELLOW << " File: " << file << '\n' + << RESET << std::endl; + + std::cout << "actual: " << a + << ", expected: " << b + << ", line " << line + << ", file " << file + << std::endl; } } +#define assert_equal(a, b) assert_equal_((a), (b), __LINE__, __FILE__) + void test_bits() { - Const c; - c.type = Type::i32; - c.value = Literal(int32_t(1)); - compare(Bits::getMaxBits(&c), 1); - c.value = Literal(int32_t(2)); - compare(Bits::getMaxBits(&c), 2); - c.value = Literal(int32_t(3)); - compare(Bits::getMaxBits(&c), 2); + Const c0, c1; + Binary b; + + b.left = &c0; + b.right = &c1; + + // --- // + // i32 // + // --- // + + c0.type = Type::i32; + c1.type = Type::i32; + b.type = Type::i32; + + c0.value = Literal(int32_t(0)); + assert_equal(getMaxBits(&c0), 0); + c0.value = Literal(int32_t(1)); + assert_equal(getMaxBits(&c0), 1); + c0.value = Literal(int32_t(2)); + assert_equal(getMaxBits(&c0), 2); + c0.value = Literal(int32_t(0x80000)); + assert_equal(getMaxBits(&c0), 20); + c0.value = Literal(int32_t(-1)); + assert_equal(getMaxBits(&c0), 32); + + b.op = AddInt32; + c0.value = Literal(int32_t(0xFFFF)); + c1.value = Literal(int32_t(0x11)); + assert_equal(getMaxBits(&b), 17); + c0.value = Literal(int32_t(-1)); + c1.value = Literal(int32_t(2)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(-1)); + c1.value = Literal(int32_t(-1)); + assert_equal(getMaxBits(&b), 32); + + b.op = SubInt32; + c0.value = Literal(int32_t(0xFFFF)); + c1.value = Literal(int32_t(0x11)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(-1)); + c1.value = Literal(int32_t(2)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(2)); + c1.value = Literal(int32_t(-1)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(0)); + c1.value = Literal(int32_t(1)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(0x7FFFFFF0)); + c1.value = Literal(int32_t(0x7FFFFFFF)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(1)); + c1.value = Literal(int32_t(1)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(0)); + c1.value = Literal(int32_t(0x7FFFFFFF)); + assert_equal(getMaxBits(&b), 32); + + b.op = MulInt32; + c0.value = Literal(int32_t(0xFFFF)); + c1.value = Literal(int32_t(0x11)); + assert_equal(getMaxBits(&b), 21); + c0.value = Literal(int32_t(0)); + c1.value = Literal(int32_t(1)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(int32_t(1)); + c1.value = Literal(int32_t(0)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(int32_t(3)); + c1.value = Literal(int32_t(3)); + assert_equal(getMaxBits(&b), 4); + c0.value = Literal(int32_t(2)); + c1.value = Literal(int32_t(-2)); + assert_equal(getMaxBits(&b), 32); + + b.op = DivSInt32; + c0.value = Literal(int32_t(0)); + c1.value = Literal(int32_t(0xF)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int32_t( 1)); + c1.value = Literal(int32_t( 2)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int32_t(0xFF)); + c1.value = Literal(int32_t(0xFF)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(int32_t(-1)); + c1.value = Literal(int32_t( 1)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(-1)); + c1.value = Literal(int32_t( 2)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(0x7FFFFFFF)); + c1.value = Literal(int32_t(3)); + assert_equal(getMaxBits(&b), 30); + c0.value = Literal(int32_t(0x0000FFFF)); + c1.value = Literal(int32_t(0xFF)); + assert_equal(getMaxBits(&b), 9); + c0.value = Literal(int32_t(0x00001000)); + c1.value = Literal(int32_t(0x00000FFF)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(int32_t(0x80000000)); + c1.value = Literal(int32_t(-1)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(2)); + c1.value = Literal(int32_t(-2)); + assert_equal(getMaxBits(&b), 32); + + + b.op = DivUInt32; + c0.value = Literal(uint32_t(0)); + c1.value = Literal(uint32_t(0xF)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(uint32_t( 1)); + c1.value = Literal(uint32_t( 2)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(uint32_t(0xFF)); + c1.value = Literal(uint32_t(0xFF)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(uint32_t(-1)); + c1.value = Literal(uint32_t( 1)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(uint32_t(-1)); + c1.value = Literal(uint32_t( 2)); + assert_equal(getMaxBits(&b), 31); + c0.value = Literal(uint32_t(0x7FFFFFFF)); + c1.value = Literal(uint32_t(3)); + assert_equal(getMaxBits(&b), 30); + c0.value = Literal(int32_t(0x0000FFFF)); + c1.value = Literal(int32_t(0xFF)); + assert_equal(getMaxBits(&b), 9); + c0.value = Literal(int32_t(0x00001000)); + c1.value = Literal(int32_t(0x00000FFF)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(uint32_t(0x80000000)); + c1.value = Literal(uint32_t(-1)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(uint32_t(2)); + c1.value = Literal(uint32_t(-2)); + assert_equal(getMaxBits(&b), 0); + + b.op = RemSInt32; + c0.value = Literal(int32_t(0)); + c1.value = Literal(int32_t(0xF)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int32_t(0)); + c1.value = Literal(int32_t(-1)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int32_t( 1)); + c1.value = Literal(int32_t( 2)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(int32_t(-1)); + c1.value = Literal(int32_t( 2)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(3)); + c1.value = Literal(int32_t(-1)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(int32_t(0x7FFFFFFF)); + c1.value = Literal(int32_t(0x7FFFFFFF)); + assert_equal(getMaxBits(&b), 31); + + b.op = RemUInt32; + c0.value = Literal(uint32_t(0)); + c1.value = Literal(uint32_t(0xF)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(uint32_t(0)); + c1.value = Literal(uint32_t(-1)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(uint32_t( 1)); + c1.value = Literal(uint32_t( 2)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(uint32_t(-1)); + c1.value = Literal(uint32_t( 2)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(uint32_t(3)); + c1.value = Literal(uint32_t(-1)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(uint32_t(0x7FFFFFFF)); + c1.value = Literal(uint32_t(0x7FFFFFFF)); + assert_equal(getMaxBits(&b), 31); + + b.op = AndInt32; + c0.value = Literal(int32_t(0)); + c1.value = Literal(int32_t(0xF)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int32_t(0xF)); + c1.value = Literal(int32_t(0)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int32_t(3)); + c1.value = Literal(int32_t(3)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(int32_t(-1)); + c1.value = Literal(int32_t(3)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(int32_t(3)); + c1.value = Literal(int32_t(-1)); + assert_equal(getMaxBits(&b), 2); + + b.op = OrInt32; + c0.value = Literal(int32_t(0)); + c1.value = Literal(int32_t(0xF)); + assert_equal(getMaxBits(&b), 4); + c0.value = Literal(int32_t(0xF)); + c1.value = Literal(int32_t(0)); + assert_equal(getMaxBits(&b), 4); + c0.value = Literal(int32_t(3)); + c1.value = Literal(int32_t(3)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(int32_t(-1)); + c1.value = Literal(int32_t(3)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(3)); + c1.value = Literal(int32_t(-1)); + assert_equal(getMaxBits(&b), 32); + + b.op = XorInt32; + c0.value = Literal(int32_t(0)); + c1.value = Literal(int32_t(0xF)); + assert_equal(getMaxBits(&b), 4); + c0.value = Literal(int32_t(0xF)); + c1.value = Literal(int32_t(0)); + assert_equal(getMaxBits(&b), 4); + c0.value = Literal(int32_t(3)); + c1.value = Literal(int32_t(3)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(int32_t(-1)); + c1.value = Literal(int32_t(3)); + assert_equal(getMaxBits(&b), 32); + c0.value = Literal(int32_t(3)); + c1.value = Literal(int32_t(-1)); + assert_equal(getMaxBits(&b), 32); + + // --- // + // i64 // + // --- // + + c0.type = Type::i64; + c1.type = Type::i64; + b.type = Type::i64; + + c0.value = Literal(int64_t(0)); + assert_equal(getMaxBits(&c0), 0); + c0.value = Literal(int64_t(1)); + assert_equal(getMaxBits(&c0), 1); + c0.value = Literal(int64_t(2)); + assert_equal(getMaxBits(&c0), 2); + c0.value = Literal(int64_t(0x80000)); + assert_equal(getMaxBits(&c0), 20); + c0.value = Literal(int64_t(-1)); + assert_equal(getMaxBits(&c0), 64); + + b.op = AddInt64; + c0.value = Literal(int64_t(0xFFFF)); + c1.value = Literal(int64_t(0x11)); + assert_equal(getMaxBits(&b), 17); + c0.value = Literal(int64_t(-1)); + c1.value = Literal(int64_t(2)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(-1)); + c1.value = Literal(int64_t(-1)); + assert_equal(getMaxBits(&b), 64); + + b.op = SubInt64; + c0.value = Literal(int64_t(0xFFFF)); + c1.value = Literal(int64_t(0x11)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(-1)); + c1.value = Literal(int64_t(2)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(2)); + c1.value = Literal(int64_t(-1)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(0)); + c1.value = Literal(int64_t(1)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(0x7FFFFFFFFFFFFFF0)); + c1.value = Literal(int64_t(0x7FFFFFFFFFFFFFFF)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(1)); + c1.value = Literal(int64_t(1)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(0)); + c1.value = Literal(int64_t(0x7FFFFFFFFFFFFFFF)); + assert_equal(getMaxBits(&b), 64); + + b.op = MulInt64; + c0.value = Literal(int64_t(0xFFFF)); + c1.value = Literal(int64_t(0x11)); + assert_equal(getMaxBits(&b), 21); + c0.value = Literal(int64_t(0)); + c1.value = Literal(int64_t(1)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(int64_t(1)); + c1.value = Literal(int64_t(0)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(int64_t(3)); + c1.value = Literal(int64_t(3)); + assert_equal(getMaxBits(&b), 4); + c0.value = Literal(int64_t(2)); + c1.value = Literal(int64_t(-2)); + assert_equal(getMaxBits(&b), 64); + + b.op = DivSInt64; + c0.value = Literal(int64_t(0)); + c1.value = Literal(int64_t(0xF)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int64_t( 1)); + c1.value = Literal(int64_t( 2)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int64_t(0xFF)); + c1.value = Literal(int64_t(0xFF)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(int64_t(-1)); + c1.value = Literal(int64_t( 1)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(-1)); + c1.value = Literal(int64_t( 2)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(0x7FFFFFFFFFFFFFFF)); + c1.value = Literal(int64_t(3)); + assert_equal(getMaxBits(&b), 62); + c0.value = Literal(int64_t(0x8000000000000000)); + c1.value = Literal(int64_t(-1)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(2)); + c1.value = Literal(int64_t(-2)); + assert_equal(getMaxBits(&b), 64); + + b.op = DivUInt64; + c0.value = Literal(uint64_t(0)); + c1.value = Literal(uint64_t(0xF)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(uint64_t( 1)); + c1.value = Literal(uint64_t( 2)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(uint64_t(0xFF)); + c1.value = Literal(uint64_t(0xFF)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(uint64_t(-1)); + c1.value = Literal(uint64_t( 1)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(uint64_t(-1)); + c1.value = Literal(uint64_t( 2)); + assert_equal(getMaxBits(&b), 63); + c0.value = Literal(uint64_t(0x7FFFFFFFFFFFFFFF)); + c1.value = Literal(uint64_t(3)); + assert_equal(getMaxBits(&b), 62); + c0.value = Literal(uint64_t(0x8000000000000000)); + c1.value = Literal(uint64_t(-1)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(uint64_t(2)); + c1.value = Literal(uint64_t(-2)); + assert_equal(getMaxBits(&b), 0); + + b.op = RemSInt64; + c0.value = Literal(int64_t(0)); + c1.value = Literal(int64_t(0xF)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int64_t(0)); + c1.value = Literal(int64_t(-1)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int64_t( 1)); + c1.value = Literal(int64_t( 2)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(int64_t(-1)); + c1.value = Literal(int64_t( 2)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(3)); + c1.value = Literal(int64_t(-1)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(int64_t(0x7FFFFFFFFFFFFFFF)); + c1.value = Literal(int64_t(0x7FFFFFFFFFFFFFFF)); + assert_equal(getMaxBits(&b), 63); + + b.op = RemUInt64; + c0.value = Literal(uint64_t(0)); + c1.value = Literal(uint64_t(0xF)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(uint64_t(0)); + c1.value = Literal(uint64_t(-1)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(uint64_t( 1)); + c1.value = Literal(uint64_t( 2)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(uint64_t(-1)); + c1.value = Literal(uint64_t( 2)); + assert_equal(getMaxBits(&b), 1); + c0.value = Literal(uint64_t(3)); + c1.value = Literal(uint64_t(-1)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(uint64_t(0x7FFFFFFFFFFFFFFF)); + c1.value = Literal(uint64_t(0x7FFFFFFFFFFFFFFF)); + assert_equal(getMaxBits(&b), 63); + + b.op = AndInt64; + c0.value = Literal(int64_t(0)); + c1.value = Literal(int64_t(0xF)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int64_t(0xF)); + c1.value = Literal(int64_t(0)); + assert_equal(getMaxBits(&b), 0); + c0.value = Literal(int64_t(3)); + c1.value = Literal(int64_t(3)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(int64_t(-1)); + c1.value = Literal(int64_t(3)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(int64_t(3)); + c1.value = Literal(int64_t(-1)); + assert_equal(getMaxBits(&b), 2); + + b.op = OrInt64; + c0.value = Literal(int64_t(0)); + c1.value = Literal(int64_t(0xF)); + assert_equal(getMaxBits(&b), 4); + c0.value = Literal(int64_t(0xF)); + c1.value = Literal(int64_t(0)); + assert_equal(getMaxBits(&b), 4); + c0.value = Literal(int64_t(3)); + c1.value = Literal(int64_t(3)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(int64_t(-1)); + c1.value = Literal(int64_t(3)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(3)); + c1.value = Literal(int64_t(-1)); + assert_equal(getMaxBits(&b), 64); + + b.op = XorInt64; + c0.value = Literal(int64_t(0)); + c1.value = Literal(int64_t(0xF)); + assert_equal(getMaxBits(&b), 4); + c0.value = Literal(int64_t(0xF)); + c1.value = Literal(int64_t(0)); + assert_equal(getMaxBits(&b), 4); + c0.value = Literal(int64_t(3)); + c1.value = Literal(int64_t(3)); + assert_equal(getMaxBits(&b), 2); + c0.value = Literal(int64_t(-1)); + c1.value = Literal(int64_t(3)); + assert_equal(getMaxBits(&b), 64); + c0.value = Literal(int64_t(3)); + c1.value = Literal(int64_t(-1)); + assert_equal(getMaxBits(&b), 64); + + Unary u; + c0.type = Type::i32; + u.value = &c0; + + u.type = Type::i64; + + u.op = ExtendUInt32; + c0.value = Literal(int32_t(0)); + assert_equal(getMaxBits(&u), 0); + c0.value = Literal(int32_t(1)); + assert_equal(getMaxBits(&u), 1); + c0.value = Literal(int32_t(0xF)); + assert_equal(getMaxBits(&u), 4); + c0.value = Literal(int32_t(-1)); + assert_equal(getMaxBits(&u), 32); + + u.op = ExtendSInt32; + c0.value = Literal(int32_t(0)); + assert_equal(getMaxBits(&u), 0); + c0.value = Literal(int32_t(1)); + assert_equal(getMaxBits(&u), 1); + c0.value = Literal(int32_t(0xF)); + assert_equal(getMaxBits(&u), 4); + c0.value = Literal(int32_t(0x7FFFFFFF)); + assert_equal(getMaxBits(&u), 31); + c0.value = Literal(int32_t(0x80000000)); + assert_equal(getMaxBits(&u), 64); + c0.value = Literal(int32_t(-1)); + assert_equal(getMaxBits(&u), 64); + + u.type = Type::i32; + c0.type = Type::i64; + + u.op = WrapInt64; + c0.value = Literal(int64_t(0)); + assert_equal(getMaxBits(&u), 0); + c0.value = Literal(int64_t(0x7FFFFFFF)); + assert_equal(getMaxBits(&u), 31); + c0.value = Literal(int64_t(0xFFFFFFFF)); + assert_equal(getMaxBits(&u), 32); + c0.value = Literal(int64_t(0xFFFFFFFFFF)); + assert_equal(getMaxBits(&u), 32); + c0.value = Literal(int64_t(-1)); + assert_equal(getMaxBits(&u), 32); + } void test_cost() { // Some optimizations assume that the cost of a get is zero, e.g. local-cse. LocalGet get; - compare(CostAnalyzer(&get).cost, 0); + assert_equal(CostAnalyzer(&get).cost, 0); } int main() { test_bits(); - test_cost(); - std::cout << "Success.\n"; + if (failsCount > 0) { + abort(); + } else { + std::cout << "Success" << std::endl; + } return 0; } diff --git a/test/example/cpp-unit.txt b/test/example/cpp-unit.txt index a9d787cc5..35821117c 100644 --- a/test/example/cpp-unit.txt +++ b/test/example/cpp-unit.txt @@ -1 +1 @@ -Success. +Success diff --git a/test/passes/optimize-instructions_all-features.txt b/test/passes/optimize-instructions_all-features.txt index dda7a47c0..90556f016 100644 --- a/test/passes/optimize-instructions_all-features.txt +++ b/test/passes/optimize-instructions_all-features.txt @@ -887,15 +887,9 @@ ) ) (drop - (i32.shr_s - (i32.shl - (i32.div_s - (i32.const 1) - (i32.const 2) - ) - (i32.const 24) - ) - (i32.const 24) + (i32.div_s + (i32.const 1) + (i32.const 2) ) ) (drop |