Make use of vec<T, N> vector broadcasts

Also disable the assignment operator implicitly doing a broadcast.
Instead the explicit constructor must be used. This prevents bugs like
assigning a scalar to one element, while it was intended to broadcast
(especially when using [] on an array of vectors).

Bug: b/146224130
Bug: b/144825072
Change-Id: I43c977e256e134f6707b5c19252ded08db73b270
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/39630
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Device/PixelProcessor.cpp b/src/Device/PixelProcessor.cpp
index a1e8df1..1c81a24 100644
--- a/src/Device/PixelProcessor.cpp
+++ b/src/Device/PixelProcessor.cpp
@@ -62,86 +62,26 @@
 
 void PixelProcessor::setBlendConstant(const Color<float> &blendConstant)
 {
-	// TODO(b/140935644): Compact into generic function, cheack if clamp is required
-	factor.blendConstant4W[0][0] =
-	factor.blendConstant4W[0][1] =
-	factor.blendConstant4W[0][2] =
-	factor.blendConstant4W[0][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.r));
+	// TODO(b/140935644): Check if clamp is required
+	factor.blendConstant4W[0] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.r)));
+	factor.blendConstant4W[1] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.g)));
+	factor.blendConstant4W[2] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.b)));
+	factor.blendConstant4W[3] = word4(static_cast<uint16_t>(iround(0xFFFFu * blendConstant.a)));
 
-	factor.blendConstant4W[1][0] =
-	factor.blendConstant4W[1][1] =
-	factor.blendConstant4W[1][2] =
-	factor.blendConstant4W[1][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.g));
+	factor.invBlendConstant4W[0] = word4(0xFFFFu - factor.blendConstant4W[0][0]);
+	factor.invBlendConstant4W[1] = word4(0xFFFFu - factor.blendConstant4W[1][0]);
+	factor.invBlendConstant4W[2] = word4(0xFFFFu - factor.blendConstant4W[2][0]);
+	factor.invBlendConstant4W[3] = word4(0xFFFFu - factor.blendConstant4W[3][0]);
 
-	factor.blendConstant4W[2][0] =
-	factor.blendConstant4W[2][1] =
-	factor.blendConstant4W[2][2] =
-	factor.blendConstant4W[2][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.b));
+	factor.blendConstant4F[0] = float4(blendConstant.r);
+	factor.blendConstant4F[1] = float4(blendConstant.g);
+	factor.blendConstant4F[2] = float4(blendConstant.b);
+	factor.blendConstant4F[3] = float4(blendConstant.a);
 
