Implement remaining vector extract/insert operations.

Bug swiftshader:15

Change-Id: I9ed683b6d122183c4313d2bf609fd7c14bf5e387
Reviewed-on: https://swiftshader-review.googlesource.com/7958
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-on: https://swiftshader-review.googlesource.com/8163
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index 58d5aad..199a0f3 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -6470,14 +6470,9 @@
 		return x86::sqrtps(x);
 	}
 
-	RValue<Float4> Insert(const Float4 &val, RValue<Float> element, int i)
+	RValue<Float4> Insert(RValue<Float4> val, RValue<Float> element, int i)
 	{
-		Value *value = val.loadValue();
-		Value *insert = Nucleus::createInsertElement(value, element.value, i);
-
-		val = RValue<Float4>(insert);
-
-		return val;
+		return RValue<Float4>(Nucleus::createInsertElement(val.value, element.value, i));
 	}
 
 	RValue<Float> Extract(RValue<Float4> x, int i)
diff --git a/src/Reactor/Reactor.hpp b/src/Reactor/Reactor.hpp
index ccc810f..d39833d 100644
--- a/src/Reactor/Reactor.hpp
+++ b/src/Reactor/Reactor.hpp
@@ -1462,7 +1462,7 @@
 	RValue<Int4> Min(RValue<Int4> x, RValue<Int4> y);
 	RValue<Int4> RoundInt(RValue<Float4> cast);
 	RValue<Short8> Pack(RValue<Int4> x, RValue<Int4> y);
-	RValue<Int> Extract(RValue<Int4> x, int i);
+	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);
@@ -2135,7 +2135,7 @@
 	RValue<Float4> Rcp_pp(RValue<Float4> val, bool exactAtPow2 = false);
 	RValue<Float4> RcpSqrt_pp(RValue<Float4> val);
 	RValue<Float4> Sqrt(RValue<Float4> x);
-	RValue<Float4> Insert(const Float4 &val, RValue<Float> element, int i);
+	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> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, unsigned char imm);
@@ -2511,7 +2511,7 @@
 	template<int T>
 	RValue<Float4> SwizzleMask1Float4<T>::operator=(float x) const
 	{
-		return Insert(*parent, Float(x), T & 0x3);
+		return *parent = Insert(*parent, Float(x), T & 0x3);
 	}
 
 	template<int T>
@@ -2523,7 +2523,7 @@
 	template<int T>
 	RValue<Float4> SwizzleMask1Float4<T>::operator=(RValue<Float> rhs) const   // FIXME: Call a non-template function
 	{
-		return Insert(*parent, rhs, T & 0x3);
+		return *parent = Insert(*parent, rhs, T & 0x3);
 	}
 
 	template<int T>
diff --git a/src/Reactor/Subzero.vcxproj b/src/Reactor/Subzero.vcxproj
index deda6a3..2a11524 100644
--- a/src/Reactor/Subzero.vcxproj
+++ b/src/Reactor/Subzero.vcxproj
@@ -260,6 +260,10 @@
     <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceVariableSplitting.h" />

     <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX8664.h" />

     <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX8664Traits.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssemblerX8664.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceConditionCodesX8664.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstX8664.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRegistersX8664.h" />

   </ItemGroup>

   <ItemGroup>

     <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceClFlags.def" />

diff --git a/src/Reactor/Subzero.vcxproj.filters b/src/Reactor/Subzero.vcxproj.filters
index 6bdcac7..b415ca1 100644
--- a/src/Reactor/Subzero.vcxproj.filters
+++ b/src/Reactor/Subzero.vcxproj.filters
@@ -275,6 +275,18 @@
     <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX8664.h">

       <Filter>Header Files</Filter>

     </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssemblerX8664.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceConditionCodesX8664.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstX8664.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRegistersX8664.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

   </ItemGroup>

   <ItemGroup>

     <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceClFlags.def">

diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index 4305776..198d589 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -3307,12 +3307,12 @@
 
 	RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
 	{
-		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
+		return RValue<Short4>(Nucleus::createInsertElement(val.value, element.value, i));
 	}
 
 	RValue<Short> Extract(RValue<Short4> val, int i)
 	{
-		assert(false && "UNIMPLEMENTED"); return RValue<Short>(V(nullptr));
+		return RValue<Short>(Nucleus::createExtractElement(val.value, Int::getType(), i));
 	}
 
 	RValue<Short4> CmpGT(RValue<Short4> x, RValue<Short4> y)
@@ -4776,12 +4776,12 @@
 
 	RValue<Int> Extract(RValue<Int2> val, int i)
 	{
-		assert(false && "UNIMPLEMENTED"); return RValue<Int>(V(nullptr));
+		return RValue<Int>(Nucleus::createExtractElement(val.value, Int::getType(), i));
 	}
 
 	RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
 	{
-		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(V(nullptr));
+		return RValue<Int2>(Nucleus::createInsertElement(val.value, element.value, i));
 	}
 
 	Type *Int2::getType()
@@ -6187,14 +6187,9 @@
 		return RValue<Float4>(V(result));
 	}
 
-	RValue<Float4> Insert(const Float4 &val, RValue<Float> element, int i)
+	RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i)
 	{
-		Value *value = val.loadValue();
-		Value *insert = Nucleus::createInsertElement(value, element.value, i);
-
-		val = RValue<Float4>(insert);
-
-		return val;
+		return RValue<Float4>(Nucleus::createInsertElement(x.value, element.value, i));
 	}
 
 	RValue<Float> Extract(RValue<Float4> x, int i)