Implement vector absolute value. Bug swiftshader:15 Change-Id: Ib22831ce669c68a790664839d18ea05668e90992 Reviewed-on: https://swiftshader-review.googlesource.com/7971 Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com> Reviewed-on: https://swiftshader-review.googlesource.com/8166 Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp index 62a240a..91a50eb 100644 --- a/src/Reactor/SubzeroReactor.cpp +++ b/src/Reactor/SubzeroReactor.cpp
@@ -3689,7 +3689,8 @@ RValue<Int4> Abs(RValue<Int4> x) { - assert(false && "UNIMPLEMENTED"); return RValue<Int4>(V(nullptr)); + auto negative = x >> 31; + return (x ^ negative) - negative; } RValue<Short8> MulHigh(RValue<Short8> x, RValue<Short8> y) @@ -6154,7 +6155,11 @@ RValue<Float4> Abs(RValue<Float4> x) { - assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr)); + Value *vector = Nucleus::createBitCast(x.value, Int4::getType()); + int64_t constantVector[4] = {0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF}; + Value *result = Nucleus::createAnd(vector, V(Nucleus::createConstantVector(constantVector, Int4::getType()))); + + return As<Float4>(result); } RValue<Float4> Max(RValue<Float4> x, RValue<Float4> y)