Reactor: Switch swizzles over to 16-bit hex codes

This migrates from 2-bit swizzle codes per lane to 4-bit, which reads more fluently in hex.
The order has been reversed so that the most significant nibble (leftmost on little-endian CPUs) represents the first output lane.

Fixed up Swizzle, Mask, and ShuffleLowHigh

Bug: b/145746360
Change-Id: I132bd757801a5ca543ef2b9b0ed34d0527db5bfa
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/39049
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: David Turner <digit@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Device/QuadRasterizer.cpp b/src/Device/QuadRasterizer.cpp
index a3494d8..0f23599 100644
--- a/src/Device/QuadRasterizer.cpp
+++ b/src/Device/QuadRasterizer.cpp
@@ -179,8 +179,8 @@
 					xLeft[q] = *Pointer<Short4>(primitive + q * sizeof(Primitive) + OFFSET(Primitive,outline) + y * sizeof(Primitive::Span));
 					xRight[q] = xLeft[q];
 
-					xLeft[q] = Swizzle(xLeft[q], 0xA0) - Short4(1, 2, 1, 2);
-					xRight[q] = Swizzle(xRight[q], 0xF5) - Short4(0, 1, 0, 1);
+					xLeft[q] = Swizzle(xLeft[q], 0x0022) - Short4(1, 2, 1, 2);
+					xRight[q] = Swizzle(xRight[q], 0x1133) - Short4(0, 1, 0, 1);
 				}
 
 				For(Int x = x0, x < x1, x += 2)
diff --git a/src/Main/FrameBuffer.cpp b/src/Main/FrameBuffer.cpp
index 5e4f6c3..2dc5cd6 100644
--- a/src/Main/FrameBuffer.cpp
+++ b/src/Main/FrameBuffer.cpp
@@ -217,8 +217,8 @@
 						case FORMAT_A16B16G16R16:
 							For(, x < width - 1, x += 2)
 							{
-								Short4 c0 = As<UShort4>(Swizzle(*Pointer<Short4>(s + 0), 0xC6)) >> 8;
-								Short4 c1 = As<UShort4>(Swizzle(*Pointer<Short4>(s + 8), 0xC6)) >> 8;
+								Short4 c0 = As<UShort4>(Swizzle(*Pointer<Short4>(s + 0), 0x2103)) >> 8;
+								Short4 c1 = As<UShort4>(Swizzle(*Pointer<Short4>(s + 8), 0x2103)) >> 8;
 
 								*Pointer<Int2>(d) = As<Int2>(PackUnsigned(c0, c1));
 
@@ -264,7 +264,7 @@
 								break;
 							case FORMAT_A16B16G16R16:
 								{
-									Short4 c = As<UShort4>(Swizzle(*Pointer<Short4>(s), 0xC6)) >> 8;
+									Short4 c = As<UShort4>(Swizzle(*Pointer<Short4>(s), 0x2103)) >> 8;
 
 									*Pointer<Int>(d) = Int(As<Int2>(PackUnsigned(c, c)));
 								}
@@ -545,10 +545,10 @@
 			break;
 		case FORMAT_X8B8G8R8:
 		case FORMAT_A8B8G8R8:
-			c2 = Swizzle(Unpack(*Pointer<Byte4>(s)), 0xC6);
+			c2 = Swizzle(Unpack(*Pointer<Byte4>(s)), 0x2103);
 			break;
 		case FORMAT_A16B16G16R16:
-			c2 = Swizzle(*Pointer<Short4>(s), 0xC6);
+			c2 = Swizzle(*Pointer<Short4>(s), 0x2103);
 			break;
 		case FORMAT_R5G6B5:
 			{
@@ -568,7 +568,7 @@
 		c1 = As<Short4>(As<UShort4>(c1) >> 9);
 		c2 = As<Short4>(As<UShort4>(c2) >> 9);
 
-		Short4 alpha = Swizzle(c1, 0xFF) & Short4(0xFFFFu, 0xFFFFu, 0xFFFFu, 0x0000);
+		Short4 alpha = Swizzle(c1, 0x3333) & Short4(0xFFFFu, 0xFFFFu, 0xFFFFu, 0x0000);
 
 		c1 = (c1 - c2) * alpha;
 		c1 = c1 >> 7;
@@ -586,7 +586,7 @@
 		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
 			{
-				c1 = Swizzle(c1, 0xC6);
+				c1 = Swizzle(c1, 0x2103);
 
 				*Pointer<Byte4>(d) = Byte4(PackUnsigned(c1, c1));
 			}
diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp
index 999afe8..6fe6e74 100644
--- a/src/Pipeline/PixelRoutine.cpp
+++ b/src/Pipeline/PixelRoutine.cpp
@@ -1852,8 +1852,8 @@
 			buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
 			pixel.y = *Pointer<Float4>(buffer + 8 * x, 16);
 			pixel.z = pixel.x;
-			pixel.x = ShuffleLowHigh(pixel.x, pixel.y, 0x88);
-			pixel.z = ShuffleLowHigh(pixel.z, pixel.y, 0xDD);
+			pixel.x = ShuffleLowHigh(pixel.x, pixel.y, 0x0202);
+			pixel.z = ShuffleLowHigh(pixel.z, pixel.y, 0x1313);
 			pixel.y = pixel.z;
 			pixel.z = pixel.w = one;
 			break;
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index 0360138..05d4b42 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -2604,7 +2604,7 @@
 #else
 		auto result = V(lowerPack(V(x.value), V(y.value), true));
 #endif
-		return As<SByte8>(Swizzle(As<Int4>(result), 0x88));
+		return As<SByte8>(Swizzle(As<Int4>(result), 0x0202));
 	}
 
 	RValue<Byte8> PackUnsigned(RValue<Short4> x, RValue<Short4> y)
@@ -2615,7 +2615,7 @@
 #else
 		auto result = V(lowerPack(V(x.value), V(y.value), false));
 #endif
-		return As<Byte8>(Swizzle(As<Int4>(result), 0x88));
+		return As<Byte8>(Swizzle(As<Int4>(result), 0x0202));
 	}
 
 	RValue<Short4> CmpGT(RValue<Short4> x, RValue<Short4> y)
diff --git a/src/Reactor/Reactor.cpp b/src/Reactor/Reactor.cpp
index 6f6a8de..a90f967 100644
--- a/src/Reactor/Reactor.cpp
+++ b/src/Reactor/Reactor.cpp
@@ -113,18 +113,17 @@
 	//
 	//    msb               lsb
 	//     v                 v
-	//    [.aaa|.bbb|.ccc|.ddd]    where '.' means an ignored bit
+	//    [.xxx|.yyy|.zzz|.www]    where '.' means an ignored bit
 	//
 	// This format makes it easy to write calls with hexadecimal select values,
-	// since each hex digit is a separate swizzle index. Note that the order
-	// of indices is reversed compared to createSwizzle4() below!
+	// since each hex digit is a separate swizzle index.
 	//
 	// For example:
 	//      createBlend4( [a,b,c,d], [e,f,g,h], 0x0123 ) -> [a,b,c,d]
 	//      createBlend4( [a,b,c,d], [e,f,g,h], 0x4567 ) -> [e,f,g,h]
 	//      createBlend4( [a,b,c,d], [e,f,g,h], 0x4012 ) -> [e,a,b,c]
 	//
