Refactor vector swizzle.

Bug swiftshader:15

Change-Id: Iaa626705220e4bd9b3c744c7623f8b204022b716
Reviewed-on: https://swiftshader-review.googlesource.com/7397
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index 36da630..8b32d1f 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -665,9 +665,21 @@
 		return V(::builder->CreateInsertElement(vector, element, createConstantInt(index)));
 	}
 
-	Value *Nucleus::createShuffleVector(Value *V1, Value *V2, Value *mask)
+	Value *Nucleus::createShuffleVector(Value *V1, Value *V2, const int *select)
 	{
-		return V(::builder->CreateShuffleVector(V1, V2, mask));
+		int size = llvm::cast<llvm::VectorType>(V1->getType())->getNumElements();
+		const int maxSize = 16;
+		llvm::Constant *swizzle[maxSize];
+		assert(size <= maxSize);
+
+		for(int i = 0; i < size; i++)
+		{
+			swizzle[i] = Nucleus::createConstantInt(select[i]);
+		}
+
+		llvm::Value *shuffle = llvm::ConstantVector::get(llvm::ArrayRef<llvm::Constant*>(swizzle, size));
+
+		return V(::builder->CreateShuffleVector(V1, V2, shuffle));
 	}
 
 	Value *Nucleus::createSelect(Value *C, Value *ifTrue, Value *ifFalse)
@@ -692,15 +704,15 @@
 
 	static Value *createSwizzle4(Value *val, unsigned char select)
 	{
-		Constant *swizzle[4];
-		swizzle[0] = Nucleus::createConstantInt((select >> 0) & 0x03);
-		swizzle[1] = Nucleus::createConstantInt((select >> 2) & 0x03);
-		swizzle[2] = Nucleus::createConstantInt((select >> 4) & 0x03);
-		swizzle[3] = Nucleus::createConstantInt((select >> 6) & 0x03);
+		int swizzle[4] =
+		{
+			(select >> 0) & 0x03,
+			(select >> 2) & 0x03,
+			(select >> 4) & 0x03,
+			(select >> 6) & 0x03,
+		};
 
-		Value *shuffle = Nucleus::createShuffleVector(val, V(UndefValue::get(val->getType())), V(Nucleus::createConstantVector(swizzle, 4)));
-
-		return shuffle;
+		return Nucleus::createShuffleVector(val, val, swizzle);
 	}
 
 	static Value *createMask4(Value *lhs, Value *rhs, unsigned char select)
@@ -712,13 +724,15 @@
 		mask[(select >> 4) & 0x03] = true;
 		mask[(select >> 6) & 0x03] = true;
 
-		Constant *swizzle[4];
-		swizzle[0] = Nucleus::createConstantInt(mask[0] ? 4 : 0);
-		swizzle[1] = Nucleus::createConstantInt(mask[1] ? 5 : 1);
-		swizzle[2] = Nucleus::createConstantInt(mask[2] ? 6 : 2);
-		swizzle[3] = Nucleus::createConstantInt(mask[3] ? 7 : 3);
+		int swizzle[4] =
+		{
+			mask[0] ? 4 : 0,
+			mask[1] ? 5 : 1,
+			mask[2] ? 6 : 2,
+			mask[3] ? 7 : 3,
+		};
 
-		Value *shuffle = Nucleus::createShuffleVector(lhs, rhs, V(Nucleus::createConstantVector(swizzle, 4)));
+		Value *shuffle = Nucleus::createShuffleVector(lhs, rhs, swizzle);
 
 		return shuffle;
 	}
@@ -2205,17 +2219,8 @@
 		}
 		else
 		{
-			Constant *shuffle[8];
-			shuffle[0] = Nucleus::createConstantInt(0);
-			shuffle[1] = Nucleus::createConstantInt(8);
-			shuffle[2] = Nucleus::createConstantInt(1);
-			shuffle[3] = Nucleus::createConstantInt(9);
-			shuffle[4] = Nucleus::createConstantInt(2);
-			shuffle[5] = Nucleus::createConstantInt(10);
-			shuffle[6] = Nucleus::createConstantInt(3);
-			shuffle[7] = Nucleus::createConstantInt(11);
-
-			Value *packed = Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 8)));
+			int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11};
+			Value *packed = Nucleus::createShuffleVector(x.value, y.value, shuffle);
 
 			return RValue<Short4>(Nucleus::createBitCast(packed, Short4::getType()));
 		}
