Browse Source

Wrote more SIMD tests.

David Piuva 3 months ago
parent
commit
c3abedcc87
1 changed files with 201 additions and 1 deletions
  1. 201 1
      Source/test/tests/SimdTest.cpp

+ 201 - 1
Source/test/tests/SimdTest.cpp

@@ -3,7 +3,6 @@
 #include "../../DFPSR/base/simd.h"
 #include "../../DFPSR/base/endian.h"
 
-// TODO: Test: allLanesNotEqual, allLanesLesser, allLanesGreater, allLanesLesserOrEqual, allLanesGreaterOrEqual, operand ~.
 // TODO: Set up a test where SIMD is disabled to force using the reference implementation.
 // TODO: Keep the reference implementation alongside the SIMD types during brute-force testing with millions of random inputs.
 
@@ -11,6 +10,189 @@
 #define ASSERT_NOTEQUAL_SIMD(A, B) ASSERT_COMP(A, B, !allLanesEqual, "!=")
 
 static void testComparisons() {
+	// Test non-vectorized comparison functions. (Used for test conditions and debug assertions)
+	ASSERT_EQUAL(allLanesEqual(I32x4(-2, 1, 4, 7345), I32x4(-2, 1, 4, 7345)), true);
+	ASSERT_EQUAL(allLanesEqual(I32x4(-2, 1, 4, 7345), I32x4( 2, 1, 4, 7345)), false);
+	ASSERT_EQUAL(allLanesEqual(I32x4(-2, 1, 4, 7345), I32x4(-2, 5, 4, 7345)), false);
+	ASSERT_EQUAL(allLanesEqual(I32x4(-2, 1, 4, 7345), I32x4(-2, 1, 2, 7345)), false);
+	ASSERT_EQUAL(allLanesEqual(I32x4(-2, 1, 4, 7345), I32x4(-2, 1, 4, 6531)), false);
+	ASSERT_EQUAL(allLanesEqual(I32x4(-2, 1, 4, 7345), I32x4(-2, 0, 4,  385)), false);
+	ASSERT_EQUAL(allLanesEqual(I32x4( 0, 0, 0,    0), I32x4(-2, 1, 4, 7345)), false);
+	ASSERT_EQUAL(allLanesNotEqual(I32x4(-2, 1, 4, 5), I32x4( 6, 8, 3, 7)), true);
+	ASSERT_EQUAL(allLanesNotEqual(I32x4(-2, 1, 4, 5), I32x4(-2, 8, 3, 7)), false);
+	ASSERT_EQUAL(allLanesNotEqual(I32x4(-2, 1, 4, 5), I32x4( 6, 1, 3, 7)), false);
+	ASSERT_EQUAL(allLanesNotEqual(I32x4(-2, 1, 4, 5), I32x4( 6, 8, 4, 7)), false);
+	ASSERT_EQUAL(allLanesNotEqual(I32x4(-2, 1, 4, 5), I32x4( 6, 8, 3, 5)), false);
+	ASSERT_EQUAL(allLanesNotEqual(I32x4(-2, 1, 4, 5), I32x4(-2, 8, 3, 5)), false);
+	ASSERT_EQUAL(allLanesNotEqual(I32x4(-2, 1, 4, 5), I32x4( 6, 1, 4, 7)), false);
+	ASSERT_EQUAL(allLanesLesser (I32x4(-4, -1,  1,  3), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesLesser (I32x4(-3, -1,  1,  3), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (I32x4(-4,  0,  1,  3), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (I32x4(-4, -1,  2,  3), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (I32x4(-4, -1,  1,  4), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (I32x4(36, -1,  1,  3), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (I32x4(-4, 86,  1,  3), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (I32x4(-4, -1, 35,  3), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (I32x4(-4, -1,  1, 75), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(I32x4(-2,  1,  4,  5), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesGreater(I32x4(-3,  1,  4,  5), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(I32x4(-2,  0,  4,  5), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(I32x4(-2,  1,  2,  5), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(I32x4(-2,  1,  4,  4), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(I32x4(-5,  1,  4,  5), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(I32x4(-2, -5,  4,  5), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(I32x4(-2,  1, -7,  5), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(I32x4(-2,  1,  4, -4), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x4(-4, -1,  1,  3), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x4(-3, -1,  1,  3), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x4(-4,  0,  1,  3), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x4(-4, -1,  2,  3), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x4(-4, -1,  1,  4), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x4(36, -1,  1,  3), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x4(-4, 86,  1,  3), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x4(-4, -1, 35,  3), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x4(-4, -1,  1, 75), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x4(-2,  1,  4,  5), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x4(-3,  1,  4,  5), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x4(-2,  0,  4,  5), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x4(-2,  1,  2,  5), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x4(-2,  1,  4,  4), I32x4(-3,  0,  2,  4)), true);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x4(-5,  1,  4,  5), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x4(-2, -5,  4,  5), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x4(-2,  1, -7,  5), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x4(-2,  1,  4, -4), I32x4(-3,  0,  2,  4)), false);
+	ASSERT_EQUAL(allLanesEqual         (I32x8(-2, 1, 4, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesEqual         (I32x8( 0, 1, 4, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (I32x8(-2, 0, 4, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (I32x8(-2, 1, 0, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (I32x8(-2, 1, 4, 0, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (I32x8(-2, 1, 4, 8,  0, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (I32x8(-2, 1, 4, 8, 74,  0, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (I32x8(-2, 1, 4, 8, 74, 23, 0, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (I32x8(-2, 1, 4, 8, 74, 23, 5,  0), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (I32x8( 5, 8, 6, 9, 35, 75, 3, 75), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesNotEqual      (I32x8(-2, 8, 6, 9, 35, 75, 3, 75), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (I32x8( 5, 1, 6, 9, 35, 75, 3, 75), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (I32x8( 5, 8, 4, 9, 35, 75, 3, 75), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (I32x8( 5, 8, 6, 8, 35, 75, 3, 75), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (I32x8( 5, 8, 6, 9, 74, 75, 3, 75), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (I32x8( 5, 8, 6, 9, 35, 23, 3, 75), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (I32x8( 5, 8, 6, 9, 35, 75, 5, 75), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (I32x8( 5, 8, 6, 9, 35, 75, 3, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (I32x8(-2, 1, 4, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesser        (I32x8(-3, 0, 3, 7, 73, 22, 4, 63), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesGreater       (I32x8(-1, 2, 5, 9, 75, 24, 6, 65), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesGreater       (I32x8(-2, 2, 5, 9, 75, 24, 6, 65), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (I32x8(-1, 0, 5, 9, 75, 24, 6, 65), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (I32x8(-1, 2, 4, 9, 75, 24, 6, 65), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (I32x8(-1, 2, 5, 8, 75, 24, 6, 65), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (I32x8(-1, 2, 5, 9,  3, 24, 6, 65), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (I32x8(-1, 2, 5, 9, 75, 23, 6, 65), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (I32x8(-1, 2, 5, 9, 75, 24, 2, 65), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (I32x8(-1, 2, 5, 9, 75, 24, 6,  5), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x8(-2, 1, 4, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x8(-1, 1, 4, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x8(-2, 2, 4, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x8(-2, 1, 5, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x8(-2, 1, 4, 9, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x8(-2, 1, 4, 8, 75, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x8(-2, 1, 4, 8, 74, 73, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x8(-2, 1, 4, 8, 74, 23, 6, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (I32x8(-2, 1, 4, 8, 74, 23, 5, 69), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x8(-2, 1, 4, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x8(-3, 1, 4, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x8(-2, 0, 4, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x8(-2, 1, 2, 8, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x8(-2, 1, 4, 5, 74, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x8(-2, 1, 4, 8, 34, 23, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x8(-2, 1, 4, 8, 74,  1, 5, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x8(-2, 1, 4, 8, 74, 23, 3, 64), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(I32x8(-2, 1, 4, 8, 74, 23, 5,  4), I32x8(-2, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual(U32x4(8, 1, 4, 7345), U32x4(8, 1, 4, 7345)), true);
+	ASSERT_EQUAL(allLanesEqual(U32x4(8, 1, 4, 7345), U32x4(2, 1, 4, 7345)), false);
+	ASSERT_EQUAL(allLanesEqual(U32x4(8, 1, 4, 7345), U32x4(8, 5, 4, 7345)), false);
+	ASSERT_EQUAL(allLanesEqual(U32x4(8, 1, 4, 7345), U32x4(8, 1, 2, 7345)), false);
+	ASSERT_EQUAL(allLanesEqual(U32x4(8, 1, 4, 7345), U32x4(8, 1, 4, 6531)), false);
+	ASSERT_EQUAL(allLanesNotEqual(U32x4(8, 1, 4, 5), U32x4(6, 8, 3, 7)), true);
+	ASSERT_EQUAL(allLanesNotEqual(U32x4(8, 1, 4, 5), U32x4(8, 8, 3, 7)), false);
+	ASSERT_EQUAL(allLanesNotEqual(U32x4(8, 1, 4, 5), U32x4(6, 1, 3, 7)), false);
+	ASSERT_EQUAL(allLanesNotEqual(U32x4(8, 1, 4, 5), U32x4(6, 8, 4, 7)), false);
+	ASSERT_EQUAL(allLanesNotEqual(U32x4(8, 1, 4, 5), U32x4(6, 8, 3, 5)), false);
+	ASSERT_EQUAL(allLanesLesser (U32x4( 7, 4,  1,  3), U32x4( 8,  5,  2,  4)), true);
+	ASSERT_EQUAL(allLanesLesser (U32x4( 8, 4,  1,  3), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (U32x4( 7, 5,  1,  3), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (U32x4( 7, 4,  2,  3), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (U32x4( 7, 4,  1,  4), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (U32x4(36, 4,  1,  3), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (U32x4( 7,48,  1,  3), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (U32x4( 7, 4, 35,  3), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesser (U32x4( 7, 4,  1, 75), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(U32x4( 9, 6,  3,  5), U32x4( 8,  5,  2,  4)), true);
+	ASSERT_EQUAL(allLanesGreater(U32x4( 8, 6,  3,  5), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(U32x4( 9, 5,  3,  5), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(U32x4( 9, 6,  2,  5), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(U32x4( 9, 6,  3,  4), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(U32x4( 4, 6,  3,  5), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(U32x4( 9, 2,  3,  5), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(U32x4( 9, 6,  1,  5), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesGreater(U32x4( 9, 6,  3,  0), U32x4( 8,  5,  2,  4)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x4( 6, 9, 1, 3), U32x4(7,10, 2, 4)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x4( 7, 9, 1, 3), U32x4(7,10, 2, 4)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x4( 6,10, 1, 3), U32x4(7,10, 2, 4)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x4( 6, 9, 2, 3), U32x4(7,10, 2, 4)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x4( 6, 9, 1, 4), U32x4(7,10, 2, 4)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x4(36, 9, 1, 3), U32x4(7,10, 2, 4)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x4( 6,86, 1, 3), U32x4(7,10, 2, 4)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x4( 6, 9,35, 3), U32x4(7,10, 2, 4)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x4( 6, 9, 1,75), U32x4(7,10, 2, 4)), false);
+	ASSERT_EQUAL(allLanesEqual         (U32x8( 8, 1, 4, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesEqual         (U32x8( 0, 1, 4, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (U32x8( 8, 0, 4, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (U32x8( 8, 1, 0, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (U32x8( 8, 1, 4, 0, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (U32x8( 8, 1, 4, 8,  0, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (U32x8( 8, 1, 4, 8, 74,  0, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (U32x8( 8, 1, 4, 8, 74, 23, 0, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesEqual         (U32x8( 8, 1, 4, 8, 74, 23, 5,  0), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (U32x8( 5, 8, 6, 9, 35, 75, 3, 75), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesNotEqual      (U32x8( 8, 8, 6, 9, 35, 75, 3, 75), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (U32x8( 5, 1, 6, 9, 35, 75, 3, 75), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (U32x8( 5, 8, 4, 9, 35, 75, 3, 75), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (U32x8( 5, 8, 6, 8, 35, 75, 3, 75), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (U32x8( 5, 8, 6, 9, 74, 75, 3, 75), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (U32x8( 5, 8, 6, 9, 35, 23, 3, 75), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (U32x8( 5, 8, 6, 9, 35, 75, 5, 75), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (U32x8( 5, 8, 6, 9, 35, 75, 3, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesNotEqual      (U32x8( 8, 1, 4, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesser        (U32x8( 7, 0, 3, 7, 73, 22, 4, 63), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesGreater       (U32x8( 9, 2, 5, 9, 75, 24, 6, 65), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesGreater       (U32x8( 8, 2, 5, 9, 75, 24, 6, 65), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (U32x8( 9, 0, 5, 9, 75, 24, 6, 65), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (U32x8( 9, 2, 4, 9, 75, 24, 6, 65), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (U32x8( 9, 2, 5, 8, 75, 24, 6, 65), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (U32x8( 9, 2, 5, 9,  3, 24, 6, 65), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (U32x8( 9, 2, 5, 9, 75, 23, 6, 65), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (U32x8( 9, 2, 5, 9, 75, 24, 2, 65), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreater       (U32x8( 9, 2, 5, 9, 75, 24, 6,  5), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x8( 8, 1, 4, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x8( 9, 1, 4, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x8( 8, 2, 4, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x8( 8, 1, 5, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x8( 8, 1, 4, 9, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x8( 8, 1, 4, 8, 75, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x8( 8, 1, 4, 8, 74, 73, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x8( 8, 1, 4, 8, 74, 23, 6, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesLesserOrEqual (U32x8( 8, 1, 4, 8, 74, 23, 5, 69), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(U32x8( 8, 1, 4, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), true);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(U32x8( 7, 1, 4, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(U32x8( 8, 0, 4, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(U32x8( 8, 1, 2, 8, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(U32x8( 8, 1, 4, 5, 74, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(U32x8( 8, 1, 4, 8, 34, 23, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(U32x8( 8, 1, 4, 8, 74,  1, 5, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(U32x8( 8, 1, 4, 8, 74, 23, 3, 64), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+	ASSERT_EQUAL(allLanesGreaterOrEqual(U32x8( 8, 1, 4, 8, 74, 23, 5,  4), U32x8( 8, 1, 4, 8, 74, 23, 5, 64)), false);
+
 	// F32x4 Comparisons
 	ASSERT_EQUAL_SIMD(F32x4(1.5f), F32x4(1.5f, 1.5f, 1.5f, 1.5f));
 	ASSERT_EQUAL_SIMD(F32x4(-1.5f), F32x4(-1.5f, -1.5f, -1.5f, -1.5f));
@@ -1049,6 +1231,24 @@ START_TEST(Simd)
 
 	testBitShift();
 
+	// Bitwise negation.
+	ASSERT_EQUAL_SIMD(
+	  ~U32x4(0b11000000111000000111111100001100, 0b00111000000000110000001110001100, 0b00001110000000100011000000011001, 0b00001110001000000111001100001000),
+	   U32x4(0b00111111000111111000000011110011, 0b11000111111111001111110001110011, 0b11110001111111011100111111100110, 0b11110001110111111000110011110111)
+	);
+	ASSERT_EQUAL_SIMD(
+	  ~U16x8(0b1100000011100000, 0b0111111100001100, 0b0011100000000011, 0b0000001110001100, 0b0000111000000010, 0b0011000000011000, 0b0000111000100000, 0b0111001100001000),
+	   U16x8(0b0011111100011111, 0b1000000011110011, 0b1100011111111100, 0b1111110001110011, 0b1111000111111101, 0b1100111111100111, 0b1111000111011111, 0b1000110011110111)
+	);
+	ASSERT_EQUAL_SIMD(
+	  ~U32x8(0b11000000111000000111111100001100, 0b00111000000000110000001110001100, 0b00001110000000100011000000011000, 0b00001110001000000111001100001000, 0b11000000111000100111101100101100, 0b00111010000000110010001110101101, 0b01001110001000100011001000010010, 0b01001110001001000111100110000100),
+	   U32x8(0b00111111000111111000000011110011, 0b11000111111111001111110001110011, 0b11110001111111011100111111100111, 0b11110001110111111000110011110111, 0b00111111000111011000010011010011, 0b11000101111111001101110001010010, 0b10110001110111011100110111101101, 0b10110001110110111000011001111011)
+	);
+	ASSERT_EQUAL_SIMD(
+	  ~U16x16(0b1100000011100000, 0b0111111100001100, 0b0011100000000011, 0b0000001110001100, 0b0000111000000010, 0b0011000000011000, 0b0000111000100000, 0b0111001100001000,  0b1100100011100100, 0b0110011100001110, 0b0010100001001011, 0b0001001110001110, 0b0000111011000110, 0b0011000111011000, 0b0000111000100100, 0b0101001100011000),
+	   U16x16(0b0011111100011111, 0b1000000011110011, 0b1100011111111100, 0b1111110001110011, 0b1111000111111101, 0b1100111111100111, 0b1111000111011111, 0b1000110011110111,  0b0011011100011011, 0b1001100011110001, 0b1101011110110100, 0b1110110001110001, 0b1111000100111001, 0b1100111000100111, 0b1111000111011011, 0b1010110011100111)
+	);
+
 	// Reinterpret cast.
 	ASSERT_EQUAL_SIMD(
 	  reinterpret_U8FromU32(U32x4(ENDIAN32_BYTE_0, ENDIAN32_BYTE_1, ENDIAN32_BYTE_2, ENDIAN32_BYTE_3)),