Commit 8960fbfe by Nicolas Capens Committed by Nicolas Capens

Emulate vector packing intrinsics.

Bug b/37496082 Change-Id: I993f34baf6169b0bc3c37742f6238dba38a67d0a Reviewed-on: https://swiftshader-review.googlesource.com/10955Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 98436737
...@@ -3609,6 +3609,22 @@ namespace sw ...@@ -3609,6 +3609,22 @@ namespace sw
RValue<SByte8> Pack(RValue<Short4> x, RValue<Short4> y) RValue<SByte8> Pack(RValue<Short4> x, RValue<Short4> y)
{ {
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 result;
}
else
{
Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8); 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}; 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 target = ::context->getConstantUndef(Ice::IceType_i32);
...@@ -3619,6 +3635,7 @@ namespace sw ...@@ -3619,6 +3635,7 @@ namespace sw
return As<SByte8>(Swizzle(As<Int4>(V(result)), 0x88)); return As<SByte8>(Swizzle(As<Int4>(V(result)), 0x88));
} }
}
RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y) RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
{ {
...@@ -3987,6 +4004,22 @@ namespace sw ...@@ -3987,6 +4004,22 @@ namespace sw
RValue<Byte8> Pack(RValue<UShort4> x, RValue<UShort4> y) RValue<Byte8> Pack(RValue<UShort4> x, RValue<UShort4> y)
{ {
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 result;
}
else
{
Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8); 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}; 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 target = ::context->getConstantUndef(Ice::IceType_i32);
...@@ -3997,6 +4030,7 @@ namespace sw ...@@ -3997,6 +4030,7 @@ namespace sw
return As<Byte8>(Swizzle(As<Int4>(V(result)), 0x88)); return As<Byte8>(Swizzle(As<Int4>(V(result)), 0x88));
} }
}
Type *UShort4::getType() Type *UShort4::getType()
{ {
...@@ -5862,6 +5896,22 @@ namespace sw ...@@ -5862,6 +5896,22 @@ namespace sw
RValue<Short8> Pack(RValue<Int4> x, RValue<Int4> y) RValue<Short8> Pack(RValue<Int4> x, RValue<Int4> y)
{ {
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 result;
}
else
{
Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 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}; 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 target = ::context->getConstantUndef(Ice::IceType_i32);
...@@ -5872,6 +5922,7 @@ namespace sw ...@@ -5872,6 +5922,7 @@ namespace sw
return RValue<Short8>(V(result)); return RValue<Short8>(V(result));
} }
}
RValue<Int> Extract(RValue<Int4> x, int i) RValue<Int> Extract(RValue<Int4> x, int i)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment