Implement Concatenate() and Insert() for Int2. Change-Id: I2f5bbf0cab904a9500a6219bd6a218cb877611fa Reviewed-on: https://swiftshader-review.googlesource.com/3142 Reviewed-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Reactor/Nucleus.cpp b/src/Reactor/Nucleus.cpp index 49ec859..ee082e6 100644 --- a/src/Reactor/Nucleus.cpp +++ b/src/Reactor/Nucleus.cpp
@@ -4824,6 +4824,17 @@ } } + RValue<Int2> Concatenate(RValue<Int> lo, RValue<Int> hi) + { + Constant *shuffle[2]; + shuffle[0] = Nucleus::createConstantInt(0); + shuffle[1] = Nucleus::createConstantInt(1); + + Value *packed = Nucleus::createShuffleVector(Nucleus::createBitCast(lo.value, VectorType::get(Int::getType(), 1)), Nucleus::createBitCast(hi.value, VectorType::get(Int::getType(), 1)), Nucleus::createConstantVector(shuffle, 2)); + + return RValue<Int2>(Nucleus::createBitCast(packed, Int2::getType())); + } + RValue<Int> Extract(RValue<Int2> val, int i) { if(false) // FIXME: LLVM does not generate optimal code @@ -4845,11 +4856,10 @@ } } - // FIXME: Crashes LLVM -// RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i) -// { -// return RValue<Int2>(Nucleus::createInsertElement(val.value, element.value, Nucleus::createConstantInt(i))); -// } + RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i) + { + return RValue<Int2>(Nucleus::createBitCast(Nucleus::createInsertElement(Nucleus::createBitCast(val.value, VectorType::get(Int::getType(), 2)), element.value, i), Int2::getType())); + } Type *Int2::getType() {
diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp index 59d43e0..6f39e68 100644 --- a/src/Reactor/Nucleus.hpp +++ b/src/Reactor/Nucleus.hpp
@@ -1555,8 +1555,9 @@ // RValue<Int2> RoundInt(RValue<Float4> cast); RValue<Long1> UnpackLow(RValue<Int2> x, RValue<Int2> y); RValue<Long1> UnpackHigh(RValue<Int2> x, RValue<Int2> y); + RValue<Int2> Concatenate(RValue<Int> lo, RValue<Int> hi); RValue<Int> Extract(RValue<Int2> val, int i); -// RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i); + RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i); class UInt2 : public Variable<UInt2> {