@@ -2229,17 +2234,8 @@
 		}
 		else
 		{
-			Constant *shuffle[8];
-			shuffle[0] = Nucleus::createConstantInt(4);
-			shuffle[1] = Nucleus::createConstantInt(12);
-			shuffle[2] = Nucleus::createConstantInt(5);
-			shuffle[3] = Nucleus::createConstantInt(13);
-			shuffle[4] = Nucleus::createConstantInt(6);
-			shuffle[5] = Nucleus::createConstantInt(14);
-			shuffle[6] = Nucleus::createConstantInt(7);
-			shuffle[7] = Nucleus::createConstantInt(15);
-
-			Value *packed = Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 8)));
+			int shuffle[8] = {4, 12, 5, 13, 6, 14, 7, 15};
+			Value *packed = Nucleus::createShuffleVector(x.value, y.value, shuffle);
 
 			return RValue<Short4>(Nucleus::createBitCast(packed, Short4::getType()));
 		}
@@ -2513,17 +2509,8 @@
 		}
 		else
 		{
-			Constant *shuffle[8];
-			shuffle[0] = Nucleus::createConstantInt(0);
-			shuffle[1] = Nucleus::createConstantInt(8);
-			shuffle[2] = Nucleus::createConstantInt(1);
-			shuffle[3] = Nucleus::createConstantInt(9);
-			shuffle[4] = Nucleus::createConstantInt(2);
-			shuffle[5] = Nucleus::createConstantInt(10);
-			shuffle[6] = Nucleus::createConstantInt(3);
-			shuffle[7] = Nucleus::createConstantInt(11);
-
-			Value *packed = Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 8)));
+			int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11};
+			Value *packed = Nucleus::createShuffleVector(x.value, y.value, shuffle);
 
 			return RValue<Short4>(Nucleus::createBitCast(packed, Short4::getType()));
 		}
@@ -2537,17 +2524,8 @@
 		}
 		else
 		{
-			Constant *shuffle[8];
-			shuffle[0] = Nucleus::createConstantInt(4);
-			shuffle[1] = Nucleus::createConstantInt(12);
-			shuffle[2] = Nucleus::createConstantInt(5);
-			shuffle[3] = Nucleus::createConstantInt(13);
-			shuffle[4] = Nucleus::createConstantInt(6);
-			shuffle[5] = Nucleus::createConstantInt(14);
-			shuffle[6] = Nucleus::createConstantInt(7);
-			shuffle[7] = Nucleus::createConstantInt(15);
-
-			Value *packed = Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 8)));
+			int shuffle[8] = {4, 12, 5, 13, 6, 14, 7, 15};
+			Value *packed = Nucleus::createShuffleVector(x.value, y.value, shuffle);
 
 			return RValue<Short4>(Nucleus::createBitCast(packed, Short4::getType()));
 		}
