/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "op_logical.hxx" #include "formulagroup.hxx" #include "document.hxx" #include "formulacell.hxx" #include "tokenarray.hxx" #include "compiler.hxx" #include "interpre.hxx" #include #include using namespace formula; namespace sc { namespace opencl { void OpAnd::GenSlidingWindowFunction(std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; 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"; ss << " double t = 1,tmp=0;\n"; for(unsigned int j = 0; j< vSubArguments.size(); j++) { ss << " double tmp"<GetFormulaToken(); if(tmpCur0->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*pCurDVR= static_cast(tmpCur0); ss<< " int buffer_len"<GetArrayLength(); ss<< ";\n"; ss <<" if(gid0 >= buffer_len"<GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" tmp = 1;\n else\n"; ss <<" tmp = "; ss <GenSlidingWindowDeclRef()<<";\n"; ss <<" tmp"<GetType() == formula::svDouble) { ss <<" tmp = "; ss <GenSlidingWindowDeclRef()<<";\n"; ss <<" tmp"<GetType() == formula::svDoubleVectorRef) { const formula::DoubleVectorRefToken*pCurDVR= static_cast(tmpCur0); size_t nCurWindowSize = pCurDVR->GetArrayLength() < pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength(): pCurDVR->GetRefRowSize() ; ss << " for(int i = "; if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) { ss << "gid0; i < " << nCurWindowSize << "; i++) {\n"; } else if(pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()){ ss << "0; i < gid0 + " << nCurWindowSize << "; i++) {\n"; } else{ ss << "0; i < " << nCurWindowSize << "; i++) {\n"; } #ifdef ISNAN if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) { ss <<" if(isNan("<GenSlidingWindowDeclRef(); ss <<")||i+gid0>="<GetArrayLength(); ss <<")\n"; ss <<" tmp = 1;\n else\n"; } else { ss <<" if(isNan("<GenSlidingWindowDeclRef(); ss <<")||i>="<GetArrayLength(); ss <<")\n"; ss <<" tmp = 1;\n else\n"; } #endif ss <<" tmp = "; ss <GenSlidingWindowDeclRef()<<";\n"; ss <<" tmp"<GenSlidingWindowDecl(ss); } ss << ") {\n"; ss << " int gid0 = get_global_id(0);\n"; ss << " double t = 0,tmp=0;\n"; for(unsigned int j = 0; j< vSubArguments.size(); j++) { ss << " double tmp"<GetFormulaToken(); if(tmpCur0->GetType() == formula::svSingleVectorRef) { #ifdef ISNAN const formula::SingleVectorRefToken*pCurDVR= static_cast(tmpCur0); ss<< " int buffer_len"<GetArrayLength(); ss<< ";\n"; ss <<" if(gid0 >= buffer_len"<GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" tmp = 0;\n else\n"; #endif ss <<" tmp = "; ss <GenSlidingWindowDeclRef()<<";\n"; ss <<" tmp"<GetType() == formula::svDouble) { ss <<" tmp = "; ss <GenSlidingWindowDeclRef()<<";\n"; ss <<" tmp"<GetType() == formula::svDoubleVectorRef) { const formula::DoubleVectorRefToken*pCurDVR= static_cast(tmpCur0); size_t nCurWindowSize = pCurDVR->GetArrayLength() < pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength(): pCurDVR->GetRefRowSize() ; ss << " for(int i = "; if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) { ss << "gid0; i < " << nCurWindowSize << "; i++) {\n"; } else if(pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()){ ss << "0; i < gid0 + " << nCurWindowSize << "; i++) {\n"; } else{ ss << "0; i < " << nCurWindowSize << "; i++) {\n"; } #ifdef ISNAN if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) { ss <<" if(isNan("<GenSlidingWindowDeclRef(); ss <<")||i+gid0>="<GetArrayLength(); ss <<")\n"; ss <<" tmp = 0;\n else\n"; } else { ss <<" if(isNan("<GenSlidingWindowDeclRef(); ss <<")||i>="<GetArrayLength(); ss <<")\n"; ss <<" tmp = 0;\n else\n"; } #endif ss <<" tmp = "; ss <GenSlidingWindowDeclRef()<<";\n"; ss <<" tmp"<GenSlidingWindowDecl(ss); } ss << ") {\n"; ss << " int gid0 = get_global_id(0);\n"; ss << " double tmp=0;\n"; FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); if(tmpCur0->GetType() == formula::svSingleVectorRef) { #ifdef ISNAN const formula::SingleVectorRefToken*pCurDVR= static_cast(tmpCur0); ss <<" if(gid0 >= "<GetArrayLength()<<" || isNan("; ss <GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" tmp = 0;\n else\n"; #endif ss <<" tmp = "; ss <GenSlidingWindowDeclRef()<<";\n"; ss <<" tmp = (tmp == 0.0);\n"; } else if(tmpCur0->GetType() == formula::svDouble) { ss <<" tmp = "; ss <GenSlidingWindowDeclRef()<<";\n"; ss <<" tmp = (tmp == 0.0);\n"; } ss << " return tmp;\n"; ss << "}\n"; } void OpXor::GenSlidingWindowFunction(std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; 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"; ss << " int t = 0,tmp0 = 0;\n"; ss << " double tmp = 0;\n"; for(unsigned int j = 0; j< vSubArguments.size(); j++) { FormulaToken *tmpCur0 = vSubArguments[j]->GetFormulaToken(); if(tmpCur0->GetType() == formula::svSingleVectorRef) { #ifdef ISNAN const formula::SingleVectorRefToken*pCurDVR= static_cast(tmpCur0); ss <<" if(gid0 >= "<GetArrayLength()<<" || isNan("; ss <GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" tmp = 0;\n else\n"; #endif ss <<" tmp = "; ss <GenSlidingWindowDeclRef()<<";\n"; ss <<" tmp0 = (tmp != 0);\n"; ss <<" t = t ^tmp0;\n"; } else if(tmpCur0->GetType() == formula::svDouble) { ss <<" tmp = "; ss <GenSlidingWindowDeclRef()<<";\n"; ss <<" tmp0 = (tmp != 0);\n"; ss <<" t = t ^tmp0;\n"; } else if(tmpCur0->GetType() == formula::svDoubleVectorRef) { const formula::DoubleVectorRefToken*pCurDVR= static_cast(tmpCur0); size_t nCurWindowSize = pCurDVR->GetArrayLength() < pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength(): pCurDVR->GetRefRowSize() ; ss << " for(int i = "; if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) { ss << "gid0; i < " << nCurWindowSize << "; i++) {\n"; } else if(pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()){ ss << "0; i < gid0 + " << nCurWindowSize << "; i++) {\n"; } else{ ss << "0; i < " << nCurWindowSize << "; i++) {\n"; } #ifdef ISNAN if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) { ss <<" if(isNan("<GenSlidingWindowDeclRef(); ss <<")||i+gid0>="<GetArrayLength(); ss <<")\n"; ss <<" tmp = 0;\n else\n"; } else { ss <<" if(isNan("<GenSlidingWindowDeclRef(); ss <<")||i>="<GetArrayLength(); ss <<")\n"; ss <<" tmp = 0;\n else\n"; } #endif ss <<" tmp = "; ss <GenSlidingWindowDeclRef()<<";\n"; ss <<" tmp0 = (tmp != 0);\n"; ss <<" t = t ^tmp0;\n"; ss <<" }\n"; } } ss << " return t;\n"; ss << "}\n"; } void OpIf::GenSlidingWindowFunction(std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; 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 { if(vSubArguments.size()==3) { 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"; } if(vSubArguments.size()==2) { ss << " if(isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << ")|| "; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << " == 0)\n"; ss << " return 0;\n"; ss << " else"; ss <<" return "; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss <<";\n"; } if(vSubArguments.size()==1) { ss << " if(isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << ")|| "; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << " == 0)\n"; ss << " return 0;\n"; ss << " else"; ss <<" return 1;\n"; } } ss << "}\n"; } }} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */