sc/qa/unit/data/functions/spreadsheet/fods/vlookup.fods |  220 +++++++++++++
 sc/source/core/opencl/op_spreadsheet.cxx                |  252 +++++++---------
 2 files changed, 334 insertions(+), 138 deletions(-)

New commits:
commit 0db5b15e8e2799ed28ed4baa9939b76c90e944fb
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Tue Aug 30 12:19:16 2022 +0200
Commit:     Luboš Luňák <l.lu...@collabora.com>
CommitDate: Tue Aug 30 15:51:39 2022 +0200

    opencl VLOOKUP should not look up in other columns
    
    VLOOKUP searches only the first column, I have no idea why this was
    made to search all of them.
    
    Change-Id: I3297a723a727ba3f56db9bbb320d5b868b247db7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139026
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>

diff --git a/sc/qa/unit/data/functions/spreadsheet/fods/vlookup.fods 
b/sc/qa/unit/data/functions/spreadsheet/fods/vlookup.fods
index 301b9bfaf690..354aff0d763d 100644
--- a/sc/qa/unit/data/functions/spreadsheet/fods/vlookup.fods
+++ b/sc/qa/unit/data/functions/spreadsheet/fods/vlookup.fods
@@ -991,6 +991,15 @@
      <table:table-cell office:value-type="string" calcext:value-type="string">
       <text:p>False</text:p>
      </table:table-cell>
+     <table:table-cell/>
+     <table:table-cell table:style-name="ce33" office:value-type="string" 
calcext:value-type="string">
+      <text:p>Sorted num</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="2"/>
+     <table:table-cell table:style-name="ce33" office:value-type="string" 
calcext:value-type="string">
+      <text:p>Unsorted num</text:p>
+     </table:table-cell>
+     <table:table-cell/>
     </table:table-row>
     <table:table-row table:style-name="ro2">
      <table:table-cell table:formula="of:=VLOOKUP(111;[.I1:.J5];2;FALSE())" 
office:value-type="string" office:string-value="Bananas" 
calcext:value-type="string">
@@ -1068,6 +1077,20 @@
      <table:table-cell table:formula="of:=VLOOKUP(column1;table;2;0)" 
office:value-type="string" office:string-value="cherry" 
calcext:value-type="string">
       <text:p>cherry</text:p>
      </table:table-cell>
+     <table:table-cell/>
+     <table:table-cell office:value-type="float" office:value="1" 
calcext:value-type="float">
+      <text:p>1</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="11" 
calcext:value-type="float">
+      <text:p>11</text:p>
+     </table:table-cell>
+     <table:table-cell/>
+     <table:table-cell office:value-type="float" office:value="5" 
calcext:value-type="float">
+      <text:p>5</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="21" 
calcext:value-type="float">
+      <text:p>21</text:p>
+     </table:table-cell>
     </table:table-row>
     <table:table-row table:style-name="ro2">
      <table:table-cell table:formula="of:=VLOOKUP([.P2];[.$L$2:.$M$8];2;0)" 
office:value-type="float" office:value="2" calcext:value-type="float">
@@ -1129,6 +1152,20 @@
      <table:table-cell table:formula="of:=VLOOKUP(column1;table;2;0)" 
office:value-type="string" office:string-value="banana" 
calcext:value-type="string">
       <text:p>banana</text:p>
      </table:table-cell>
+     <table:table-cell/>
+     <table:table-cell office:value-type="float" office:value="2" 
calcext:value-type="float">
+      <text:p>2</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="12" 
calcext:value-type="float">
+      <text:p>12</text:p>
+     </table:table-cell>
+     <table:table-cell/>
+     <table:table-cell office:value-type="float" office:value="8" 
calcext:value-type="float">
+      <text:p>8</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="24" 
calcext:value-type="float">
+      <text:p>24</text:p>
+     </table:table-cell>
     </table:table-row>
     <table:table-row table:style-name="ro5">
      <table:table-cell table:formula="of:=VLOOKUP([.P3];[.$L$2:.$M$8];2;0)" 
office:value-type="float" office:value="2" calcext:value-type="float">
@@ -1188,6 +1225,20 @@
      <table:table-cell table:formula="of:=VLOOKUP(column1;table;2;0)" 
office:value-type="string" office:string-value="blackberry" 
calcext:value-type="string">
       <text:p>blackberry</text:p>
      </table:table-cell>
+     <table:table-cell/>
+     <table:table-cell office:value-type="float" office:value="4" 
calcext:value-type="float">
+      <text:p>4</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="14" 
calcext:value-type="float">
+      <text:p>14</text:p>
+     </table:table-cell>
+     <table:table-cell/>
+     <table:table-cell office:value-type="float" office:value="6" 
calcext:value-type="float">
+      <text:p>6</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="22" 
calcext:value-type="float">
+      <text:p>22</text:p>
+     </table:table-cell>
     </table:table-row>
     <table:table-row table:style-name="ro2">
      <table:table-cell table:formula="of:=VLOOKUP([.P4];[.$L$2:.$M$8];2;0)" 
office:value-type="float" office:value="3" calcext:value-type="float">
@@ -2343,14 +2394,179 @@
      </table:table-cell>
      <table:table-cell table:number-columns-repeated="30"/>
     </table:table-row>
-    <table:table-row table:style-name="ro2" 
table:number-rows-repeated="1048513">
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:formula="of:=VLOOKUP(1;[.$AJ$2:.$AK$4];2;1)" 
office:value-type="float" office:value="11" calcext:value-type="float">
+      <text:p>11</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="11" 
calcext:value-type="float">
+      <text:p>11</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce27" 
table:formula="of:=[.A63]=[.B63]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>PRAVDA</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A63])" 
office:value-type="string" office:string-value="=VLOOKUP(1;$AJ$2:$AK$4;2;1)" 
calcext:value-type="string">
+      <text:p>=VLOOKUP(1;$AJ$2:$AK$4;2;1)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="36"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:formula="of:=VLOOKUP(4;[.$AJ$2:.$AK$4];2;1)" 
office:value-type="float" office:value="14" calcext:value-type="float">
+      <text:p>14</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="14" 
calcext:value-type="float">
+      <text:p>14</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce27" 
table:formula="of:=[.A64]=[.B64]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>PRAVDA</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A64])" 
office:value-type="string" office:string-value="=VLOOKUP(4;$AJ$2:$AK$4;2;1)" 
calcext:value-type="string">
+      <text:p>=VLOOKUP(4;$AJ$2:$AK$4;2;1)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="36"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:formula="of:=VLOOKUP(3.5;[.$AJ$2:.$AK$4];2;1)" 
office:value-type="float" office:value="12" calcext:value-type="float">
+      <text:p>12</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="12" 
calcext:value-type="float">
+      <text:p>12</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce27" 
table:formula="of:=[.A65]=[.B65]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>PRAVDA</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A65])" 
office:value-type="string" office:string-value="=VLOOKUP(3,5;$AJ$2:$AK$4;2;1)" 
calcext:value-type="string">
+      <text:p>=VLOOKUP(3,5;$AJ$2:$AK$4;2;1)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="36"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:formula="of:=VLOOKUP(5;[.$AJ$2:.$AK$4];2;1)" 
office:value-type="float" office:value="14" calcext:value-type="float">
+      <text:p>14</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="14" 
calcext:value-type="float">
+      <text:p>14</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce27" 
table:formula="of:=[.A66]=[.B66]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>PRAVDA</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A66])" 
office:value-type="string" office:string-value="=VLOOKUP(5;$AJ$2:$AK$4;2;1)" 
calcext:value-type="string">
+      <text:p>=VLOOKUP(5;$AJ$2:$AK$4;2;1)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="36"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:formula="of:=VLOOKUP(-0.5;[.$AJ$2:.$AK$4];2;1)" 
office:value-type="string" office:string-value="" calcext:value-type="error">
+      <text:p>#N/A</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=#N/A" office:value-type="string" 
office:string-value="" calcext:value-type="error">
+      <text:p>#N/A</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce27" 
table:formula="of:=ISERROR([.A67])" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>PRAVDA</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A67])" 
office:value-type="string" office:string-value="=VLOOKUP(-0,5;$AJ$2:$AK$4;2;1)" 
calcext:value-type="string">
+      <text:p>=VLOOKUP(-0,5;$AJ$2:$AK$4;2;1)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="36"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:formula="of:=VLOOKUP(11;[.$AJ$2:.$AK$4];2;1)" 
office:value-type="float" office:value="14" calcext:value-type="float">
+      <text:p>14</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="14" 
calcext:value-type="float">
+      <text:p>14</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce27" 
table:formula="of:=[.A68]=[.B68]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>PRAVDA</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A68])" 
office:value-type="string" office:string-value="=VLOOKUP(11;$AJ$2:$AK$4;2;1)" 
calcext:value-type="string">
+      <text:p>=VLOOKUP(11;$AJ$2:$AK$4;2;1)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="36"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:formula="of:=VLOOKUP(5;[.$AM$2:.$AN$4];2;0)" 
office:value-type="float" office:value="21" calcext:value-type="float">
+      <text:p>21</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="21" 
calcext:value-type="float">
+      <text:p>21</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce27" 
table:formula="of:=[.A69]=[.B69]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>PRAVDA</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A69])" 
office:value-type="string" office:string-value="=VLOOKUP(5;$AM$2:$AN$4;2;0)" 
calcext:value-type="string">
+      <text:p>=VLOOKUP(5;$AM$2:$AN$4;2;0)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="36"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:formula="of:=VLOOKUP(6;[.$AM$2:.$AN$4];2;0)" 
office:value-type="float" office:value="22" calcext:value-type="float">
+      <text:p>22</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="22" 
calcext:value-type="float">
+      <text:p>22</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce27" 
table:formula="of:=[.A70]=[.B70]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>PRAVDA</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A70])" 
office:value-type="string" office:string-value="=VLOOKUP(6;$AM$2:$AN$4;2;0)" 
calcext:value-type="string">
+      <text:p>=VLOOKUP(6;$AM$2:$AN$4;2;0)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="36"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:formula="of:=VLOOKUP(8;[.$AM$2:.$AN$4];2;0)" 
office:value-type="float" office:value="24" calcext:value-type="float">
+      <text:p>24</text:p>
+     </table:table-cell>
+     <table:table-cell office:value-type="float" office:value="24" 
calcext:value-type="float">
+      <text:p>24</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce27" 
table:formula="of:=[.A71]=[.B71]" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>PRAVDA</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A71])" 
office:value-type="string" office:string-value="=VLOOKUP(8;$AM$2:$AN$4;2;0)" 
calcext:value-type="string">
+      <text:p>=VLOOKUP(8;$AM$2:$AN$4;2;0)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="36"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:formula="of:=VLOOKUP(7;[.$AM$2:.$AN$4];2;0)" 
office:value-type="string" office:string-value="" calcext:value-type="error">
+      <text:p>#N/A</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=#N/A" office:value-type="string" 
office:string-value="" calcext:value-type="error">
+      <text:p>#N/A</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce27" 
table:formula="of:=ISERROR([.A72])" office:value-type="boolean" 
office:boolean-value="true" calcext:value-type="boolean">
+      <text:p>PRAVDA</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A72])" 
office:value-type="string" office:string-value="=VLOOKUP(7;$AM$2:$AN$4;2;0)" 
calcext:value-type="string">
+      <text:p>=VLOOKUP(7;$AM$2:$AN$4;2;0)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="36"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro6">
+     <table:table-cell table:formula="of:=VLOOKUP(21;[.$AM$2:.$AN$4];2;0)" 
office:value-type="float" office:value="21" calcext:value-type="float">
+      <text:p>21</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=#N/A" office:value-type="string" 
office:string-value="" calcext:value-type="error">
+      <text:p>#N/A</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="ce27" 
table:formula="of:=ISERROR([.A73])" office:value-type="boolean" 
office:boolean-value="false" calcext:value-type="boolean">
+      <text:p>NEPRAVDA</text:p>
+     </table:table-cell>
+     <table:table-cell table:formula="of:=FORMULA([.A73])" 
office:value-type="string" office:string-value="=VLOOKUP(21;$AM$2:$AN$4;2;0)" 
calcext:value-type="string">
+      <text:p>=VLOOKUP(21;$AM$2:$AN$4;2;0)</text:p>
+     </table:table-cell>
+     <table:table-cell table:number-columns-repeated="36"/>
+    </table:table-row>
+    <table:table-row table:style-name="ro2" 
table:number-rows-repeated="1048502">
      <table:table-cell table:number-columns-repeated="34"/>
     </table:table-row>
     <table:table-row table:style-name="ro2">
      <table:table-cell table:number-columns-repeated="34"/>
     </table:table-row>
     <calcext:conditional-formats>
-     <calcext:conditional-format 
calcext:target-range-address="Sheet2.C2:Sheet2.C62">
+     <calcext:conditional-format 
calcext:target-range-address="Sheet2.C2:Sheet2.C100">
       <calcext:condition calcext:apply-style-name="Default" 
calcext:value="=&quot;&quot;" calcext:base-cell-address="Sheet2.C2"/>
       <calcext:condition calcext:apply-style-name="Untitled1" 
calcext:value="=0" calcext:base-cell-address="Sheet2.C2"/>
       <calcext:condition calcext:apply-style-name="Untitled2" 
calcext:value="=1" calcext:base-cell-address="Sheet2.C2"/>
diff --git a/sc/source/core/opencl/op_spreadsheet.cxx 
b/sc/source/core/opencl/op_spreadsheet.cxx
index 48789d582b07..d088b718b442 100644
--- a/sc/source/core/opencl/op_spreadsheet.cxx
+++ b/sc/source/core/opencl/op_spreadsheet.cxx
@@ -115,155 +115,135 @@ void 
OpVLookup::GenSlidingWindowFunction(std::stringstream &ss,
             ss << "    loop = "<<nCurWindowSize<<"/"<< unrollSize<<";\n";
         }
 
-        for (int i = 0; i < secondParaWidth; i++)
+        ss << "    for ( int j = 0;j< loop; j++)\n";
+        ss << "    {\n";
+        ss << "        int i = ";
+        if (!pCurDVR->IsStartFixed()&& pCurDVR->IsEndFixed())
         {
-            ss << "    for ( int j = 0;j< loop; j++)\n";
-            ss << "    {\n";
-            ss << "        int i = ";
-            if (!pCurDVR->IsStartFixed()&& pCurDVR->IsEndFixed())
-            {
-                ss << "gid0 + j * "<< unrollSize <<";\n";
-            }
-            else
-            {
-                ss << "j * "<< unrollSize <<";\n";
-            }
-            if (!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
-            {
-                ss << "        int doubleIndex = i+gid0;\n";
-            }
-            else
-            {
-                ss << "        int doubleIndex = i;\n";
-            }
-            ss << "        if(tmp";
-            ss << 3+(secondParaWidth-1);
-            ss << " == 1)\n";
-            ss << "        {\n";
-
-            for (int j = 0;j < unrollSize; j++)
-            {
-                CheckSubArgumentIsNan(ss,vSubArguments,1+i);
-
-                ss << "            if((tmp0 - tmp";
-                ss << 1+i;
-                ss << ")>=0 && intermediate > ( tmp0 -tmp";
-                ss << 1+i;
-                ss << "))\n";
-                ss << "            {\n";
-                ss << "                rowNum = doubleIndex;\n";
-                ss << "                intermediate = tmp0 - tmp";
-                ss << 1+i;
-                ss << ";\n";
-                ss << "            }\n";
-                ss << "            i++;\n";
-                ss << "            doubleIndex++;\n";
-            }
-
-            ss << "        }else\n";
-            ss << "        {\n";
-            for (int j = 0; j < unrollSize; j++)
-            {
-                CheckSubArgumentIsNan(ss,vSubArguments,1+i);
+            ss << "gid0 + j * "<< unrollSize <<";\n";
+        }
+        else
+        {
+            ss << "j * "<< unrollSize <<";\n";
+        }
+        if (!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
+        {
+            ss << "        int doubleIndex = i+gid0;\n";
+        }
+        else
+        {
+            ss << "        int doubleIndex = i;\n";
+        }
+        ss << "        if(tmp";
+        ss << 3+(secondParaWidth-1);
+        ss << " == 1)\n";
+        ss << "        {\n";
 
-                ss << "            if(tmp0 == tmp";
-                ss << 1+i;
-                ss << " && rowNum == -1)\n";
-                ss << "            {\n";
-                ss << "                rowNum = doubleIndex;\n";
-                ss << "            }\n";
-                ss << "            i++;\n";
-                ss << "            doubleIndex++;\n";
-            }
-            ss << "        }\n\n";
+        for (int j = 0;j < unrollSize; j++)
+        {
+            CheckSubArgumentIsNan(ss,vSubArguments,1);
 
-            ss << "    }\n";
-            ss << "    if(rowNum!=-1)\n";
-            ss << "    {\n";
-            for (int j = 0; j < secondParaWidth; j++)
-            {
-                ss << "        if(tmp";
-                ss << 2+(secondParaWidth-1);
-                ss << " == ";
-                ss << j+1;
-                ss << ")\n";
-                ss << "            tmp = ";
-                vSubArguments[1+j]->GenDeclRef(ss);
-                ss << "[rowNum];\n";
-            }
-            ss << "        return tmp;\n";
-            ss << "    }\n";
-            ss << "    for (int i = ";
-            if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed())
-            {
-                ss << "gid0 + loop *"<<unrollSize<<"; i < ";
-                ss << nCurWindowSize <<"; i++)\n";
-            }
-            else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
-            {
-                ss << "0 + loop *"<<unrollSize<<"; i < gid0+";
-                ss << nCurWindowSize <<"; i++)\n";
-            }
-            else
-            {
-                ss << "0 + loop *"<<unrollSize<<"; i < ";
-                ss << nCurWindowSize <<"; i++)\n";
-            }
-            ss << "    {\n";
-            if (!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
-            {
-               ss << "        int doubleIndex = i+gid0;\n";
-            }
-            else
-            {
-               ss << "        int doubleIndex = i;\n";
-            }
-            CheckSubArgumentIsNan(ss,vSubArguments,1+i);
-            ss << "        if(tmp";
-            ss << 3+(secondParaWidth-1);
-            ss << " == 1)\n";
-            ss << "        {\n";
-            ss << "            if((tmp0 - tmp";
-            ss << 1+i;
-            ss << ")>=0 && intermediate > ( tmp0 -tmp";
-            ss << 1+i;
-            ss << "))\n";
+            ss << "            if((tmp0 - tmp1)>=0 && intermediate > (tmp0 
-tmp1))\n";
             ss << "            {\n";
             ss << "                rowNum = doubleIndex;\n";
-            ss << "                intermediate = tmp0 - tmp";
-            ss << 1+i;
-            ss << ";\n";
+            ss << "                intermediate = tmp0 - tmp1;\n";
             ss << "            }\n";
-            ss << "        }\n";
-            ss << "        else\n";
-            ss << "        {\n";
-            ss << "            if(tmp0 == tmp";
-            ss << 1+i;
-            ss << " && rowNum == -1)\n";
+            ss << "            i++;\n";
+            ss << "            doubleIndex++;\n";
+        }
+
+        ss << "        }else\n";
+        ss << "        {\n";
+        for (int j = 0; j < unrollSize; j++)
+        {
+            CheckSubArgumentIsNan(ss,vSubArguments,1);
+
+            ss << "            if(tmp0 == tmp1 && rowNum == -1)\n";
             ss << "            {\n";
             ss << "                rowNum = doubleIndex;\n";
             ss << "            }\n";
-            ss << "        }\n";
+            ss << "            i++;\n";
+            ss << "            doubleIndex++;\n";
+        }
+        ss << "        }\n\n";
 
-            ss << "    }\n\n";
-            ss << "    if(rowNum!=-1)\n";
-            ss << "    {\n";
+        ss << "    }\n";
+        ss << "    if(rowNum!=-1)\n";
+        ss << "    {\n";
+        for (int j = 0; j < secondParaWidth; j++)
+        {
+            ss << "        if(tmp";
+            ss << 2+(secondParaWidth-1);
+            ss << " == ";
+            ss << j+1;
+            ss << ")\n";
+            ss << "            tmp = ";
+            vSubArguments[1+j]->GenDeclRef(ss);
+            ss << "[rowNum];\n";
+        }
+        ss << "        return tmp;\n";
+        ss << "    }\n";
+        ss << "    for (int i = ";
+        if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed())
+        {
+            ss << "gid0 + loop *"<<unrollSize<<"; i < ";
+            ss << nCurWindowSize <<"; i++)\n";
+        }
+        else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
+        {
+            ss << "0 + loop *"<<unrollSize<<"; i < gid0+";
+            ss << nCurWindowSize <<"; i++)\n";
+        }
+        else
+        {
+            ss << "0 + loop *"<<unrollSize<<"; i < ";
+            ss << nCurWindowSize <<"; i++)\n";
+        }
+        ss << "    {\n";
+        if (!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
+        {
+           ss << "        int doubleIndex = i+gid0;\n";
+        }
+        else
+        {
+           ss << "        int doubleIndex = i;\n";
+        }
+        CheckSubArgumentIsNan(ss,vSubArguments,1);
+        ss << "        if(tmp";
+        ss << 3+(secondParaWidth-1);
+        ss << " == 1)\n";
+        ss << "        {\n";
+        ss << "            if((tmp0 - tmp1)>=0 && intermediate > (tmp0 
-tmp1))\n";
+        ss << "            {\n";
+        ss << "                rowNum = doubleIndex;\n";
+        ss << "                intermediate = tmp0 - tmp1;\n";
+        ss << "            }\n";
+        ss << "        }\n";
+        ss << "        else\n";
+        ss << "        {\n";
+        ss << "            if(tmp0 == tmp1 && rowNum == -1)\n";
+        ss << "            {\n";
+        ss << "                rowNum = doubleIndex;\n";
+        ss << "            }\n";
+        ss << "        }\n";
 
-            for (int j = 0; j < secondParaWidth; j++)
-            {
-                ss << "        if(tmp";
-                ss << 2+(secondParaWidth-1);
-                ss << " == ";
-                ss << j+1;
-                ss << ")\n";
-                ss << "            tmp = ";
-                vSubArguments[1+j]->GenDeclRef(ss);
-                ss << "[rowNum];\n";
-            }
-            ss << "        return tmp;\n";
-            ss << "    }\n";
+        ss << "    }\n\n";
+        ss << "    if(rowNum!=-1)\n";
+        ss << "    {\n";
 
+        for (int j = 0; j < secondParaWidth; j++)
+        {
+            ss << "        if(tmp";
+            ss << 2+(secondParaWidth-1);
+            ss << " == ";
+            ss << j+1;
+            ss << ")\n";
+            ss << "            tmp = ";
+            vSubArguments[1+j]->GenDeclRef(ss);
+            ss << "[rowNum];\n";
         }
+        ss << "        return tmp;\n";
+        ss << "    }\n";
     }
     else
     {

Reply via email to