@@ -2662,53 +2640,19 @@
 			// FIXME: Use Swizzle<Short8>
 			if(!CPUID::supportsSSSE3())
 			{
-				Constant *pshuflw[8];
-				pshuflw[0] = Nucleus::createConstantInt(0);
-				pshuflw[1] = Nucleus::createConstantInt(2);
-				pshuflw[2] = Nucleus::createConstantInt(0);
-				pshuflw[3] = Nucleus::createConstantInt(2);
-				pshuflw[4] = Nucleus::createConstantInt(4);
-				pshuflw[5] = Nucleus::createConstantInt(5);
-				pshuflw[6] = Nucleus::createConstantInt(6);
-				pshuflw[7] = Nucleus::createConstantInt(7);
+				int pshuflw[8] = {0, 2, 0, 2, 4, 5, 6, 7};
+				int pshufhw[8] = {0, 1, 2, 3, 4, 6, 4, 6};
 
-				Constant *pshufhw[8];
-				pshufhw[0] = Nucleus::createConstantInt(0);
-				pshufhw[1] = Nucleus::createConstantInt(1);
-				pshufhw[2] = Nucleus::createConstantInt(2);
-				pshufhw[3] = Nucleus::createConstantInt(3);
-				pshufhw[4] = Nucleus::createConstantInt(4);
-				pshufhw[5] = Nucleus::createConstantInt(6);
-				pshufhw[6] = Nucleus::createConstantInt(4);
-				pshufhw[7] = Nucleus::createConstantInt(6);
-
-				Value *shuffle1 = Nucleus::createShuffleVector(short8, V(UndefValue::get(Short8::getType())), V(Nucleus::createConstantVector(pshuflw, 8)));
-				Value *shuffle2 = Nucleus::createShuffleVector(shuffle1, V(UndefValue::get(Short8::getType())), V(Nucleus::createConstantVector(pshufhw, 8)));
+				Value *shuffle1 = Nucleus::createShuffleVector(short8, short8, pshuflw);
+				Value *shuffle2 = Nucleus::createShuffleVector(shuffle1, shuffle1, pshufhw);
 				Value *int4 = Nucleus::createBitCast(shuffle2, Int4::getType());
 				packed = createSwizzle4(int4, 0x88);
 			}
 			else
 			{
-				Constant *pshufb[16];
-				pshufb[0] = Nucleus::createConstantInt(0);
-				pshufb[1] = Nucleus::createConstantInt(1);
-				pshufb[2] = Nucleus::createConstantInt(4);
-				pshufb[3] = Nucleus::createConstantInt(5);
-				pshufb[4] = Nucleus::createConstantInt(8);
-				pshufb[5] = Nucleus::createConstantInt(9);
-				pshufb[6] = Nucleus::createConstantInt(12);
-				pshufb[7] = Nucleus::createConstantInt(13);
-				pshufb[8] = Nucleus::createConstantInt(0);
-				pshufb[9] = Nucleus::createConstantInt(1);
-				pshufb[10] = Nucleus::createConstantInt(4);
-				pshufb[11] = Nucleus::createConstantInt(5);
-				pshufb[12] = Nucleus::createConstantInt(8);
-				pshufb[13] = Nucleus::createConstantInt(9);
-				pshufb[14] = Nucleus::createConstantInt(12);
-				pshufb[15] = Nucleus::createConstantInt(13);
-
+				int pshufb[16] = {0, 1, 4, 5, 8, 9, 12, 13, 0, 1, 4, 5, 8, 9, 12, 13};
 				Value *byte16 = Nucleus::createBitCast(cast.value, Byte16::getType());
-				packed = Nucleus::createShuffleVector(byte16, V(UndefValue::get(Byte16::getType())), V(Nucleus::createConstantVector(pshufb, 16)));
+				packed = Nucleus::createShuffleVector(byte16, byte16, pshufb);
 			}
 
 			#if 0   // FIXME: No optimal instruction selection
@@ -3109,13 +3053,8 @@
 		}
 		else
 		{
-			Constant *shuffle[4];
-			shuffle[0] = Nucleus::createConstantInt(0);
-			shuffle[1] = Nucleus::createConstantInt(4);
-			shuffle[2] = Nucleus::createConstantInt(1);
-			shuffle[3] = Nucleus::createConstantInt(5);
-
-			Value *packed = Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 4)));
+			int shuffle[4] = {0, 4, 1, 5};
+			Value *packed = Nucleus::createShuffleVector(x.value, y.value, shuffle);
 
 			return RValue<Int2>(Nucleus::createBitCast(packed, Int2::getType()));
 		}
@@ -3129,13 +3068,8 @@
 		}
 		else
 		{
-			Constant *shuffle[4];
-			shuffle[0] = Nucleus::createConstantInt(2);
-			shuffle[1] = Nucleus::createConstantInt(6);
-			shuffle[2] = Nucleus::createConstantInt(3);
-			shuffle[3] = Nucleus::createConstantInt(7);
-
-			Value *packed = Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 4)));
+			int shuffle[4] = {2, 6, 3, 7};
+			Value *packed = Nucleus::createShuffleVector(x.value, y.value, shuffle);
 
 			return RValue<Int2>(Nucleus::createBitCast(packed, Int2::getType()));
 		}
