OSDN Git Service

Emulate MultiplyAddPairs intrinsic.
authorNicolas Capens <capn@google.com>
Tue, 25 Jul 2017 19:32:12 +0000 (15:32 -0400)
committerNicolas Capens <nicolascapens@google.com>
Wed, 26 Jul 2017 19:28:55 +0000 (19:28 +0000)
Bug b/37496078

Change-Id: I2940cee7a7b174c98f28282831c414c1f524702d
Reviewed-on: https://swiftshader-review.googlesource.com/10933
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
src/Reactor/SubzeroReactor.cpp

index c199464..6c2adf0 100644 (file)
@@ -3609,15 +3609,26 @@ namespace sw
 
        RValue<Int2> MulAdd(RValue<Short4> x, RValue<Short4> y)
        {
-               Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
-               const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::MultiplyAddPairs, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
-               auto target = ::context->getConstantUndef(Ice::IceType_i32);
-               auto pmaddwd = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
-               pmaddwd->addArg(x.value);
-               pmaddwd->addArg(y.value);
-               ::basicBlock->appendInst(pmaddwd);
+               if(emulateIntrinsics)
+               {
+                       Int2 result;
+                       result = Insert(result, Int(Extract(x, 0)) * Int(Extract(y, 0)) + Int(Extract(x, 1)) * Int(Extract(y, 1)), 0);
+                       result = Insert(result, Int(Extract(x, 2)) * Int(Extract(y, 2)) + Int(Extract(x, 3)) * Int(Extract(y, 3)), 1);
 
-               return As<Int2>(V(result));
+                       return result;
+               }
+               else
+               {
+                       Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
+                       const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::MultiplyAddPairs, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
+                       auto target = ::context->getConstantUndef(Ice::IceType_i32);
+                       auto pmaddwd = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
+                       pmaddwd->addArg(x.value);
+                       pmaddwd->addArg(y.value);
+                       ::basicBlock->appendInst(pmaddwd);
+
+                       return As<Int2>(V(result));
+               }
        }
 
        RValue<SByte8> Pack(RValue<Short4> x, RValue<Short4> y)