Make maskAny() SIMD width agnostic. This change also replaces two shift operations with a single compare operation. Bug: b/237494823 Change-Id: Ifec8b8741c362f1ee0ac66e2b3ed17f0909b1b9b Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/66870 Tested-by: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Pipeline/PixelProgram.cpp b/src/Pipeline/PixelProgram.cpp index 9933839..8307544 100644 --- a/src/Pipeline/PixelProgram.cpp +++ b/src/Pipeline/PixelProgram.cpp
@@ -34,7 +34,6 @@ // Union all cMask and return it as Booleans SIMD::Int PixelProgram::maskAny(Int cMask[4], const SampleSet &samples) { - ASSERT(SIMD::Width == 4); // See if at least 1 sample is used Int maskUnion = 0; for(unsigned int q : samples) @@ -43,17 +42,15 @@ } // Convert to Booleans - SIMD::Int laneBits = SIMD::Int(1, 2, 4, 8); - SIMD::Int laneShiftsToMSB = SIMD::Int(31, 30, 29, 28); + SIMD::Int laneBits = SIMD::Int([](int i) { return 1 << i; }); // 1, 2, 4, 8, ... SIMD::Int mask(maskUnion); - mask = ((mask & laneBits) << laneShiftsToMSB) >> 31; + mask = CmpNEQ(mask & laneBits, 0); return mask; } // Union all cMask/sMask/zMask and return it as Booleans SIMD::Int PixelProgram::maskAny(Int cMask[4], Int sMask[4], Int zMask[4], const SampleSet &samples) { - ASSERT(SIMD::Width == 4); // See if at least 1 sample is used Int maskUnion = 0; for(unsigned int q : samples) @@ -62,10 +59,9 @@ } // Convert to Booleans - SIMD::Int laneBits = SIMD::Int(1, 2, 4, 8); - SIMD::Int laneShiftsToMSB = SIMD::Int(31, 30, 29, 28); + SIMD::Int laneBits = SIMD::Int([](int i) { return 1 << i; }); // 1, 2, 4, 8, ... SIMD::Int mask(maskUnion); - mask = ((mask & laneBits) << laneShiftsToMSB) >> 31; + mask = CmpNEQ(mask & laneBits, 0); return mask; }