Implement vector masking.

Bug swiftshader:15

Change-Id: I6975f7a61ee232630b82e7844b8bc65088564827
Reviewed-on: https://swiftshader-review.googlesource.com/7959
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-on: https://swiftshader-review.googlesource.com/8164
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index 198d589..20843d5 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -1065,7 +1065,17 @@
 
 	static Value *createMask4(Value *lhs, Value *rhs, unsigned char select)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		int64_t mask[4] = {0, 0, 0, 0};
+
+		mask[(select >> 0) & 0x03] = -1;
+		mask[(select >> 2) & 0x03] = -1;
+		mask[(select >> 4) & 0x03] = -1;
+		mask[(select >> 6) & 0x03] = -1;
+
+		Value *condition = Nucleus::createConstantVector(mask, T(Ice::IceType_v4i1));
+		Value *result = Nucleus::createSelect(condition, rhs, lhs);
+
+		return result;
 	}
 
 	Value *Nucleus::createConstantPointer(const void *address, Type *Ty, unsigned int align)
@@ -1176,6 +1186,7 @@
 		switch((int)reinterpret_cast<intptr_t>(type))
 		{
 		case Ice::IceType_v4i32:
+		case Ice::IceType_v4i1:
 			{
 				const int initializer[4] = {(int)i[0], (int)i[1], (int)i[2], (int)i[3]};
 				static_assert(sizeof(initializer) == vectorSize, "!");
@@ -1190,6 +1201,7 @@
 			}
 			break;
 		case Ice::IceType_v8i16:
+		case Ice::IceType_v8i1:
 			{
 				const short initializer[8] = {(short)i[0], (short)i[1], (short)i[2], (short)i[3], (short)i[4], (short)i[5], (short)i[6], (short)i[7]};
 				static_assert(sizeof(initializer) == vectorSize, "!");
@@ -1197,6 +1209,7 @@
 			}
 			break;
 		case Ice::IceType_v16i8:
+		case Ice::IceType_v16i1:
 			{
 				const char initializer[16] = {(char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[4], (char)i[5], (char)i[6], (char)i[7], (char)i[8], (char)i[9], (char)i[10], (char)i[11], (char)i[12], (char)i[13], (char)i[14], (char)i[15]};
 				static_assert(sizeof(initializer) == vectorSize, "!");
@@ -6230,10 +6243,10 @@
 	RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, unsigned char select)
 	{
 		Value *vector = lhs.loadValue();
-		Value *shuffle = createMask4(vector, rhs.value, select);
-		lhs.storeValue(shuffle);
+		Value *result = createMask4(vector, rhs.value, select);
+		lhs.storeValue(result);
 
-		return RValue<Float4>(shuffle);
+		return RValue<Float4>(result);
 	}
 
 	RValue<Int> SignMask(RValue<Float4> x)