Implement vector packing. Bug swiftshader:15 Change-Id: I3b20ba10e71c7813c35b16ae6c7382bfe4e0ae00 Reviewed-on: https://swiftshader-review.googlesource.com/7851 Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com> Reviewed-on: https://swiftshader-review.googlesource.com/8150 Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp index d169de1..c15ea8e 100644 --- a/src/Reactor/SubzeroReactor.cpp +++ b/src/Reactor/SubzeroReactor.cpp
@@ -3192,7 +3192,15 @@ RValue<SByte8> Pack(RValue<Short4> x, RValue<Short4> y) { - assert(false && "UNIMPLEMENTED"); return RValue<SByte8>(V(nullptr)); + Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8); + const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; + auto target = ::context->getConstantUndef(Ice::IceType_i32); + auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); + pack->addArg(x.value); + pack->addArg(y.value); + ::basicBlock->appendInst(pack); + + return RValue<SByte8>(V(result)); } RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y) @@ -3481,7 +3489,15 @@ RValue<Byte8> Pack(RValue<UShort4> x, RValue<UShort4> y) { - assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(V(nullptr)); + Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8); + const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; + auto target = ::context->getConstantUndef(Ice::IceType_i32); + auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); + pack->addArg(x.value); + pack->addArg(y.value); + ::basicBlock->appendInst(pack); + + return RValue<Byte8>(V(result)); } Type *UShort4::getType() @@ -5180,7 +5196,15 @@ RValue<Short8> Pack(RValue<Int4> x, RValue<Int4> y) { - assert(false && "UNIMPLEMENTED"); return RValue<Short8>(V(nullptr)); + Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); + const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; + auto target = ::context->getConstantUndef(Ice::IceType_i32); + auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); + pack->addArg(x.value); + pack->addArg(y.value); + ::basicBlock->appendInst(pack); + + return RValue<Short8>(V(result)); } RValue<Int> Extract(RValue<Int4> x, int i) @@ -5496,7 +5520,15 @@ RValue<UShort8> Pack(RValue<UInt4> x, RValue<UInt4> y) { - assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(V(nullptr)); + Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); + const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; + auto target = ::context->getConstantUndef(Ice::IceType_i32); + auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); + pack->addArg(x.value); + pack->addArg(y.value); + ::basicBlock->appendInst(pack); + + return RValue<UShort8>(V(result)); } Type *UInt4::getType()