@@ -3702,26 +3636,28 @@
 
 	RValue<UShort8> Swizzle(RValue<UShort8> x, char select0, char select1, char select2, char select3, char select4, char select5, char select6, char select7)
 	{
-		Constant *pshufb[16];
-		pshufb[0] = Nucleus::createConstantInt(select0 + 0);
-		pshufb[1] = Nucleus::createConstantInt(select0 + 1);
-		pshufb[2] = Nucleus::createConstantInt(select1 + 0);
-		pshufb[3] = Nucleus::createConstantInt(select1 + 1);
-		pshufb[4] = Nucleus::createConstantInt(select2 + 0);
-		pshufb[5] = Nucleus::createConstantInt(select2 + 1);
-		pshufb[6] = Nucleus::createConstantInt(select3 + 0);
-		pshufb[7] = Nucleus::createConstantInt(select3 + 1);
-		pshufb[8] = Nucleus::createConstantInt(select4 + 0);
-		pshufb[9] = Nucleus::createConstantInt(select4 + 1);
-		pshufb[10] = Nucleus::createConstantInt(select5 + 0);
-		pshufb[11] = Nucleus::createConstantInt(select5 + 1);
-		pshufb[12] = Nucleus::createConstantInt(select6 + 0);
-		pshufb[13] = Nucleus::createConstantInt(select6 + 1);
-		pshufb[14] = Nucleus::createConstantInt(select7 + 0);
-		pshufb[15] = Nucleus::createConstantInt(select7 + 1);
+		int pshufb[16] =
+		{
+			select0 + 0,
+			select0 + 1,
+			select1 + 0,
+			select1 + 1,
+			select2 + 0,
+			select2 + 1,
+			select3 + 0,
+			select3 + 1,
+			select4 + 0,
+			select4 + 1,
+			select5 + 0,
+			select5 + 1,
+			select6 + 0,
+			select6 + 1,
+			select7 + 0,
+			select7 + 1,
+		};
 
 		Value *byte16 = Nucleus::createBitCast(x.value, Byte16::getType());
-		Value *shuffle = Nucleus::createShuffleVector(byte16, V(UndefValue::get(Byte16::getType())), V(Nucleus::createConstantVector(pshufb, 16)));
+		Value *shuffle = Nucleus::createShuffleVector(byte16, byte16, pshufb);
 		Value *short8 = Nucleus::createBitCast(shuffle, UShort8::getType());
 
 		return RValue<UShort8>(short8);
@@ -3732,33 +3668,6 @@
 		return x86::pmulhuw(x, y);   // FIXME: Fallback required
 	}
 
-	// FIXME: Implement as Shuffle(x, y, Select(i0, ..., i16)) and Shuffle(x, y, SELECT_PACK_REPEAT(element))
-//	RValue<UShort8> PackRepeat(RValue<Byte16> x, RValue<Byte16> y, int element)
-//	{
-//		Constant *pshufb[16];
-//		pshufb[0] = Nucleus::createConstantInt(element + 0);
-//		pshufb[1] = Nucleus::createConstantInt(element + 0);
-//		pshufb[2] = Nucleus::createConstantInt(element + 4);
-//		pshufb[3] = Nucleus::createConstantInt(element + 4);
-//		pshufb[4] = Nucleus::createConstantInt(element + 8);
-//		pshufb[5] = Nucleus::createConstantInt(element + 8);
-//		pshufb[6] = Nucleus::createConstantInt(element + 12);
-//		pshufb[7] = Nucleus::createConstantInt(element + 12);
-//		pshufb[8] = Nucleus::createConstantInt(element + 16);
-//		pshufb[9] = Nucleus::createConstantInt(element + 16);
-//		pshufb[10] = Nucleus::createConstantInt(element + 20);
-//		pshufb[11] = Nucleus::createConstantInt(element + 20);
-//		pshufb[12] = Nucleus::createConstantInt(element + 24);
-//		pshufb[13] = Nucleus::createConstantInt(element + 24);
-//		pshufb[14] = Nucleus::createConstantInt(element + 28);
-//		pshufb[15] = Nucleus::createConstantInt(element + 28);
-//
-//		Value *shuffle = Nucleus::createShuffleVector(x.value, y.value, Nucleus::createConstantVector(pshufb, 16));
-//		Value *short8 = Nucleus::createBitCast(shuffle, UShort8::getType());
-//
-//		return RValue<UShort8>(short8);
-//	}
-
 	Type *UShort8::getType()
 	{
 		return T(VectorType::get(UShort::getType(), 8));
@@ -4226,11 +4135,8 @@
 
 	RValue<Long2> UnpackHigh(RValue<Long2> x, RValue<Long2> y)
 	{
-		Constant *shuffle[2];
-		shuffle[0] = Nucleus::createConstantInt(1);
-		shuffle[1] = Nucleus::createConstantInt(3);
-
-		Value *packed = Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 2)));
+		int shuffle[2] = {1, 3};
+		Value *packed = Nucleus::createShuffleVector(x.value, y.value, shuffle);
 
 		return RValue<Long2>(packed);
 	}
@@ -4590,11 +4496,8 @@
 //		Value *extend = Nucleus::createZExt(cast.value, Long::getType());
 //		Value *vector = Nucleus::createBitCast(extend, Int2::getType());
 //
-//		Constant *shuffle[2];
-//		shuffle[0] = Nucleus::createConstantInt(0);
-//		shuffle[1] = Nucleus::createConstantInt(0);
-//
-//		Value *replicate = Nucleus::createShuffleVector(vector, UndefValue::get(Int2::getType()), Nucleus::createConstantVector(shuffle, 2));
+//		int shuffle[2] = {0, 0};
+//		Value *replicate = Nucleus::createShuffleVector(vector, vector, shuffle);
 //
 //		storeValue(replicate);
 //	}
@@ -4659,11 +4562,8 @@
 		}
 		else
 		{
-			Constant *shuffle[2];
-			shuffle[0] = Nucleus::createConstantInt(0);
-			shuffle[1] = Nucleus::createConstantInt(1);
-
-			Value *packed = Nucleus::createShuffleVector(Nucleus::createBitCast(lo.value, T(VectorType::get(Int::getType(), 1))), Nucleus::createBitCast(hi.value, T(VectorType::get(Int::getType(), 1))), V(Nucleus::createConstantVector(shuffle, 2)));
+			int shuffle[2] = {0, 1};
+			Value *packed = Nucleus::createShuffleVector(Nucleus::createBitCast(lo.value, T(VectorType::get(Int::getType(), 1))), Nucleus::createBitCast(hi.value, T(VectorType::get(Int::getType(), 1))), shuffle);
 
 			storeValue(Nucleus::createBitCast(packed, Int2::getType()));
 		}
@@ -4885,11 +4785,8 @@
 		}
 		else
 		{
-			Constant *shuffle[2];
-			shuffle[0] = Nucleus::createConstantInt(0);
-			shuffle[1] = Nucleus::createConstantInt(2);
-
-			Value *packed = Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 2)));
+			int shuffle[2] = {0, 2};
+			Value *packed = Nucleus::createShuffleVector(x.value, y.value, shuffle);
 
 			return RValue<Long1>(Nucleus::createBitCast(packed, Long1::getType()));
 		}
@@ -4903,11 +4800,8 @@
 		}
 		else
 		{
-			Constant *shuffle[2];
-			shuffle[0] = Nucleus::createConstantInt(1);
-			shuffle[1] = Nucleus::createConstantInt(3);
-
-			Value *packed = Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 2)));
+			int shuffle[2] = {1, 3};
+			Value *packed = Nucleus::createShuffleVector(x.value, y.value, shuffle);
 
 			return RValue<Long1>(Nucleus::createBitCast(packed, Long1::getType()));
 		}
@@ -5224,39 +5118,13 @@
 		}
 		else
 		{
-			Constant *swizzle[16];
-			swizzle[0] = Nucleus::createConstantInt(0);
-			swizzle[1] = Nucleus::createConstantInt(16);
-			swizzle[2] = Nucleus::createConstantInt(1);
-			swizzle[3] = Nucleus::createConstantInt(17);
-			swizzle[4] = Nucleus::createConstantInt(2);
-			swizzle[5] = Nucleus::createConstantInt(18);
-			swizzle[6] = Nucleus::createConstantInt(3);
-			swizzle[7] = Nucleus::createConstantInt(19);
-			swizzle[8] = Nucleus::createConstantInt(4);
-			swizzle[9] = Nucleus::createConstantInt(20);
-			swizzle[10] = Nucleus::createConstantInt(5);
-			swizzle[11] = Nucleus::createConstantInt(21);
-			swizzle[12] = Nucleus::createConstantInt(6);
-			swizzle[13] = Nucleus::createConstantInt(22);
-			swizzle[14] = Nucleus::createConstantInt(7);
-			swizzle[15] = Nucleus::createConstantInt(23);
-
+			int swizzle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23};
 			Value *b = Nucleus::createBitCast(a, Byte16::getType());
-			Value *c = Nucleus::createShuffleVector(b, V(Nucleus::createNullValue(Byte16::getType())), V(Nucleus::createConstantVector(swizzle, 16)));
+			Value *c = Nucleus::createShuffleVector(b, V(Nucleus::createNullValue(Byte16::getType())), swizzle);
 
-			Constant *swizzle2[8];
-			swizzle2[0] = Nucleus::createConstantInt(0);
-			swizzle2[1] = Nucleus::createConstantInt(8);
-			swizzle2[2] = Nucleus::createConstantInt(1);
-			swizzle2[3] = Nucleus::createConstantInt(9);
-			swizzle2[4] = Nucleus::createConstantInt(2);
-			swizzle2[5] = Nucleus::createConstantInt(10);
-			swizzle2[6] = Nucleus::createConstantInt(3);
-			swizzle2[7] = Nucleus::createConstantInt(11);
-
+			int swizzle2[8] = {0, 8, 1, 9, 2, 10, 3, 11};
 			Value *d = Nucleus::createBitCast(c, Short8::getType());
-			e = Nucleus::createShuffleVector(d, V(Nucleus::createNullValue(Short8::getType())), V(Nucleus::createConstantVector(swizzle2, 8)));
+			e = Nucleus::createShuffleVector(d, V(Nucleus::createNullValue(Short8::getType())), swizzle2);
 		}
 
 		Value *f = Nucleus::createBitCast(e, Int4::getType());
@@ -5276,39 +5144,13 @@
 		}
 		else
 		{
-			Constant *swizzle[16];
-			swizzle[0] = Nucleus::createConstantInt(0);
-			swizzle[1] = Nucleus::createConstantInt(0);
-			swizzle[2] = Nucleus::createConstantInt(1);
-			swizzle[3] = Nucleus::createConstantInt(1);
-			swizzle[4] = Nucleus::createConstantInt(2);
-			swizzle[5] = Nucleus::createConstantInt(2);
-			swizzle[6] = Nucleus::createConstantInt(3);
-			swizzle[7] = Nucleus::createConstantInt(3);
-			swizzle[8] = Nucleus::createConstantInt(4);
-			swizzle[9] = Nucleus::createConstantInt(4);
-			swizzle[10] = Nucleus::createConstantInt(5);
-			swizzle[11] = Nucleus::createConstantInt(5);
-			swizzle[12] = Nucleus::createConstantInt(6);
-			swizzle[13] = Nucleus::createConstantInt(6);
-			swizzle[14] = Nucleus::createConstantInt(7);
-			swizzle[15] = Nucleus::createConstantInt(7);
-
+			int	swizzle[16] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7};
 			Value *b = Nucleus::createBitCast(a, Byte16::getType());
-			Value *c = Nucleus::createShuffleVector(b, b, V(Nucleus::createConstantVector(swizzle, 16)));
+			Value *c = Nucleus::createShuffleVector(b, b, swizzle);
 
-			Constant *swizzle2[8];
-			swizzle2[0] = Nucleus::createConstantInt(0);
-			swizzle2[1] = Nucleus::createConstantInt(0);
-			swizzle2[2] = Nucleus::createConstantInt(1);
-			swizzle2[3] = Nucleus::createConstantInt(1);
-			swizzle2[4] = Nucleus::createConstantInt(2);
-			swizzle2[5] = Nucleus::createConstantInt(2);
-			swizzle2[6] = Nucleus::createConstantInt(3);
-			swizzle2[7] = Nucleus::createConstantInt(3);
-
+			int swizzle2[8] = {0, 0, 1, 1, 2, 2, 3, 3};
 			Value *d = Nucleus::createBitCast(c, Short8::getType());
-			Value *e = Nucleus::createShuffleVector(d, d, V(Nucleus::createConstantVector(swizzle2, 8)));
+			Value *e = Nucleus::createShuffleVector(d, d, swizzle2);
 
 			Value *f = Nucleus::createBitCast(e, Int4::getType());
 			//	g = Nucleus::createAShr(f, Nucleus::createConstantInt(24));
@@ -5342,17 +5184,8 @@
 		{
 			Value *b = Nucleus::createBitCast(vector.value, Short8::getType());
 
-			Constant *swizzle[8];
-			swizzle[0] = Nucleus::createConstantInt(0);
-			swizzle[1] = Nucleus::createConstantInt(0);
-			swizzle[2] = Nucleus::createConstantInt(1);
-			swizzle[3] = Nucleus::createConstantInt(1);
-			swizzle[4] = Nucleus::createConstantInt(2);
-			swizzle[5] = Nucleus::createConstantInt(2);
-			swizzle[6] = Nucleus::createConstantInt(3);
-			swizzle[7] = Nucleus::createConstantInt(3);
-
-			Value *c = Nucleus::createShuffleVector(b, b, V(Nucleus::createConstantVector(swizzle, 8)));
+			int swizzle[8] = {0, 0, 1, 1, 2, 2, 3, 3};
+			Value *c = Nucleus::createShuffleVector(b, b, swizzle);
 			Value *d = Nucleus::createBitCast(c, Int4::getType());
 			storeValue(d);
 
@@ -5379,17 +5212,8 @@
 		{
 			Value *b = Nucleus::createBitCast(vector.value, Short8::getType());
 
-			Constant *swizzle[8];
-			swizzle[0] = Nucleus::createConstantInt(0);
-			swizzle[1] = Nucleus::createConstantInt(8);
-			swizzle[2] = Nucleus::createConstantInt(1);
-			swizzle[3] = Nucleus::createConstantInt(9);
-			swizzle[4] = Nucleus::createConstantInt(2);
-			swizzle[5] = Nucleus::createConstantInt(10);
-			swizzle[6] = Nucleus::createConstantInt(3);
-			swizzle[7] = Nucleus::createConstantInt(11);
-
-			Value *c = Nucleus::createShuffleVector(b, V(Nucleus::createNullValue(Short8::getType())), V(Nucleus::createConstantVector(swizzle, 8)));
+			int swizzle[8] = {0, 8, 1, 9, 2, 10, 3, 11};
+			Value *c = Nucleus::createShuffleVector(b, V(Nucleus::createNullValue(Short8::getType())), swizzle);
 			Value *d = Nucleus::createBitCast(c, Int4::getType());
 			storeValue(d);
 		}
@@ -5501,13 +5325,8 @@
 		Value *vector = loadValue();
 		Value *insert = Nucleus::createInsertElement(vector, rhs.value, 0);
 
-		Constant *swizzle[4];
-		swizzle[0] = Nucleus::createConstantInt(0);
-		swizzle[1] = Nucleus::createConstantInt(0);
-		swizzle[2] = Nucleus::createConstantInt(0);
-		swizzle[3] = Nucleus::createConstantInt(0);
-
-		Value *replicate = Nucleus::createShuffleVector(insert, V(UndefValue::get(Int4::getType())), V(Nucleus::createConstantVector(swizzle, 4)));
+		int swizzle[4] = {0, 0, 0, 0};
+		Value *replicate = Nucleus::createShuffleVector(insert, insert, swizzle);
 
 		storeValue(replicate);
 	}