-	static Value *createBlend4(Value *lhs, Value *rhs, unsigned short select)
+	static Value *createBlend4(Value *lhs, Value *rhs, uint16_t select)
 	{
 		int swizzle[4] =
 		{
@@ -137,27 +136,41 @@
 		return Nucleus::createShuffleVector(lhs, rhs, swizzle);
 	}
 
-	static Value *createSwizzle4(Value *val, unsigned char select)
+	// NOTE: Only 8 bits out of 16 of the |select| value are used.
+	// More specifically, the value should look like:
+	//
+	//    msb               lsb
+	//     v                 v
+	//    [..xx|..yy|..zz|..ww]    where '.' means an ignored bit
+	//
+	// This format makes it easy to write calls with hexadecimal select values,
+	// since each hex digit is a separate swizzle index.
+	//
+	// For example:
+	//      createSwizzle4( [a,b,c,d], 0x0123 ) -> [a,b,c,d]
+	//      createSwizzle4( [a,b,c,d], 0x0033 ) -> [a,a,d,d]
+	//
+	static Value *createSwizzle4(Value *val, uint16_t select)
 	{
 		int swizzle[4] =
 		{
-			(select >> 0) & 0x03,
-			(select >> 2) & 0x03,
-			(select >> 4) & 0x03,
-			(select >> 6) & 0x03,
+			(select >> 12) & 0x03,
+			(select >> 8)  & 0x03,
+			(select >> 4)  & 0x03,
+			(select >> 0)  & 0x03,
 		};
 
 		return Nucleus::createShuffleVector(val, val, swizzle);
 	}
 
-	static Value *createMask4(Value *lhs, Value *rhs, unsigned char select)
+	static Value *createMask4(Value *lhs, Value *rhs, uint16_t select)
 	{
 		bool mask[4] = {false, false, false, false};
 
-		mask[(select >> 0) & 0x03] = true;
-		mask[(select >> 2) & 0x03] = true;
-		mask[(select >> 4) & 0x03] = true;
-		mask[(select >> 6) & 0x03] = true;
+		mask[(select >> 12) & 0x03] = true;
+		mask[(select >> 8)  & 0x03] = true;
+		mask[(select >> 4)  & 0x03] = true;
+		mask[(select >> 0)  & 0x03] = true;
 
 		int swizzle[4] =
 		{
@@ -1428,7 +1441,7 @@
 	{
 		int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23};   // Real type is v16i8
 		auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
-		return As<Short4>(Swizzle(As<Int4>(lowHigh), 0xEE));
+		return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
 	}
 
 	SByte8::SByte8(uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4, uint8_t x5, uint8_t x6, uint8_t x7)
@@ -1604,7 +1617,7 @@
 	{
 		int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23};   // Real type is v16i8
 		auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
-		return As<Short4>(Swizzle(As<Int4>(lowHigh), 0xEE));
+		return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
 	}
 
 	Byte16::Byte16(RValue<Byte16> rhs)
@@ -1662,7 +1675,7 @@
 		Value *vector = loadValue();
 		Value *element = Nucleus::createTrunc(cast.value, Short::getType());
 		Value *insert = Nucleus::createInsertElement(vector, element, 0);
-		Value *swizzle = Swizzle(RValue<Short4>(insert), 0x00).value;
+		Value *swizzle = Swizzle(RValue<Short4>(insert), 0x0000).value;
 
 		storeValue(swizzle);
 	}
@@ -1882,22 +1895,22 @@
 	{
 		int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11};   // Real type is v8i16
 		auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
-		return As<Int2>(Swizzle(As<Int4>(lowHigh), 0xEE));
+		return As<Int2>(Swizzle(As<Int4>(lowHigh), 0x2323));
 	}
 
-	RValue<Short4> Swizzle(RValue<Short4> x, unsigned char select)
+	RValue<Short4> Swizzle(RValue<Short4> x, uint16_t select)
 	{
 		// Real type is v8i16
 		int shuffle[8] =
 		{
-			(select >> 0) & 0x03,
-			(select >> 2) & 0x03,
-			(select >> 4) & 0x03,
-			(select >> 6) & 0x03,
-			(select >> 0) & 0x03,
-			(select >> 2) & 0x03,
-			(select >> 4) & 0x03,
-			(select >> 6) & 0x03,
+			(select >> 12) & 0x03,
+			(select >>  8) & 0x03,
+			(select >>  4) & 0x03,
+			(select >>  0) & 0x03,
+			(select >> 12) & 0x03,
+			(select >>  8) & 0x03,
+			(select >>  4) & 0x03,
+			(select >>  0) & 0x03,
 		};
 
 		return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
@@ -3094,7 +3107,7 @@
 	{
 		int shuffle[4] = {0, 4, 1, 5};   // Real type is v4i32
 		auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
-		return As<Short4>(Swizzle(lowHigh, 0xEE));
+		return As<Short4>(Swizzle(lowHigh, 0x2323));
 	}
 
 	RValue<Int> Extract(RValue<Int2> val, int i)
@@ -3505,7 +3518,7 @@
 		return RValue<Int4>(Nucleus::createInsertElement(x.value, element.value, i));
 	}
 
-	RValue<Int4> Swizzle(RValue<Int4> x, unsigned char select)
+	RValue<Int4> Swizzle(RValue<Int4> x, uint16_t select)
 	{
 		return RValue<Int4>(createSwizzle4(x.value, select));
 	}
@@ -3745,7 +3758,7 @@
 		return RValue<UInt4>(Nucleus::createInsertElement(x.value, element.value, i));
 	}
 
-	RValue<UInt4> Swizzle(RValue<UInt4> x, unsigned char select)
+	RValue<UInt4> Swizzle(RValue<UInt4> x, uint16_t select)
 	{
 		return RValue<UInt4>(createSwizzle4(x.value, select));
 	}
@@ -4245,24 +4258,24 @@
 		return RValue<Float>(Nucleus::createExtractElement(x.value, Float::getType(), i));
 	}
 
-	RValue<Float4> Swizzle(RValue<Float4> x, unsigned char select)
+	RValue<Float4> Swizzle(RValue<Float4> x, uint16_t select)
 	{
 		return RValue<Float4>(createSwizzle4(x.value, select));
 	}
 
-	RValue<Float4> Blend(RValue<Float4> x, RValue<Float4> y, unsigned short select)
+	RValue<Float4> Blend(RValue<Float4> x, RValue<Float4> y, uint16_t select)
 	{
 		return RValue<Float4>(createBlend4(x.value, y.value, select));
 	}
 
-	RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, unsigned char imm)
+	RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, uint16_t imm)
 	{
 		int shuffle[4] =
 		{
-			((imm >> 0) & 0x03) + 0,
-			((imm >> 2) & 0x03) + 0,
-			((imm >> 4) & 0x03) + 4,
-			((imm >> 6) & 0x03) + 4,
+			((imm >> 12) & 0x03) + 0,
+			((imm >>  8) & 0x03) + 0,
+			((imm >>  4) & 0x03) + 4,
+			((imm >>  0) & 0x03) + 4,
 		};
 
 		return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
@@ -4280,7 +4293,7 @@
 		return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
 	}
 
-	RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, unsigned char select)
+	RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, uint16_t select)
 	{
 		Value *vector = lhs.loadValue();
 		Value *result = createMask4(vector, rhs.value, select);
diff --git a/src/Reactor/Reactor.hpp b/src/Reactor/Reactor.hpp
index 5fdc73a..8dc3a2f 100644
--- a/src/Reactor/Reactor.hpp
+++ b/src/Reactor/Reactor.hpp
@@ -883,7 +883,7 @@
 	RValue<Byte8> PackUnsigned(RValue<Short4> x, RValue<Short4> y);
 	RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y);
 	RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y);
-	RValue<Short4> Swizzle(RValue<Short4> x, unsigned char select);
+	RValue<Short4> Swizzle(RValue<Short4> x, uint16_t select);
 	RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i);
 	RValue<Short> Extract(RValue<Short4> val, int i);
 	RValue<Short4> CmpGT(RValue<Short4> x, RValue<Short4> y);
