Slim down ROP handling for various formats

Change-Id: Ie2c008b40b83fa2d04f3008a5fcb9b554513639b
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/36116
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp
index 495c785..ce85f3b 100644
--- a/src/Pipeline/PixelRoutine.cpp
+++ b/src/Pipeline/PixelRoutine.cpp
@@ -1404,38 +1404,26 @@
 				Pointer<Byte> buffer = cBuffer + 2 * x;
 				Int value = *Pointer<Int>(buffer);
 
-				Int c01 = Extract(As<Int2>(current.x), 0);
+				Int channelMask = *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[bgraWriteMask & 0xF][0]));
 
+				Int c01 = Extract(As<Int2>(current.x), 0);
+				Int mask01 = *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][0]) + xMask * 8);
 				if(bgraWriteMask != 0x0000000F)
 				{
-					Int masked = value;
-					c01 &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[bgraWriteMask][0]));
-					masked &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[~bgraWriteMask & 0xF][0]));
-					c01 |= masked;
+					mask01 &= channelMask;
 				}
-
-				c01 &= *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][0]) + xMask * 8);
-				value &= *Pointer<Int>(constants + OFFSET(Constants,invMaskW4Q[0][0]) + xMask * 8);
-				c01 |= value;
-				*Pointer<Int>(buffer) = c01;
+				*Pointer<Int>(buffer) = (c01 & mask01) | (value & ~mask01);
 
 				buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
 				value = *Pointer<Int>(buffer);
 
 				Int c23 = Extract(As<Int2>(current.x), 1);
-
+				Int mask23 = *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][2]) + xMask * 8);
 				if(bgraWriteMask != 0x0000000F)
 				{
-					Int masked = value;
-					c23 &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[bgraWriteMask][0]));
-					masked &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[~bgraWriteMask & 0xF][0]));
-					c23 |= masked;
+					mask23 &= channelMask;
 				}
-
-				c23 &= *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][2]) + xMask * 8);
-				value &= *Pointer<Int>(constants + OFFSET(Constants,invMaskW4Q[0][2]) + xMask * 8);
-				c23 |= value;
-				*Pointer<Int>(buffer) = c23;
+				*Pointer<Int>(buffer) = (c23 & mask23) | (value & ~mask23);
 			}
 			break;
 		case VK_FORMAT_R5G6B5_UNORM_PACK16:
@@ -1443,38 +1431,26 @@
 				Pointer<Byte> buffer = cBuffer + 2 * x;
 				Int value = *Pointer<Int>(buffer);
 
-				Int c01 = Extract(As<Int2>(current.x), 0);
+				Int channelMask = *Pointer<Int>(constants + OFFSET(Constants,mask565Q[bgraWriteMask & 0x7][0]));
 
+				Int c01 = Extract(As<Int2>(current.x), 0);
+				Int mask01 = *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][0]) + xMask * 8);
 				if((bgraWriteMask & 0x00000007) != 0x00000007)
 				{
-					Int masked = value;
-					c01 &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[bgraWriteMask & 0x7][0]));
-					masked &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[~bgraWriteMask & 0x7][0]));
-					c01 |= masked;
+					mask01 &= channelMask;
 				}
-
-				c01 &= *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][0]) + xMask * 8);
-				value &= *Pointer<Int>(constants + OFFSET(Constants,invMaskW4Q[0][0]) + xMask * 8);
-				c01 |= value;
-				*Pointer<Int>(buffer) = c01;
+				*Pointer<Int>(buffer) = (c01 & mask01) | (value & ~mask01);
 
 				buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
 				value = *Pointer<Int>(buffer);
 
 				Int c23 = Extract(As<Int2>(current.x), 1);
-
+				Int mask23 = *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][2]) + xMask * 8);
 				if((bgraWriteMask & 0x00000007) != 0x00000007)
 				{
-					Int masked = value;
-					c23 &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[bgraWriteMask & 0x7][0]));
-					masked &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[~bgraWriteMask & 0x7][0]));
-					c23 |= masked;
+					mask23 &= channelMask;
 				}
