From 37fbecee519c3fc4502f48f42cced9797c85361f Mon Sep 17 00:00:00 2001 From: Nicolas Capens Date: Fri, 21 Oct 2016 15:08:56 -0400 Subject: [PATCH] Implement several vector shuffle operations. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Bug swiftshader:15 Change-Id: I3f670be22415433a0582b3335fb48040e5a171c3 Reviewed-on: https://swiftshader-review.googlesource.com/7790 Reviewed-by: Nicolas Capens Tested-by: Nicolas Capens Reviewed-on: https://swiftshader-review.googlesource.com/8141 Reviewed-by: Alexis Hétu --- src/Reactor/SubzeroReactor.cpp | 43 ++++++++++++++++++++++++++++++++++-------- third_party/pnacl-subzero | 2 +- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp index 48f336168..98c660e99 100644 --- a/src/Reactor/SubzeroReactor.cpp +++ b/src/Reactor/SubzeroReactor.cpp @@ -2542,12 +2542,14 @@ namespace sw RValue Unpack(RValue x) { - assert(false && "UNIMPLEMENTED"); return RValue(V(nullptr)); + int shuffle[16] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7}; // Real type is v16i8 + return RValue(Nucleus::createShuffleVector(x.value, x.value, shuffle)); } RValue UnpackLow(RValue x, RValue y) { - assert(false && "UNIMPLEMENTED"); return RValue(V(nullptr)); + int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8 + return RValue(Nucleus::createShuffleVector(x.value, y.value, shuffle)); } RValue UnpackHigh(RValue x, RValue y) @@ -2763,7 +2765,8 @@ namespace sw RValue UnpackLow(RValue x, RValue y) { - assert(false && "UNIMPLEMENTED"); return RValue(V(nullptr)); + int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8 + return RValue(Nucleus::createShuffleVector(x.value, y.value, shuffle)); } RValue UnpackHigh(RValue x, RValue y) @@ -3185,7 +3188,8 @@ namespace sw RValue UnpackLow(RValue x, RValue y) { - assert(false && "UNIMPLEMENTED"); return RValue(V(nullptr)); + int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11}; // Real type is v8i16 + return RValue(Nucleus::createShuffleVector(x.value, y.value, shuffle)); } RValue UnpackHigh(RValue x, RValue y) @@ -3195,7 +3199,20 @@ namespace sw RValue Swizzle(RValue x, unsigned char select) { - assert(false && "UNIMPLEMENTED"); return RValue(V(nullptr)); + // Real type is v8i16 + int shuffle[8] = + { + (select >> 0) & 0x03, + (select >> 2) & 0x03, + (select >> 4) & 0x03, + (select >> 6) & 0x03, + (select >> 0) & 0x03, + (select >> 2) & 0x03, + (select >> 4) & 0x03, + (select >> 6) & 0x03, + }; + + return RValue(Nucleus::createShuffleVector(x.value, x.value, shuffle)); } RValue Insert(RValue val, RValue element, int i) @@ -5955,17 +5972,27 @@ namespace sw RValue ShuffleLowHigh(RValue x, RValue y, unsigned char imm) { - assert(false && "UNIMPLEMENTED"); return RValue(V(nullptr)); + int shuffle[4] = + { + ((imm >> 0) & 0x03) + 0, + ((imm >> 2) & 0x03) + 0, + ((imm >> 4) & 0x03) + 4, + ((imm >> 6) & 0x03) + 4, + }; + + return RValue(Nucleus::createShuffleVector(x.value, y.value, shuffle)); } RValue UnpackLow(RValue x, RValue y) { - assert(false && "UNIMPLEMENTED"); return RValue(V(nullptr)); + int shuffle[4] = {0, 4, 1, 5}; + return RValue(Nucleus::createShuffleVector(x.value, y.value, shuffle)); } RValue UnpackHigh(RValue x, RValue y) { - assert(false && "UNIMPLEMENTED"); return RValue(V(nullptr)); + int shuffle[4] = {2, 6, 3, 7}; + return RValue(Nucleus::createShuffleVector(x.value, y.value, shuffle)); } RValue Mask(Float4 &lhs, RValue rhs, unsigned char select) diff --git a/third_party/pnacl-subzero b/third_party/pnacl-subzero index b001cc4c0..61593fb9d 160000 --- a/third_party/pnacl-subzero +++ b/third_party/pnacl-subzero @@ -1 +1 @@ -Subproject commit b001cc4c0bea8e13be1d6733ef0f96fe5706fc21 +Subproject commit 61593fb9d46f1b3d98878d4b90dcb07009b93fbc -- 2.11.0