Emulate vector packing intrinsics. Bug b/37496082 Change-Id: I993f34baf6169b0bc3c37742f6238dba38a67d0a Reviewed-on: https://swiftshader-review.googlesource.com/10955 Tested-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp index e2f6127..c1639ae 100644 --- a/src/Reactor/SubzeroReactor.cpp +++ b/src/Reactor/SubzeroReactor.cpp
@@ -3609,15 +3609,32 @@ RValue<SByte8> Pack(RValue<Short4> x, RValue<Short4> y) { - 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); + if(emulateIntrinsics) + { + SByte8 result; + result = Insert(result, Saturate(Extract(x, 0)), 0); + result = Insert(result, Saturate(Extract(x, 1)), 1); + result = Insert(result, Saturate(Extract(x, 2)), 2); + result = Insert(result, Saturate(Extract(x, 3)), 3); + result = Insert(result, Saturate(Extract(y, 0)), 4); + result = Insert(result, Saturate(Extract(y, 1)), 5); + result = Insert(result, Saturate(Extract(y, 2)), 6); + result = Insert(result, Saturate(Extract(y, 3)), 7); - return As<SByte8>(Swizzle(As<Int4>(V(result)), 0x88)); + return result; + } + else + { + 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 As<SByte8>(Swizzle(As<Int4>(V(result)), 0x88)); + } } RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y) @@ -3987,15 +4004,32 @@ RValue<Byte8> Pack(RValue<UShort4> x, RValue<UShort4> y) { - 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); + if(emulateIntrinsics) + { + Byte8 result; + result = Insert(result, Saturate(Extract(x, 0)), 0); + result = Insert(result, Saturate(Extract(x, 1)), 1); + result = Insert(result, Saturate(Extract(x, 2)), 2); + result = Insert(result, Saturate(Extract(x, 3)), 3); + result = Insert(result, Saturate(Extract(y, 0)), 4); + result = Insert(result, Saturate(Extract(y, 1)), 5); + result = Insert(result, Saturate(Extract(y, 2)), 6); + result = Insert(result, Saturate(Extract(y, 3)), 7); - return As<Byte8>(Swizzle(As<Int4>(V(result)), 0x88)); + return result; + } + else + { + 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 As<Byte8>(Swizzle(As<Int4>(V(result)), 0x88)); + } } Type *UShort4::getType() @@ -5862,15 +5896,32 @@ RValue<Short8> Pack(RValue<Int4> x, RValue<Int4> y) { - 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); + if(emulateIntrinsics) + { + Short8 result; + result = Insert(result, Saturate(Extract(x, 0)), 0); + result = Insert(result, Saturate(Extract(x, 1)), 1); + result = Insert(result, Saturate(Extract(x, 2)), 2); + result = Insert(result, Saturate(Extract(x, 3)), 3); + result = Insert(result, Saturate(Extract(y, 0)), 4); + result = Insert(result, Saturate(Extract(y, 1)), 5); + result = Insert(result, Saturate(Extract(y, 2)), 6); + result = Insert(result, Saturate(Extract(y, 3)), 7); - return RValue<Short8>(V(result)); + return result; + } + else + { + 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)