@@ -6538,13 +6357,8 @@
 		Value *vector = loadValue();
 		Value *insert = Nucleus::createInsertElement(vector, rhs.value, 0);
 
-		Constant *swizzle[4];
-		swizzle[0] = Nucleus::createConstantInt(0);
-		swizzle[1] = Nucleus::createConstantInt(0);
-		swizzle[2] = Nucleus::createConstantInt(0);
-		swizzle[3] = Nucleus::createConstantInt(0);
-
-		Value *replicate = Nucleus::createShuffleVector(insert, V(UndefValue::get(Float4::getType())), V(Nucleus::createConstantVector(swizzle, 4)));
+		int swizzle[4] = {0, 0, 0, 0};
+		Value *replicate = Nucleus::createShuffleVector(insert, insert, swizzle);
 
 		storeValue(replicate);
 	}
@@ -6737,35 +6551,27 @@
 
 	RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, unsigned char imm)
 	{
-		Constant *shuffle[4];
-		shuffle[0] = Nucleus::createConstantInt(((imm >> 0) & 0x03) + 0);
-		shuffle[1] = Nucleus::createConstantInt(((imm >> 2) & 0x03) + 0);
-		shuffle[2] = Nucleus::createConstantInt(((imm >> 4) & 0x03) + 4);
-		shuffle[3] = Nucleus::createConstantInt(((imm >> 6) & 0x03) + 4);
+		int shuffle[4] =
+		{
+			((imm >> 0) & 0x03) + 0,
+			((imm >> 2) & 0x03) + 0,
+			((imm >> 4) & 0x03) + 4,
+			((imm >> 6) & 0x03) + 4,
+		};
 
-		return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 4))));
+		return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
 	}
 
 	RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
 	{
-		Constant *shuffle[4];
-		shuffle[0] = Nucleus::createConstantInt(0);
-		shuffle[1] = Nucleus::createConstantInt(4);
-		shuffle[2] = Nucleus::createConstantInt(1);
-		shuffle[3] = Nucleus::createConstantInt(5);
-
-		return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 4))));
+		int shuffle[4] = {0, 4, 1, 5};
+		return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
 	}
 
 	RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
 	{
-		Constant *shuffle[4];
-		shuffle[0] = Nucleus::createConstantInt(2);
-		shuffle[1] = Nucleus::createConstantInt(6);
-		shuffle[2] = Nucleus::createConstantInt(3);
-		shuffle[3] = Nucleus::createConstantInt(7);
-
-		return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, V(Nucleus::createConstantVector(shuffle, 4))));
+		int shuffle[4] = {2, 6, 3, 7};
+		return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
 	}
 
 	RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, unsigned char select)
diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp
index e69c2a0..ed265e6 100644
--- a/src/Reactor/Nucleus.hpp
+++ b/src/Reactor/Nucleus.hpp
@@ -145,7 +145,7 @@
 		// Vector instructions
 		static Value *createExtractElement(Value *vector, Type *type, int index);
 		static Value *createInsertElement(Value *vector, Value *element, int index);
-		static Value *createShuffleVector(Value *V1, Value *V2, Value *mask);
+		static Value *createShuffleVector(Value *V1, Value *V2, const int *select);
 
 		// Other instructions
 		static Value *createSelect(Value *C, Value *ifTrue, Value *ifFalse);
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index b4cd724..bb27798 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -711,7 +711,7 @@
 		return V(result);
 	}
 
-	Value *Nucleus::createShuffleVector(Value *V1, Value *V2, Value *mask)
+	Value *Nucleus::createShuffleVector(Value *V1, Value *V2, const int *select)
 	{
 		assert(false && "UNIMPLEMENTED"); return nullptr;
 	}