-
-				c23 &= *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][2]) + xMask * 8);
-				value &= *Pointer<Int>(constants + OFFSET(Constants,invMaskW4Q[0][2]) + xMask * 8);
-				c23 |= value;
-				*Pointer<Int>(buffer) = c23;
+				*Pointer<Int>(buffer) = (c23 & mask23) | (value & ~mask23);
 			}
 			break;
 		case VK_FORMAT_B8G8R8A8_UNORM:
@@ -1482,35 +1458,24 @@
 			{
 				Pointer<Byte> buffer = cBuffer + x * 4;
 				Short4 value = *Pointer<Short4>(buffer);
+				Short4 channelMask = *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
 
-				if(bgraWriteMask != 0x0000000F)   // FIXME: Need for masking when XRGB && Fh?
+				Short4 mask01 = *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
+				if(bgraWriteMask != 0x0000000F)
 				{
-					Short4 masked = value;
-					c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
-					masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[bgraWriteMask][0]));
-					c01 |= masked;
+					mask01 &= channelMask;
 				}
-
-				c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
-				value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD01Q) + xMask * 8);
-				c01 |= value;
-				*Pointer<Short4>(buffer) = c01;
+				*Pointer<Short4>(buffer) = (c01 & mask01) | (value & ~mask01);
 
 				buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
 				value = *Pointer<Short4>(buffer);
 
-				if(bgraWriteMask != 0x0000000F)   // FIXME: Need for masking when XRGB && Fh?
+				Short4 mask23 = *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
+				if(bgraWriteMask != 0x0000000F)
 				{
-					Short4 masked = value;
-					c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
-					masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[bgraWriteMask][0]));
-					c23 |= masked;
+					mask23 &= channelMask;
 				}
-
-				c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
-				value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD23Q) + xMask * 8);
-				c23 |= value;
-				*Pointer<Short4>(buffer) = c23;
+				*Pointer<Short4>(buffer) = (c23 & mask23) | (value & ~mask23);
 			}
 			break;
 		case VK_FORMAT_R8G8B8A8_UNORM:
@@ -1520,37 +1485,24 @@
 			{
 				Pointer<Byte> buffer = cBuffer + x * 4;
 				Short4 value = *Pointer<Short4>(buffer);
+				Short4 channelMask = *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[rgbaWriteMask][0]));
 
-				bool masked = (rgbaWriteMask != 0x0000000F); // FIXME: Need for masking when XBGR && Fh?
-
-				if(masked)
+				Short4 mask01 = *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
+				if(rgbaWriteMask != 0x0000000F)
 				{
-					Short4 masked = value;
-					c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[rgbaWriteMask][0]));
-					masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[rgbaWriteMask][0]));
-					c01 |= masked;
+					mask01 &= channelMask;
 				}
-
-				c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
-				value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD01Q) + xMask * 8);
-				c01 |= value;
-				*Pointer<Short4>(buffer) = c01;
+				*Pointer<Short4>(buffer) = (c01 & mask01) | (value & ~mask01);
 
 				buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
 				value = *Pointer<Short4>(buffer);
 
-				if(masked)
+				Short4 mask23 = *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
+				if(rgbaWriteMask != 0x0000000F)
 				{
-					Short4 masked = value;
-					c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[rgbaWriteMask][0]));
-					masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[rgbaWriteMask][0]));
-					c23 |= masked;
+					mask23 &= channelMask;
 				}
-
-				c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
-				value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD23Q) + xMask * 8);
-				c23 |= value;
-				*Pointer<Short4>(buffer) = c23;
+				*Pointer<Short4>(buffer) = (c23 & mask23) | (value & ~mask23);
 			}
 			break;
 		case VK_FORMAT_R8G8_UNORM: