Kaydet (Commit) a79817c8 authored tarafından haochen's avatar haochen Kaydeden (comit) Markus Mohrhard

GPU Calc:Support IF formula in GPUInterpret

Change-Id: I9b2cebb99812d28e25c961129f73585d60690846
üst bf18bb2a
......@@ -1682,6 +1682,18 @@ public:
}
virtual std::string BinFuncName(void) const SAL_OVERRIDE { return "leq"; }
};
class OpLess: public Binary {
public:
virtual std::string GetBottom(void) SAL_OVERRIDE { return "0"; }
virtual std::string Gen2(const std::string &lhs, const std::string &rhs) const SAL_OVERRIDE
{
std::stringstream ss;
ss << "("<< lhs << "<" << rhs <<")";
return ss.str();
}
virtual std::string BinFuncName(void) const SAL_OVERRIDE { return "less"; }
};
class OpGreater: public Binary {
public:
......@@ -2267,6 +2279,9 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(
case ocLessEqual:
mvSubArguments.push_back(SoPHelper(ts, ft->Children[i], new OpLessEqual));
break;
case ocLess:
mvSubArguments.push_back(SoPHelper(ts, ft->Children[i], new OpLess));
break;
case ocEqual:
mvSubArguments.push_back(SoPHelper(ts, ft->Children[i], new OpEqual));
break;
......@@ -2872,6 +2887,10 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(
mvSubArguments.push_back(SoPHelper(ts,
ft->Children[i], new OpAveDev));
break;
case ocIf:
mvSubArguments.push_back(SoPHelper(ts,
ft->Children[i], new OpIf));
break;
case ocExternal:
if ( !(pChild->GetExternal().compareTo(OUString(
"com.sun.star.sheet.addin.Analysis.getEffect"))))
......
......@@ -314,6 +314,43 @@ void OpXor::GenSlidingWindowFunction(std::stringstream &ss,
ss << " return t;\n";
ss << "}\n";
}
void OpIf::GenSlidingWindowFunction(std::stringstream &ss,
const std::string &sSymName, SubArguments &vSubArguments)
{
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
if(vSubArguments.size()!=3) throw Unhandled("unknown operand for ocPush");
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ") {\n";
ss << " int gid0 = get_global_id(0);\n";
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
if(tmpCur0->GetType() == formula::svDoubleVectorRef)
{
throw UnhandledToken(tmpCur0, "unknown operand for ocPush");
}
else
{
ss << " if(isNan(";
ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ")|| ";
ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " == 0)\n";
ss << " return ";
ss << vSubArguments[2]->GenSlidingWindowDeclRef();
ss << ";\n";
ss << " else";
ss <<" return ";
ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss <<";\n";
}
ss << "}\n";
}
}}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -44,6 +44,13 @@ public:
const std::string &sSymName, SubArguments &vSubArguments) SAL_OVERRIDE;
virtual std::string BinFuncName(void) const SAL_OVERRIDE { return "Xor"; }
};
class OpIf:public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string &sSymName, SubArguments &vSubArguments) SAL_OVERRIDE;
virtual std::string BinFuncName(void) const SAL_OVERRIDE { return "IF"; }
};
}}
......
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