Bump version to 4.3-4
[LibreOffice.git] / sc / source / core / opencl / op_logical.cxx
blob96170f2293f37faa178129d51fc957c413614a8b
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
10 #include "op_logical.hxx"
12 #include "formulagroup.hxx"
13 #include "document.hxx"
14 #include "formulacell.hxx"
15 #include "tokenarray.hxx"
16 #include "compiler.hxx"
17 #include "interpre.hxx"
18 #include <formula/vectortoken.hxx>
19 #include <sstream>
22 using namespace formula;
24 namespace sc { namespace opencl {
25 void OpAnd::GenSlidingWindowFunction(std::stringstream &ss,
26 const std::string &sSymName, SubArguments &vSubArguments)
28 ss << "\ndouble " << sSymName;
29 ss << "_"<< BinFuncName() <<"(";
30 for (unsigned i = 0; i < vSubArguments.size(); i++)
32 if (i)
33 ss << ",";
34 vSubArguments[i]->GenSlidingWindowDecl(ss);
36 ss << ") {\n";
37 ss << " int gid0 = get_global_id(0);\n";
38 ss << " double t = 1,tmp=0;\n";
39 for(unsigned int j = 0; j< vSubArguments.size(); j++)
41 ss << " double tmp"<<j<<" = 1;\n";
42 FormulaToken *tmpCur0 = vSubArguments[j]->GetFormulaToken();
43 if(tmpCur0->GetType() == formula::svSingleVectorRef)
45 const formula::SingleVectorRefToken*pCurDVR= static_cast<const
46 formula::SingleVectorRefToken *>(tmpCur0);
47 ss<< " int buffer_len"<<j<<" = "<<pCurDVR->GetArrayLength();
48 ss<< ";\n";
49 ss <<" if(gid0 >= buffer_len"<<j<<" || isNan(";
50 ss <<vSubArguments[j]->GenSlidingWindowDeclRef();
51 ss <<"))\n";
52 ss <<" tmp = 1;\n else\n";
53 ss <<" tmp = ";
54 ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
55 ss <<" tmp"<<j<<" = tmp"<<j<<" && tmp;\n";
57 else if(tmpCur0->GetType() == formula::svDouble)
59 ss <<" tmp = ";
60 ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
61 ss <<" tmp"<<j<<" = tmp"<<j<<" && tmp;\n";
63 else if(tmpCur0->GetType() == formula::svDoubleVectorRef)
65 const formula::DoubleVectorRefToken*pCurDVR= static_cast<const
66 formula::DoubleVectorRefToken *>(tmpCur0);
67 size_t nCurWindowSize = pCurDVR->GetArrayLength() <
68 pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
69 pCurDVR->GetRefRowSize() ;
70 ss << " for(int i = ";
71 if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) {
72 ss << "gid0; i < " << nCurWindowSize << "; i++) {\n";
74 else if(pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()){
75 ss << "0; i < gid0 + " << nCurWindowSize << "; i++) {\n";
77 else{
78 ss << "0; i < " << nCurWindowSize << "; i++) {\n";
80 #ifdef ISNAN
81 if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
83 ss <<" if(isNan("<<vSubArguments[j]->GenSlidingWindowDeclRef();
84 ss <<")||i+gid0>="<<pCurDVR->GetArrayLength();
85 ss <<")\n";
86 ss <<" tmp = 1;\n else\n";
88 else
90 ss <<" if(isNan("<<vSubArguments[j]->GenSlidingWindowDeclRef();
91 ss <<")||i>="<<pCurDVR->GetArrayLength();
92 ss <<")\n";
93 ss <<" tmp = 1;\n else\n";
95 #endif
96 ss <<" tmp = ";
97 ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
98 ss <<" tmp"<<j<<" = tmp"<<j<<" && tmp;\n";
99 ss <<" }\n";
101 else
103 ss <<" tmp"<<j<<" = ";
104 ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
106 ss <<" t = t && tmp"<<j<<";\n";
108 ss << " return t;\n";
109 ss << "}\n";
112 void OpOr::GenSlidingWindowFunction(std::stringstream &ss,
113 const std::string &sSymName, SubArguments &vSubArguments)
115 ss << "\ndouble " << sSymName;
116 ss << "_"<< BinFuncName() <<"(";
117 for (unsigned i = 0; i < vSubArguments.size(); i++)
119 if (i)
120 ss << ",";
121 vSubArguments[i]->GenSlidingWindowDecl(ss);
123 ss << ") {\n";
124 ss << " int gid0 = get_global_id(0);\n";
125 ss << " double t = 0,tmp=0;\n";
126 for(unsigned int j = 0; j< vSubArguments.size(); j++)
128 ss << " double tmp"<<j<<" = 0;\n";
129 FormulaToken *tmpCur0 = vSubArguments[j]->GetFormulaToken();
130 if(tmpCur0->GetType() == formula::svSingleVectorRef)
132 #ifdef ISNAN
133 const formula::SingleVectorRefToken*pCurDVR= static_cast<const
134 formula::SingleVectorRefToken *>(tmpCur0);
135 ss<< " int buffer_len"<<j<<" = "<<pCurDVR->GetArrayLength();
136 ss<< ";\n";
137 ss <<" if(gid0 >= buffer_len"<<j<<" || isNan(";
138 ss <<vSubArguments[j]->GenSlidingWindowDeclRef();
139 ss <<"))\n";
140 ss <<" tmp = 0;\n else\n";
141 #endif
142 ss <<" tmp = ";
143 ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
144 ss <<" tmp"<<j<<" = tmp"<<j<<" || tmp;\n";
146 else if(tmpCur0->GetType() == formula::svDouble)
148 ss <<" tmp = ";
149 ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
150 ss <<" tmp"<<j<<" = tmp"<<j<<" || tmp;\n";
152 else if(tmpCur0->GetType() == formula::svDoubleVectorRef)
154 const formula::DoubleVectorRefToken*pCurDVR= static_cast<const
155 formula::DoubleVectorRefToken *>(tmpCur0);
156 size_t nCurWindowSize = pCurDVR->GetArrayLength() <
157 pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
158 pCurDVR->GetRefRowSize() ;
159 ss << " for(int i = ";
160 if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) {
161 ss << "gid0; i < " << nCurWindowSize << "; i++) {\n";
163 else if(pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()){
164 ss << "0; i < gid0 + " << nCurWindowSize << "; i++) {\n";
166 else{
167 ss << "0; i < " << nCurWindowSize << "; i++) {\n";
169 #ifdef ISNAN
170 if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
172 ss <<" if(isNan("<<vSubArguments[j]->GenSlidingWindowDeclRef();
173 ss <<")||i+gid0>="<<pCurDVR->GetArrayLength();
174 ss <<")\n";
175 ss <<" tmp = 0;\n else\n";
177 else
179 ss <<" if(isNan("<<vSubArguments[j]->GenSlidingWindowDeclRef();
180 ss <<")||i>="<<pCurDVR->GetArrayLength();
181 ss <<")\n";
182 ss <<" tmp = 0;\n else\n";
184 #endif
185 ss <<" tmp = ";
186 ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
187 ss <<" tmp"<<j<<" = tmp"<<j<<" || tmp;\n";
188 ss <<" }\n";
190 ss <<" t = t || tmp"<<j<<";\n";
192 ss << " return t;\n";
193 ss << "}\n";
195 void OpNot::GenSlidingWindowFunction(std::stringstream &ss,
196 const std::string &sSymName, SubArguments &vSubArguments)
198 ss << "\ndouble " << sSymName;
199 ss << "_"<< BinFuncName() <<"(";
200 for (unsigned i = 0; i < vSubArguments.size(); i++)
202 if (i)
203 ss << ",";
204 vSubArguments[i]->GenSlidingWindowDecl(ss);
206 ss << ") {\n";
207 ss << " int gid0 = get_global_id(0);\n";
208 ss << " double tmp=0;\n";
209 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
210 if(tmpCur0->GetType() == formula::svSingleVectorRef)
212 #ifdef ISNAN
213 const formula::SingleVectorRefToken*pCurDVR= static_cast<const
214 formula::SingleVectorRefToken *>(tmpCur0);
215 ss <<" if(gid0 >= "<<pCurDVR->GetArrayLength()<<" || isNan(";
216 ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
217 ss <<"))\n";
218 ss <<" tmp = 0;\n else\n";
219 #endif
220 ss <<" tmp = ";
221 ss <<vSubArguments[0]->GenSlidingWindowDeclRef()<<";\n";
222 ss <<" tmp = (tmp == 0.0);\n";
224 else if(tmpCur0->GetType() == formula::svDouble)
226 ss <<" tmp = ";
227 ss <<vSubArguments[0]->GenSlidingWindowDeclRef()<<";\n";
228 ss <<" tmp = (tmp == 0.0);\n";
230 ss << " return tmp;\n";
231 ss << "}\n";
234 void OpXor::GenSlidingWindowFunction(std::stringstream &ss,
235 const std::string &sSymName, SubArguments &vSubArguments)
237 ss << "\ndouble " << sSymName;
238 ss << "_"<< BinFuncName() <<"(";
239 for (unsigned i = 0; i < vSubArguments.size(); i++)
241 if (i)
242 ss << ",";
243 vSubArguments[i]->GenSlidingWindowDecl(ss);
245 ss << ") {\n";
246 ss << " int gid0 = get_global_id(0);\n";
247 ss << " int t = 0,tmp0 = 0;\n";
248 ss << " double tmp = 0;\n";
249 for(unsigned int j = 0; j< vSubArguments.size(); j++)
251 FormulaToken *tmpCur0 = vSubArguments[j]->GetFormulaToken();
252 if(tmpCur0->GetType() == formula::svSingleVectorRef)
254 #ifdef ISNAN
255 const formula::SingleVectorRefToken*pCurDVR= static_cast<const
256 formula::SingleVectorRefToken *>(tmpCur0);
257 ss <<" if(gid0 >= "<<pCurDVR->GetArrayLength()<<" || isNan(";
258 ss <<vSubArguments[j]->GenSlidingWindowDeclRef();
259 ss <<"))\n";
260 ss <<" tmp = 0;\n else\n";
261 #endif
262 ss <<" tmp = ";
263 ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
264 ss <<" tmp0 = (tmp != 0);\n";
265 ss <<" t = t ^tmp0;\n";
267 else if(tmpCur0->GetType() == formula::svDouble)
269 ss <<" tmp = ";
270 ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
271 ss <<" tmp0 = (tmp != 0);\n";
272 ss <<" t = t ^tmp0;\n";
274 else if(tmpCur0->GetType() == formula::svDoubleVectorRef)
276 const formula::DoubleVectorRefToken*pCurDVR= static_cast<const
277 formula::DoubleVectorRefToken *>(tmpCur0);
278 size_t nCurWindowSize = pCurDVR->GetArrayLength() <
279 pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
280 pCurDVR->GetRefRowSize() ;
281 ss << " for(int i = ";
282 if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) {
283 ss << "gid0; i < " << nCurWindowSize << "; i++) {\n";
285 else if(pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()){
286 ss << "0; i < gid0 + " << nCurWindowSize << "; i++) {\n";
288 else{
289 ss << "0; i < " << nCurWindowSize << "; i++) {\n";
291 #ifdef ISNAN
292 if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
294 ss <<" if(isNan("<<vSubArguments[j]->GenSlidingWindowDeclRef();
295 ss <<")||i+gid0>="<<pCurDVR->GetArrayLength();
296 ss <<")\n";
297 ss <<" tmp = 0;\n else\n";
299 else
301 ss <<" if(isNan("<<vSubArguments[j]->GenSlidingWindowDeclRef();
302 ss <<")||i>="<<pCurDVR->GetArrayLength();
303 ss <<")\n";
304 ss <<" tmp = 0;\n else\n";
306 #endif
307 ss <<" tmp = ";
308 ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
309 ss <<" tmp0 = (tmp != 0);\n";
310 ss <<" t = t ^tmp0;\n";
311 ss <<" }\n";
314 ss << " return t;\n";
315 ss << "}\n";
317 void OpIf::GenSlidingWindowFunction(std::stringstream &ss,
318 const std::string &sSymName, SubArguments &vSubArguments)
320 ss << "\ndouble " << sSymName;
321 ss << "_"<< BinFuncName() <<"(";
322 for (unsigned i = 0; i < vSubArguments.size(); i++)
324 if (i)
325 ss << ",";
326 vSubArguments[i]->GenSlidingWindowDecl(ss);
328 ss << ") {\n";
329 ss << " int gid0 = get_global_id(0);\n";
331 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
332 if(tmpCur0->GetType() == formula::svDoubleVectorRef)
334 throw UnhandledToken(tmpCur0, "unknown operand for ocPush");
336 else
338 if(vSubArguments.size()==3)
340 ss << " if(isNan(";
341 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
342 ss << ")|| ";
343 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
344 ss << " == 0)\n";
345 ss << " return ";
346 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
347 ss << ";\n";
348 ss << " else";
349 ss <<" return ";
350 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
351 ss <<";\n";
353 if(vSubArguments.size()==2)
355 ss << " if(isNan(";
356 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
357 ss << ")|| ";
358 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
359 ss << " == 0)\n";
360 ss << " return 0;\n";
361 ss << " else";
362 ss <<" return ";
363 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
364 ss <<";\n";
366 if(vSubArguments.size()==1)
368 ss << " if(isNan(";
369 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
370 ss << ")|| ";
371 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
372 ss << " == 0)\n";
373 ss << " return 0;\n";
374 ss << " else";
375 ss <<" return 1;\n";
378 ss << "}\n";
382 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */