Optimize SPIR-V matrix operations using FMA
Optimize SPIR-V matrix operations using FMA

OpMatrixTimesVector, OpVectorTimesMatrix, OpMatrixTimesMatrix, and
OpDot each consist of dot products which can be optimized by making
use of fused multiply-add operations.

Note that the NoContraction decoration specifies that "the operation
cannot be combined with another instruction to form a single operation."
Thus it doesn't apply to the operations performed within a single
instruction. GLSL.std.450 OpFma more explicitly clarifies that
NoContraction does not affect it.

Bug: b/216472189
Change-Id: I04aa0bc2c90784cb2cfbe28034a0ec2af7fd24c9
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/66048
Reviewed-by: Alexis Hétu <1c7141772178a7e80858c3db5052b328076f08f4@google.com>
Kokoro-Result: kokoro <2ac7b1f3fa578934c95181d4272be0d3bca00121@google.com>
Tested-by: Nicolas Capens <51edc787c30f24c4904e8ffbb5523c3a9f7a451d@google.com>

google/swiftshader,google/swiftshader,google/swiftshader