-	factor.blendConstant4W[3][0] =
-	factor.blendConstant4W[3][1] =
-	factor.blendConstant4W[3][2] =
-	factor.blendConstant4W[3][3] = static_cast<uint16_t>(iround(65535.0f * blendConstant.a));
-
-	factor.invBlendConstant4W[0][0] =
-	factor.invBlendConstant4W[0][1] =
-	factor.invBlendConstant4W[0][2] =
-	factor.invBlendConstant4W[0][3] = 0xFFFFu - factor.blendConstant4W[0][0];
-
-	factor.invBlendConstant4W[1][0] =
-	factor.invBlendConstant4W[1][1] =
-	factor.invBlendConstant4W[1][2] =
-	factor.invBlendConstant4W[1][3] = 0xFFFFu - factor.blendConstant4W[1][0];
-
-	factor.invBlendConstant4W[2][0] =
-	factor.invBlendConstant4W[2][1] =
-	factor.invBlendConstant4W[2][2] =
-	factor.invBlendConstant4W[2][3] = 0xFFFFu - factor.blendConstant4W[2][0];
-
-	factor.invBlendConstant4W[3][0] =
-	factor.invBlendConstant4W[3][1] =
-	factor.invBlendConstant4W[3][2] =
-	factor.invBlendConstant4W[3][3] = 0xFFFFu - factor.blendConstant4W[3][0];
-
-	factor.blendConstant4F[0][0] =
-	factor.blendConstant4F[0][1] =
-	factor.blendConstant4F[0][2] =
-	factor.blendConstant4F[0][3] = blendConstant.r;
-
-	factor.blendConstant4F[1][0] =
-	factor.blendConstant4F[1][1] =
-	factor.blendConstant4F[1][2] =
-	factor.blendConstant4F[1][3] = blendConstant.g;
-
-	factor.blendConstant4F[2][0] =
-	factor.blendConstant4F[2][1] =
-	factor.blendConstant4F[2][2] =
-	factor.blendConstant4F[2][3] = blendConstant.b;
-
-	factor.blendConstant4F[3][0] =
-	factor.blendConstant4F[3][1] =
-	factor.blendConstant4F[3][2] =
-	factor.blendConstant4F[3][3] = blendConstant.a;
-
-	factor.invBlendConstant4F[0][0] =
-	factor.invBlendConstant4F[0][1] =
-	factor.invBlendConstant4F[0][2] =
-	factor.invBlendConstant4F[0][3] = 1 - blendConstant.r;
-
-	factor.invBlendConstant4F[1][0] =
-	factor.invBlendConstant4F[1][1] =
-	factor.invBlendConstant4F[1][2] =
-	factor.invBlendConstant4F[1][3] = 1 - blendConstant.g;
-
-	factor.invBlendConstant4F[2][0] =
-	factor.invBlendConstant4F[2][1] =
-	factor.invBlendConstant4F[2][2] =
-	factor.invBlendConstant4F[2][3] = 1 - blendConstant.b;
-
-	factor.invBlendConstant4F[3][0] =
-	factor.invBlendConstant4F[3][1] =
-	factor.invBlendConstant4F[3][2] =
-	factor.invBlendConstant4F[3][3] = 1 - blendConstant.a;
+	factor.invBlendConstant4F[0] = float4(1 - blendConstant.r);
+	factor.invBlendConstant4F[1] = float4(1 - blendConstant.g);
+	factor.invBlendConstant4F[2] = float4(1 - blendConstant.b);
+	factor.invBlendConstant4F[3] = float4(1 - blendConstant.a);
 }
 
 void PixelProcessor::setRoutineCacheSize(int cacheSize)
diff --git a/src/Pipeline/Constants.cpp b/src/Pipeline/Constants.cpp
index b1afb1a..c38507d 100644
--- a/src/Pipeline/Constants.cpp
+++ b/src/Pipeline/Constants.cpp
@@ -243,18 +243,12 @@
 
 	for(int i = 0; i < 8; i++)
 	{
-		mask565Q[i][0] =
-		mask565Q[i][1] =
-		mask565Q[i][2] =
-		mask565Q[i][3] = (i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x07E0 : 0) | (i & 0x4 ? 0xF800 : 0);
+		mask565Q[i] = word4((i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x07E0 : 0) | (i & 0x4 ? 0xF800 : 0));
 	}
 
 	for (int i = 0; i < 16; i++)
 	{
-		mask5551Q[i][0] =
-		mask5551Q[i][1] =
-		mask5551Q[i][2] =
-		mask5551Q[i][3] = (i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x03E0 : 0) | (i & 0x4 ? 0x7C00 : 0) | (i & 8 ? 0x8000 : 0);
+		mask5551Q[i] = word4((i & 0x1 ? 0x001F : 0) | (i & 0x2 ? 0x03E0 : 0) | (i & 0x4 ? 0x7C00 : 0) | (i & 8 ? 0x8000 : 0));
 	}
 
 	for(int i = 0; i < 4; i++)
diff --git a/src/System/Types.hpp b/src/System/Types.hpp
index e70344f..df28db5 100644
--- a/src/System/Types.hpp
+++ b/src/System/Types.hpp
@@ -55,7 +55,7 @@
 {
 	vec() = default;
 
-	vec(T replicate)
+	explicit vec(T replicate)
 	{
 		for(int i = 0; i < N; i++)
 		{
@@ -69,6 +69,9 @@
 	{
 	}
 
+	// Require explicit use of replicate constructor.
+	vec &operator=(T) = delete;
+
 	T &operator[](int i)
 	{
 		return v[i];
@@ -87,7 +90,7 @@
 {
 	vec() = default;
 
-	constexpr vec(T replicate)
+	constexpr explicit vec(T replicate)
 		: x(replicate), y(replicate), z(replicate), w(replicate)
 	{
 	}
@@ -97,6 +100,9 @@
 	{
 	}
 
+	// Require explicit use of replicate constructor.
+	vec &operator=(T) = delete;
+
 	T &operator[](int i)
 	{
 		return v[i];