@@ -1505,346 +1505,346 @@
 	public:
 		union
 		{
-			SwizzleMask1<Vector4, 0x00> x;
-			SwizzleMask1<Vector4, 0x55> y;
-			SwizzleMask1<Vector4, 0xAA> z;
-			SwizzleMask1<Vector4, 0xFF> w;
-			Swizzle2<Vector4, 0x00>     xx;
-			Swizzle2<Vector4, 0x01>     yx;
-			Swizzle2<Vector4, 0x02>     zx;
-			Swizzle2<Vector4, 0x03>     wx;
-			SwizzleMask2<Vector4, 0x54> xy;
-			Swizzle2<Vector4, 0x55>     yy;
-			Swizzle2<Vector4, 0x56>     zy;
-			Swizzle2<Vector4, 0x57>     wy;
-			SwizzleMask2<Vector4, 0xA8> xz;
-			SwizzleMask2<Vector4, 0xA9> yz;
-			Swizzle2<Vector4, 0xAA>     zz;
-			Swizzle2<Vector4, 0xAB>     wz;
-			SwizzleMask2<Vector4, 0xFC> xw;
-			SwizzleMask2<Vector4, 0xFD> yw;
-			SwizzleMask2<Vector4, 0xFE> zw;
-			Swizzle2<Vector4, 0xFF>     ww;
-			Swizzle4<Vector4, 0x00>     xxx;
-			Swizzle4<Vector4, 0x01>     yxx;
-			Swizzle4<Vector4, 0x02>     zxx;
-			Swizzle4<Vector4, 0x03>     wxx;
-			Swizzle4<Vector4, 0x04>     xyx;
-			Swizzle4<Vector4, 0x05>     yyx;
-			Swizzle4<Vector4, 0x06>     zyx;
-			Swizzle4<Vector4, 0x07>     wyx;
-			Swizzle4<Vector4, 0x08>     xzx;
-			Swizzle4<Vector4, 0x09>     yzx;
-			Swizzle4<Vector4, 0x0A>     zzx;
-			Swizzle4<Vector4, 0x0B>     wzx;
-			Swizzle4<Vector4, 0x0C>     xwx;
-			Swizzle4<Vector4, 0x0D>     ywx;
-			Swizzle4<Vector4, 0x0E>     zwx;
-			Swizzle4<Vector4, 0x0F>     wwx;
-			Swizzle4<Vector4, 0x50>     xxy;
-			Swizzle4<Vector4, 0x51>     yxy;
-			Swizzle4<Vector4, 0x52>     zxy;
-			Swizzle4<Vector4, 0x53>     wxy;
-			Swizzle4<Vector4, 0x54>     xyy;
-			Swizzle4<Vector4, 0x55>     yyy;
-			Swizzle4<Vector4, 0x56>     zyy;
-			Swizzle4<Vector4, 0x57>     wyy;
-			Swizzle4<Vector4, 0x58>     xzy;
-			Swizzle4<Vector4, 0x59>     yzy;
-			Swizzle4<Vector4, 0x5A>     zzy;
-			Swizzle4<Vector4, 0x5B>     wzy;
-			Swizzle4<Vector4, 0x5C>     xwy;
-			Swizzle4<Vector4, 0x5D>     ywy;
-			Swizzle4<Vector4, 0x5E>     zwy;
-			Swizzle4<Vector4, 0x5F>     wwy;
-			Swizzle4<Vector4, 0xA0>     xxz;
-			Swizzle4<Vector4, 0xA1>     yxz;
-			Swizzle4<Vector4, 0xA2>     zxz;
-			Swizzle4<Vector4, 0xA3>     wxz;
-			SwizzleMask4<Vector4, 0xA4> xyz;
-			Swizzle4<Vector4, 0xA5>     yyz;
-			Swizzle4<Vector4, 0xA6>     zyz;
-			Swizzle4<Vector4, 0xA7>     wyz;
-			Swizzle4<Vector4, 0xA8>     xzz;
-			Swizzle4<Vector4, 0xA9>     yzz;
-			Swizzle4<Vector4, 0xAA>     zzz;
-			Swizzle4<Vector4, 0xAB>     wzz;
-			Swizzle4<Vector4, 0xAC>     xwz;
-			Swizzle4<Vector4, 0xAD>     ywz;
-			Swizzle4<Vector4, 0xAE>     zwz;
-			Swizzle4<Vector4, 0xAF>     wwz;
-			Swizzle4<Vector4, 0xF0>     xxw;
-			Swizzle4<Vector4, 0xF1>     yxw;
-			Swizzle4<Vector4, 0xF2>     zxw;
-			Swizzle4<Vector4, 0xF3>     wxw;
-			SwizzleMask4<Vector4, 0xF4> xyw;
-			Swizzle4<Vector4, 0xF5>     yyw;
-			Swizzle4<Vector4, 0xF6>     zyw;
-			Swizzle4<Vector4, 0xF7>     wyw;
-			SwizzleMask4<Vector4, 0xF8> xzw;
-			SwizzleMask4<Vector4, 0xF9> yzw;
-			Swizzle4<Vector4, 0xFA>     zzw;
-			Swizzle4<Vector4, 0xFB>     wzw;
-			Swizzle4<Vector4, 0xFC>     xww;
-			Swizzle4<Vector4, 0xFD>     yww;
-			Swizzle4<Vector4, 0xFE>     zww;
-			Swizzle4<Vector4, 0xFF>     www;
-			Swizzle4<Vector4, 0x00>     xxxx;
-			Swizzle4<Vector4, 0x01>     yxxx;
-			Swizzle4<Vector4, 0x02>     zxxx;
-			Swizzle4<Vector4, 0x03>     wxxx;
-			Swizzle4<Vector4, 0x04>     xyxx;
-			Swizzle4<Vector4, 0x05>     yyxx;
-			Swizzle4<Vector4, 0x06>     zyxx;
-			Swizzle4<Vector4, 0x07>     wyxx;
-			Swizzle4<Vector4, 0x08>     xzxx;
-			Swizzle4<Vector4, 0x09>     yzxx;
-			Swizzle4<Vector4, 0x0A>     zzxx;
-			Swizzle4<Vector4, 0x0B>     wzxx;
-			Swizzle4<Vector4, 0x0C>     xwxx;
-			Swizzle4<Vector4, 0x0D>     ywxx;
-			Swizzle4<Vector4, 0x0E>     zwxx;
-			Swizzle4<Vector4, 0x0F>     wwxx;
-			Swizzle4<Vector4, 0x10>     xxyx;
-			Swizzle4<Vector4, 0x11>     yxyx;
-			Swizzle4<Vector4, 0x12>     zxyx;
-			Swizzle4<Vector4, 0x13>     wxyx;
-			Swizzle4<Vector4, 0x14>     xyyx;
-			Swizzle4<Vector4, 0x15>     yyyx;
-			Swizzle4<Vector4, 0x16>     zyyx;
-			Swizzle4<Vector4, 0x17>     wyyx;
-			Swizzle4<Vector4, 0x18>     xzyx;
-			Swizzle4<Vector4, 0x19>     yzyx;
-			Swizzle4<Vector4, 0x1A>     zzyx;
-			Swizzle4<Vector4, 0x1B>     wzyx;
-			Swizzle4<Vector4, 0x1C>     xwyx;
-			Swizzle4<Vector4, 0x1D>     ywyx;
-			Swizzle4<Vector4, 0x1E>     zwyx;
-			Swizzle4<Vector4, 0x1F>     wwyx;
-			Swizzle4<Vector4, 0x20>     xxzx;
-			Swizzle4<Vector4, 0x21>     yxzx;
-			Swizzle4<Vector4, 0x22>     zxzx;
-			Swizzle4<Vector4, 0x23>     wxzx;
-			Swizzle4<Vector4, 0x24>     xyzx;
-			Swizzle4<Vector4, 0x25>     yyzx;
-			Swizzle4<Vector4, 0x26>     zyzx;
-			Swizzle4<Vector4, 0x27>     wyzx;
-			Swizzle4<Vector4, 0x28>     xzzx;
-			Swizzle4<Vector4, 0x29>     yzzx;
-			Swizzle4<Vector4, 0x2A>     zzzx;
-			Swizzle4<Vector4, 0x2B>     wzzx;
-			Swizzle4<Vector4, 0x2C>     xwzx;
-			Swizzle4<Vector4, 0x2D>     ywzx;
-			Swizzle4<Vector4, 0x2E>     zwzx;
-			Swizzle4<Vector4, 0x2F>     wwzx;
-			Swizzle4<Vector4, 0x30>     xxwx;
-			Swizzle4<Vector4, 0x31>     yxwx;
-			Swizzle4<Vector4, 0x32>     zxwx;
-			Swizzle4<Vector4, 0x33>     wxwx;
-			Swizzle4<Vector4, 0x34>     xywx;
-			Swizzle4<Vector4, 0x35>     yywx;
-			Swizzle4<Vector4, 0x36>     zywx;
-			Swizzle4<Vector4, 0x37>     wywx;
-			Swizzle4<Vector4, 0x38>     xzwx;
-			Swizzle4<Vector4, 0x39>     yzwx;
-			Swizzle4<Vector4, 0x3A>     zzwx;
-			Swizzle4<Vector4, 0x3B>     wzwx;
-			Swizzle4<Vector4, 0x3C>     xwwx;
-			Swizzle4<Vector4, 0x3D>     ywwx;
-			Swizzle4<Vector4, 0x3E>     zwwx;
-			Swizzle4<Vector4, 0x3F>     wwwx;
-			Swizzle4<Vector4, 0x40>     xxxy;
-			Swizzle4<Vector4, 0x41>     yxxy;
-			Swizzle4<Vector4, 0x42>     zxxy;
-			Swizzle4<Vector4, 0x43>     wxxy;
-			Swizzle4<Vector4, 0x44>     xyxy;
-			Swizzle4<Vector4, 0x45>     yyxy;
-			Swizzle4<Vector4, 0x46>     zyxy;
-			Swizzle4<Vector4, 0x47>     wyxy;
-			Swizzle4<Vector4, 0x48>     xzxy;
-			Swizzle4<Vector4, 0x49>     yzxy;
-			Swizzle4<Vector4, 0x4A>     zzxy;
-			Swizzle4<Vector4, 0x4B>     wzxy;
-			Swizzle4<Vector4, 0x4C>     xwxy;
-			Swizzle4<Vector4, 0x4D>     ywxy;
-			Swizzle4<Vector4, 0x4E>     zwxy;
-			Swizzle4<Vector4, 0x4F>     wwxy;
-			Swizzle4<Vector4, 0x50>     xxyy;
-			Swizzle4<Vector4, 0x51>     yxyy;
-			Swizzle4<Vector4, 0x52>     zxyy;
-			Swizzle4<Vector4, 0x53>     wxyy;
-			Swizzle4<Vector4, 0x54>     xyyy;
-			Swizzle4<Vector4, 0x55>     yyyy;
-			Swizzle4<Vector4, 0x56>     zyyy;
-			Swizzle4<Vector4, 0x57>     wyyy;
-			Swizzle4<Vector4, 0x58>     xzyy;
-			Swizzle4<Vector4, 0x59>     yzyy;
-			Swizzle4<Vector4, 0x5A>     zzyy;
-			Swizzle4<Vector4, 0x5B>     wzyy;
-			Swizzle4<Vector4, 0x5C>     xwyy;
-			Swizzle4<Vector4, 0x5D>     ywyy;
-			Swizzle4<Vector4, 0x5E>     zwyy;
-			Swizzle4<Vector4, 0x5F>     wwyy;
-			Swizzle4<Vector4, 0x60>     xxzy;
-			Swizzle4<Vector4, 0x61>     yxzy;
-			Swizzle4<Vector4, 0x62>     zxzy;
-			Swizzle4<Vector4, 0x63>     wxzy;
-			Swizzle4<Vector4, 0x64>     xyzy;
-			Swizzle4<Vector4, 0x65>     yyzy;
-			Swizzle4<Vector4, 0x66>     zyzy;
-			Swizzle4<Vector4, 0x67>     wyzy;
-			Swizzle4<Vector4, 0x68>     xzzy;
-			Swizzle4<Vector4, 0x69>     yzzy;
-			Swizzle4<Vector4, 0x6A>     zzzy;
-			Swizzle4<Vector4, 0x6B>     wzzy;
-			Swizzle4<Vector4, 0x6C>     xwzy;
-			Swizzle4<Vector4, 0x6D>     ywzy;
-			Swizzle4<Vector4, 0x6E>     zwzy;
-			Swizzle4<Vector4, 0x6F>     wwzy;
-			Swizzle4<Vector4, 0x70>     xxwy;
-			Swizzle4<Vector4, 0x71>     yxwy;
-			Swizzle4<Vector4, 0x72>     zxwy;
-			Swizzle4<Vector4, 0x73>     wxwy;
-			Swizzle4<Vector4, 0x74>     xywy;
-			Swizzle4<Vector4, 0x75>     yywy;
-			Swizzle4<Vector4, 0x76>     zywy;
-			Swizzle4<Vector4, 0x77>     wywy;
-			Swizzle4<Vector4, 0x78>     xzwy;
-			Swizzle4<Vector4, 0x79>     yzwy;
-			Swizzle4<Vector4, 0x7A>     zzwy;
-			Swizzle4<Vector4, 0x7B>     wzwy;
-			Swizzle4<Vector4, 0x7C>     xwwy;
-			Swizzle4<Vector4, 0x7D>     ywwy;
-			Swizzle4<Vector4, 0x7E>     zwwy;
-			Swizzle4<Vector4, 0x7F>     wwwy;
-			Swizzle4<Vector4, 0x80>     xxxz;
-			Swizzle4<Vector4, 0x81>     yxxz;
-			Swizzle4<Vector4, 0x82>     zxxz;
-			Swizzle4<Vector4, 0x83>     wxxz;
-			Swizzle4<Vector4, 0x84>     xyxz;
-			Swizzle4<Vector4, 0x85>     yyxz;
-			Swizzle4<Vector4, 0x86>     zyxz;
-			Swizzle4<Vector4, 0x87>     wyxz;
-			Swizzle4<Vector4, 0x88>     xzxz;
-			Swizzle4<Vector4, 0x89>     yzxz;
-			Swizzle4<Vector4, 0x8A>     zzxz;
-			Swizzle4<Vector4, 0x8B>     wzxz;
-			Swizzle4<Vector4, 0x8C>     xwxz;
-			Swizzle4<Vector4, 0x8D>     ywxz;
-			Swizzle4<Vector4, 0x8E>     zwxz;
-			Swizzle4<Vector4, 0x8F>     wwxz;
-			Swizzle4<Vector4, 0x90>     xxyz;
-			Swizzle4<Vector4, 0x91>     yxyz;
-			Swizzle4<Vector4, 0x92>     zxyz;
-			Swizzle4<Vector4, 0x93>     wxyz;
-			Swizzle4<Vector4, 0x94>     xyyz;
-			Swizzle4<Vector4, 0x95>     yyyz;
-			Swizzle4<Vector4, 0x96>     zyyz;
-			Swizzle4<Vector4, 0x97>     wyyz;
-			Swizzle4<Vector4, 0x98>     xzyz;
-			Swizzle4<Vector4, 0x99>     yzyz;
-			Swizzle4<Vector4, 0x9A>     zzyz;
-			Swizzle4<Vector4, 0x9B>     wzyz;
-			Swizzle4<Vector4, 0x9C>     xwyz;
-			Swizzle4<Vector4, 0x9D>     ywyz;
-			Swizzle4<Vector4, 0x9E>     zwyz;
-			Swizzle4<Vector4, 0x9F>     wwyz;
-			Swizzle4<Vector4, 0xA0>     xxzz;
-			Swizzle4<Vector4, 0xA1>     yxzz;
-			Swizzle4<Vector4, 0xA2>     zxzz;
-			Swizzle4<Vector4, 0xA3>     wxzz;
-			Swizzle4<Vector4, 0xA4>     xyzz;
-			Swizzle4<Vector4, 0xA5>     yyzz;
-			Swizzle4<Vector4, 0xA6>     zyzz;
-			Swizzle4<Vector4, 0xA7>     wyzz;
-			Swizzle4<Vector4, 0xA8>     xzzz;
-			Swizzle4<Vector4, 0xA9>     yzzz;
-			Swizzle4<Vector4, 0xAA>     zzzz;
-			Swizzle4<Vector4, 0xAB>     wzzz;
-			Swizzle4<Vector4, 0xAC>     xwzz;
-			Swizzle4<Vector4, 0xAD>     ywzz;
-			Swizzle4<Vector4, 0xAE>     zwzz;
-			Swizzle4<Vector4, 0xAF>     wwzz;
-			Swizzle4<Vector4, 0xB0>     xxwz;
-			Swizzle4<Vector4, 0xB1>     yxwz;
-			Swizzle4<Vector4, 0xB2>     zxwz;
-			Swizzle4<Vector4, 0xB3>     wxwz;
-			Swizzle4<Vector4, 0xB4>     xywz;
-			Swizzle4<Vector4, 0xB5>     yywz;
-			Swizzle4<Vector4, 0xB6>     zywz;
-			Swizzle4<Vector4, 0xB7>     wywz;
-			Swizzle4<Vector4, 0xB8>     xzwz;
-			Swizzle4<Vector4, 0xB9>     yzwz;
-			Swizzle4<Vector4, 0xBA>     zzwz;
-			Swizzle4<Vector4, 0xBB>     wzwz;
-			Swizzle4<Vector4, 0xBC>     xwwz;
-			Swizzle4<Vector4, 0xBD>     ywwz;
-			Swizzle4<Vector4, 0xBE>     zwwz;
-			Swizzle4<Vector4, 0xBF>     wwwz;
-			Swizzle4<Vector4, 0xC0>     xxxw;
-			Swizzle4<Vector4, 0xC1>     yxxw;
-			Swizzle4<Vector4, 0xC2>     zxxw;
-			Swizzle4<Vector4, 0xC3>     wxxw;
-			Swizzle4<Vector4, 0xC4>     xyxw;
-			Swizzle4<Vector4, 0xC5>     yyxw;
-			Swizzle4<Vector4, 0xC6>     zyxw;
-			Swizzle4<Vector4, 0xC7>     wyxw;
-			Swizzle4<Vector4, 0xC8>     xzxw;
-			Swizzle4<Vector4, 0xC9>     yzxw;
-			Swizzle4<Vector4, 0xCA>     zzxw;
-			Swizzle4<Vector4, 0xCB>     wzxw;
-			Swizzle4<Vector4, 0xCC>     xwxw;
-			Swizzle4<Vector4, 0xCD>     ywxw;
-			Swizzle4<Vector4, 0xCE>     zwxw;
-			Swizzle4<Vector4, 0xCF>     wwxw;
-			Swizzle4<Vector4, 0xD0>     xxyw;
-			Swizzle4<Vector4, 0xD1>     yxyw;
-			Swizzle4<Vector4, 0xD2>     zxyw;
-			Swizzle4<Vector4, 0xD3>     wxyw;
-			Swizzle4<Vector4, 0xD4>     xyyw;
-			Swizzle4<Vector4, 0xD5>     yyyw;
-			Swizzle4<Vector4, 0xD6>     zyyw;
-			Swizzle4<Vector4, 0xD7>     wyyw;
-			Swizzle4<Vector4, 0xD8>     xzyw;
-			Swizzle4<Vector4, 0xD9>     yzyw;
-			Swizzle4<Vector4, 0xDA>     zzyw;
-			Swizzle4<Vector4, 0xDB>     wzyw;
-			Swizzle4<Vector4, 0xDC>     xwyw;
-			Swizzle4<Vector4, 0xDD>     ywyw;
-			Swizzle4<Vector4, 0xDE>     zwyw;
-			Swizzle4<Vector4, 0xDF>     wwyw;
-			Swizzle4<Vector4, 0xE0>     xxzw;
-			Swizzle4<Vector4, 0xE1>     yxzw;
-			Swizzle4<Vector4, 0xE2>     zxzw;
-			Swizzle4<Vector4, 0xE3>     wxzw;
-			SwizzleMask4<Vector4, 0xE4> xyzw;
-			Swizzle4<Vector4, 0xE5>     yyzw;
-			Swizzle4<Vector4, 0xE6>     zyzw;
-			Swizzle4<Vector4, 0xE7>     wyzw;
-			Swizzle4<Vector4, 0xE8>     xzzw;
-			Swizzle4<Vector4, 0xE9>     yzzw;
-			Swizzle4<Vector4, 0xEA>     zzzw;
-			Swizzle4<Vector4, 0xEB>     wzzw;
-			Swizzle4<Vector4, 0xEC>     xwzw;
-			Swizzle4<Vector4, 0xED>     ywzw;
-			Swizzle4<Vector4, 0xEE>     zwzw;
-			Swizzle4<Vector4, 0xEF>     wwzw;
-			Swizzle4<Vector4, 0xF0>     xxww;
-			Swizzle4<Vector4, 0xF1>     yxww;
-			Swizzle4<Vector4, 0xF2>     zxww;
-			Swizzle4<Vector4, 0xF3>     wxww;
-			Swizzle4<Vector4, 0xF4>     xyww;
-			Swizzle4<Vector4, 0xF5>     yyww;
-			Swizzle4<Vector4, 0xF6>     zyww;
-			Swizzle4<Vector4, 0xF7>     wyww;
-			Swizzle4<Vector4, 0xF8>     xzww;
-			Swizzle4<Vector4, 0xF9>     yzww;
-			Swizzle4<Vector4, 0xFA>     zzww;
-			Swizzle4<Vector4, 0xFB>     wzww;
-			Swizzle4<Vector4, 0xFC>     xwww;
-			Swizzle4<Vector4, 0xFD>     ywww;
-			Swizzle4<Vector4, 0xFE>     zwww;
-			Swizzle4<Vector4, 0xFF>     wwww;
+			SwizzleMask1<Vector4, 0x0000> x;
+			SwizzleMask1<Vector4, 0x1111> y;
+			SwizzleMask1<Vector4, 0x2222> z;
+			SwizzleMask1<Vector4, 0x3333> w;
+			Swizzle2<Vector4, 0x0000>     xx;
+			Swizzle2<Vector4, 0x1000>     yx;
+			Swizzle2<Vector4, 0x2000>     zx;
+			Swizzle2<Vector4, 0x3000>     wx;
+			SwizzleMask2<Vector4, 0x0111> xy;
+			Swizzle2<Vector4, 0x1111>     yy;
+			Swizzle2<Vector4, 0x2111>     zy;
+			Swizzle2<Vector4, 0x3111>     wy;
+			SwizzleMask2<Vector4, 0x0222> xz;
+			SwizzleMask2<Vector4, 0x1222> yz;
+			Swizzle2<Vector4, 0x2222>     zz;
+			Swizzle2<Vector4, 0x3222>     wz;
+			SwizzleMask2<Vector4, 0x0333> xw;
+			SwizzleMask2<Vector4, 0x1333> yw;
+			SwizzleMask2<Vector4, 0x2333> zw;
+			Swizzle2<Vector4, 0x3333>     ww;
+			Swizzle4<Vector4, 0x0000>     xxx;
+			Swizzle4<Vector4, 0x1000>     yxx;
+			Swizzle4<Vector4, 0x2000>     zxx;
+			Swizzle4<Vector4, 0x3000>     wxx;
+			Swizzle4<Vector4, 0x0100>     xyx;
+			Swizzle4<Vector4, 0x1100>     yyx;
+			Swizzle4<Vector4, 0x2100>     zyx;
+			Swizzle4<Vector4, 0x3100>     wyx;
+			Swizzle4<Vector4, 0x0200>     xzx;
+			Swizzle4<Vector4, 0x1200>     yzx;
+			Swizzle4<Vector4, 0x2200>     zzx;
+			Swizzle4<Vector4, 0x3200>     wzx;
+			Swizzle4<Vector4, 0x0300>     xwx;
+			Swizzle4<Vector4, 0x1300>     ywx;
+			Swizzle4<Vector4, 0x2300>     zwx;
+			Swizzle4<Vector4, 0x3300>     wwx;
+			Swizzle4<Vector4, 0x0011>     xxy;
+			Swizzle4<Vector4, 0x1011>     yxy;
+			Swizzle4<Vector4, 0x2011>     zxy;
+			Swizzle4<Vector4, 0x3011>     wxy;
+			Swizzle4<Vector4, 0x0111>     xyy;
+			Swizzle4<Vector4, 0x1111>     yyy;
+			Swizzle4<Vector4, 0x2111>     zyy;
+			Swizzle4<Vector4, 0x3111>     wyy;
+			Swizzle4<Vector4, 0x0211>     xzy;
+			Swizzle4<Vector4, 0x1211>     yzy;
+			Swizzle4<Vector4, 0x2211>     zzy;
+			Swizzle4<Vector4, 0x3211>     wzy;
+			Swizzle4<Vector4, 0x0311>     xwy;
+			Swizzle4<Vector4, 0x1311>     ywy;
+			Swizzle4<Vector4, 0x2311>     zwy;
+			Swizzle4<Vector4, 0x3311>     wwy;
+			Swizzle4<Vector4, 0x0022>     xxz;
+			Swizzle4<Vector4, 0x1022>     yxz;
+			Swizzle4<Vector4, 0x2022>     zxz;
+			Swizzle4<Vector4, 0x3022>     wxz;
+			SwizzleMask4<Vector4, 0x0122> xyz;
+			Swizzle4<Vector4, 0x1122>     yyz;
+			Swizzle4<Vector4, 0x2122>     zyz;
+			Swizzle4<Vector4, 0x3122>     wyz;
+			Swizzle4<Vector4, 0x0222>     xzz;
+			Swizzle4<Vector4, 0x1222>     yzz;
+			Swizzle4<Vector4, 0x2222>     zzz;
+			Swizzle4<Vector4, 0x3222>     wzz;
+			Swizzle4<Vector4, 0x0322>     xwz;
+			Swizzle4<Vector4, 0x1322>     ywz;
+			Swizzle4<Vector4, 0x2322>     zwz;
+			Swizzle4<Vector4, 0x3322>     wwz;
+			Swizzle4<Vector4, 0x0033>     xxw;
+			Swizzle4<Vector4, 0x1033>     yxw;
+			Swizzle4<Vector4, 0x2033>     zxw;
+			Swizzle4<Vector4, 0x3033>     wxw;
+			SwizzleMask4<Vector4, 0x0133> xyw;
+			Swizzle4<Vector4, 0x1133>     yyw;
+			Swizzle4<Vector4, 0x2133>     zyw;
+			Swizzle4<Vector4, 0x3133>     wyw;
+			SwizzleMask4<Vector4, 0x0233> xzw;
+			SwizzleMask4<Vector4, 0x1233> yzw;
+			Swizzle4<Vector4, 0x2233>     zzw;
+			Swizzle4<Vector4, 0x3233>     wzw;
+			Swizzle4<Vector4, 0x0333>     xww;
+			Swizzle4<Vector4, 0x1333>     yww;
+			Swizzle4<Vector4, 0x2333>     zww;
+			Swizzle4<Vector4, 0x3333>     www;
+			Swizzle4<Vector4, 0x0000>     xxxx;
+			Swizzle4<Vector4, 0x1000>     yxxx;
+			Swizzle4<Vector4, 0x2000>     zxxx;
+			Swizzle4<Vector4, 0x3000>     wxxx;
+			Swizzle4<Vector4, 0x0100>     xyxx;
+			Swizzle4<Vector4, 0x1100>     yyxx;
+			Swizzle4<Vector4, 0x2100>     zyxx;
+			Swizzle4<Vector4, 0x3100>     wyxx;
+			Swizzle4<Vector4, 0x0200>     xzxx;
+			Swizzle4<Vector4, 0x1200>     yzxx;
+			Swizzle4<Vector4, 0x2200>     zzxx;
+			Swizzle4<Vector4, 0x3200>     wzxx;
+			Swizzle4<Vector4, 0x0300>     xwxx;
+			Swizzle4<Vector4, 0x1300>     ywxx;
+			Swizzle4<Vector4, 0x2300>     zwxx;
+			Swizzle4<Vector4, 0x3300>     wwxx;
+			Swizzle4<Vector4, 0x0010>     xxyx;
+			Swizzle4<Vector4, 0x1010>     yxyx;
+			Swizzle4<Vector4, 0x2010>     zxyx;
+			Swizzle4<Vector4, 0x3010>     wxyx;
+			Swizzle4<Vector4, 0x0110>     xyyx;
+			Swizzle4<Vector4, 0x1110>     yyyx;
+			Swizzle4<Vector4, 0x2110>     zyyx;
+			Swizzle4<Vector4, 0x3110>     wyyx;
+			Swizzle4<Vector4, 0x0210>     xzyx;
+			Swizzle4<Vector4, 0x1210>     yzyx;
+			Swizzle4<Vector4, 0x2210>     zzyx;
+			Swizzle4<Vector4, 0x3210>     wzyx;
+			Swizzle4<Vector4, 0x0310>     xwyx;
+			Swizzle4<Vector4, 0x1310>     ywyx;
+			Swizzle4<Vector4, 0x2310>     zwyx;
+			Swizzle4<Vector4, 0x3310>     wwyx;
+			Swizzle4<Vector4, 0x0020>     xxzx;
+			Swizzle4<Vector4, 0x1020>     yxzx;
+			Swizzle4<Vector4, 0x2020>     zxzx;
+			Swizzle4<Vector4, 0x3020>     wxzx;
+			Swizzle4<Vector4, 0x0120>     xyzx;
+			Swizzle4<Vector4, 0x1120>     yyzx;
+			Swizzle4<Vector4, 0x2120>     zyzx;
+			Swizzle4<Vector4, 0x3120>     wyzx;
+			Swizzle4<Vector4, 0x0220>     xzzx;
+			Swizzle4<Vector4, 0x1220>     yzzx;
+			Swizzle4<Vector4, 0x2220>     zzzx;
+			Swizzle4<Vector4, 0x3220>     wzzx;
+			Swizzle4<Vector4, 0x0320>     xwzx;
+			Swizzle4<Vector4, 0x1320>     ywzx;
+			Swizzle4<Vector4, 0x2320>     zwzx;
+			Swizzle4<Vector4, 0x3320>     wwzx;
+			Swizzle4<Vector4, 0x0030>     xxwx;
+			Swizzle4<Vector4, 0x1030>     yxwx;
+			Swizzle4<Vector4, 0x2030>     zxwx;
+			Swizzle4<Vector4, 0x3030>     wxwx;
+			Swizzle4<Vector4, 0x0130>     xywx;
+			Swizzle4<Vector4, 0x1130>     yywx;
+			Swizzle4<Vector4, 0x2130>     zywx;
+			Swizzle4<Vector4, 0x3130>     wywx;
+			Swizzle4<Vector4, 0x0230>     xzwx;
+			Swizzle4<Vector4, 0x1230>     yzwx;
+			Swizzle4<Vector4, 0x2230>     zzwx;
+			Swizzle4<Vector4, 0x3230>     wzwx;
+			Swizzle4<Vector4, 0x0330>     xwwx;
+			Swizzle4<Vector4, 0x1330>     ywwx;
+			Swizzle4<Vector4, 0x2330>     zwwx;
+			Swizzle4<Vector4, 0x3330>     wwwx;
+			Swizzle4<Vector4, 0x0001>     xxxy;
+			Swizzle4<Vector4, 0x1001>     yxxy;
+			Swizzle4<Vector4, 0x2001>     zxxy;
+			Swizzle4<Vector4, 0x3001>     wxxy;
+			Swizzle4<Vector4, 0x0101>     xyxy;
+			Swizzle4<Vector4, 0x1101>     yyxy;
+			Swizzle4<Vector4, 0x2101>     zyxy;
+			Swizzle4<Vector4, 0x3101>     wyxy;
+			Swizzle4<Vector4, 0x0201>     xzxy;
+			Swizzle4<Vector4, 0x1201>     yzxy;
+			Swizzle4<Vector4, 0x2201>     zzxy;
+			Swizzle4<Vector4, 0x3201>     wzxy;
+			Swizzle4<Vector4, 0x0301>     xwxy;
+			Swizzle4<Vector4, 0x1301>     ywxy;
+			Swizzle4<Vector4, 0x2301>     zwxy;
+			Swizzle4<Vector4, 0x3301>     wwxy;
+			Swizzle4<Vector4, 0x0011>     xxyy;
+			Swizzle4<Vector4, 0x1011>     yxyy;
+			Swizzle4<Vector4, 0x2011>     zxyy;
+			Swizzle4<Vector4, 0x3011>     wxyy;
+			Swizzle4<Vector4, 0x0111>     xyyy;
+			Swizzle4<Vector4, 0x1111>     yyyy;
+			Swizzle4<Vector4, 0x2111>     zyyy;
+			Swizzle4<Vector4, 0x3111>     wyyy;
+			Swizzle4<Vector4, 0x0211>     xzyy;
+			Swizzle4<Vector4, 0x1211>     yzyy;
+			Swizzle4<Vector4, 0x2211>     zzyy;
+			Swizzle4<Vector4, 0x3211>     wzyy;
+			Swizzle4<Vector4, 0x0311>     xwyy;
+			Swizzle4<Vector4, 0x1311>     ywyy;
+			Swizzle4<Vector4, 0x2311>     zwyy;
+			Swizzle4<Vector4, 0x3311>     wwyy;
+			Swizzle4<Vector4, 0x0021>     xxzy;
+			Swizzle4<Vector4, 0x1021>     yxzy;
+			Swizzle4<Vector4, 0x2021>     zxzy;
+			Swizzle4<Vector4, 0x3021>     wxzy;
+			Swizzle4<Vector4, 0x0121>     xyzy;
+			Swizzle4<Vector4, 0x1121>     yyzy;
+			Swizzle4<Vector4, 0x2121>     zyzy;
+			Swizzle4<Vector4, 0x3121>     wyzy;
+			Swizzle4<Vector4, 0x0221>     xzzy;
+			Swizzle4<Vector4, 0x1221>     yzzy;
+			Swizzle4<Vector4, 0x2221>     zzzy;
+			Swizzle4<Vector4, 0x3221>     wzzy;
+			Swizzle4<Vector4, 0x0321>     xwzy;
+			Swizzle4<Vector4, 0x1321>     ywzy;
+			Swizzle4<Vector4, 0x2321>     zwzy;
+			Swizzle4<Vector4, 0x3321>     wwzy;
+			Swizzle4<Vector4, 0x0031>     xxwy;
+			Swizzle4<Vector4, 0x1031>     yxwy;
+			Swizzle4<Vector4, 0x2031>     zxwy;
+			Swizzle4<Vector4, 0x3031>     wxwy;
+			Swizzle4<Vector4, 0x0131>     xywy;
+			Swizzle4<Vector4, 0x1131>     yywy;
+			Swizzle4<Vector4, 0x2131>     zywy;
+			Swizzle4<Vector4, 0x3131>     wywy;
+			Swizzle4<Vector4, 0x0231>     xzwy;
+			Swizzle4<Vector4, 0x1231>     yzwy;
+			Swizzle4<Vector4, 0x2231>     zzwy;
+			Swizzle4<Vector4, 0x3231>     wzwy;
+			Swizzle4<Vector4, 0x0331>     xwwy;
+			Swizzle4<Vector4, 0x1331>     ywwy;
+			Swizzle4<Vector4, 0x2331>     zwwy;
+			Swizzle4<Vector4, 0x3331>     wwwy;
+			Swizzle4<Vector4, 0x0002>     xxxz;
+			Swizzle4<Vector4, 0x1002>     yxxz;
+			Swizzle4<Vector4, 0x2002>     zxxz;
+			Swizzle4<Vector4, 0x3002>     wxxz;
+			Swizzle4<Vector4, 0x0102>     xyxz;
+			Swizzle4<Vector4, 0x1102>     yyxz;
+			Swizzle4<Vector4, 0x2102>     zyxz;
+			Swizzle4<Vector4, 0x3102>     wyxz;
+			Swizzle4<Vector4, 0x0202>     xzxz;
+			Swizzle4<Vector4, 0x1202>     yzxz;
+			Swizzle4<Vector4, 0x2202>     zzxz;
+			Swizzle4<Vector4, 0x3202>     wzxz;
+			Swizzle4<Vector4, 0x0302>     xwxz;
+			Swizzle4<Vector4, 0x1302>     ywxz;
+			Swizzle4<Vector4, 0x2302>     zwxz;
+			Swizzle4<Vector4, 0x3302>     wwxz;
+			Swizzle4<Vector4, 0x0012>     xxyz;
+			Swizzle4<Vector4, 0x1012>     yxyz;
+			Swizzle4<Vector4, 0x2012>     zxyz;
+			Swizzle4<Vector4, 0x3012>     wxyz;
+			Swizzle4<Vector4, 0x0112>     xyyz;
+			Swizzle4<Vector4, 0x1112>     yyyz;
+			Swizzle4<Vector4, 0x2112>     zyyz;
+			Swizzle4<Vector4, 0x3112>     wyyz;
+			Swizzle4<Vector4, 0x0212>     xzyz;
+			Swizzle4<Vector4, 0x1212>     yzyz;
+			Swizzle4<Vector4, 0x2212>     zzyz;
+			Swizzle4<Vector4, 0x3212>     wzyz;
+			Swizzle4<Vector4, 0x0312>     xwyz;
+			Swizzle4<Vector4, 0x1312>     ywyz;
+			Swizzle4<Vector4, 0x2312>     zwyz;
+			Swizzle4<Vector4, 0x3312>     wwyz;
+			Swizzle4<Vector4, 0x0022>     xxzz;
+			Swizzle4<Vector4, 0x1022>     yxzz;
+			Swizzle4<Vector4, 0x2022>     zxzz;
+			Swizzle4<Vector4, 0x3022>     wxzz;
+			Swizzle4<Vector4, 0x0122>     xyzz;
+			Swizzle4<Vector4, 0x1122>     yyzz;
+			Swizzle4<Vector4, 0x2122>     zyzz;
+			Swizzle4<Vector4, 0x3122>     wyzz;
+			Swizzle4<Vector4, 0x0222>     xzzz;
+			Swizzle4<Vector4, 0x1222>     yzzz;
+			Swizzle4<Vector4, 0x2222>     zzzz;
+			Swizzle4<Vector4, 0x3222>     wzzz;
+			Swizzle4<Vector4, 0x0322>     xwzz;
+			Swizzle4<Vector4, 0x1322>     ywzz;
+			Swizzle4<Vector4, 0x2322>     zwzz;
+			Swizzle4<Vector4, 0x3322>     wwzz;
+			Swizzle4<Vector4, 0x0032>     xxwz;
+			Swizzle4<Vector4, 0x1032>     yxwz;
+			Swizzle4<Vector4, 0x2032>     zxwz;
+			Swizzle4<Vector4, 0x3032>     wxwz;
+			Swizzle4<Vector4, 0x0132>     xywz;
+			Swizzle4<Vector4, 0x1132>     yywz;
+			Swizzle4<Vector4, 0x2132>     zywz;
+			Swizzle4<Vector4, 0x3132>     wywz;
+			Swizzle4<Vector4, 0x0232>     xzwz;
+			Swizzle4<Vector4, 0x1232>     yzwz;
+			Swizzle4<Vector4, 0x2232>     zzwz;
+			Swizzle4<Vector4, 0x3232>     wzwz;
+			Swizzle4<Vector4, 0x0332>     xwwz;
+			Swizzle4<Vector4, 0x1332>     ywwz;
+			Swizzle4<Vector4, 0x2332>     zwwz;
+			Swizzle4<Vector4, 0x3332>     wwwz;
+			Swizzle4<Vector4, 0x0003>     xxxw;
+			Swizzle4<Vector4, 0x1003>     yxxw;
+			Swizzle4<Vector4, 0x2003>     zxxw;
+			Swizzle4<Vector4, 0x3003>     wxxw;
+			Swizzle4<Vector4, 0x0103>     xyxw;
+			Swizzle4<Vector4, 0x1103>     yyxw;
+			Swizzle4<Vector4, 0x2103>     zyxw;
+			Swizzle4<Vector4, 0x3103>     wyxw;
+			Swizzle4<Vector4, 0x0203>     xzxw;
+			Swizzle4<Vector4, 0x1203>     yzxw;
+			Swizzle4<Vector4, 0x2203>     zzxw;
+			Swizzle4<Vector4, 0x3203>     wzxw;
+			Swizzle4<Vector4, 0x0303>     xwxw;
+			Swizzle4<Vector4, 0x1303>     ywxw;
+			Swizzle4<Vector4, 0x2303>     zwxw;
+			Swizzle4<Vector4, 0x3303>     wwxw;
+			Swizzle4<Vector4, 0x0013>     xxyw;
+			Swizzle4<Vector4, 0x1013>     yxyw;
+			Swizzle4<Vector4, 0x2013>     zxyw;
+			Swizzle4<Vector4, 0x3013>     wxyw;
+			Swizzle4<Vector4, 0x0113>     xyyw;
+			Swizzle4<Vector4, 0x1113>     yyyw;
+			Swizzle4<Vector4, 0x2113>     zyyw;
+			Swizzle4<Vector4, 0x3113>     wyyw;
+			Swizzle4<Vector4, 0x0213>     xzyw;
+			Swizzle4<Vector4, 0x1213>     yzyw;
+			Swizzle4<Vector4, 0x2213>     zzyw;
+			Swizzle4<Vector4, 0x3213>     wzyw;
+			Swizzle4<Vector4, 0x0313>     xwyw;
+			Swizzle4<Vector4, 0x1313>     ywyw;
+			Swizzle4<Vector4, 0x2313>     zwyw;
+			Swizzle4<Vector4, 0x3313>     wwyw;
+			Swizzle4<Vector4, 0x0023>     xxzw;
+			Swizzle4<Vector4, 0x1023>     yxzw;
+			Swizzle4<Vector4, 0x2023>     zxzw;
+			Swizzle4<Vector4, 0x3023>     wxzw;
+			SwizzleMask4<Vector4, 0x0123> xyzw;
+			Swizzle4<Vector4, 0x1123>     yyzw;
+			Swizzle4<Vector4, 0x2123>     zyzw;
+			Swizzle4<Vector4, 0x3123>     wyzw;
+			Swizzle4<Vector4, 0x0223>     xzzw;
+			Swizzle4<Vector4, 0x1223>     yzzw;
+			Swizzle4<Vector4, 0x2223>     zzzw;
+			Swizzle4<Vector4, 0x3223>     wzzw;
+			Swizzle4<Vector4, 0x0323>     xwzw;
+			Swizzle4<Vector4, 0x1323>     ywzw;
+			Swizzle4<Vector4, 0x2323>     zwzw;
+			Swizzle4<Vector4, 0x3323>     wwzw;
+			Swizzle4<Vector4, 0x0033>     xxww;
+			Swizzle4<Vector4, 0x1033>     yxww;
+			Swizzle4<Vector4, 0x2033>     zxww;
+			Swizzle4<Vector4, 0x3033>     wxww;
+			Swizzle4<Vector4, 0x0133>     xyww;
+			Swizzle4<Vector4, 0x1133>     yyww;
+			Swizzle4<Vector4, 0x2133>     zyww;
+			Swizzle4<Vector4, 0x3133>     wyww;
+			Swizzle4<Vector4, 0x0233>     xzww;
+			Swizzle4<Vector4, 0x1233>     yzww;
+			Swizzle4<Vector4, 0x2233>     zzww;
+			Swizzle4<Vector4, 0x3233>     wzww;
+			Swizzle4<Vector4, 0x0333>     xwww;
+			Swizzle4<Vector4, 0x1333>     ywww;
+			Swizzle4<Vector4, 0x2333>     zwww;
+			Swizzle4<Vector4, 0x3333>     wwww;
 		};
 	};
 
