From a4c30b054c6a5359483e2fcc9d4d5ed658831a45 Mon Sep 17 00:00:00 2001 From: Nicolas Capens Date: Tue, 8 Nov 2016 15:43:17 -0500 Subject: [PATCH] Implement vector masking. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Bug swiftshader:15 Change-Id: I6975f7a61ee232630b82e7844b8bc65088564827 Reviewed-on: https://swiftshader-review.googlesource.com/7959 Reviewed-by: Nicolas Capens Tested-by: Nicolas Capens Reviewed-on: https://swiftshader-review.googlesource.com/8164 Reviewed-by: Alexis Hétu --- src/Reactor/SubzeroReactor.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp index 198d58972..20843d53d 100644 --- a/src/Reactor/SubzeroReactor.cpp +++ b/src/Reactor/SubzeroReactor.cpp @@ -1065,7 +1065,17 @@ namespace sw static Value *createMask4(Value *lhs, Value *rhs, unsigned char select) { - assert(false && "UNIMPLEMENTED"); return nullptr; + int64_t mask[4] = {0, 0, 0, 0}; + + mask[(select >> 0) & 0x03] = -1; + mask[(select >> 2) & 0x03] = -1; + mask[(select >> 4) & 0x03] = -1; + mask[(select >> 6) & 0x03] = -1; + + Value *condition = Nucleus::createConstantVector(mask, T(Ice::IceType_v4i1)); + Value *result = Nucleus::createSelect(condition, rhs, lhs); + + return result; } Value *Nucleus::createConstantPointer(const void *address, Type *Ty, unsigned int align) @@ -1176,6 +1186,7 @@ namespace sw switch((int)reinterpret_cast(type)) { case Ice::IceType_v4i32: + case Ice::IceType_v4i1: { const int initializer[4] = {(int)i[0], (int)i[1], (int)i[2], (int)i[3]}; static_assert(sizeof(initializer) == vectorSize, "!"); @@ -1190,6 +1201,7 @@ namespace sw } break; case Ice::IceType_v8i16: + case Ice::IceType_v8i1: { const short initializer[8] = {(short)i[0], (short)i[1], (short)i[2], (short)i[3], (short)i[4], (short)i[5], (short)i[6], (short)i[7]}; static_assert(sizeof(initializer) == vectorSize, "!"); @@ -1197,6 +1209,7 @@ namespace sw } break; case Ice::IceType_v16i8: + case Ice::IceType_v16i1: { const char initializer[16] = {(char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[4], (char)i[5], (char)i[6], (char)i[7], (char)i[8], (char)i[9], (char)i[10], (char)i[11], (char)i[12], (char)i[13], (char)i[14], (char)i[15]}; static_assert(sizeof(initializer) == vectorSize, "!"); @@ -6230,10 +6243,10 @@ namespace sw RValue Mask(Float4 &lhs, RValue rhs, unsigned char select) { Value *vector = lhs.loadValue(); - Value *shuffle = createMask4(vector, rhs.value, select); - lhs.storeValue(shuffle); + Value *result = createMask4(vector, rhs.value, select); + lhs.storeValue(result); - return RValue(shuffle); + return RValue(result); } RValue SignMask(RValue x) -- 2.11.0