Implement vector extract, insert, and swizzle.

Bug swiftshader:15

Change-Id: I81f88999e183ce3617d923249335ff02d6a9f1b1
Reviewed-on: https://swiftshader-review.googlesource.com/7396
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/Main.cpp b/src/Reactor/Main.cpp
index a7aa820..e1887b5 100644
--- a/src/Reactor/Main.cpp
+++ b/src/Reactor/Main.cpp
@@ -50,6 +50,10 @@
 				z += (2 << i) - (i / 3);
 			}
 
+			Float4 v;
+			v.z = As<Float>(z);
+			z = As<Int>(Float(Float4(v.xzxx).y));
+
 			Int sum = x + y + z;
    
 			Return(sum);
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index 13c83eb..b4cd724 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -695,12 +695,20 @@
 
 	Value *Nucleus::createExtractElement(Value *vector, Type *type, int index)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		auto result = ::function->makeVariable(T(type));
+		auto extract = Ice::InstExtractElement::create(::function, result, vector, ::context->getConstantInt32(index));
+		::basicBlock->appendInst(extract);
+
+		return V(result);
 	}
 
 	Value *Nucleus::createInsertElement(Value *vector, Value *element, int index)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		auto result = ::function->makeVariable(vector->getType());
+		auto insert = Ice::InstInsertElement::create(::function, result, vector, element, ::context->getConstantInt32(index));
+		::basicBlock->appendInst(insert);
+
+		return V(result);
 	}
 
 	Value *Nucleus::createShuffleVector(Value *V1, Value *V2, Value *mask)
@@ -730,7 +738,15 @@
 
 	static Value *createSwizzle4(Value *val, unsigned char select)
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		auto result = ::function->makeVariable(val->getType());
+		auto shuffle = Ice::InstShuffleVector::create(::function, result, val, val);
+		shuffle->addIndex(Ice::ConstantInteger32::create(::context, Ice::IceType_i32, (select >> 0) & 0x03));
+		shuffle->addIndex(Ice::ConstantInteger32::create(::context, Ice::IceType_i32, (select >> 2) & 0x03));
+		shuffle->addIndex(Ice::ConstantInteger32::create(::context, Ice::IceType_i32, (select >> 4) & 0x03));
+		shuffle->addIndex(Ice::ConstantInteger32::create(::context, Ice::IceType_i32, (select >> 6) & 0x03));
+		::basicBlock->appendInst(shuffle);
+
+		return V(result);
 	}
 
 	static Value *createMask4(Value *lhs, Value *rhs, unsigned char select)
@@ -5227,7 +5243,7 @@
 
 	Type *Float::getType()
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return T(Ice::IceType_f32);
 	}
 
 	Float2::Float2(RValue<Float4> cast)
@@ -5615,7 +5631,7 @@
 
 	Type *Float4::getType()
 	{
-		assert(false && "UNIMPLEMENTED"); return nullptr;
+		return T(Ice::IceType_v4f32);
 	}
 
 	RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)