@@ -1945,8 +1945,8 @@
 	RValue<Int> Extract(RValue<Int4> val, int i);
 	RValue<Int4> Insert(RValue<Int4> val, RValue<Int> element, int i);
 	RValue<Int> SignMask(RValue<Int4> x);
-	RValue<Int4> Swizzle(RValue<Int4> x, unsigned char select);
-	RValue<Int4> Blend(RValue<Int4> x, RValue<Int4> y, unsigned short select);
+	RValue<Int4> Swizzle(RValue<Int4> x, uint16_t select);
+	RValue<Int4> Blend(RValue<Int4> x, RValue<Int4> y, uint16_t select);
 	RValue<Int4> MulHigh(RValue<Int4> x, RValue<Int4> y);
 
 	class UInt4 : public LValue<UInt4>, public XYZW<UInt4>
@@ -2030,8 +2030,8 @@
 	RValue<UInt> Extract(RValue<UInt4> val, int i);
 	RValue<UInt4> Insert(RValue<UInt4> val, RValue<UInt> element, int i);
 //	RValue<UInt4> RoundInt(RValue<Float4> cast);
-	RValue<UInt4> Swizzle(RValue<UInt4> x, unsigned char select);
-	RValue<UInt4> Blend(RValue<UInt4> x, RValue<UInt4> y, unsigned short select);
+	RValue<UInt4> Swizzle(RValue<UInt4> x, uint16_t select);
+	RValue<UInt4> Blend(RValue<UInt4> x, RValue<UInt4> y, uint16_t select);
 
 	class Half : public LValue<Half>
 	{
@@ -2177,8 +2177,8 @@
 //	RValue<Float2> Abs(RValue<Float2> x);
 //	RValue<Float2> Max(RValue<Float2> x, RValue<Float2> y);
 //	RValue<Float2> Min(RValue<Float2> x, RValue<Float2> y);
-//	RValue<Float2> Swizzle(RValue<Float2> x, unsigned char select);
-//	RValue<Float2> Mask(Float2 &lhs, RValue<Float2> rhs, unsigned char select);
+//	RValue<Float2> Swizzle(RValue<Float2> x, uint16_t select);
+//	RValue<Float2> Mask(Float2 &lhs, RValue<Float2> rhs, uint16_t select);
 
 	class Float4 : public LValue<Float4>, public XYZW<Float4>
 	{
@@ -2257,12 +2257,12 @@
 	RValue<Float4> Sqrt(RValue<Float4> x);
 	RValue<Float4> Insert(RValue<Float4> val, RValue<Float> element, int i);
 	RValue<Float> Extract(RValue<Float4> x, int i);
-	RValue<Float4> Swizzle(RValue<Float4> x, unsigned char select);
-	RValue<Float4> Blend(RValue<Float4> x, RValue<Float4> y, unsigned short select);
-	RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, unsigned char imm);
+	RValue<Float4> Swizzle(RValue<Float4> x, uint16_t select);
+	RValue<Float4> Blend(RValue<Float4> x, RValue<Float4> y, uint16_t select);
+	RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, uint16_t imm);
 	RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y);
 	RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y);
-	RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, unsigned char select);
+	RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, uint16_t select);
 	RValue<Int> SignMask(RValue<Float4> x);
 
 	// Ordered comparison functions
@@ -2843,28 +2843,28 @@
 	Float4::Float4(const Swizzle2<Float4, X> &x, const Swizzle2<Float4, Y> &y) : XYZW(this)
 	{
 		RR_DEBUG_INFO_UPDATE_LOC();
-		*this = ShuffleLowHigh(*x.parent, *y.parent, (X & 0xF) | (Y & 0xF) << 4);
+		*this = ShuffleLowHigh(*x.parent, *y.parent, (uint16_t(X) & 0xFF00u) | (uint16_t(Y >> 8) & 0x00FFu));
 	}
 
 	template<int X, int Y>
 	Float4::Float4(const SwizzleMask2<Float4, X> &x, const Swizzle2<Float4, Y> &y) : XYZW(this)
 	{
 		RR_DEBUG_INFO_UPDATE_LOC();
-		*this = ShuffleLowHigh(*x.parent, *y.parent, (X & 0xF) | (Y & 0xF) << 4);
+		*this = ShuffleLowHigh(*x.parent, *y.parent, (uint16_t(X) & 0xFF00u) | (uint16_t(Y >> 8) & 0x00FFu));
 	}
 
 	template<int X, int Y>
 	Float4::Float4(const Swizzle2<Float4, X> &x, const SwizzleMask2<Float4, Y> &y) : XYZW(this)
 	{
 		RR_DEBUG_INFO_UPDATE_LOC();
-		*this = ShuffleLowHigh(*x.parent, *y.parent, (X & 0xF) | (Y & 0xF) << 4);
+		*this = ShuffleLowHigh(*x.parent, *y.parent, (uint16_t(X) & 0xFF00u) | (uint16_t(Y >> 8) & 0x00FFu));
 	}
 
 	template<int X, int Y>
 	Float4::Float4(const SwizzleMask2<Float4, X> &x, const SwizzleMask2<Float4, Y> &y) : XYZW(this)
 	{
 		RR_DEBUG_INFO_UPDATE_LOC();
-		*this = ShuffleLowHigh(*x.parent, *y.parent, (X & 0xF) | (Y & 0xF) << 4);
+		*this = ShuffleLowHigh(*x.parent, *y.parent, (uint16_t(X) & 0xFF00u) | (uint16_t(Y >> 8) & 0x00FFu));
 	}
 
 	template<int T>
