Implement vector sign mask operations. Bug swiftshader:15 Change-Id: I0d9cb2daeea931994abeb63f0939879875d4e81f Reviewed-on: https://swiftshader-review.googlesource.com/7791 Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com> Reviewed-on: https://swiftshader-review.googlesource.com/8148 Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp index fa55b44..a8c2b74 100644 --- a/src/Reactor/SubzeroReactor.cpp +++ b/src/Reactor/SubzeroReactor.cpp
@@ -2778,7 +2778,14 @@ RValue<Int> SignMask(RValue<SByte8> x) { - assert(false && "UNIMPLEMENTED"); return RValue<Int>(V(nullptr)); + Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32); + const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; + auto target = ::context->getConstantUndef(Ice::IceType_i32); + auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic); + movmsk->addArg(x.value); + ::basicBlock->appendInst(movmsk); + + return RValue<Int>(V(result)); } RValue<Byte8> CmpGT(RValue<SByte8> x, RValue<SByte8> y) @@ -5182,7 +5189,14 @@ RValue<Int> SignMask(RValue<Int4> x) { - assert(false && "UNIMPLEMENTED"); return RValue<Int>(V(nullptr)); + Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32); + const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; + auto target = ::context->getConstantUndef(Ice::IceType_i32); + auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic); + movmsk->addArg(x.value); + ::basicBlock->appendInst(movmsk); + + return RValue<Int>(V(result)); } RValue<Int4> Swizzle(RValue<Int4> x, unsigned char select) @@ -6004,7 +6018,14 @@ RValue<Int> SignMask(RValue<Float4> x) { - assert(false && "UNIMPLEMENTED"); return RValue<Int>(V(nullptr)); + Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32); + const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; + auto target = ::context->getConstantUndef(Ice::IceType_i32); + auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic); + movmsk->addArg(x.value); + ::basicBlock->appendInst(movmsk); + + return RValue<Int>(V(result)); } RValue<Int4> CmpEQ(RValue<Float4> x, RValue<Float4> y)