Optimize fragment input interpolation using FMA

Bug: b/216472189
Change-Id: Idc3800b70c203f860afe78018cbcebb7e6884089
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/63769
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Sean Risser <srisser@google.com>
diff --git a/src/Device/QuadRasterizer.cpp b/src/Device/QuadRasterizer.cpp
index 6414419..c93a4da 100644
--- a/src/Device/QuadRasterizer.cpp
+++ b/src/Device/QuadRasterizer.cpp
@@ -232,16 +232,16 @@
 
 Float4 QuadRasterizer::interpolate(Float4 &x, Float4 &D, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective)
 {
-	Float4 interpolant = D;
-
-	if(!flat)
+	if(flat)
 	{
-		interpolant += x * *Pointer<Float4>(planeEquation + OFFSET(PlaneEquation, A), 16);
+		return D;
+	}
 
-		if(perspective)
-		{
-			interpolant *= rhw;
-		}
+	Float4 interpolant = MulAdd(x, *Pointer<Float4>(planeEquation + OFFSET(PlaneEquation, A), 16), D);
+
+	if(perspective)
+	{
+		interpolant *= rhw;
 	}
 
 	return interpolant;