diff --git a/src/Reactor/ReactorUnitTests.cpp b/src/Reactor/ReactorUnitTests.cpp
index fe25a01..d76622f 100644
--- a/src/Reactor/ReactorUnitTests.cpp
+++ b/src/Reactor/ReactorUnitTests.cpp
@@ -349,6 +349,15 @@
 
 TEST(ReactorUnitTests, Swizzle)
 {
+	auto swizzleCode = [](int i) -> uint16_t
+	{
+		auto x = (i >> 0) & 0x03;
+		auto y = (i >> 2) & 0x03;
+		auto z = (i >> 4) & 0x03;
+		auto w = (i >> 6) & 0x03;
+		return (x << 12) | (y << 8) | (z << 4) | (w << 0);
+	};
+
 	{
 		FunctionT<int(void*)> function;
 		{
@@ -356,12 +365,12 @@
 
 			for(int i = 0; i < 256; i++)
 			{
-				*Pointer<Float4>(out + 16 * i) = Swizzle(Float4(1.0f, 2.0f, 3.0f, 4.0f), i);
+				*Pointer<Float4>(out + 16 * i) = Swizzle(Float4(1.0f, 2.0f, 3.0f, 4.0f), swizzleCode(i));
 			}
 
 			for(int i = 0; i < 256; i++)
-			{	
-				*Pointer<Float4>(out + 16 * (256 + i)) = ShuffleLowHigh(Float4(1.0f, 2.0f, 3.0f, 4.0f), Float4(5.0f, 6.0f, 7.0f, 8.0f), i);
+			{
+				*Pointer<Float4>(out + 16 * (256 + i)) = ShuffleLowHigh(Float4(1.0f, 2.0f, 3.0f, 4.0f), Float4(5.0f, 6.0f, 7.0f, 8.0f), swizzleCode(i));
 			}
 
 			*Pointer<Float4>(out + 16 * (512 + 0)) = UnpackLow(Float4(1.0f, 2.0f, 3.0f, 4.0f), Float4(5.0f, 6.0f, 7.0f, 8.0f));
@@ -374,13 +383,13 @@
 			for(int i = 0; i < 256; i++)
 			{
 				*Pointer<Short4>(out + 16 * (512 + 6) + (8 * i)) =
-                                    Swizzle(Short4(1, 2, 3, 4), i);
+                                    Swizzle(Short4(1, 2, 3, 4), swizzleCode(i));
 			}
 
 			for(int i = 0; i < 256; i++)
 			{
 				*Pointer<Int4>(out + 16 * (512 + 6 + i) + (8 * 256)) =
-                                    Swizzle(Int4(1, 2, 3, 4), i);
+                                    Swizzle(Int4(1, 2, 3, 4), swizzleCode(i));
 			}
 
 			Return(0);
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index 47b4b16..81409c8 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -2202,7 +2202,7 @@
 			pack->addArg(y.value);
 			::basicBlock->appendInst(pack);
 
-			return As<SByte8>(Swizzle(As<Int4>(V(result)), 0x88));
+			return As<SByte8>(Swizzle(As<Int4>(V(result)), 0x0202));
 		}
 	}
 
@@ -2232,7 +2232,7 @@
 			pack->addArg(y.value);
 			::basicBlock->appendInst(pack);
 
-			return As<Byte8>(Swizzle(As<Int4>(V(result)), 0x88));
+			return As<Byte8>(Swizzle(As<Int4>(V(result)), 0x0202));
 		}
 	}
 
diff --git a/src/Renderer/QuadRasterizer.cpp b/src/Renderer/QuadRasterizer.cpp
index 947a88b..a16c457 100644
--- a/src/Renderer/QuadRasterizer.cpp
+++ b/src/Renderer/QuadRasterizer.cpp
@@ -272,8 +272,8 @@
 					xLeft[q] = *Pointer<Short4>(primitive + q * sizeof(Primitive) + OFFSET(Primitive,outline) + y * sizeof(Primitive::Span));
 					xRight[q] = xLeft[q];
 
-					xLeft[q] = Swizzle(xLeft[q], 0xA0) - Short4(1, 2, 1, 2);
-					xRight[q] = Swizzle(xRight[q], 0xF5) - Short4(0, 1, 0, 1);
+					xLeft[q] = Swizzle(xLeft[q], 0x0022) - Short4(1, 2, 1, 2);
+					xRight[q] = Swizzle(xRight[q], 0x1133) - Short4(0, 1, 0, 1);
 				}
 
 				For(Int x = x0, x < x1, x += 2)
diff --git a/src/Shader/PixelRoutine.cpp b/src/Shader/PixelRoutine.cpp
index 12040fd..31673a1 100644
--- a/src/Shader/PixelRoutine.cpp
+++ b/src/Shader/PixelRoutine.cpp
@@ -2081,8 +2081,8 @@
 			buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
 			pixel.y = *Pointer<Float4>(buffer + 8 * x, 16);
 			pixel.z = pixel.x;
-			pixel.x = ShuffleLowHigh(pixel.x, pixel.y, 0x88);
-			pixel.z = ShuffleLowHigh(pixel.z, pixel.y, 0xDD);
+			pixel.x = ShuffleLowHigh(pixel.x, pixel.y, 0x0202);
+			pixel.z = ShuffleLowHigh(pixel.z, pixel.y, 0x1313);
 			pixel.y = pixel.z;
 			pixel.z = pixel.w = one;
 			break;