Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 // Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.
     18 
     19 package android.renderscript.cts;
     20 
     21 import android.renderscript.Allocation;
     22 import android.renderscript.RSRuntimeException;
     23 import android.renderscript.Element;
     24 
     25 public class TestConvert extends RSBaseCompute {
     26 
     27     private ScriptC_TestConvert script;
     28     private ScriptC_TestConvertRelaxed scriptRelaxed;
     29 
     30     @Override
     31     protected void setUp() throws Exception {
     32         super.setUp();
     33         script = new ScriptC_TestConvert(mRS);
     34         scriptRelaxed = new ScriptC_TestConvertRelaxed(mRS);
     35     }
     36 
     37     public class ArgumentsFloatFloat {
     38         public float inV;
     39         public Target.Floaty out;
     40     }
     41 
     42     private void checkConvertFloat2Float2() {
     43         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfb5215c44e1f6ac6l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
     44         try {
     45             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
     46             script.forEach_testConvertFloat2Float2Float2(inV, out);
     47             verifyResultsConvertFloat2Float2(inV, out, false);
     48         } catch (Exception e) {
     49             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Float2Float2: " + e.toString());
     50         }
     51         try {
     52             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
     53             scriptRelaxed.forEach_testConvertFloat2Float2Float2(inV, out);
     54             verifyResultsConvertFloat2Float2(inV, out, true);
     55         } catch (Exception e) {
     56             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Float2Float2: " + e.toString());
     57         }
     58     }
     59 
     60     private void verifyResultsConvertFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
     61         float[] arrayInV = new float[INPUTSIZE * 2];
     62         inV.copyTo(arrayInV);
     63         float[] arrayOut = new float[INPUTSIZE * 2];
     64         out.copyTo(arrayOut);
     65         for (int i = 0; i < INPUTSIZE; i++) {
     66             for (int j = 0; j < 2 ; j++) {
     67                 // Extract the inputs.
     68                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
     69                 args.inV = arrayInV[i * 2 + j];
     70                 // Figure out what the outputs should have been.
     71                 Target target = new Target(relaxed);
     72                 CoreMathVerifier.computeConvert(args, target);
     73                 // Validate the outputs.
     74                 boolean valid = true;
     75                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
     76                     valid = false;
     77                 }
     78                 if (!valid) {
     79                     StringBuilder message = new StringBuilder();
     80                     message.append("Input inV: ");
     81                     message.append(String.format("%14.8g {%8x} %15a",
     82                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
     83                     message.append("\n");
     84                     message.append("Expected output out: ");
     85                     message.append(args.out.toString());
     86                     message.append("\n");
     87                     message.append("Actual   output out: ");
     88                     message.append(String.format("%14.8g {%8x} %15a",
     89                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
     90                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
     91                         message.append(" FAIL");
     92                     }
     93                     message.append("\n");
     94                     assertTrue("Incorrect output for checkConvertFloat2Float2" +
     95                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
     96                 }
     97             }
     98         }
     99     }
    100 
    101     private void checkConvertFloat3Float3() {
    102         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfb53dedf443a8ba4l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
    103         try {
    104             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
    105             script.forEach_testConvertFloat3Float3Float3(inV, out);
    106             verifyResultsConvertFloat3Float3(inV, out, false);
    107         } catch (Exception e) {
    108             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Float3Float3: " + e.toString());
    109         }
    110         try {
    111             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
    112             scriptRelaxed.forEach_testConvertFloat3Float3Float3(inV, out);
    113             verifyResultsConvertFloat3Float3(inV, out, true);
    114         } catch (Exception e) {
    115             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Float3Float3: " + e.toString());
    116         }
    117     }
    118 
    119     private void verifyResultsConvertFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
    120         float[] arrayInV = new float[INPUTSIZE * 4];
    121         inV.copyTo(arrayInV);
    122         float[] arrayOut = new float[INPUTSIZE * 4];
    123         out.copyTo(arrayOut);
    124         for (int i = 0; i < INPUTSIZE; i++) {
    125             for (int j = 0; j < 3 ; j++) {
    126                 // Extract the inputs.
    127                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
    128                 args.inV = arrayInV[i * 4 + j];
    129                 // Figure out what the outputs should have been.
    130                 Target target = new Target(relaxed);
    131                 CoreMathVerifier.computeConvert(args, target);
    132                 // Validate the outputs.
    133                 boolean valid = true;
    134                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    135                     valid = false;
    136                 }
    137                 if (!valid) {
    138                     StringBuilder message = new StringBuilder();
    139                     message.append("Input inV: ");
    140                     message.append(String.format("%14.8g {%8x} %15a",
    141                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
    142                     message.append("\n");
    143                     message.append("Expected output out: ");
    144                     message.append(args.out.toString());
    145                     message.append("\n");
    146                     message.append("Actual   output out: ");
    147                     message.append(String.format("%14.8g {%8x} %15a",
    148                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
    149                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    150                         message.append(" FAIL");
    151                     }
    152                     message.append("\n");
    153                     assertTrue("Incorrect output for checkConvertFloat3Float3" +
    154                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    155                 }
    156             }
    157         }
    158     }
    159 
    160     private void checkConvertFloat4Float4() {
    161         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfb55a7fa3a55ac82l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
    162         try {
    163             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
    164             script.forEach_testConvertFloat4Float4Float4(inV, out);
    165             verifyResultsConvertFloat4Float4(inV, out, false);
    166         } catch (Exception e) {
    167             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Float4Float4: " + e.toString());
    168         }
    169         try {
    170             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
    171             scriptRelaxed.forEach_testConvertFloat4Float4Float4(inV, out);
    172             verifyResultsConvertFloat4Float4(inV, out, true);
    173         } catch (Exception e) {
    174             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Float4Float4: " + e.toString());
    175         }
    176     }
    177 
    178     private void verifyResultsConvertFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
    179         float[] arrayInV = new float[INPUTSIZE * 4];
    180         inV.copyTo(arrayInV);
    181         float[] arrayOut = new float[INPUTSIZE * 4];
    182         out.copyTo(arrayOut);
    183         for (int i = 0; i < INPUTSIZE; i++) {
    184             for (int j = 0; j < 4 ; j++) {
    185                 // Extract the inputs.
    186                 ArgumentsFloatFloat args = new ArgumentsFloatFloat();
    187                 args.inV = arrayInV[i * 4 + j];
    188                 // Figure out what the outputs should have been.
    189                 Target target = new Target(relaxed);
    190                 CoreMathVerifier.computeConvert(args, target);
    191                 // Validate the outputs.
    192                 boolean valid = true;
    193                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    194                     valid = false;
    195                 }
    196                 if (!valid) {
    197                     StringBuilder message = new StringBuilder();
    198                     message.append("Input inV: ");
    199                     message.append(String.format("%14.8g {%8x} %15a",
    200                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
    201                     message.append("\n");
    202                     message.append("Expected output out: ");
    203                     message.append(args.out.toString());
    204                     message.append("\n");
    205                     message.append("Actual   output out: ");
    206                     message.append(String.format("%14.8g {%8x} %15a",
    207                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
    208                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    209                         message.append(" FAIL");
    210                     }
    211                     message.append("\n");
    212                     assertTrue("Incorrect output for checkConvertFloat4Float4" +
    213                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    214                 }
    215             }
    216         }
    217     }
    218 
    219     public class ArgumentsCharFloat {
    220         public byte inV;
    221         public Target.Floaty out;
    222     }
    223 
    224     private void checkConvertChar2Float2() {
    225         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x5861e2161f489286l, true, 7);
    226         try {
    227             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
    228             script.forEach_testConvertFloat2Char2Float2(inV, out);
    229             verifyResultsConvertChar2Float2(inV, out, false);
    230         } catch (Exception e) {
    231             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Char2Float2: " + e.toString());
    232         }
    233         try {
    234             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
    235             scriptRelaxed.forEach_testConvertFloat2Char2Float2(inV, out);
    236             verifyResultsConvertChar2Float2(inV, out, true);
    237         } catch (Exception e) {
    238             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Char2Float2: " + e.toString());
    239         }
    240     }
    241 
    242     private void verifyResultsConvertChar2Float2(Allocation inV, Allocation out, boolean relaxed) {
    243         byte[] arrayInV = new byte[INPUTSIZE * 2];
    244         inV.copyTo(arrayInV);
    245         float[] arrayOut = new float[INPUTSIZE * 2];
    246         out.copyTo(arrayOut);
    247         for (int i = 0; i < INPUTSIZE; i++) {
    248             for (int j = 0; j < 2 ; j++) {
    249                 // Extract the inputs.
    250                 ArgumentsCharFloat args = new ArgumentsCharFloat();
    251                 args.inV = arrayInV[i * 2 + j];
    252                 // Figure out what the outputs should have been.
    253                 Target target = new Target(relaxed);
    254                 CoreMathVerifier.computeConvert(args, target);
    255                 // Validate the outputs.
    256                 boolean valid = true;
    257                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
    258                     valid = false;
    259                 }
    260                 if (!valid) {
    261                     StringBuilder message = new StringBuilder();
    262                     message.append("Input inV: ");
    263                     message.append(String.format("%d", args.inV));
    264                     message.append("\n");
    265                     message.append("Expected output out: ");
    266                     message.append(args.out.toString());
    267                     message.append("\n");
    268                     message.append("Actual   output out: ");
    269                     message.append(String.format("%14.8g {%8x} %15a",
    270                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
    271                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
    272                         message.append(" FAIL");
    273                     }
    274                     message.append("\n");
    275                     assertTrue("Incorrect output for checkConvertChar2Float2" +
    276                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    277                 }
    278             }
    279         }
    280     }
    281 
    282     private void checkConvertChar3Float3() {
    283         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x5863ab311563b364l, true, 7);
    284         try {
    285             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
    286             script.forEach_testConvertFloat3Char3Float3(inV, out);
    287             verifyResultsConvertChar3Float3(inV, out, false);
    288         } catch (Exception e) {
    289             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Char3Float3: " + e.toString());
    290         }
    291         try {
    292             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
    293             scriptRelaxed.forEach_testConvertFloat3Char3Float3(inV, out);
    294             verifyResultsConvertChar3Float3(inV, out, true);
    295         } catch (Exception e) {
    296             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Char3Float3: " + e.toString());
    297         }
    298     }
    299 
    300     private void verifyResultsConvertChar3Float3(Allocation inV, Allocation out, boolean relaxed) {
    301         byte[] arrayInV = new byte[INPUTSIZE * 4];
    302         inV.copyTo(arrayInV);
    303         float[] arrayOut = new float[INPUTSIZE * 4];
    304         out.copyTo(arrayOut);
    305         for (int i = 0; i < INPUTSIZE; i++) {
    306             for (int j = 0; j < 3 ; j++) {
    307                 // Extract the inputs.
    308                 ArgumentsCharFloat args = new ArgumentsCharFloat();
    309                 args.inV = arrayInV[i * 4 + j];
    310                 // Figure out what the outputs should have been.
    311                 Target target = new Target(relaxed);
    312                 CoreMathVerifier.computeConvert(args, target);
    313                 // Validate the outputs.
    314                 boolean valid = true;
    315                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    316                     valid = false;
    317                 }
    318                 if (!valid) {
    319                     StringBuilder message = new StringBuilder();
    320                     message.append("Input inV: ");
    321                     message.append(String.format("%d", args.inV));
    322                     message.append("\n");
    323                     message.append("Expected output out: ");
    324                     message.append(args.out.toString());
    325                     message.append("\n");
    326                     message.append("Actual   output out: ");
    327                     message.append(String.format("%14.8g {%8x} %15a",
    328                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
    329                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    330                         message.append(" FAIL");
    331                     }
    332                     message.append("\n");
    333                     assertTrue("Incorrect output for checkConvertChar3Float3" +
    334                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    335                 }
    336             }
    337         }
    338     }
    339 
    340     private void checkConvertChar4Float4() {
    341         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x5865744c0b7ed442l, true, 7);
    342         try {
    343             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
    344             script.forEach_testConvertFloat4Char4Float4(inV, out);
    345             verifyResultsConvertChar4Float4(inV, out, false);
    346         } catch (Exception e) {
    347             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Char4Float4: " + e.toString());
    348         }
    349         try {
    350             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
    351             scriptRelaxed.forEach_testConvertFloat4Char4Float4(inV, out);
    352             verifyResultsConvertChar4Float4(inV, out, true);
    353         } catch (Exception e) {
    354             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Char4Float4: " + e.toString());
    355         }
    356     }
    357 
    358     private void verifyResultsConvertChar4Float4(Allocation inV, Allocation out, boolean relaxed) {
    359         byte[] arrayInV = new byte[INPUTSIZE * 4];
    360         inV.copyTo(arrayInV);
    361         float[] arrayOut = new float[INPUTSIZE * 4];
    362         out.copyTo(arrayOut);
    363         for (int i = 0; i < INPUTSIZE; i++) {
    364             for (int j = 0; j < 4 ; j++) {
    365                 // Extract the inputs.
    366                 ArgumentsCharFloat args = new ArgumentsCharFloat();
    367                 args.inV = arrayInV[i * 4 + j];
    368                 // Figure out what the outputs should have been.
    369                 Target target = new Target(relaxed);
    370                 CoreMathVerifier.computeConvert(args, target);
    371                 // Validate the outputs.
    372                 boolean valid = true;
    373                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    374                     valid = false;
    375                 }
    376                 if (!valid) {
    377                     StringBuilder message = new StringBuilder();
    378                     message.append("Input inV: ");
    379                     message.append(String.format("%d", args.inV));
    380                     message.append("\n");
    381                     message.append("Expected output out: ");
    382                     message.append(args.out.toString());
    383                     message.append("\n");
    384                     message.append("Actual   output out: ");
    385                     message.append(String.format("%14.8g {%8x} %15a",
    386                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
    387                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    388                         message.append(" FAIL");
    389                     }
    390                     message.append("\n");
    391                     assertTrue("Incorrect output for checkConvertChar4Float4" +
    392                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    393                 }
    394             }
    395         }
    396     }
    397 
    398     public class ArgumentsUcharFloat {
    399         public byte inV;
    400         public Target.Floaty out;
    401     }
    402 
    403     private void checkConvertUchar2Float2() {
    404         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7d30021dbb20ac31l, false, 8);
    405         try {
    406             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
    407             script.forEach_testConvertFloat2Uchar2Float2(inV, out);
    408             verifyResultsConvertUchar2Float2(inV, out, false);
    409         } catch (Exception e) {
    410             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Uchar2Float2: " + e.toString());
    411         }
    412         try {
    413             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
    414             scriptRelaxed.forEach_testConvertFloat2Uchar2Float2(inV, out);
    415             verifyResultsConvertUchar2Float2(inV, out, true);
    416         } catch (Exception e) {
    417             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Uchar2Float2: " + e.toString());
    418         }
    419     }
    420 
    421     private void verifyResultsConvertUchar2Float2(Allocation inV, Allocation out, boolean relaxed) {
    422         byte[] arrayInV = new byte[INPUTSIZE * 2];
    423         inV.copyTo(arrayInV);
    424         float[] arrayOut = new float[INPUTSIZE * 2];
    425         out.copyTo(arrayOut);
    426         for (int i = 0; i < INPUTSIZE; i++) {
    427             for (int j = 0; j < 2 ; j++) {
    428                 // Extract the inputs.
    429                 ArgumentsUcharFloat args = new ArgumentsUcharFloat();
    430                 args.inV = arrayInV[i * 2 + j];
    431                 // Figure out what the outputs should have been.
    432                 Target target = new Target(relaxed);
    433                 CoreMathVerifier.computeConvert(args, target);
    434                 // Validate the outputs.
    435                 boolean valid = true;
    436                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
    437                     valid = false;
    438                 }
    439                 if (!valid) {
    440                     StringBuilder message = new StringBuilder();
    441                     message.append("Input inV: ");
    442                     message.append(String.format("0x%x", args.inV));
    443                     message.append("\n");
    444                     message.append("Expected output out: ");
    445                     message.append(args.out.toString());
    446                     message.append("\n");
    447                     message.append("Actual   output out: ");
    448                     message.append(String.format("%14.8g {%8x} %15a",
    449                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
    450                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
    451                         message.append(" FAIL");
    452                     }
    453                     message.append("\n");
    454                     assertTrue("Incorrect output for checkConvertUchar2Float2" +
    455                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    456                 }
    457             }
    458         }
    459     }
    460 
    461     private void checkConvertUchar3Float3() {
    462         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7d31cb38b13bcd0fl, false, 8);
    463         try {
    464             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
    465             script.forEach_testConvertFloat3Uchar3Float3(inV, out);
    466             verifyResultsConvertUchar3Float3(inV, out, false);
    467         } catch (Exception e) {
    468             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Uchar3Float3: " + e.toString());
    469         }
    470         try {
    471             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
    472             scriptRelaxed.forEach_testConvertFloat3Uchar3Float3(inV, out);
    473             verifyResultsConvertUchar3Float3(inV, out, true);
    474         } catch (Exception e) {
    475             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Uchar3Float3: " + e.toString());
    476         }
    477     }
    478 
    479     private void verifyResultsConvertUchar3Float3(Allocation inV, Allocation out, boolean relaxed) {
    480         byte[] arrayInV = new byte[INPUTSIZE * 4];
    481         inV.copyTo(arrayInV);
    482         float[] arrayOut = new float[INPUTSIZE * 4];
    483         out.copyTo(arrayOut);
    484         for (int i = 0; i < INPUTSIZE; i++) {
    485             for (int j = 0; j < 3 ; j++) {
    486                 // Extract the inputs.
    487                 ArgumentsUcharFloat args = new ArgumentsUcharFloat();
    488                 args.inV = arrayInV[i * 4 + j];
    489                 // Figure out what the outputs should have been.
    490                 Target target = new Target(relaxed);
    491                 CoreMathVerifier.computeConvert(args, target);
    492                 // Validate the outputs.
    493                 boolean valid = true;
    494                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    495                     valid = false;
    496                 }
    497                 if (!valid) {
    498                     StringBuilder message = new StringBuilder();
    499                     message.append("Input inV: ");
    500                     message.append(String.format("0x%x", args.inV));
    501                     message.append("\n");
    502                     message.append("Expected output out: ");
    503                     message.append(args.out.toString());
    504                     message.append("\n");
    505                     message.append("Actual   output out: ");
    506                     message.append(String.format("%14.8g {%8x} %15a",
    507                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
    508                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    509                         message.append(" FAIL");
    510                     }
    511                     message.append("\n");
    512                     assertTrue("Incorrect output for checkConvertUchar3Float3" +
    513                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    514                 }
    515             }
    516         }
    517     }
    518 
    519     private void checkConvertUchar4Float4() {
    520         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7d339453a756ededl, false, 8);
    521         try {
    522             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
    523             script.forEach_testConvertFloat4Uchar4Float4(inV, out);
    524             verifyResultsConvertUchar4Float4(inV, out, false);
    525         } catch (Exception e) {
    526             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Uchar4Float4: " + e.toString());
    527         }
    528         try {
    529             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
    530             scriptRelaxed.forEach_testConvertFloat4Uchar4Float4(inV, out);
    531             verifyResultsConvertUchar4Float4(inV, out, true);
    532         } catch (Exception e) {
    533             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Uchar4Float4: " + e.toString());
    534         }
    535     }
    536 
    537     private void verifyResultsConvertUchar4Float4(Allocation inV, Allocation out, boolean relaxed) {
    538         byte[] arrayInV = new byte[INPUTSIZE * 4];
    539         inV.copyTo(arrayInV);
    540         float[] arrayOut = new float[INPUTSIZE * 4];
    541         out.copyTo(arrayOut);
    542         for (int i = 0; i < INPUTSIZE; i++) {
    543             for (int j = 0; j < 4 ; j++) {
    544                 // Extract the inputs.
    545                 ArgumentsUcharFloat args = new ArgumentsUcharFloat();
    546                 args.inV = arrayInV[i * 4 + j];
    547                 // Figure out what the outputs should have been.
    548                 Target target = new Target(relaxed);
    549                 CoreMathVerifier.computeConvert(args, target);
    550                 // Validate the outputs.
    551                 boolean valid = true;
    552                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    553                     valid = false;
    554                 }
    555                 if (!valid) {
    556                     StringBuilder message = new StringBuilder();
    557                     message.append("Input inV: ");
    558                     message.append(String.format("0x%x", args.inV));
    559                     message.append("\n");
    560                     message.append("Expected output out: ");
    561                     message.append(args.out.toString());
    562                     message.append("\n");
    563                     message.append("Actual   output out: ");
    564                     message.append(String.format("%14.8g {%8x} %15a",
    565                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
    566                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    567                         message.append(" FAIL");
    568                     }
    569                     message.append("\n");
    570                     assertTrue("Incorrect output for checkConvertUchar4Float4" +
    571                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    572                 }
    573             }
    574         }
    575     }
    576 
    577     public class ArgumentsShortFloat {
    578         public short inV;
    579         public Target.Floaty out;
    580     }
    581 
    582     private void checkConvertShort2Float2() {
    583         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x94ca184eff219172l, true, 15);
    584         try {
    585             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
    586             script.forEach_testConvertFloat2Short2Float2(inV, out);
    587             verifyResultsConvertShort2Float2(inV, out, false);
    588         } catch (Exception e) {
    589             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Short2Float2: " + e.toString());
    590         }
    591         try {
    592             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
    593             scriptRelaxed.forEach_testConvertFloat2Short2Float2(inV, out);
    594             verifyResultsConvertShort2Float2(inV, out, true);
    595         } catch (Exception e) {
    596             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Short2Float2: " + e.toString());
    597         }
    598     }
    599 
    600     private void verifyResultsConvertShort2Float2(Allocation inV, Allocation out, boolean relaxed) {
    601         short[] arrayInV = new short[INPUTSIZE * 2];
    602         inV.copyTo(arrayInV);
    603         float[] arrayOut = new float[INPUTSIZE * 2];
    604         out.copyTo(arrayOut);
    605         for (int i = 0; i < INPUTSIZE; i++) {
    606             for (int j = 0; j < 2 ; j++) {
    607                 // Extract the inputs.
    608                 ArgumentsShortFloat args = new ArgumentsShortFloat();
    609                 args.inV = arrayInV[i * 2 + j];
    610                 // Figure out what the outputs should have been.
    611                 Target target = new Target(relaxed);
    612                 CoreMathVerifier.computeConvert(args, target);
    613                 // Validate the outputs.
    614                 boolean valid = true;
    615                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
    616                     valid = false;
    617                 }
    618                 if (!valid) {
    619                     StringBuilder message = new StringBuilder();
    620                     message.append("Input inV: ");
    621                     message.append(String.format("%d", args.inV));
    622                     message.append("\n");
    623                     message.append("Expected output out: ");
    624                     message.append(args.out.toString());
    625                     message.append("\n");
    626                     message.append("Actual   output out: ");
    627                     message.append(String.format("%14.8g {%8x} %15a",
    628                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
    629                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
    630                         message.append(" FAIL");
    631                     }
    632                     message.append("\n");
    633                     assertTrue("Incorrect output for checkConvertShort2Float2" +
    634                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    635                 }
    636             }
    637         }
    638     }
    639 
    640     private void checkConvertShort3Float3() {
    641         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x94cbe169f53cb250l, true, 15);
    642         try {
    643             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
    644             script.forEach_testConvertFloat3Short3Float3(inV, out);
    645             verifyResultsConvertShort3Float3(inV, out, false);
    646         } catch (Exception e) {
    647             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Short3Float3: " + e.toString());
    648         }
    649         try {
    650             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
    651             scriptRelaxed.forEach_testConvertFloat3Short3Float3(inV, out);
    652             verifyResultsConvertShort3Float3(inV, out, true);
    653         } catch (Exception e) {
    654             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Short3Float3: " + e.toString());
    655         }
    656     }
    657 
    658     private void verifyResultsConvertShort3Float3(Allocation inV, Allocation out, boolean relaxed) {
    659         short[] arrayInV = new short[INPUTSIZE * 4];
    660         inV.copyTo(arrayInV);
    661         float[] arrayOut = new float[INPUTSIZE * 4];
    662         out.copyTo(arrayOut);
    663         for (int i = 0; i < INPUTSIZE; i++) {
    664             for (int j = 0; j < 3 ; j++) {
    665                 // Extract the inputs.
    666                 ArgumentsShortFloat args = new ArgumentsShortFloat();
    667                 args.inV = arrayInV[i * 4 + j];
    668                 // Figure out what the outputs should have been.
    669                 Target target = new Target(relaxed);
    670                 CoreMathVerifier.computeConvert(args, target);
    671                 // Validate the outputs.
    672                 boolean valid = true;
    673                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    674                     valid = false;
    675                 }
    676                 if (!valid) {
    677                     StringBuilder message = new StringBuilder();
    678                     message.append("Input inV: ");
    679                     message.append(String.format("%d", args.inV));
    680                     message.append("\n");
    681                     message.append("Expected output out: ");
    682                     message.append(args.out.toString());
    683                     message.append("\n");
    684                     message.append("Actual   output out: ");
    685                     message.append(String.format("%14.8g {%8x} %15a",
    686                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
    687                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    688                         message.append(" FAIL");
    689                     }
    690                     message.append("\n");
    691                     assertTrue("Incorrect output for checkConvertShort3Float3" +
    692                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    693                 }
    694             }
    695         }
    696     }
    697 
    698     private void checkConvertShort4Float4() {
    699         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x94cdaa84eb57d32el, true, 15);
    700         try {
    701             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
    702             script.forEach_testConvertFloat4Short4Float4(inV, out);
    703             verifyResultsConvertShort4Float4(inV, out, false);
    704         } catch (Exception e) {
    705             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Short4Float4: " + e.toString());
    706         }
    707         try {
    708             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
    709             scriptRelaxed.forEach_testConvertFloat4Short4Float4(inV, out);
    710             verifyResultsConvertShort4Float4(inV, out, true);
    711         } catch (Exception e) {
    712             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Short4Float4: " + e.toString());
    713         }
    714     }
    715 
    716     private void verifyResultsConvertShort4Float4(Allocation inV, Allocation out, boolean relaxed) {
    717         short[] arrayInV = new short[INPUTSIZE * 4];
    718         inV.copyTo(arrayInV);
    719         float[] arrayOut = new float[INPUTSIZE * 4];
    720         out.copyTo(arrayOut);
    721         for (int i = 0; i < INPUTSIZE; i++) {
    722             for (int j = 0; j < 4 ; j++) {
    723                 // Extract the inputs.
    724                 ArgumentsShortFloat args = new ArgumentsShortFloat();
    725                 args.inV = arrayInV[i * 4 + j];
    726                 // Figure out what the outputs should have been.
    727                 Target target = new Target(relaxed);
    728                 CoreMathVerifier.computeConvert(args, target);
    729                 // Validate the outputs.
    730                 boolean valid = true;
    731                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    732                     valid = false;
    733                 }
    734                 if (!valid) {
    735                     StringBuilder message = new StringBuilder();
    736                     message.append("Input inV: ");
    737                     message.append(String.format("%d", args.inV));
    738                     message.append("\n");
    739                     message.append("Expected output out: ");
    740                     message.append(args.out.toString());
    741                     message.append("\n");
    742                     message.append("Actual   output out: ");
    743                     message.append(String.format("%14.8g {%8x} %15a",
    744                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
    745                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    746                         message.append(" FAIL");
    747                     }
    748                     message.append("\n");
    749                     assertTrue("Incorrect output for checkConvertShort4Float4" +
    750                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    751                 }
    752             }
    753         }
    754     }
    755 
    756     public class ArgumentsUshortFloat {
    757         public short inV;
    758         public Target.Floaty out;
    759     }
    760 
    761     private void checkConvertUshort2Float2() {
    762         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xc36979962c6de12bl, false, 16);
    763         try {
    764             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
    765             script.forEach_testConvertFloat2Ushort2Float2(inV, out);
    766             verifyResultsConvertUshort2Float2(inV, out, false);
    767         } catch (Exception e) {
    768             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Ushort2Float2: " + e.toString());
    769         }
    770         try {
    771             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
    772             scriptRelaxed.forEach_testConvertFloat2Ushort2Float2(inV, out);
    773             verifyResultsConvertUshort2Float2(inV, out, true);
    774         } catch (Exception e) {
    775             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Ushort2Float2: " + e.toString());
    776         }
    777     }
    778 
    779     private void verifyResultsConvertUshort2Float2(Allocation inV, Allocation out, boolean relaxed) {
    780         short[] arrayInV = new short[INPUTSIZE * 2];
    781         inV.copyTo(arrayInV);
    782         float[] arrayOut = new float[INPUTSIZE * 2];
    783         out.copyTo(arrayOut);
    784         for (int i = 0; i < INPUTSIZE; i++) {
    785             for (int j = 0; j < 2 ; j++) {
    786                 // Extract the inputs.
    787                 ArgumentsUshortFloat args = new ArgumentsUshortFloat();
    788                 args.inV = arrayInV[i * 2 + j];
    789                 // Figure out what the outputs should have been.
    790                 Target target = new Target(relaxed);
    791                 CoreMathVerifier.computeConvert(args, target);
    792                 // Validate the outputs.
    793                 boolean valid = true;
    794                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
    795                     valid = false;
    796                 }
    797                 if (!valid) {
    798                     StringBuilder message = new StringBuilder();
    799                     message.append("Input inV: ");
    800                     message.append(String.format("0x%x", args.inV));
    801                     message.append("\n");
    802                     message.append("Expected output out: ");
    803                     message.append(args.out.toString());
    804                     message.append("\n");
    805                     message.append("Actual   output out: ");
    806                     message.append(String.format("%14.8g {%8x} %15a",
    807                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
    808                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
    809                         message.append(" FAIL");
    810                     }
    811                     message.append("\n");
    812                     assertTrue("Incorrect output for checkConvertUshort2Float2" +
    813                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    814                 }
    815             }
    816         }
    817     }
    818 
    819     private void checkConvertUshort3Float3() {
    820         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xc36b42b122890209l, false, 16);
    821         try {
    822             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
    823             script.forEach_testConvertFloat3Ushort3Float3(inV, out);
    824             verifyResultsConvertUshort3Float3(inV, out, false);
    825         } catch (Exception e) {
    826             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Ushort3Float3: " + e.toString());
    827         }
    828         try {
    829             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
    830             scriptRelaxed.forEach_testConvertFloat3Ushort3Float3(inV, out);
    831             verifyResultsConvertUshort3Float3(inV, out, true);
    832         } catch (Exception e) {
    833             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Ushort3Float3: " + e.toString());
    834         }
    835     }
    836 
    837     private void verifyResultsConvertUshort3Float3(Allocation inV, Allocation out, boolean relaxed) {
    838         short[] arrayInV = new short[INPUTSIZE * 4];
    839         inV.copyTo(arrayInV);
    840         float[] arrayOut = new float[INPUTSIZE * 4];
    841         out.copyTo(arrayOut);
    842         for (int i = 0; i < INPUTSIZE; i++) {
    843             for (int j = 0; j < 3 ; j++) {
    844                 // Extract the inputs.
    845                 ArgumentsUshortFloat args = new ArgumentsUshortFloat();
    846                 args.inV = arrayInV[i * 4 + j];
    847                 // Figure out what the outputs should have been.
    848                 Target target = new Target(relaxed);
    849                 CoreMathVerifier.computeConvert(args, target);
    850                 // Validate the outputs.
    851                 boolean valid = true;
    852                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    853                     valid = false;
    854                 }
    855                 if (!valid) {
    856                     StringBuilder message = new StringBuilder();
    857                     message.append("Input inV: ");
    858                     message.append(String.format("0x%x", args.inV));
    859                     message.append("\n");
    860                     message.append("Expected output out: ");
    861                     message.append(args.out.toString());
    862                     message.append("\n");
    863                     message.append("Actual   output out: ");
    864                     message.append(String.format("%14.8g {%8x} %15a",
    865                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
    866                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    867                         message.append(" FAIL");
    868                     }
    869                     message.append("\n");
    870                     assertTrue("Incorrect output for checkConvertUshort3Float3" +
    871                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    872                 }
    873             }
    874         }
    875     }
    876 
    877     private void checkConvertUshort4Float4() {
    878         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xc36d0bcc18a422e7l, false, 16);
    879         try {
    880             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
    881             script.forEach_testConvertFloat4Ushort4Float4(inV, out);
    882             verifyResultsConvertUshort4Float4(inV, out, false);
    883         } catch (Exception e) {
    884             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Ushort4Float4: " + e.toString());
    885         }
    886         try {
    887             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
    888             scriptRelaxed.forEach_testConvertFloat4Ushort4Float4(inV, out);
    889             verifyResultsConvertUshort4Float4(inV, out, true);
    890         } catch (Exception e) {
    891             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Ushort4Float4: " + e.toString());
    892         }
    893     }
    894 
    895     private void verifyResultsConvertUshort4Float4(Allocation inV, Allocation out, boolean relaxed) {
    896         short[] arrayInV = new short[INPUTSIZE * 4];
    897         inV.copyTo(arrayInV);
    898         float[] arrayOut = new float[INPUTSIZE * 4];
    899         out.copyTo(arrayOut);
    900         for (int i = 0; i < INPUTSIZE; i++) {
    901             for (int j = 0; j < 4 ; j++) {
    902                 // Extract the inputs.
    903                 ArgumentsUshortFloat args = new ArgumentsUshortFloat();
    904                 args.inV = arrayInV[i * 4 + j];
    905                 // Figure out what the outputs should have been.
    906                 Target target = new Target(relaxed);
    907                 CoreMathVerifier.computeConvert(args, target);
    908                 // Validate the outputs.
    909                 boolean valid = true;
    910                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    911                     valid = false;
    912                 }
    913                 if (!valid) {
    914                     StringBuilder message = new StringBuilder();
    915                     message.append("Input inV: ");
    916                     message.append(String.format("0x%x", args.inV));
    917                     message.append("\n");
    918                     message.append("Expected output out: ");
    919                     message.append(args.out.toString());
    920                     message.append("\n");
    921                     message.append("Actual   output out: ");
    922                     message.append(String.format("%14.8g {%8x} %15a",
    923                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
    924                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
    925                         message.append(" FAIL");
    926                     }
    927                     message.append("\n");
    928                     assertTrue("Incorrect output for checkConvertUshort4Float4" +
    929                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    930                 }
    931             }
    932         }
    933     }
    934 
    935     public class ArgumentsIntFloat {
    936         public int inV;
    937         public Target.Floaty out;
    938     }
    939 
    940     private void checkConvertInt2Float2() {
    941         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x2a52c7eb7402bfc5l, true, 31);
    942         try {
    943             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
    944             script.forEach_testConvertFloat2Int2Float2(inV, out);
    945             verifyResultsConvertInt2Float2(inV, out, false);
    946         } catch (Exception e) {
    947             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Int2Float2: " + e.toString());
    948         }
    949         try {
    950             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
    951             scriptRelaxed.forEach_testConvertFloat2Int2Float2(inV, out);
    952             verifyResultsConvertInt2Float2(inV, out, true);
    953         } catch (Exception e) {
    954             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Int2Float2: " + e.toString());
    955         }
    956     }
    957 
    958     private void verifyResultsConvertInt2Float2(Allocation inV, Allocation out, boolean relaxed) {
    959         int[] arrayInV = new int[INPUTSIZE * 2];
    960         inV.copyTo(arrayInV);
    961         float[] arrayOut = new float[INPUTSIZE * 2];
    962         out.copyTo(arrayOut);
    963         for (int i = 0; i < INPUTSIZE; i++) {
    964             for (int j = 0; j < 2 ; j++) {
    965                 // Extract the inputs.
    966                 ArgumentsIntFloat args = new ArgumentsIntFloat();
    967                 args.inV = arrayInV[i * 2 + j];
    968                 // Figure out what the outputs should have been.
    969                 Target target = new Target(relaxed);
    970                 CoreMathVerifier.computeConvert(args, target);
    971                 // Validate the outputs.
    972                 boolean valid = true;
    973                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
    974                     valid = false;
    975                 }
    976                 if (!valid) {
    977                     StringBuilder message = new StringBuilder();
    978                     message.append("Input inV: ");
    979                     message.append(String.format("%d", args.inV));
    980                     message.append("\n");
    981                     message.append("Expected output out: ");
    982                     message.append(args.out.toString());
    983                     message.append("\n");
    984                     message.append("Actual   output out: ");
    985                     message.append(String.format("%14.8g {%8x} %15a",
    986                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
    987                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
    988                         message.append(" FAIL");
    989                     }
    990                     message.append("\n");
    991                     assertTrue("Incorrect output for checkConvertInt2Float2" +
    992                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
    993                 }
    994             }
    995         }
    996     }
    997 
    998     private void checkConvertInt3Float3() {
    999         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x2a5491066a1de0a3l, true, 31);
   1000         try {
   1001             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
   1002             script.forEach_testConvertFloat3Int3Float3(inV, out);
   1003             verifyResultsConvertInt3Float3(inV, out, false);
   1004         } catch (Exception e) {
   1005             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Int3Float3: " + e.toString());
   1006         }
   1007         try {
   1008             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
   1009             scriptRelaxed.forEach_testConvertFloat3Int3Float3(inV, out);
   1010             verifyResultsConvertInt3Float3(inV, out, true);
   1011         } catch (Exception e) {
   1012             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Int3Float3: " + e.toString());
   1013         }
   1014     }
   1015 
   1016     private void verifyResultsConvertInt3Float3(Allocation inV, Allocation out, boolean relaxed) {
   1017         int[] arrayInV = new int[INPUTSIZE * 4];
   1018         inV.copyTo(arrayInV);
   1019         float[] arrayOut = new float[INPUTSIZE * 4];
   1020         out.copyTo(arrayOut);
   1021         for (int i = 0; i < INPUTSIZE; i++) {
   1022             for (int j = 0; j < 3 ; j++) {
   1023                 // Extract the inputs.
   1024                 ArgumentsIntFloat args = new ArgumentsIntFloat();
   1025                 args.inV = arrayInV[i * 4 + j];
   1026                 // Figure out what the outputs should have been.
   1027                 Target target = new Target(relaxed);
   1028                 CoreMathVerifier.computeConvert(args, target);
   1029                 // Validate the outputs.
   1030                 boolean valid = true;
   1031                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   1032                     valid = false;
   1033                 }
   1034                 if (!valid) {
   1035                     StringBuilder message = new StringBuilder();
   1036                     message.append("Input inV: ");
   1037                     message.append(String.format("%d", args.inV));
   1038                     message.append("\n");
   1039                     message.append("Expected output out: ");
   1040                     message.append(args.out.toString());
   1041                     message.append("\n");
   1042                     message.append("Actual   output out: ");
   1043                     message.append(String.format("%14.8g {%8x} %15a",
   1044                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   1045                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   1046                         message.append(" FAIL");
   1047                     }
   1048                     message.append("\n");
   1049                     assertTrue("Incorrect output for checkConvertInt3Float3" +
   1050                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1051                 }
   1052             }
   1053         }
   1054     }
   1055 
   1056     private void checkConvertInt4Float4() {
   1057         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x2a565a2160390181l, true, 31);
   1058         try {
   1059             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
   1060             script.forEach_testConvertFloat4Int4Float4(inV, out);
   1061             verifyResultsConvertInt4Float4(inV, out, false);
   1062         } catch (Exception e) {
   1063             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Int4Float4: " + e.toString());
   1064         }
   1065         try {
   1066             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
   1067             scriptRelaxed.forEach_testConvertFloat4Int4Float4(inV, out);
   1068             verifyResultsConvertInt4Float4(inV, out, true);
   1069         } catch (Exception e) {
   1070             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Int4Float4: " + e.toString());
   1071         }
   1072     }
   1073 
   1074     private void verifyResultsConvertInt4Float4(Allocation inV, Allocation out, boolean relaxed) {
   1075         int[] arrayInV = new int[INPUTSIZE * 4];
   1076         inV.copyTo(arrayInV);
   1077         float[] arrayOut = new float[INPUTSIZE * 4];
   1078         out.copyTo(arrayOut);
   1079         for (int i = 0; i < INPUTSIZE; i++) {
   1080             for (int j = 0; j < 4 ; j++) {
   1081                 // Extract the inputs.
   1082                 ArgumentsIntFloat args = new ArgumentsIntFloat();
   1083                 args.inV = arrayInV[i * 4 + j];
   1084                 // Figure out what the outputs should have been.
   1085                 Target target = new Target(relaxed);
   1086                 CoreMathVerifier.computeConvert(args, target);
   1087                 // Validate the outputs.
   1088                 boolean valid = true;
   1089                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   1090                     valid = false;
   1091                 }
   1092                 if (!valid) {
   1093                     StringBuilder message = new StringBuilder();
   1094                     message.append("Input inV: ");
   1095                     message.append(String.format("%d", args.inV));
   1096                     message.append("\n");
   1097                     message.append("Expected output out: ");
   1098                     message.append(args.out.toString());
   1099                     message.append("\n");
   1100                     message.append("Actual   output out: ");
   1101                     message.append(String.format("%14.8g {%8x} %15a",
   1102                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   1103                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   1104                         message.append(" FAIL");
   1105                     }
   1106                     message.append("\n");
   1107                     assertTrue("Incorrect output for checkConvertInt4Float4" +
   1108                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1109                 }
   1110             }
   1111         }
   1112     }
   1113 
   1114     public class ArgumentsUintFloat {
   1115         public int inV;
   1116         public Target.Floaty out;
   1117     }
   1118 
   1119     private void checkConvertUint2Float2() {
   1120         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xd1e081390684cc46l, false, 32);
   1121         try {
   1122             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
   1123             script.forEach_testConvertFloat2Uint2Float2(inV, out);
   1124             verifyResultsConvertUint2Float2(inV, out, false);
   1125         } catch (Exception e) {
   1126             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Uint2Float2: " + e.toString());
   1127         }
   1128         try {
   1129             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
   1130             scriptRelaxed.forEach_testConvertFloat2Uint2Float2(inV, out);
   1131             verifyResultsConvertUint2Float2(inV, out, true);
   1132         } catch (Exception e) {
   1133             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Uint2Float2: " + e.toString());
   1134         }
   1135     }
   1136 
   1137     private void verifyResultsConvertUint2Float2(Allocation inV, Allocation out, boolean relaxed) {
   1138         int[] arrayInV = new int[INPUTSIZE * 2];
   1139         inV.copyTo(arrayInV);
   1140         float[] arrayOut = new float[INPUTSIZE * 2];
   1141         out.copyTo(arrayOut);
   1142         for (int i = 0; i < INPUTSIZE; i++) {
   1143             for (int j = 0; j < 2 ; j++) {
   1144                 // Extract the inputs.
   1145                 ArgumentsUintFloat args = new ArgumentsUintFloat();
   1146                 args.inV = arrayInV[i * 2 + j];
   1147                 // Figure out what the outputs should have been.
   1148                 Target target = new Target(relaxed);
   1149                 CoreMathVerifier.computeConvert(args, target);
   1150                 // Validate the outputs.
   1151                 boolean valid = true;
   1152                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   1153                     valid = false;
   1154                 }
   1155                 if (!valid) {
   1156                     StringBuilder message = new StringBuilder();
   1157                     message.append("Input inV: ");
   1158                     message.append(String.format("0x%x", args.inV));
   1159                     message.append("\n");
   1160                     message.append("Expected output out: ");
   1161                     message.append(args.out.toString());
   1162                     message.append("\n");
   1163                     message.append("Actual   output out: ");
   1164                     message.append(String.format("%14.8g {%8x} %15a",
   1165                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   1166                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   1167                         message.append(" FAIL");
   1168                     }
   1169                     message.append("\n");
   1170                     assertTrue("Incorrect output for checkConvertUint2Float2" +
   1171                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1172                 }
   1173             }
   1174         }
   1175     }
   1176 
   1177     private void checkConvertUint3Float3() {
   1178         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xd1e24a53fc9fed24l, false, 32);
   1179         try {
   1180             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
   1181             script.forEach_testConvertFloat3Uint3Float3(inV, out);
   1182             verifyResultsConvertUint3Float3(inV, out, false);
   1183         } catch (Exception e) {
   1184             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Uint3Float3: " + e.toString());
   1185         }
   1186         try {
   1187             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
   1188             scriptRelaxed.forEach_testConvertFloat3Uint3Float3(inV, out);
   1189             verifyResultsConvertUint3Float3(inV, out, true);
   1190         } catch (Exception e) {
   1191             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Uint3Float3: " + e.toString());
   1192         }
   1193     }
   1194 
   1195     private void verifyResultsConvertUint3Float3(Allocation inV, Allocation out, boolean relaxed) {
   1196         int[] arrayInV = new int[INPUTSIZE * 4];
   1197         inV.copyTo(arrayInV);
   1198         float[] arrayOut = new float[INPUTSIZE * 4];
   1199         out.copyTo(arrayOut);
   1200         for (int i = 0; i < INPUTSIZE; i++) {
   1201             for (int j = 0; j < 3 ; j++) {
   1202                 // Extract the inputs.
   1203                 ArgumentsUintFloat args = new ArgumentsUintFloat();
   1204                 args.inV = arrayInV[i * 4 + j];
   1205                 // Figure out what the outputs should have been.
   1206                 Target target = new Target(relaxed);
   1207                 CoreMathVerifier.computeConvert(args, target);
   1208                 // Validate the outputs.
   1209                 boolean valid = true;
   1210                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   1211                     valid = false;
   1212                 }
   1213                 if (!valid) {
   1214                     StringBuilder message = new StringBuilder();
   1215                     message.append("Input inV: ");
   1216                     message.append(String.format("0x%x", args.inV));
   1217                     message.append("\n");
   1218                     message.append("Expected output out: ");
   1219                     message.append(args.out.toString());
   1220                     message.append("\n");
   1221                     message.append("Actual   output out: ");
   1222                     message.append(String.format("%14.8g {%8x} %15a",
   1223                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   1224                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   1225                         message.append(" FAIL");
   1226                     }
   1227                     message.append("\n");
   1228                     assertTrue("Incorrect output for checkConvertUint3Float3" +
   1229                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1230                 }
   1231             }
   1232         }
   1233     }
   1234 
   1235     private void checkConvertUint4Float4() {
   1236         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xd1e4136ef2bb0e02l, false, 32);
   1237         try {
   1238             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
   1239             script.forEach_testConvertFloat4Uint4Float4(inV, out);
   1240             verifyResultsConvertUint4Float4(inV, out, false);
   1241         } catch (Exception e) {
   1242             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Uint4Float4: " + e.toString());
   1243         }
   1244         try {
   1245             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
   1246             scriptRelaxed.forEach_testConvertFloat4Uint4Float4(inV, out);
   1247             verifyResultsConvertUint4Float4(inV, out, true);
   1248         } catch (Exception e) {
   1249             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Uint4Float4: " + e.toString());
   1250         }
   1251     }
   1252 
   1253     private void verifyResultsConvertUint4Float4(Allocation inV, Allocation out, boolean relaxed) {
   1254         int[] arrayInV = new int[INPUTSIZE * 4];
   1255         inV.copyTo(arrayInV);
   1256         float[] arrayOut = new float[INPUTSIZE * 4];
   1257         out.copyTo(arrayOut);
   1258         for (int i = 0; i < INPUTSIZE; i++) {
   1259             for (int j = 0; j < 4 ; j++) {
   1260                 // Extract the inputs.
   1261                 ArgumentsUintFloat args = new ArgumentsUintFloat();
   1262                 args.inV = arrayInV[i * 4 + j];
   1263                 // Figure out what the outputs should have been.
   1264                 Target target = new Target(relaxed);
   1265                 CoreMathVerifier.computeConvert(args, target);
   1266                 // Validate the outputs.
   1267                 boolean valid = true;
   1268                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   1269                     valid = false;
   1270                 }
   1271                 if (!valid) {
   1272                     StringBuilder message = new StringBuilder();
   1273                     message.append("Input inV: ");
   1274                     message.append(String.format("0x%x", args.inV));
   1275                     message.append("\n");
   1276                     message.append("Expected output out: ");
   1277                     message.append(args.out.toString());
   1278                     message.append("\n");
   1279                     message.append("Actual   output out: ");
   1280                     message.append(String.format("%14.8g {%8x} %15a",
   1281                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   1282                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   1283                         message.append(" FAIL");
   1284                     }
   1285                     message.append("\n");
   1286                     assertTrue("Incorrect output for checkConvertUint4Float4" +
   1287                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1288                 }
   1289             }
   1290         }
   1291     }
   1292 
   1293     public class ArgumentsFloatChar {
   1294         public float inV;
   1295         public byte out;
   1296     }
   1297 
   1298     private void checkConvertFloat2Char2() {
   1299         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x239cb25829789662l, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
   1300         try {
   1301             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   1302             script.forEach_testConvertChar2Float2Char2(inV, out);
   1303             verifyResultsConvertFloat2Char2(inV, out, false);
   1304         } catch (Exception e) {
   1305             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Float2Char2: " + e.toString());
   1306         }
   1307         try {
   1308             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   1309             scriptRelaxed.forEach_testConvertChar2Float2Char2(inV, out);
   1310             verifyResultsConvertFloat2Char2(inV, out, true);
   1311         } catch (Exception e) {
   1312             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Float2Char2: " + e.toString());
   1313         }
   1314     }
   1315 
   1316     private void verifyResultsConvertFloat2Char2(Allocation inV, Allocation out, boolean relaxed) {
   1317         float[] arrayInV = new float[INPUTSIZE * 2];
   1318         inV.copyTo(arrayInV);
   1319         byte[] arrayOut = new byte[INPUTSIZE * 2];
   1320         out.copyTo(arrayOut);
   1321         for (int i = 0; i < INPUTSIZE; i++) {
   1322             for (int j = 0; j < 2 ; j++) {
   1323                 // Extract the inputs.
   1324                 ArgumentsFloatChar args = new ArgumentsFloatChar();
   1325                 args.inV = arrayInV[i * 2 + j];
   1326                 // Figure out what the outputs should have been.
   1327                 CoreMathVerifier.computeConvert(args);
   1328                 // Validate the outputs.
   1329                 boolean valid = true;
   1330                 if (args.out != arrayOut[i * 2 + j]) {
   1331                     valid = false;
   1332                 }
   1333                 if (!valid) {
   1334                     StringBuilder message = new StringBuilder();
   1335                     message.append("Input inV: ");
   1336                     message.append(String.format("%14.8g {%8x} %15a",
   1337                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   1338                     message.append("\n");
   1339                     message.append("Expected output out: ");
   1340                     message.append(String.format("%d", args.out));
   1341                     message.append("\n");
   1342                     message.append("Actual   output out: ");
   1343                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   1344                     if (args.out != arrayOut[i * 2 + j]) {
   1345                         message.append(" FAIL");
   1346                     }
   1347                     message.append("\n");
   1348                     assertTrue("Incorrect output for checkConvertFloat2Char2" +
   1349                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1350                 }
   1351             }
   1352         }
   1353     }
   1354 
   1355     private void checkConvertFloat3Char3() {
   1356         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x239cbcf988805b56l, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
   1357         try {
   1358             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   1359             script.forEach_testConvertChar3Float3Char3(inV, out);
   1360             verifyResultsConvertFloat3Char3(inV, out, false);
   1361         } catch (Exception e) {
   1362             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Float3Char3: " + e.toString());
   1363         }
   1364         try {
   1365             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   1366             scriptRelaxed.forEach_testConvertChar3Float3Char3(inV, out);
   1367             verifyResultsConvertFloat3Char3(inV, out, true);
   1368         } catch (Exception e) {
   1369             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Float3Char3: " + e.toString());
   1370         }
   1371     }
   1372 
   1373     private void verifyResultsConvertFloat3Char3(Allocation inV, Allocation out, boolean relaxed) {
   1374         float[] arrayInV = new float[INPUTSIZE * 4];
   1375         inV.copyTo(arrayInV);
   1376         byte[] arrayOut = new byte[INPUTSIZE * 4];
   1377         out.copyTo(arrayOut);
   1378         for (int i = 0; i < INPUTSIZE; i++) {
   1379             for (int j = 0; j < 3 ; j++) {
   1380                 // Extract the inputs.
   1381                 ArgumentsFloatChar args = new ArgumentsFloatChar();
   1382                 args.inV = arrayInV[i * 4 + j];
   1383                 // Figure out what the outputs should have been.
   1384                 CoreMathVerifier.computeConvert(args);
   1385                 // Validate the outputs.
   1386                 boolean valid = true;
   1387                 if (args.out != arrayOut[i * 4 + j]) {
   1388                     valid = false;
   1389                 }
   1390                 if (!valid) {
   1391                     StringBuilder message = new StringBuilder();
   1392                     message.append("Input inV: ");
   1393                     message.append(String.format("%14.8g {%8x} %15a",
   1394                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   1395                     message.append("\n");
   1396                     message.append("Expected output out: ");
   1397                     message.append(String.format("%d", args.out));
   1398                     message.append("\n");
   1399                     message.append("Actual   output out: ");
   1400                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   1401                     if (args.out != arrayOut[i * 4 + j]) {
   1402                         message.append(" FAIL");
   1403                     }
   1404                     message.append("\n");
   1405                     assertTrue("Incorrect output for checkConvertFloat3Char3" +
   1406                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1407                 }
   1408             }
   1409         }
   1410     }
   1411 
   1412     private void checkConvertFloat4Char4() {
   1413         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x239cc79ae788204al, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
   1414         try {
   1415             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   1416             script.forEach_testConvertChar4Float4Char4(inV, out);
   1417             verifyResultsConvertFloat4Char4(inV, out, false);
   1418         } catch (Exception e) {
   1419             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Float4Char4: " + e.toString());
   1420         }
   1421         try {
   1422             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   1423             scriptRelaxed.forEach_testConvertChar4Float4Char4(inV, out);
   1424             verifyResultsConvertFloat4Char4(inV, out, true);
   1425         } catch (Exception e) {
   1426             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Float4Char4: " + e.toString());
   1427         }
   1428     }
   1429 
   1430     private void verifyResultsConvertFloat4Char4(Allocation inV, Allocation out, boolean relaxed) {
   1431         float[] arrayInV = new float[INPUTSIZE * 4];
   1432         inV.copyTo(arrayInV);
   1433         byte[] arrayOut = new byte[INPUTSIZE * 4];
   1434         out.copyTo(arrayOut);
   1435         for (int i = 0; i < INPUTSIZE; i++) {
   1436             for (int j = 0; j < 4 ; j++) {
   1437                 // Extract the inputs.
   1438                 ArgumentsFloatChar args = new ArgumentsFloatChar();
   1439                 args.inV = arrayInV[i * 4 + j];
   1440                 // Figure out what the outputs should have been.
   1441                 CoreMathVerifier.computeConvert(args);
   1442                 // Validate the outputs.
   1443                 boolean valid = true;
   1444                 if (args.out != arrayOut[i * 4 + j]) {
   1445                     valid = false;
   1446                 }
   1447                 if (!valid) {
   1448                     StringBuilder message = new StringBuilder();
   1449                     message.append("Input inV: ");
   1450                     message.append(String.format("%14.8g {%8x} %15a",
   1451                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   1452                     message.append("\n");
   1453                     message.append("Expected output out: ");
   1454                     message.append(String.format("%d", args.out));
   1455                     message.append("\n");
   1456                     message.append("Actual   output out: ");
   1457                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   1458                     if (args.out != arrayOut[i * 4 + j]) {
   1459                         message.append(" FAIL");
   1460                     }
   1461                     message.append("\n");
   1462                     assertTrue("Incorrect output for checkConvertFloat4Char4" +
   1463                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1464                 }
   1465             }
   1466         }
   1467     }
   1468 
   1469     public class ArgumentsCharChar {
   1470         public byte inV;
   1471         public byte out;
   1472     }
   1473 
   1474     private void checkConvertChar2Char2() {
   1475         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd8618777d5086da2l, true, 7);
   1476         try {
   1477             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   1478             script.forEach_testConvertChar2Char2Char2(inV, out);
   1479             verifyResultsConvertChar2Char2(inV, out, false);
   1480         } catch (Exception e) {
   1481             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Char2Char2: " + e.toString());
   1482         }
   1483         try {
   1484             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   1485             scriptRelaxed.forEach_testConvertChar2Char2Char2(inV, out);
   1486             verifyResultsConvertChar2Char2(inV, out, true);
   1487         } catch (Exception e) {
   1488             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Char2Char2: " + e.toString());
   1489         }
   1490     }
   1491 
   1492     private void verifyResultsConvertChar2Char2(Allocation inV, Allocation out, boolean relaxed) {
   1493         byte[] arrayInV = new byte[INPUTSIZE * 2];
   1494         inV.copyTo(arrayInV);
   1495         byte[] arrayOut = new byte[INPUTSIZE * 2];
   1496         out.copyTo(arrayOut);
   1497         for (int i = 0; i < INPUTSIZE; i++) {
   1498             for (int j = 0; j < 2 ; j++) {
   1499                 // Extract the inputs.
   1500                 ArgumentsCharChar args = new ArgumentsCharChar();
   1501                 args.inV = arrayInV[i * 2 + j];
   1502                 // Figure out what the outputs should have been.
   1503                 CoreMathVerifier.computeConvert(args);
   1504                 // Validate the outputs.
   1505                 boolean valid = true;
   1506                 if (args.out != arrayOut[i * 2 + j]) {
   1507                     valid = false;
   1508                 }
   1509                 if (!valid) {
   1510                     StringBuilder message = new StringBuilder();
   1511                     message.append("Input inV: ");
   1512                     message.append(String.format("%d", args.inV));
   1513                     message.append("\n");
   1514                     message.append("Expected output out: ");
   1515                     message.append(String.format("%d", args.out));
   1516                     message.append("\n");
   1517                     message.append("Actual   output out: ");
   1518                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   1519                     if (args.out != arrayOut[i * 2 + j]) {
   1520                         message.append(" FAIL");
   1521                     }
   1522                     message.append("\n");
   1523                     assertTrue("Incorrect output for checkConvertChar2Char2" +
   1524                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1525                 }
   1526             }
   1527         }
   1528     }
   1529 
   1530     private void checkConvertChar3Char3() {
   1531         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xd861921934103296l, true, 7);
   1532         try {
   1533             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   1534             script.forEach_testConvertChar3Char3Char3(inV, out);
   1535             verifyResultsConvertChar3Char3(inV, out, false);
   1536         } catch (Exception e) {
   1537             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Char3Char3: " + e.toString());
   1538         }
   1539         try {
   1540             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   1541             scriptRelaxed.forEach_testConvertChar3Char3Char3(inV, out);
   1542             verifyResultsConvertChar3Char3(inV, out, true);
   1543         } catch (Exception e) {
   1544             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Char3Char3: " + e.toString());
   1545         }
   1546     }
   1547 
   1548     private void verifyResultsConvertChar3Char3(Allocation inV, Allocation out, boolean relaxed) {
   1549         byte[] arrayInV = new byte[INPUTSIZE * 4];
   1550         inV.copyTo(arrayInV);
   1551         byte[] arrayOut = new byte[INPUTSIZE * 4];
   1552         out.copyTo(arrayOut);
   1553         for (int i = 0; i < INPUTSIZE; i++) {
   1554             for (int j = 0; j < 3 ; j++) {
   1555                 // Extract the inputs.
   1556                 ArgumentsCharChar args = new ArgumentsCharChar();
   1557                 args.inV = arrayInV[i * 4 + j];
   1558                 // Figure out what the outputs should have been.
   1559                 CoreMathVerifier.computeConvert(args);
   1560                 // Validate the outputs.
   1561                 boolean valid = true;
   1562                 if (args.out != arrayOut[i * 4 + j]) {
   1563                     valid = false;
   1564                 }
   1565                 if (!valid) {
   1566                     StringBuilder message = new StringBuilder();
   1567                     message.append("Input inV: ");
   1568                     message.append(String.format("%d", args.inV));
   1569                     message.append("\n");
   1570                     message.append("Expected output out: ");
   1571                     message.append(String.format("%d", args.out));
   1572                     message.append("\n");
   1573                     message.append("Actual   output out: ");
   1574                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   1575                     if (args.out != arrayOut[i * 4 + j]) {
   1576                         message.append(" FAIL");
   1577                     }
   1578                     message.append("\n");
   1579                     assertTrue("Incorrect output for checkConvertChar3Char3" +
   1580                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1581                 }
   1582             }
   1583         }
   1584     }
   1585 
   1586     private void checkConvertChar4Char4() {
   1587         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd8619cba9317f78al, true, 7);
   1588         try {
   1589             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   1590             script.forEach_testConvertChar4Char4Char4(inV, out);
   1591             verifyResultsConvertChar4Char4(inV, out, false);
   1592         } catch (Exception e) {
   1593             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Char4Char4: " + e.toString());
   1594         }
   1595         try {
   1596             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   1597             scriptRelaxed.forEach_testConvertChar4Char4Char4(inV, out);
   1598             verifyResultsConvertChar4Char4(inV, out, true);
   1599         } catch (Exception e) {
   1600             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Char4Char4: " + e.toString());
   1601         }
   1602     }
   1603 
   1604     private void verifyResultsConvertChar4Char4(Allocation inV, Allocation out, boolean relaxed) {
   1605         byte[] arrayInV = new byte[INPUTSIZE * 4];
   1606         inV.copyTo(arrayInV);
   1607         byte[] arrayOut = new byte[INPUTSIZE * 4];
   1608         out.copyTo(arrayOut);
   1609         for (int i = 0; i < INPUTSIZE; i++) {
   1610             for (int j = 0; j < 4 ; j++) {
   1611                 // Extract the inputs.
   1612                 ArgumentsCharChar args = new ArgumentsCharChar();
   1613                 args.inV = arrayInV[i * 4 + j];
   1614                 // Figure out what the outputs should have been.
   1615                 CoreMathVerifier.computeConvert(args);
   1616                 // Validate the outputs.
   1617                 boolean valid = true;
   1618                 if (args.out != arrayOut[i * 4 + j]) {
   1619                     valid = false;
   1620                 }
   1621                 if (!valid) {
   1622                     StringBuilder message = new StringBuilder();
   1623                     message.append("Input inV: ");
   1624                     message.append(String.format("%d", args.inV));
   1625                     message.append("\n");
   1626                     message.append("Expected output out: ");
   1627                     message.append(String.format("%d", args.out));
   1628                     message.append("\n");
   1629                     message.append("Actual   output out: ");
   1630                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   1631                     if (args.out != arrayOut[i * 4 + j]) {
   1632                         message.append(" FAIL");
   1633                     }
   1634                     message.append("\n");
   1635                     assertTrue("Incorrect output for checkConvertChar4Char4" +
   1636                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1637                 }
   1638             }
   1639         }
   1640     }
   1641 
   1642     public class ArgumentsUcharChar {
   1643         public byte inV;
   1644         public byte out;
   1645     }
   1646 
   1647     private void checkConvertUchar2Char2() {
   1648         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7fef40c5678a7a23l, false, 7);
   1649         try {
   1650             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   1651             script.forEach_testConvertChar2Uchar2Char2(inV, out);
   1652             verifyResultsConvertUchar2Char2(inV, out, false);
   1653         } catch (Exception e) {
   1654             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Uchar2Char2: " + e.toString());
   1655         }
   1656         try {
   1657             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   1658             scriptRelaxed.forEach_testConvertChar2Uchar2Char2(inV, out);
   1659             verifyResultsConvertUchar2Char2(inV, out, true);
   1660         } catch (Exception e) {
   1661             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Uchar2Char2: " + e.toString());
   1662         }
   1663     }
   1664 
   1665     private void verifyResultsConvertUchar2Char2(Allocation inV, Allocation out, boolean relaxed) {
   1666         byte[] arrayInV = new byte[INPUTSIZE * 2];
   1667         inV.copyTo(arrayInV);
   1668         byte[] arrayOut = new byte[INPUTSIZE * 2];
   1669         out.copyTo(arrayOut);
   1670         for (int i = 0; i < INPUTSIZE; i++) {
   1671             for (int j = 0; j < 2 ; j++) {
   1672                 // Extract the inputs.
   1673                 ArgumentsUcharChar args = new ArgumentsUcharChar();
   1674                 args.inV = arrayInV[i * 2 + j];
   1675                 // Figure out what the outputs should have been.
   1676                 CoreMathVerifier.computeConvert(args);
   1677                 // Validate the outputs.
   1678                 boolean valid = true;
   1679                 if (args.out != arrayOut[i * 2 + j]) {
   1680                     valid = false;
   1681                 }
   1682                 if (!valid) {
   1683                     StringBuilder message = new StringBuilder();
   1684                     message.append("Input inV: ");
   1685                     message.append(String.format("0x%x", args.inV));
   1686                     message.append("\n");
   1687                     message.append("Expected output out: ");
   1688                     message.append(String.format("%d", args.out));
   1689                     message.append("\n");
   1690                     message.append("Actual   output out: ");
   1691                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   1692                     if (args.out != arrayOut[i * 2 + j]) {
   1693                         message.append(" FAIL");
   1694                     }
   1695                     message.append("\n");
   1696                     assertTrue("Incorrect output for checkConvertUchar2Char2" +
   1697                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1698                 }
   1699             }
   1700         }
   1701     }
   1702 
   1703     private void checkConvertUchar3Char3() {
   1704         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7fef4b66c6923f17l, false, 7);
   1705         try {
   1706             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   1707             script.forEach_testConvertChar3Uchar3Char3(inV, out);
   1708             verifyResultsConvertUchar3Char3(inV, out, false);
   1709         } catch (Exception e) {
   1710             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Uchar3Char3: " + e.toString());
   1711         }
   1712         try {
   1713             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   1714             scriptRelaxed.forEach_testConvertChar3Uchar3Char3(inV, out);
   1715             verifyResultsConvertUchar3Char3(inV, out, true);
   1716         } catch (Exception e) {
   1717             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Uchar3Char3: " + e.toString());
   1718         }
   1719     }
   1720 
   1721     private void verifyResultsConvertUchar3Char3(Allocation inV, Allocation out, boolean relaxed) {
   1722         byte[] arrayInV = new byte[INPUTSIZE * 4];
   1723         inV.copyTo(arrayInV);
   1724         byte[] arrayOut = new byte[INPUTSIZE * 4];
   1725         out.copyTo(arrayOut);
   1726         for (int i = 0; i < INPUTSIZE; i++) {
   1727             for (int j = 0; j < 3 ; j++) {
   1728                 // Extract the inputs.
   1729                 ArgumentsUcharChar args = new ArgumentsUcharChar();
   1730                 args.inV = arrayInV[i * 4 + j];
   1731                 // Figure out what the outputs should have been.
   1732                 CoreMathVerifier.computeConvert(args);
   1733                 // Validate the outputs.
   1734                 boolean valid = true;
   1735                 if (args.out != arrayOut[i * 4 + j]) {
   1736                     valid = false;
   1737                 }
   1738                 if (!valid) {
   1739                     StringBuilder message = new StringBuilder();
   1740                     message.append("Input inV: ");
   1741                     message.append(String.format("0x%x", args.inV));
   1742                     message.append("\n");
   1743                     message.append("Expected output out: ");
   1744                     message.append(String.format("%d", args.out));
   1745                     message.append("\n");
   1746                     message.append("Actual   output out: ");
   1747                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   1748                     if (args.out != arrayOut[i * 4 + j]) {
   1749                         message.append(" FAIL");
   1750                     }
   1751                     message.append("\n");
   1752                     assertTrue("Incorrect output for checkConvertUchar3Char3" +
   1753                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1754                 }
   1755             }
   1756         }
   1757     }
   1758 
   1759     private void checkConvertUchar4Char4() {
   1760         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7fef5608259a040bl, false, 7);
   1761         try {
   1762             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   1763             script.forEach_testConvertChar4Uchar4Char4(inV, out);
   1764             verifyResultsConvertUchar4Char4(inV, out, false);
   1765         } catch (Exception e) {
   1766             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Uchar4Char4: " + e.toString());
   1767         }
   1768         try {
   1769             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   1770             scriptRelaxed.forEach_testConvertChar4Uchar4Char4(inV, out);
   1771             verifyResultsConvertUchar4Char4(inV, out, true);
   1772         } catch (Exception e) {
   1773             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Uchar4Char4: " + e.toString());
   1774         }
   1775     }
   1776 
   1777     private void verifyResultsConvertUchar4Char4(Allocation inV, Allocation out, boolean relaxed) {
   1778         byte[] arrayInV = new byte[INPUTSIZE * 4];
   1779         inV.copyTo(arrayInV);
   1780         byte[] arrayOut = new byte[INPUTSIZE * 4];
   1781         out.copyTo(arrayOut);
   1782         for (int i = 0; i < INPUTSIZE; i++) {
   1783             for (int j = 0; j < 4 ; j++) {
   1784                 // Extract the inputs.
   1785                 ArgumentsUcharChar args = new ArgumentsUcharChar();
   1786                 args.inV = arrayInV[i * 4 + j];
   1787                 // Figure out what the outputs should have been.
   1788                 CoreMathVerifier.computeConvert(args);
   1789                 // Validate the outputs.
   1790                 boolean valid = true;
   1791                 if (args.out != arrayOut[i * 4 + j]) {
   1792                     valid = false;
   1793                 }
   1794                 if (!valid) {
   1795                     StringBuilder message = new StringBuilder();
   1796                     message.append("Input inV: ");
   1797                     message.append(String.format("0x%x", args.inV));
   1798                     message.append("\n");
   1799                     message.append("Expected output out: ");
   1800                     message.append(String.format("%d", args.out));
   1801                     message.append("\n");
   1802                     message.append("Actual   output out: ");
   1803                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   1804                     if (args.out != arrayOut[i * 4 + j]) {
   1805                         message.append(" FAIL");
   1806                     }
   1807                     message.append("\n");
   1808                     assertTrue("Incorrect output for checkConvertUchar4Char4" +
   1809                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1810                 }
   1811             }
   1812         }
   1813     }
   1814 
   1815     public class ArgumentsShortChar {
   1816         public short inV;
   1817         public byte out;
   1818     }
   1819 
   1820     private void checkConvertShort2Char2() {
   1821         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x68ab650215c60866l, true, 7);
   1822         try {
   1823             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   1824             script.forEach_testConvertChar2Short2Char2(inV, out);
   1825             verifyResultsConvertShort2Char2(inV, out, false);
   1826         } catch (Exception e) {
   1827             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Short2Char2: " + e.toString());
   1828         }
   1829         try {
   1830             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   1831             scriptRelaxed.forEach_testConvertChar2Short2Char2(inV, out);
   1832             verifyResultsConvertShort2Char2(inV, out, true);
   1833         } catch (Exception e) {
   1834             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Short2Char2: " + e.toString());
   1835         }
   1836     }
   1837 
   1838     private void verifyResultsConvertShort2Char2(Allocation inV, Allocation out, boolean relaxed) {
   1839         short[] arrayInV = new short[INPUTSIZE * 2];
   1840         inV.copyTo(arrayInV);
   1841         byte[] arrayOut = new byte[INPUTSIZE * 2];
   1842         out.copyTo(arrayOut);
   1843         for (int i = 0; i < INPUTSIZE; i++) {
   1844             for (int j = 0; j < 2 ; j++) {
   1845                 // Extract the inputs.
   1846                 ArgumentsShortChar args = new ArgumentsShortChar();
   1847                 args.inV = arrayInV[i * 2 + j];
   1848                 // Figure out what the outputs should have been.
   1849                 CoreMathVerifier.computeConvert(args);
   1850                 // Validate the outputs.
   1851                 boolean valid = true;
   1852                 if (args.out != arrayOut[i * 2 + j]) {
   1853                     valid = false;
   1854                 }
   1855                 if (!valid) {
   1856                     StringBuilder message = new StringBuilder();
   1857                     message.append("Input inV: ");
   1858                     message.append(String.format("%d", args.inV));
   1859                     message.append("\n");
   1860                     message.append("Expected output out: ");
   1861                     message.append(String.format("%d", args.out));
   1862                     message.append("\n");
   1863                     message.append("Actual   output out: ");
   1864                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   1865                     if (args.out != arrayOut[i * 2 + j]) {
   1866                         message.append(" FAIL");
   1867                     }
   1868                     message.append("\n");
   1869                     assertTrue("Incorrect output for checkConvertShort2Char2" +
   1870                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1871                 }
   1872             }
   1873         }
   1874     }
   1875 
   1876     private void checkConvertShort3Char3() {
   1877         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x68ab6fa374cdcd5al, true, 7);
   1878         try {
   1879             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   1880             script.forEach_testConvertChar3Short3Char3(inV, out);
   1881             verifyResultsConvertShort3Char3(inV, out, false);
   1882         } catch (Exception e) {
   1883             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Short3Char3: " + e.toString());
   1884         }
   1885         try {
   1886             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   1887             scriptRelaxed.forEach_testConvertChar3Short3Char3(inV, out);
   1888             verifyResultsConvertShort3Char3(inV, out, true);
   1889         } catch (Exception e) {
   1890             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Short3Char3: " + e.toString());
   1891         }
   1892     }
   1893 
   1894     private void verifyResultsConvertShort3Char3(Allocation inV, Allocation out, boolean relaxed) {
   1895         short[] arrayInV = new short[INPUTSIZE * 4];
   1896         inV.copyTo(arrayInV);
   1897         byte[] arrayOut = new byte[INPUTSIZE * 4];
   1898         out.copyTo(arrayOut);
   1899         for (int i = 0; i < INPUTSIZE; i++) {
   1900             for (int j = 0; j < 3 ; j++) {
   1901                 // Extract the inputs.
   1902                 ArgumentsShortChar args = new ArgumentsShortChar();
   1903                 args.inV = arrayInV[i * 4 + j];
   1904                 // Figure out what the outputs should have been.
   1905                 CoreMathVerifier.computeConvert(args);
   1906                 // Validate the outputs.
   1907                 boolean valid = true;
   1908                 if (args.out != arrayOut[i * 4 + j]) {
   1909                     valid = false;
   1910                 }
   1911                 if (!valid) {
   1912                     StringBuilder message = new StringBuilder();
   1913                     message.append("Input inV: ");
   1914                     message.append(String.format("%d", args.inV));
   1915                     message.append("\n");
   1916                     message.append("Expected output out: ");
   1917                     message.append(String.format("%d", args.out));
   1918                     message.append("\n");
   1919                     message.append("Actual   output out: ");
   1920                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   1921                     if (args.out != arrayOut[i * 4 + j]) {
   1922                         message.append(" FAIL");
   1923                     }
   1924                     message.append("\n");
   1925                     assertTrue("Incorrect output for checkConvertShort3Char3" +
   1926                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1927                 }
   1928             }
   1929         }
   1930     }
   1931 
   1932     private void checkConvertShort4Char4() {
   1933         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x68ab7a44d3d5924el, true, 7);
   1934         try {
   1935             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   1936             script.forEach_testConvertChar4Short4Char4(inV, out);
   1937             verifyResultsConvertShort4Char4(inV, out, false);
   1938         } catch (Exception e) {
   1939             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Short4Char4: " + e.toString());
   1940         }
   1941         try {
   1942             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   1943             scriptRelaxed.forEach_testConvertChar4Short4Char4(inV, out);
   1944             verifyResultsConvertShort4Char4(inV, out, true);
   1945         } catch (Exception e) {
   1946             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Short4Char4: " + e.toString());
   1947         }
   1948     }
   1949 
   1950     private void verifyResultsConvertShort4Char4(Allocation inV, Allocation out, boolean relaxed) {
   1951         short[] arrayInV = new short[INPUTSIZE * 4];
   1952         inV.copyTo(arrayInV);
   1953         byte[] arrayOut = new byte[INPUTSIZE * 4];
   1954         out.copyTo(arrayOut);
   1955         for (int i = 0; i < INPUTSIZE; i++) {
   1956             for (int j = 0; j < 4 ; j++) {
   1957                 // Extract the inputs.
   1958                 ArgumentsShortChar args = new ArgumentsShortChar();
   1959                 args.inV = arrayInV[i * 4 + j];
   1960                 // Figure out what the outputs should have been.
   1961                 CoreMathVerifier.computeConvert(args);
   1962                 // Validate the outputs.
   1963                 boolean valid = true;
   1964                 if (args.out != arrayOut[i * 4 + j]) {
   1965                     valid = false;
   1966                 }
   1967                 if (!valid) {
   1968                     StringBuilder message = new StringBuilder();
   1969                     message.append("Input inV: ");
   1970                     message.append(String.format("%d", args.inV));
   1971                     message.append("\n");
   1972                     message.append("Expected output out: ");
   1973                     message.append(String.format("%d", args.out));
   1974                     message.append("\n");
   1975                     message.append("Actual   output out: ");
   1976                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   1977                     if (args.out != arrayOut[i * 4 + j]) {
   1978                         message.append(" FAIL");
   1979                     }
   1980                     message.append("\n");
   1981                     assertTrue("Incorrect output for checkConvertShort4Char4" +
   1982                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   1983                 }
   1984             }
   1985         }
   1986     }
   1987 
   1988     public class ArgumentsUshortChar {
   1989         public short inV;
   1990         public byte out;
   1991     }
   1992 
   1993     private void checkConvertUshort2Char2() {
   1994         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x8d798509b19e2211l, false, 7);
   1995         try {
   1996             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   1997             script.forEach_testConvertChar2Ushort2Char2(inV, out);
   1998             verifyResultsConvertUshort2Char2(inV, out, false);
   1999         } catch (Exception e) {
   2000             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Ushort2Char2: " + e.toString());
   2001         }
   2002         try {
   2003             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   2004             scriptRelaxed.forEach_testConvertChar2Ushort2Char2(inV, out);
   2005             verifyResultsConvertUshort2Char2(inV, out, true);
   2006         } catch (Exception e) {
   2007             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Ushort2Char2: " + e.toString());
   2008         }
   2009     }
   2010 
   2011     private void verifyResultsConvertUshort2Char2(Allocation inV, Allocation out, boolean relaxed) {
   2012         short[] arrayInV = new short[INPUTSIZE * 2];
   2013         inV.copyTo(arrayInV);
   2014         byte[] arrayOut = new byte[INPUTSIZE * 2];
   2015         out.copyTo(arrayOut);
   2016         for (int i = 0; i < INPUTSIZE; i++) {
   2017             for (int j = 0; j < 2 ; j++) {
   2018                 // Extract the inputs.
   2019                 ArgumentsUshortChar args = new ArgumentsUshortChar();
   2020                 args.inV = arrayInV[i * 2 + j];
   2021                 // Figure out what the outputs should have been.
   2022                 CoreMathVerifier.computeConvert(args);
   2023                 // Validate the outputs.
   2024                 boolean valid = true;
   2025                 if (args.out != arrayOut[i * 2 + j]) {
   2026                     valid = false;
   2027                 }
   2028                 if (!valid) {
   2029                     StringBuilder message = new StringBuilder();
   2030                     message.append("Input inV: ");
   2031                     message.append(String.format("0x%x", args.inV));
   2032                     message.append("\n");
   2033                     message.append("Expected output out: ");
   2034                     message.append(String.format("%d", args.out));
   2035                     message.append("\n");
   2036                     message.append("Actual   output out: ");
   2037                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   2038                     if (args.out != arrayOut[i * 2 + j]) {
   2039                         message.append(" FAIL");
   2040                     }
   2041                     message.append("\n");
   2042                     assertTrue("Incorrect output for checkConvertUshort2Char2" +
   2043                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2044                 }
   2045             }
   2046         }
   2047     }
   2048 
   2049     private void checkConvertUshort3Char3() {
   2050         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x8d798fab10a5e705l, false, 7);
   2051         try {
   2052             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   2053             script.forEach_testConvertChar3Ushort3Char3(inV, out);
   2054             verifyResultsConvertUshort3Char3(inV, out, false);
   2055         } catch (Exception e) {
   2056             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Ushort3Char3: " + e.toString());
   2057         }
   2058         try {
   2059             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   2060             scriptRelaxed.forEach_testConvertChar3Ushort3Char3(inV, out);
   2061             verifyResultsConvertUshort3Char3(inV, out, true);
   2062         } catch (Exception e) {
   2063             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Ushort3Char3: " + e.toString());
   2064         }
   2065     }
   2066 
   2067     private void verifyResultsConvertUshort3Char3(Allocation inV, Allocation out, boolean relaxed) {
   2068         short[] arrayInV = new short[INPUTSIZE * 4];
   2069         inV.copyTo(arrayInV);
   2070         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2071         out.copyTo(arrayOut);
   2072         for (int i = 0; i < INPUTSIZE; i++) {
   2073             for (int j = 0; j < 3 ; j++) {
   2074                 // Extract the inputs.
   2075                 ArgumentsUshortChar args = new ArgumentsUshortChar();
   2076                 args.inV = arrayInV[i * 4 + j];
   2077                 // Figure out what the outputs should have been.
   2078                 CoreMathVerifier.computeConvert(args);
   2079                 // Validate the outputs.
   2080                 boolean valid = true;
   2081                 if (args.out != arrayOut[i * 4 + j]) {
   2082                     valid = false;
   2083                 }
   2084                 if (!valid) {
   2085                     StringBuilder message = new StringBuilder();
   2086                     message.append("Input inV: ");
   2087                     message.append(String.format("0x%x", args.inV));
   2088                     message.append("\n");
   2089                     message.append("Expected output out: ");
   2090                     message.append(String.format("%d", args.out));
   2091                     message.append("\n");
   2092                     message.append("Actual   output out: ");
   2093                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   2094                     if (args.out != arrayOut[i * 4 + j]) {
   2095                         message.append(" FAIL");
   2096                     }
   2097                     message.append("\n");
   2098                     assertTrue("Incorrect output for checkConvertUshort3Char3" +
   2099                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2100                 }
   2101             }
   2102         }
   2103     }
   2104 
   2105     private void checkConvertUshort4Char4() {
   2106         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x8d799a4c6fadabf9l, false, 7);
   2107         try {
   2108             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   2109             script.forEach_testConvertChar4Ushort4Char4(inV, out);
   2110             verifyResultsConvertUshort4Char4(inV, out, false);
   2111         } catch (Exception e) {
   2112             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Ushort4Char4: " + e.toString());
   2113         }
   2114         try {
   2115             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   2116             scriptRelaxed.forEach_testConvertChar4Ushort4Char4(inV, out);
   2117             verifyResultsConvertUshort4Char4(inV, out, true);
   2118         } catch (Exception e) {
   2119             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Ushort4Char4: " + e.toString());
   2120         }
   2121     }
   2122 
   2123     private void verifyResultsConvertUshort4Char4(Allocation inV, Allocation out, boolean relaxed) {
   2124         short[] arrayInV = new short[INPUTSIZE * 4];
   2125         inV.copyTo(arrayInV);
   2126         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2127         out.copyTo(arrayOut);
   2128         for (int i = 0; i < INPUTSIZE; i++) {
   2129             for (int j = 0; j < 4 ; j++) {
   2130                 // Extract the inputs.
   2131                 ArgumentsUshortChar args = new ArgumentsUshortChar();
   2132                 args.inV = arrayInV[i * 4 + j];
   2133                 // Figure out what the outputs should have been.
   2134                 CoreMathVerifier.computeConvert(args);
   2135                 // Validate the outputs.
   2136                 boolean valid = true;
   2137                 if (args.out != arrayOut[i * 4 + j]) {
   2138                     valid = false;
   2139                 }
   2140                 if (!valid) {
   2141                     StringBuilder message = new StringBuilder();
   2142                     message.append("Input inV: ");
   2143                     message.append(String.format("0x%x", args.inV));
   2144                     message.append("\n");
   2145                     message.append("Expected output out: ");
   2146                     message.append(String.format("%d", args.out));
   2147                     message.append("\n");
   2148                     message.append("Actual   output out: ");
   2149                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   2150                     if (args.out != arrayOut[i * 4 + j]) {
   2151                         message.append(" FAIL");
   2152                     }
   2153                     message.append("\n");
   2154                     assertTrue("Incorrect output for checkConvertUshort4Char4" +
   2155                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2156                 }
   2157             }
   2158         }
   2159     }
   2160 
   2161     public class ArgumentsIntChar {
   2162         public int inV;
   2163         public byte out;
   2164     }
   2165 
   2166     private void checkConvertInt2Char2() {
   2167         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xd74f5147364256dfl, true, 7);
   2168         try {
   2169             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   2170             script.forEach_testConvertChar2Int2Char2(inV, out);
   2171             verifyResultsConvertInt2Char2(inV, out, false);
   2172         } catch (Exception e) {
   2173             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Int2Char2: " + e.toString());
   2174         }
   2175         try {
   2176             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   2177             scriptRelaxed.forEach_testConvertChar2Int2Char2(inV, out);
   2178             verifyResultsConvertInt2Char2(inV, out, true);
   2179         } catch (Exception e) {
   2180             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Int2Char2: " + e.toString());
   2181         }
   2182     }
   2183 
   2184     private void verifyResultsConvertInt2Char2(Allocation inV, Allocation out, boolean relaxed) {
   2185         int[] arrayInV = new int[INPUTSIZE * 2];
   2186         inV.copyTo(arrayInV);
   2187         byte[] arrayOut = new byte[INPUTSIZE * 2];
   2188         out.copyTo(arrayOut);
   2189         for (int i = 0; i < INPUTSIZE; i++) {
   2190             for (int j = 0; j < 2 ; j++) {
   2191                 // Extract the inputs.
   2192                 ArgumentsIntChar args = new ArgumentsIntChar();
   2193                 args.inV = arrayInV[i * 2 + j];
   2194                 // Figure out what the outputs should have been.
   2195                 CoreMathVerifier.computeConvert(args);
   2196                 // Validate the outputs.
   2197                 boolean valid = true;
   2198                 if (args.out != arrayOut[i * 2 + j]) {
   2199                     valid = false;
   2200                 }
   2201                 if (!valid) {
   2202                     StringBuilder message = new StringBuilder();
   2203                     message.append("Input inV: ");
   2204                     message.append(String.format("%d", args.inV));
   2205                     message.append("\n");
   2206                     message.append("Expected output out: ");
   2207                     message.append(String.format("%d", args.out));
   2208                     message.append("\n");
   2209                     message.append("Actual   output out: ");
   2210                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   2211                     if (args.out != arrayOut[i * 2 + j]) {
   2212                         message.append(" FAIL");
   2213                     }
   2214                     message.append("\n");
   2215                     assertTrue("Incorrect output for checkConvertInt2Char2" +
   2216                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2217                 }
   2218             }
   2219         }
   2220     }
   2221 
   2222     private void checkConvertInt3Char3() {
   2223         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xd74f5be8954a1bd3l, true, 7);
   2224         try {
   2225             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   2226             script.forEach_testConvertChar3Int3Char3(inV, out);
   2227             verifyResultsConvertInt3Char3(inV, out, false);
   2228         } catch (Exception e) {
   2229             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Int3Char3: " + e.toString());
   2230         }
   2231         try {
   2232             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   2233             scriptRelaxed.forEach_testConvertChar3Int3Char3(inV, out);
   2234             verifyResultsConvertInt3Char3(inV, out, true);
   2235         } catch (Exception e) {
   2236             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Int3Char3: " + e.toString());
   2237         }
   2238     }
   2239 
   2240     private void verifyResultsConvertInt3Char3(Allocation inV, Allocation out, boolean relaxed) {
   2241         int[] arrayInV = new int[INPUTSIZE * 4];
   2242         inV.copyTo(arrayInV);
   2243         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2244         out.copyTo(arrayOut);
   2245         for (int i = 0; i < INPUTSIZE; i++) {
   2246             for (int j = 0; j < 3 ; j++) {
   2247                 // Extract the inputs.
   2248                 ArgumentsIntChar args = new ArgumentsIntChar();
   2249                 args.inV = arrayInV[i * 4 + j];
   2250                 // Figure out what the outputs should have been.
   2251                 CoreMathVerifier.computeConvert(args);
   2252                 // Validate the outputs.
   2253                 boolean valid = true;
   2254                 if (args.out != arrayOut[i * 4 + j]) {
   2255                     valid = false;
   2256                 }
   2257                 if (!valid) {
   2258                     StringBuilder message = new StringBuilder();
   2259                     message.append("Input inV: ");
   2260                     message.append(String.format("%d", args.inV));
   2261                     message.append("\n");
   2262                     message.append("Expected output out: ");
   2263                     message.append(String.format("%d", args.out));
   2264                     message.append("\n");
   2265                     message.append("Actual   output out: ");
   2266                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   2267                     if (args.out != arrayOut[i * 4 + j]) {
   2268                         message.append(" FAIL");
   2269                     }
   2270                     message.append("\n");
   2271                     assertTrue("Incorrect output for checkConvertInt3Char3" +
   2272                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2273                 }
   2274             }
   2275         }
   2276     }
   2277 
   2278     private void checkConvertInt4Char4() {
   2279         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xd74f6689f451e0c7l, true, 7);
   2280         try {
   2281             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   2282             script.forEach_testConvertChar4Int4Char4(inV, out);
   2283             verifyResultsConvertInt4Char4(inV, out, false);
   2284         } catch (Exception e) {
   2285             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Int4Char4: " + e.toString());
   2286         }
   2287         try {
   2288             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   2289             scriptRelaxed.forEach_testConvertChar4Int4Char4(inV, out);
   2290             verifyResultsConvertInt4Char4(inV, out, true);
   2291         } catch (Exception e) {
   2292             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Int4Char4: " + e.toString());
   2293         }
   2294     }
   2295 
   2296     private void verifyResultsConvertInt4Char4(Allocation inV, Allocation out, boolean relaxed) {
   2297         int[] arrayInV = new int[INPUTSIZE * 4];
   2298         inV.copyTo(arrayInV);
   2299         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2300         out.copyTo(arrayOut);
   2301         for (int i = 0; i < INPUTSIZE; i++) {
   2302             for (int j = 0; j < 4 ; j++) {
   2303                 // Extract the inputs.
   2304                 ArgumentsIntChar args = new ArgumentsIntChar();
   2305                 args.inV = arrayInV[i * 4 + j];
   2306                 // Figure out what the outputs should have been.
   2307                 CoreMathVerifier.computeConvert(args);
   2308                 // Validate the outputs.
   2309                 boolean valid = true;
   2310                 if (args.out != arrayOut[i * 4 + j]) {
   2311                     valid = false;
   2312                 }
   2313                 if (!valid) {
   2314                     StringBuilder message = new StringBuilder();
   2315                     message.append("Input inV: ");
   2316                     message.append(String.format("%d", args.inV));
   2317                     message.append("\n");
   2318                     message.append("Expected output out: ");
   2319                     message.append(String.format("%d", args.out));
   2320                     message.append("\n");
   2321                     message.append("Actual   output out: ");
   2322                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   2323                     if (args.out != arrayOut[i * 4 + j]) {
   2324                         message.append(" FAIL");
   2325                     }
   2326                     message.append("\n");
   2327                     assertTrue("Incorrect output for checkConvertInt4Char4" +
   2328                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2329                 }
   2330             }
   2331         }
   2332     }
   2333 
   2334     public class ArgumentsUintChar {
   2335         public int inV;
   2336         public byte out;
   2337     }
   2338 
   2339     private void checkConvertUint2Char2() {
   2340         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xe71d083133b67ae2l, false, 7);
   2341         try {
   2342             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   2343             script.forEach_testConvertChar2Uint2Char2(inV, out);
   2344             verifyResultsConvertUint2Char2(inV, out, false);
   2345         } catch (Exception e) {
   2346             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Uint2Char2: " + e.toString());
   2347         }
   2348         try {
   2349             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   2350             scriptRelaxed.forEach_testConvertChar2Uint2Char2(inV, out);
   2351             verifyResultsConvertUint2Char2(inV, out, true);
   2352         } catch (Exception e) {
   2353             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Uint2Char2: " + e.toString());
   2354         }
   2355     }
   2356 
   2357     private void verifyResultsConvertUint2Char2(Allocation inV, Allocation out, boolean relaxed) {
   2358         int[] arrayInV = new int[INPUTSIZE * 2];
   2359         inV.copyTo(arrayInV);
   2360         byte[] arrayOut = new byte[INPUTSIZE * 2];
   2361         out.copyTo(arrayOut);
   2362         for (int i = 0; i < INPUTSIZE; i++) {
   2363             for (int j = 0; j < 2 ; j++) {
   2364                 // Extract the inputs.
   2365                 ArgumentsUintChar args = new ArgumentsUintChar();
   2366                 args.inV = arrayInV[i * 2 + j];
   2367                 // Figure out what the outputs should have been.
   2368                 CoreMathVerifier.computeConvert(args);
   2369                 // Validate the outputs.
   2370                 boolean valid = true;
   2371                 if (args.out != arrayOut[i * 2 + j]) {
   2372                     valid = false;
   2373                 }
   2374                 if (!valid) {
   2375                     StringBuilder message = new StringBuilder();
   2376                     message.append("Input inV: ");
   2377                     message.append(String.format("0x%x", args.inV));
   2378                     message.append("\n");
   2379                     message.append("Expected output out: ");
   2380                     message.append(String.format("%d", args.out));
   2381                     message.append("\n");
   2382                     message.append("Actual   output out: ");
   2383                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   2384                     if (args.out != arrayOut[i * 2 + j]) {
   2385                         message.append(" FAIL");
   2386                     }
   2387                     message.append("\n");
   2388                     assertTrue("Incorrect output for checkConvertUint2Char2" +
   2389                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2390                 }
   2391             }
   2392         }
   2393     }
   2394 
   2395     private void checkConvertUint3Char3() {
   2396         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe71d12d292be3fd6l, false, 7);
   2397         try {
   2398             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   2399             script.forEach_testConvertChar3Uint3Char3(inV, out);
   2400             verifyResultsConvertUint3Char3(inV, out, false);
   2401         } catch (Exception e) {
   2402             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Uint3Char3: " + e.toString());
   2403         }
   2404         try {
   2405             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   2406             scriptRelaxed.forEach_testConvertChar3Uint3Char3(inV, out);
   2407             verifyResultsConvertUint3Char3(inV, out, true);
   2408         } catch (Exception e) {
   2409             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Uint3Char3: " + e.toString());
   2410         }
   2411     }
   2412 
   2413     private void verifyResultsConvertUint3Char3(Allocation inV, Allocation out, boolean relaxed) {
   2414         int[] arrayInV = new int[INPUTSIZE * 4];
   2415         inV.copyTo(arrayInV);
   2416         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2417         out.copyTo(arrayOut);
   2418         for (int i = 0; i < INPUTSIZE; i++) {
   2419             for (int j = 0; j < 3 ; j++) {
   2420                 // Extract the inputs.
   2421                 ArgumentsUintChar args = new ArgumentsUintChar();
   2422                 args.inV = arrayInV[i * 4 + j];
   2423                 // Figure out what the outputs should have been.
   2424                 CoreMathVerifier.computeConvert(args);
   2425                 // Validate the outputs.
   2426                 boolean valid = true;
   2427                 if (args.out != arrayOut[i * 4 + j]) {
   2428                     valid = false;
   2429                 }
   2430                 if (!valid) {
   2431                     StringBuilder message = new StringBuilder();
   2432                     message.append("Input inV: ");
   2433                     message.append(String.format("0x%x", args.inV));
   2434                     message.append("\n");
   2435                     message.append("Expected output out: ");
   2436                     message.append(String.format("%d", args.out));
   2437                     message.append("\n");
   2438                     message.append("Actual   output out: ");
   2439                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   2440                     if (args.out != arrayOut[i * 4 + j]) {
   2441                         message.append(" FAIL");
   2442                     }
   2443                     message.append("\n");
   2444                     assertTrue("Incorrect output for checkConvertUint3Char3" +
   2445                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2446                 }
   2447             }
   2448         }
   2449     }
   2450 
   2451     private void checkConvertUint4Char4() {
   2452         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xe71d1d73f1c604cal, false, 7);
   2453         try {
   2454             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   2455             script.forEach_testConvertChar4Uint4Char4(inV, out);
   2456             verifyResultsConvertUint4Char4(inV, out, false);
   2457         } catch (Exception e) {
   2458             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Uint4Char4: " + e.toString());
   2459         }
   2460         try {
   2461             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   2462             scriptRelaxed.forEach_testConvertChar4Uint4Char4(inV, out);
   2463             verifyResultsConvertUint4Char4(inV, out, true);
   2464         } catch (Exception e) {
   2465             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Uint4Char4: " + e.toString());
   2466         }
   2467     }
   2468 
   2469     private void verifyResultsConvertUint4Char4(Allocation inV, Allocation out, boolean relaxed) {
   2470         int[] arrayInV = new int[INPUTSIZE * 4];
   2471         inV.copyTo(arrayInV);
   2472         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2473         out.copyTo(arrayOut);
   2474         for (int i = 0; i < INPUTSIZE; i++) {
   2475             for (int j = 0; j < 4 ; j++) {
   2476                 // Extract the inputs.
   2477                 ArgumentsUintChar args = new ArgumentsUintChar();
   2478                 args.inV = arrayInV[i * 4 + j];
   2479                 // Figure out what the outputs should have been.
   2480                 CoreMathVerifier.computeConvert(args);
   2481                 // Validate the outputs.
   2482                 boolean valid = true;
   2483                 if (args.out != arrayOut[i * 4 + j]) {
   2484                     valid = false;
   2485                 }
   2486                 if (!valid) {
   2487                     StringBuilder message = new StringBuilder();
   2488                     message.append("Input inV: ");
   2489                     message.append(String.format("0x%x", args.inV));
   2490                     message.append("\n");
   2491                     message.append("Expected output out: ");
   2492                     message.append(String.format("%d", args.out));
   2493                     message.append("\n");
   2494                     message.append("Actual   output out: ");
   2495                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   2496                     if (args.out != arrayOut[i * 4 + j]) {
   2497                         message.append(" FAIL");
   2498                     }
   2499                     message.append("\n");
   2500                     assertTrue("Incorrect output for checkConvertUint4Char4" +
   2501                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2502                 }
   2503             }
   2504         }
   2505     }
   2506 
   2507     public class ArgumentsFloatUchar {
   2508         public float inV;
   2509         public byte out;
   2510     }
   2511 
   2512     private void checkConvertFloat2Uchar2() {
   2513         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfb52b2f4fac15b79l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
   2514         try {
   2515             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   2516             script.forEach_testConvertUchar2Float2Uchar2(inV, out);
   2517             verifyResultsConvertFloat2Uchar2(inV, out, false);
   2518         } catch (Exception e) {
   2519             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Float2Uchar2: " + e.toString());
   2520         }
   2521         try {
   2522             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   2523             scriptRelaxed.forEach_testConvertUchar2Float2Uchar2(inV, out);
   2524             verifyResultsConvertFloat2Uchar2(inV, out, true);
   2525         } catch (Exception e) {
   2526             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Float2Uchar2: " + e.toString());
   2527         }
   2528     }
   2529 
   2530     private void verifyResultsConvertFloat2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
   2531         float[] arrayInV = new float[INPUTSIZE * 2];
   2532         inV.copyTo(arrayInV);
   2533         byte[] arrayOut = new byte[INPUTSIZE * 2];
   2534         out.copyTo(arrayOut);
   2535         for (int i = 0; i < INPUTSIZE; i++) {
   2536             for (int j = 0; j < 2 ; j++) {
   2537                 // Extract the inputs.
   2538                 ArgumentsFloatUchar args = new ArgumentsFloatUchar();
   2539                 args.inV = arrayInV[i * 2 + j];
   2540                 // Figure out what the outputs should have been.
   2541                 CoreMathVerifier.computeConvert(args);
   2542                 // Validate the outputs.
   2543                 boolean valid = true;
   2544                 if (args.out != arrayOut[i * 2 + j]) {
   2545                     valid = false;
   2546                 }
   2547                 if (!valid) {
   2548                     StringBuilder message = new StringBuilder();
   2549                     message.append("Input inV: ");
   2550                     message.append(String.format("%14.8g {%8x} %15a",
   2551                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   2552                     message.append("\n");
   2553                     message.append("Expected output out: ");
   2554                     message.append(String.format("0x%x", args.out));
   2555                     message.append("\n");
   2556                     message.append("Actual   output out: ");
   2557                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   2558                     if (args.out != arrayOut[i * 2 + j]) {
   2559                         message.append(" FAIL");
   2560                     }
   2561                     message.append("\n");
   2562                     assertTrue("Incorrect output for checkConvertFloat2Uchar2" +
   2563                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2564                 }
   2565             }
   2566         }
   2567     }
   2568 
   2569     private void checkConvertFloat3Uchar3() {
   2570         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfb547c0ff0dc7c57l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
   2571         try {
   2572             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   2573             script.forEach_testConvertUchar3Float3Uchar3(inV, out);
   2574             verifyResultsConvertFloat3Uchar3(inV, out, false);
   2575         } catch (Exception e) {
   2576             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Float3Uchar3: " + e.toString());
   2577         }
   2578         try {
   2579             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   2580             scriptRelaxed.forEach_testConvertUchar3Float3Uchar3(inV, out);
   2581             verifyResultsConvertFloat3Uchar3(inV, out, true);
   2582         } catch (Exception e) {
   2583             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Float3Uchar3: " + e.toString());
   2584         }
   2585     }
   2586 
   2587     private void verifyResultsConvertFloat3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
   2588         float[] arrayInV = new float[INPUTSIZE * 4];
   2589         inV.copyTo(arrayInV);
   2590         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2591         out.copyTo(arrayOut);
   2592         for (int i = 0; i < INPUTSIZE; i++) {
   2593             for (int j = 0; j < 3 ; j++) {
   2594                 // Extract the inputs.
   2595                 ArgumentsFloatUchar args = new ArgumentsFloatUchar();
   2596                 args.inV = arrayInV[i * 4 + j];
   2597                 // Figure out what the outputs should have been.
   2598                 CoreMathVerifier.computeConvert(args);
   2599                 // Validate the outputs.
   2600                 boolean valid = true;
   2601                 if (args.out != arrayOut[i * 4 + j]) {
   2602                     valid = false;
   2603                 }
   2604                 if (!valid) {
   2605                     StringBuilder message = new StringBuilder();
   2606                     message.append("Input inV: ");
   2607                     message.append(String.format("%14.8g {%8x} %15a",
   2608                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   2609                     message.append("\n");
   2610                     message.append("Expected output out: ");
   2611                     message.append(String.format("0x%x", args.out));
   2612                     message.append("\n");
   2613                     message.append("Actual   output out: ");
   2614                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   2615                     if (args.out != arrayOut[i * 4 + j]) {
   2616                         message.append(" FAIL");
   2617                     }
   2618                     message.append("\n");
   2619                     assertTrue("Incorrect output for checkConvertFloat3Uchar3" +
   2620                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2621                 }
   2622             }
   2623         }
   2624     }
   2625 
   2626     private void checkConvertFloat4Uchar4() {
   2627         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfb56452ae6f79d35l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
   2628         try {
   2629             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   2630             script.forEach_testConvertUchar4Float4Uchar4(inV, out);
   2631             verifyResultsConvertFloat4Uchar4(inV, out, false);
   2632         } catch (Exception e) {
   2633             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Float4Uchar4: " + e.toString());
   2634         }
   2635         try {
   2636             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   2637             scriptRelaxed.forEach_testConvertUchar4Float4Uchar4(inV, out);
   2638             verifyResultsConvertFloat4Uchar4(inV, out, true);
   2639         } catch (Exception e) {
   2640             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Float4Uchar4: " + e.toString());
   2641         }
   2642     }
   2643 
   2644     private void verifyResultsConvertFloat4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
   2645         float[] arrayInV = new float[INPUTSIZE * 4];
   2646         inV.copyTo(arrayInV);
   2647         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2648         out.copyTo(arrayOut);
   2649         for (int i = 0; i < INPUTSIZE; i++) {
   2650             for (int j = 0; j < 4 ; j++) {
   2651                 // Extract the inputs.
   2652                 ArgumentsFloatUchar args = new ArgumentsFloatUchar();
   2653                 args.inV = arrayInV[i * 4 + j];
   2654                 // Figure out what the outputs should have been.
   2655                 CoreMathVerifier.computeConvert(args);
   2656                 // Validate the outputs.
   2657                 boolean valid = true;
   2658                 if (args.out != arrayOut[i * 4 + j]) {
   2659                     valid = false;
   2660                 }
   2661                 if (!valid) {
   2662                     StringBuilder message = new StringBuilder();
   2663                     message.append("Input inV: ");
   2664                     message.append(String.format("%14.8g {%8x} %15a",
   2665                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   2666                     message.append("\n");
   2667                     message.append("Expected output out: ");
   2668                     message.append(String.format("0x%x", args.out));
   2669                     message.append("\n");
   2670                     message.append("Actual   output out: ");
   2671                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   2672                     if (args.out != arrayOut[i * 4 + j]) {
   2673                         message.append(" FAIL");
   2674                     }
   2675                     message.append("\n");
   2676                     assertTrue("Incorrect output for checkConvertFloat4Uchar4" +
   2677                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2678                 }
   2679             }
   2680         }
   2681     }
   2682 
   2683     public class ArgumentsCharUchar {
   2684         public byte inV;
   2685         public byte out;
   2686     }
   2687 
   2688     private void checkConvertChar2Uchar2() {
   2689         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x58627f46cbea8339l, false, 7);
   2690         try {
   2691             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   2692             script.forEach_testConvertUchar2Char2Uchar2(inV, out);
   2693             verifyResultsConvertChar2Uchar2(inV, out, false);
   2694         } catch (Exception e) {
   2695             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Char2Uchar2: " + e.toString());
   2696         }
   2697         try {
   2698             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   2699             scriptRelaxed.forEach_testConvertUchar2Char2Uchar2(inV, out);
   2700             verifyResultsConvertChar2Uchar2(inV, out, true);
   2701         } catch (Exception e) {
   2702             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Char2Uchar2: " + e.toString());
   2703         }
   2704     }
   2705 
   2706     private void verifyResultsConvertChar2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
   2707         byte[] arrayInV = new byte[INPUTSIZE * 2];
   2708         inV.copyTo(arrayInV);
   2709         byte[] arrayOut = new byte[INPUTSIZE * 2];
   2710         out.copyTo(arrayOut);
   2711         for (int i = 0; i < INPUTSIZE; i++) {
   2712             for (int j = 0; j < 2 ; j++) {
   2713                 // Extract the inputs.
   2714                 ArgumentsCharUchar args = new ArgumentsCharUchar();
   2715                 args.inV = arrayInV[i * 2 + j];
   2716                 // Figure out what the outputs should have been.
   2717                 CoreMathVerifier.computeConvert(args);
   2718                 // Validate the outputs.
   2719                 boolean valid = true;
   2720                 if (args.out != arrayOut[i * 2 + j]) {
   2721                     valid = false;
   2722                 }
   2723                 if (!valid) {
   2724                     StringBuilder message = new StringBuilder();
   2725                     message.append("Input inV: ");
   2726                     message.append(String.format("%d", args.inV));
   2727                     message.append("\n");
   2728                     message.append("Expected output out: ");
   2729                     message.append(String.format("0x%x", args.out));
   2730                     message.append("\n");
   2731                     message.append("Actual   output out: ");
   2732                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   2733                     if (args.out != arrayOut[i * 2 + j]) {
   2734                         message.append(" FAIL");
   2735                     }
   2736                     message.append("\n");
   2737                     assertTrue("Incorrect output for checkConvertChar2Uchar2" +
   2738                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2739                 }
   2740             }
   2741         }
   2742     }
   2743 
   2744     private void checkConvertChar3Uchar3() {
   2745         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x58644861c205a417l, false, 7);
   2746         try {
   2747             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   2748             script.forEach_testConvertUchar3Char3Uchar3(inV, out);
   2749             verifyResultsConvertChar3Uchar3(inV, out, false);
   2750         } catch (Exception e) {
   2751             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Char3Uchar3: " + e.toString());
   2752         }
   2753         try {
   2754             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   2755             scriptRelaxed.forEach_testConvertUchar3Char3Uchar3(inV, out);
   2756             verifyResultsConvertChar3Uchar3(inV, out, true);
   2757         } catch (Exception e) {
   2758             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Char3Uchar3: " + e.toString());
   2759         }
   2760     }
   2761 
   2762     private void verifyResultsConvertChar3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
   2763         byte[] arrayInV = new byte[INPUTSIZE * 4];
   2764         inV.copyTo(arrayInV);
   2765         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2766         out.copyTo(arrayOut);
   2767         for (int i = 0; i < INPUTSIZE; i++) {
   2768             for (int j = 0; j < 3 ; j++) {
   2769                 // Extract the inputs.
   2770                 ArgumentsCharUchar args = new ArgumentsCharUchar();
   2771                 args.inV = arrayInV[i * 4 + j];
   2772                 // Figure out what the outputs should have been.
   2773                 CoreMathVerifier.computeConvert(args);
   2774                 // Validate the outputs.
   2775                 boolean valid = true;
   2776                 if (args.out != arrayOut[i * 4 + j]) {
   2777                     valid = false;
   2778                 }
   2779                 if (!valid) {
   2780                     StringBuilder message = new StringBuilder();
   2781                     message.append("Input inV: ");
   2782                     message.append(String.format("%d", args.inV));
   2783                     message.append("\n");
   2784                     message.append("Expected output out: ");
   2785                     message.append(String.format("0x%x", args.out));
   2786                     message.append("\n");
   2787                     message.append("Actual   output out: ");
   2788                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   2789                     if (args.out != arrayOut[i * 4 + j]) {
   2790                         message.append(" FAIL");
   2791                     }
   2792                     message.append("\n");
   2793                     assertTrue("Incorrect output for checkConvertChar3Uchar3" +
   2794                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2795                 }
   2796             }
   2797         }
   2798     }
   2799 
   2800     private void checkConvertChar4Uchar4() {
   2801         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x5866117cb820c4f5l, false, 7);
   2802         try {
   2803             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   2804             script.forEach_testConvertUchar4Char4Uchar4(inV, out);
   2805             verifyResultsConvertChar4Uchar4(inV, out, false);
   2806         } catch (Exception e) {
   2807             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Char4Uchar4: " + e.toString());
   2808         }
   2809         try {
   2810             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   2811             scriptRelaxed.forEach_testConvertUchar4Char4Uchar4(inV, out);
   2812             verifyResultsConvertChar4Uchar4(inV, out, true);
   2813         } catch (Exception e) {
   2814             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Char4Uchar4: " + e.toString());
   2815         }
   2816     }
   2817 
   2818     private void verifyResultsConvertChar4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
   2819         byte[] arrayInV = new byte[INPUTSIZE * 4];
   2820         inV.copyTo(arrayInV);
   2821         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2822         out.copyTo(arrayOut);
   2823         for (int i = 0; i < INPUTSIZE; i++) {
   2824             for (int j = 0; j < 4 ; j++) {
   2825                 // Extract the inputs.
   2826                 ArgumentsCharUchar args = new ArgumentsCharUchar();
   2827                 args.inV = arrayInV[i * 4 + j];
   2828                 // Figure out what the outputs should have been.
   2829                 CoreMathVerifier.computeConvert(args);
   2830                 // Validate the outputs.
   2831                 boolean valid = true;
   2832                 if (args.out != arrayOut[i * 4 + j]) {
   2833                     valid = false;
   2834                 }
   2835                 if (!valid) {
   2836                     StringBuilder message = new StringBuilder();
   2837                     message.append("Input inV: ");
   2838                     message.append(String.format("%d", args.inV));
   2839                     message.append("\n");
   2840                     message.append("Expected output out: ");
   2841                     message.append(String.format("0x%x", args.out));
   2842                     message.append("\n");
   2843                     message.append("Actual   output out: ");
   2844                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   2845                     if (args.out != arrayOut[i * 4 + j]) {
   2846                         message.append(" FAIL");
   2847                     }
   2848                     message.append("\n");
   2849                     assertTrue("Incorrect output for checkConvertChar4Uchar4" +
   2850                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2851                 }
   2852             }
   2853         }
   2854     }
   2855 
   2856     public class ArgumentsUcharUchar {
   2857         public byte inV;
   2858         public byte out;
   2859     }
   2860 
   2861     private void checkConvertUchar2Uchar2() {
   2862         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7d309f4e67c29ce4l, false, 8);
   2863         try {
   2864             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   2865             script.forEach_testConvertUchar2Uchar2Uchar2(inV, out);
   2866             verifyResultsConvertUchar2Uchar2(inV, out, false);
   2867         } catch (Exception e) {
   2868             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Uchar2Uchar2: " + e.toString());
   2869         }
   2870         try {
   2871             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   2872             scriptRelaxed.forEach_testConvertUchar2Uchar2Uchar2(inV, out);
   2873             verifyResultsConvertUchar2Uchar2(inV, out, true);
   2874         } catch (Exception e) {
   2875             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Uchar2Uchar2: " + e.toString());
   2876         }
   2877     }
   2878 
   2879     private void verifyResultsConvertUchar2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
   2880         byte[] arrayInV = new byte[INPUTSIZE * 2];
   2881         inV.copyTo(arrayInV);
   2882         byte[] arrayOut = new byte[INPUTSIZE * 2];
   2883         out.copyTo(arrayOut);
   2884         for (int i = 0; i < INPUTSIZE; i++) {
   2885             for (int j = 0; j < 2 ; j++) {
   2886                 // Extract the inputs.
   2887                 ArgumentsUcharUchar args = new ArgumentsUcharUchar();
   2888                 args.inV = arrayInV[i * 2 + j];
   2889                 // Figure out what the outputs should have been.
   2890                 CoreMathVerifier.computeConvert(args);
   2891                 // Validate the outputs.
   2892                 boolean valid = true;
   2893                 if (args.out != arrayOut[i * 2 + j]) {
   2894                     valid = false;
   2895                 }
   2896                 if (!valid) {
   2897                     StringBuilder message = new StringBuilder();
   2898                     message.append("Input inV: ");
   2899                     message.append(String.format("0x%x", args.inV));
   2900                     message.append("\n");
   2901                     message.append("Expected output out: ");
   2902                     message.append(String.format("0x%x", args.out));
   2903                     message.append("\n");
   2904                     message.append("Actual   output out: ");
   2905                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   2906                     if (args.out != arrayOut[i * 2 + j]) {
   2907                         message.append(" FAIL");
   2908                     }
   2909                     message.append("\n");
   2910                     assertTrue("Incorrect output for checkConvertUchar2Uchar2" +
   2911                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2912                 }
   2913             }
   2914         }
   2915     }
   2916 
   2917     private void checkConvertUchar3Uchar3() {
   2918         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7d3268695dddbdc2l, false, 8);
   2919         try {
   2920             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   2921             script.forEach_testConvertUchar3Uchar3Uchar3(inV, out);
   2922             verifyResultsConvertUchar3Uchar3(inV, out, false);
   2923         } catch (Exception e) {
   2924             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Uchar3Uchar3: " + e.toString());
   2925         }
   2926         try {
   2927             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   2928             scriptRelaxed.forEach_testConvertUchar3Uchar3Uchar3(inV, out);
   2929             verifyResultsConvertUchar3Uchar3(inV, out, true);
   2930         } catch (Exception e) {
   2931             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Uchar3Uchar3: " + e.toString());
   2932         }
   2933     }
   2934 
   2935     private void verifyResultsConvertUchar3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
   2936         byte[] arrayInV = new byte[INPUTSIZE * 4];
   2937         inV.copyTo(arrayInV);
   2938         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2939         out.copyTo(arrayOut);
   2940         for (int i = 0; i < INPUTSIZE; i++) {
   2941             for (int j = 0; j < 3 ; j++) {
   2942                 // Extract the inputs.
   2943                 ArgumentsUcharUchar args = new ArgumentsUcharUchar();
   2944                 args.inV = arrayInV[i * 4 + j];
   2945                 // Figure out what the outputs should have been.
   2946                 CoreMathVerifier.computeConvert(args);
   2947                 // Validate the outputs.
   2948                 boolean valid = true;
   2949                 if (args.out != arrayOut[i * 4 + j]) {
   2950                     valid = false;
   2951                 }
   2952                 if (!valid) {
   2953                     StringBuilder message = new StringBuilder();
   2954                     message.append("Input inV: ");
   2955                     message.append(String.format("0x%x", args.inV));
   2956                     message.append("\n");
   2957                     message.append("Expected output out: ");
   2958                     message.append(String.format("0x%x", args.out));
   2959                     message.append("\n");
   2960                     message.append("Actual   output out: ");
   2961                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   2962                     if (args.out != arrayOut[i * 4 + j]) {
   2963                         message.append(" FAIL");
   2964                     }
   2965                     message.append("\n");
   2966                     assertTrue("Incorrect output for checkConvertUchar3Uchar3" +
   2967                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   2968                 }
   2969             }
   2970         }
   2971     }
   2972 
   2973     private void checkConvertUchar4Uchar4() {
   2974         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7d34318453f8dea0l, false, 8);
   2975         try {
   2976             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   2977             script.forEach_testConvertUchar4Uchar4Uchar4(inV, out);
   2978             verifyResultsConvertUchar4Uchar4(inV, out, false);
   2979         } catch (Exception e) {
   2980             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Uchar4Uchar4: " + e.toString());
   2981         }
   2982         try {
   2983             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   2984             scriptRelaxed.forEach_testConvertUchar4Uchar4Uchar4(inV, out);
   2985             verifyResultsConvertUchar4Uchar4(inV, out, true);
   2986         } catch (Exception e) {
   2987             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Uchar4Uchar4: " + e.toString());
   2988         }
   2989     }
   2990 
   2991     private void verifyResultsConvertUchar4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
   2992         byte[] arrayInV = new byte[INPUTSIZE * 4];
   2993         inV.copyTo(arrayInV);
   2994         byte[] arrayOut = new byte[INPUTSIZE * 4];
   2995         out.copyTo(arrayOut);
   2996         for (int i = 0; i < INPUTSIZE; i++) {
   2997             for (int j = 0; j < 4 ; j++) {
   2998                 // Extract the inputs.
   2999                 ArgumentsUcharUchar args = new ArgumentsUcharUchar();
   3000                 args.inV = arrayInV[i * 4 + j];
   3001                 // Figure out what the outputs should have been.
   3002                 CoreMathVerifier.computeConvert(args);
   3003                 // Validate the outputs.
   3004                 boolean valid = true;
   3005                 if (args.out != arrayOut[i * 4 + j]) {
   3006                     valid = false;
   3007                 }
   3008                 if (!valid) {
   3009                     StringBuilder message = new StringBuilder();
   3010                     message.append("Input inV: ");
   3011                     message.append(String.format("0x%x", args.inV));
   3012                     message.append("\n");
   3013                     message.append("Expected output out: ");
   3014                     message.append(String.format("0x%x", args.out));
   3015                     message.append("\n");
   3016                     message.append("Actual   output out: ");
   3017                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   3018                     if (args.out != arrayOut[i * 4 + j]) {
   3019                         message.append(" FAIL");
   3020                     }
   3021                     message.append("\n");
   3022                     assertTrue("Incorrect output for checkConvertUchar4Uchar4" +
   3023                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3024                 }
   3025             }
   3026         }
   3027     }
   3028 
   3029     public class ArgumentsShortUchar {
   3030         public short inV;
   3031         public byte out;
   3032     }
   3033 
   3034     private void checkConvertShort2Uchar2() {
   3035         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x94cab57fabc38225l, false, 8);
   3036         try {
   3037             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   3038             script.forEach_testConvertUchar2Short2Uchar2(inV, out);
   3039             verifyResultsConvertShort2Uchar2(inV, out, false);
   3040         } catch (Exception e) {
   3041             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Short2Uchar2: " + e.toString());
   3042         }
   3043         try {
   3044             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   3045             scriptRelaxed.forEach_testConvertUchar2Short2Uchar2(inV, out);
   3046             verifyResultsConvertShort2Uchar2(inV, out, true);
   3047         } catch (Exception e) {
   3048             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Short2Uchar2: " + e.toString());
   3049         }
   3050     }
   3051 
   3052     private void verifyResultsConvertShort2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
   3053         short[] arrayInV = new short[INPUTSIZE * 2];
   3054         inV.copyTo(arrayInV);
   3055         byte[] arrayOut = new byte[INPUTSIZE * 2];
   3056         out.copyTo(arrayOut);
   3057         for (int i = 0; i < INPUTSIZE; i++) {
   3058             for (int j = 0; j < 2 ; j++) {
   3059                 // Extract the inputs.
   3060                 ArgumentsShortUchar args = new ArgumentsShortUchar();
   3061                 args.inV = arrayInV[i * 2 + j];
   3062                 // Figure out what the outputs should have been.
   3063                 CoreMathVerifier.computeConvert(args);
   3064                 // Validate the outputs.
   3065                 boolean valid = true;
   3066                 if (args.out != arrayOut[i * 2 + j]) {
   3067                     valid = false;
   3068                 }
   3069                 if (!valid) {
   3070                     StringBuilder message = new StringBuilder();
   3071                     message.append("Input inV: ");
   3072                     message.append(String.format("%d", args.inV));
   3073                     message.append("\n");
   3074                     message.append("Expected output out: ");
   3075                     message.append(String.format("0x%x", args.out));
   3076                     message.append("\n");
   3077                     message.append("Actual   output out: ");
   3078                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   3079                     if (args.out != arrayOut[i * 2 + j]) {
   3080                         message.append(" FAIL");
   3081                     }
   3082                     message.append("\n");
   3083                     assertTrue("Incorrect output for checkConvertShort2Uchar2" +
   3084                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3085                 }
   3086             }
   3087         }
   3088     }
   3089 
   3090     private void checkConvertShort3Uchar3() {
   3091         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x94cc7e9aa1dea303l, false, 8);
   3092         try {
   3093             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   3094             script.forEach_testConvertUchar3Short3Uchar3(inV, out);
   3095             verifyResultsConvertShort3Uchar3(inV, out, false);
   3096         } catch (Exception e) {
   3097             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Short3Uchar3: " + e.toString());
   3098         }
   3099         try {
   3100             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   3101             scriptRelaxed.forEach_testConvertUchar3Short3Uchar3(inV, out);
   3102             verifyResultsConvertShort3Uchar3(inV, out, true);
   3103         } catch (Exception e) {
   3104             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Short3Uchar3: " + e.toString());
   3105         }
   3106     }
   3107 
   3108     private void verifyResultsConvertShort3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
   3109         short[] arrayInV = new short[INPUTSIZE * 4];
   3110         inV.copyTo(arrayInV);
   3111         byte[] arrayOut = new byte[INPUTSIZE * 4];
   3112         out.copyTo(arrayOut);
   3113         for (int i = 0; i < INPUTSIZE; i++) {
   3114             for (int j = 0; j < 3 ; j++) {
   3115                 // Extract the inputs.
   3116                 ArgumentsShortUchar args = new ArgumentsShortUchar();
   3117                 args.inV = arrayInV[i * 4 + j];
   3118                 // Figure out what the outputs should have been.
   3119                 CoreMathVerifier.computeConvert(args);
   3120                 // Validate the outputs.
   3121                 boolean valid = true;
   3122                 if (args.out != arrayOut[i * 4 + j]) {
   3123                     valid = false;
   3124                 }
   3125                 if (!valid) {
   3126                     StringBuilder message = new StringBuilder();
   3127                     message.append("Input inV: ");
   3128                     message.append(String.format("%d", args.inV));
   3129                     message.append("\n");
   3130                     message.append("Expected output out: ");
   3131                     message.append(String.format("0x%x", args.out));
   3132                     message.append("\n");
   3133                     message.append("Actual   output out: ");
   3134                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   3135                     if (args.out != arrayOut[i * 4 + j]) {
   3136                         message.append(" FAIL");
   3137                     }
   3138                     message.append("\n");
   3139                     assertTrue("Incorrect output for checkConvertShort3Uchar3" +
   3140                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3141                 }
   3142             }
   3143         }
   3144     }
   3145 
   3146     private void checkConvertShort4Uchar4() {
   3147         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x94ce47b597f9c3e1l, false, 8);
   3148         try {
   3149             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   3150             script.forEach_testConvertUchar4Short4Uchar4(inV, out);
   3151             verifyResultsConvertShort4Uchar4(inV, out, false);
   3152         } catch (Exception e) {
   3153             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Short4Uchar4: " + e.toString());
   3154         }
   3155         try {
   3156             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   3157             scriptRelaxed.forEach_testConvertUchar4Short4Uchar4(inV, out);
   3158             verifyResultsConvertShort4Uchar4(inV, out, true);
   3159         } catch (Exception e) {
   3160             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Short4Uchar4: " + e.toString());
   3161         }
   3162     }
   3163 
   3164     private void verifyResultsConvertShort4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
   3165         short[] arrayInV = new short[INPUTSIZE * 4];
   3166         inV.copyTo(arrayInV);
   3167         byte[] arrayOut = new byte[INPUTSIZE * 4];
   3168         out.copyTo(arrayOut);
   3169         for (int i = 0; i < INPUTSIZE; i++) {
   3170             for (int j = 0; j < 4 ; j++) {
   3171                 // Extract the inputs.
   3172                 ArgumentsShortUchar args = new ArgumentsShortUchar();
   3173                 args.inV = arrayInV[i * 4 + j];
   3174                 // Figure out what the outputs should have been.
   3175                 CoreMathVerifier.computeConvert(args);
   3176                 // Validate the outputs.
   3177                 boolean valid = true;
   3178                 if (args.out != arrayOut[i * 4 + j]) {
   3179                     valid = false;
   3180                 }
   3181                 if (!valid) {
   3182                     StringBuilder message = new StringBuilder();
   3183                     message.append("Input inV: ");
   3184                     message.append(String.format("%d", args.inV));
   3185                     message.append("\n");
   3186                     message.append("Expected output out: ");
   3187                     message.append(String.format("0x%x", args.out));
   3188                     message.append("\n");
   3189                     message.append("Actual   output out: ");
   3190                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   3191                     if (args.out != arrayOut[i * 4 + j]) {
   3192                         message.append(" FAIL");
   3193                     }
   3194                     message.append("\n");
   3195                     assertTrue("Incorrect output for checkConvertShort4Uchar4" +
   3196                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3197                 }
   3198             }
   3199         }
   3200     }
   3201 
   3202     public class ArgumentsUshortUchar {
   3203         public short inV;
   3204         public byte out;
   3205     }
   3206 
   3207     private void checkConvertUshort2Uchar2() {
   3208         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xc36a16c6d90fd1del, false, 8);
   3209         try {
   3210             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   3211             script.forEach_testConvertUchar2Ushort2Uchar2(inV, out);
   3212             verifyResultsConvertUshort2Uchar2(inV, out, false);
   3213         } catch (Exception e) {
   3214             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Ushort2Uchar2: " + e.toString());
   3215         }
   3216         try {
   3217             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   3218             scriptRelaxed.forEach_testConvertUchar2Ushort2Uchar2(inV, out);
   3219             verifyResultsConvertUshort2Uchar2(inV, out, true);
   3220         } catch (Exception e) {
   3221             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Ushort2Uchar2: " + e.toString());
   3222         }
   3223     }
   3224 
   3225     private void verifyResultsConvertUshort2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
   3226         short[] arrayInV = new short[INPUTSIZE * 2];
   3227         inV.copyTo(arrayInV);
   3228         byte[] arrayOut = new byte[INPUTSIZE * 2];
   3229         out.copyTo(arrayOut);
   3230         for (int i = 0; i < INPUTSIZE; i++) {
   3231             for (int j = 0; j < 2 ; j++) {
   3232                 // Extract the inputs.
   3233                 ArgumentsUshortUchar args = new ArgumentsUshortUchar();
   3234                 args.inV = arrayInV[i * 2 + j];
   3235                 // Figure out what the outputs should have been.
   3236                 CoreMathVerifier.computeConvert(args);
   3237                 // Validate the outputs.
   3238                 boolean valid = true;
   3239                 if (args.out != arrayOut[i * 2 + j]) {
   3240                     valid = false;
   3241                 }
   3242                 if (!valid) {
   3243                     StringBuilder message = new StringBuilder();
   3244                     message.append("Input inV: ");
   3245                     message.append(String.format("0x%x", args.inV));
   3246                     message.append("\n");
   3247                     message.append("Expected output out: ");
   3248                     message.append(String.format("0x%x", args.out));
   3249                     message.append("\n");
   3250                     message.append("Actual   output out: ");
   3251                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   3252                     if (args.out != arrayOut[i * 2 + j]) {
   3253                         message.append(" FAIL");
   3254                     }
   3255                     message.append("\n");
   3256                     assertTrue("Incorrect output for checkConvertUshort2Uchar2" +
   3257                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3258                 }
   3259             }
   3260         }
   3261     }
   3262 
   3263     private void checkConvertUshort3Uchar3() {
   3264         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xc36bdfe1cf2af2bcl, false, 8);
   3265         try {
   3266             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   3267             script.forEach_testConvertUchar3Ushort3Uchar3(inV, out);
   3268             verifyResultsConvertUshort3Uchar3(inV, out, false);
   3269         } catch (Exception e) {
   3270             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Ushort3Uchar3: " + e.toString());
   3271         }
   3272         try {
   3273             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   3274             scriptRelaxed.forEach_testConvertUchar3Ushort3Uchar3(inV, out);
   3275             verifyResultsConvertUshort3Uchar3(inV, out, true);
   3276         } catch (Exception e) {
   3277             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Ushort3Uchar3: " + e.toString());
   3278         }
   3279     }
   3280 
   3281     private void verifyResultsConvertUshort3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
   3282         short[] arrayInV = new short[INPUTSIZE * 4];
   3283         inV.copyTo(arrayInV);
   3284         byte[] arrayOut = new byte[INPUTSIZE * 4];
   3285         out.copyTo(arrayOut);
   3286         for (int i = 0; i < INPUTSIZE; i++) {
   3287             for (int j = 0; j < 3 ; j++) {
   3288                 // Extract the inputs.
   3289                 ArgumentsUshortUchar args = new ArgumentsUshortUchar();
   3290                 args.inV = arrayInV[i * 4 + j];
   3291                 // Figure out what the outputs should have been.
   3292                 CoreMathVerifier.computeConvert(args);
   3293                 // Validate the outputs.
   3294                 boolean valid = true;
   3295                 if (args.out != arrayOut[i * 4 + j]) {
   3296                     valid = false;
   3297                 }
   3298                 if (!valid) {
   3299                     StringBuilder message = new StringBuilder();
   3300                     message.append("Input inV: ");
   3301                     message.append(String.format("0x%x", args.inV));
   3302                     message.append("\n");
   3303                     message.append("Expected output out: ");
   3304                     message.append(String.format("0x%x", args.out));
   3305                     message.append("\n");
   3306                     message.append("Actual   output out: ");
   3307                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   3308                     if (args.out != arrayOut[i * 4 + j]) {
   3309                         message.append(" FAIL");
   3310                     }
   3311                     message.append("\n");
   3312                     assertTrue("Incorrect output for checkConvertUshort3Uchar3" +
   3313                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3314                 }
   3315             }
   3316         }
   3317     }
   3318 
   3319     private void checkConvertUshort4Uchar4() {
   3320         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xc36da8fcc546139al, false, 8);
   3321         try {
   3322             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   3323             script.forEach_testConvertUchar4Ushort4Uchar4(inV, out);
   3324             verifyResultsConvertUshort4Uchar4(inV, out, false);
   3325         } catch (Exception e) {
   3326             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Ushort4Uchar4: " + e.toString());
   3327         }
   3328         try {
   3329             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   3330             scriptRelaxed.forEach_testConvertUchar4Ushort4Uchar4(inV, out);
   3331             verifyResultsConvertUshort4Uchar4(inV, out, true);
   3332         } catch (Exception e) {
   3333             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Ushort4Uchar4: " + e.toString());
   3334         }
   3335     }
   3336 
   3337     private void verifyResultsConvertUshort4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
   3338         short[] arrayInV = new short[INPUTSIZE * 4];
   3339         inV.copyTo(arrayInV);
   3340         byte[] arrayOut = new byte[INPUTSIZE * 4];
   3341         out.copyTo(arrayOut);
   3342         for (int i = 0; i < INPUTSIZE; i++) {
   3343             for (int j = 0; j < 4 ; j++) {
   3344                 // Extract the inputs.
   3345                 ArgumentsUshortUchar args = new ArgumentsUshortUchar();
   3346                 args.inV = arrayInV[i * 4 + j];
   3347                 // Figure out what the outputs should have been.
   3348                 CoreMathVerifier.computeConvert(args);
   3349                 // Validate the outputs.
   3350                 boolean valid = true;
   3351                 if (args.out != arrayOut[i * 4 + j]) {
   3352                     valid = false;
   3353                 }
   3354                 if (!valid) {
   3355                     StringBuilder message = new StringBuilder();
   3356                     message.append("Input inV: ");
   3357                     message.append(String.format("0x%x", args.inV));
   3358                     message.append("\n");
   3359                     message.append("Expected output out: ");
   3360                     message.append(String.format("0x%x", args.out));
   3361                     message.append("\n");
   3362                     message.append("Actual   output out: ");
   3363                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   3364                     if (args.out != arrayOut[i * 4 + j]) {
   3365                         message.append(" FAIL");
   3366                     }
   3367                     message.append("\n");
   3368                     assertTrue("Incorrect output for checkConvertUshort4Uchar4" +
   3369                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3370                 }
   3371             }
   3372         }
   3373     }
   3374 
   3375     public class ArgumentsIntUchar {
   3376         public int inV;
   3377         public byte out;
   3378     }
   3379 
   3380     private void checkConvertInt2Uchar2() {
   3381         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x2a53651c20a4b078l, false, 8);
   3382         try {
   3383             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   3384             script.forEach_testConvertUchar2Int2Uchar2(inV, out);
   3385             verifyResultsConvertInt2Uchar2(inV, out, false);
   3386         } catch (Exception e) {
   3387             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Int2Uchar2: " + e.toString());
   3388         }
   3389         try {
   3390             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   3391             scriptRelaxed.forEach_testConvertUchar2Int2Uchar2(inV, out);
   3392             verifyResultsConvertInt2Uchar2(inV, out, true);
   3393         } catch (Exception e) {
   3394             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Int2Uchar2: " + e.toString());
   3395         }
   3396     }
   3397 
   3398     private void verifyResultsConvertInt2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
   3399         int[] arrayInV = new int[INPUTSIZE * 2];
   3400         inV.copyTo(arrayInV);
   3401         byte[] arrayOut = new byte[INPUTSIZE * 2];
   3402         out.copyTo(arrayOut);
   3403         for (int i = 0; i < INPUTSIZE; i++) {
   3404             for (int j = 0; j < 2 ; j++) {
   3405                 // Extract the inputs.
   3406                 ArgumentsIntUchar args = new ArgumentsIntUchar();
   3407                 args.inV = arrayInV[i * 2 + j];
   3408                 // Figure out what the outputs should have been.
   3409                 CoreMathVerifier.computeConvert(args);
   3410                 // Validate the outputs.
   3411                 boolean valid = true;
   3412                 if (args.out != arrayOut[i * 2 + j]) {
   3413                     valid = false;
   3414                 }
   3415                 if (!valid) {
   3416                     StringBuilder message = new StringBuilder();
   3417                     message.append("Input inV: ");
   3418                     message.append(String.format("%d", args.inV));
   3419                     message.append("\n");
   3420                     message.append("Expected output out: ");
   3421                     message.append(String.format("0x%x", args.out));
   3422                     message.append("\n");
   3423                     message.append("Actual   output out: ");
   3424                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   3425                     if (args.out != arrayOut[i * 2 + j]) {
   3426                         message.append(" FAIL");
   3427                     }
   3428                     message.append("\n");
   3429                     assertTrue("Incorrect output for checkConvertInt2Uchar2" +
   3430                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3431                 }
   3432             }
   3433         }
   3434     }
   3435 
   3436     private void checkConvertInt3Uchar3() {
   3437         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x2a552e3716bfd156l, false, 8);
   3438         try {
   3439             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   3440             script.forEach_testConvertUchar3Int3Uchar3(inV, out);
   3441             verifyResultsConvertInt3Uchar3(inV, out, false);
   3442         } catch (Exception e) {
   3443             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Int3Uchar3: " + e.toString());
   3444         }
   3445         try {
   3446             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   3447             scriptRelaxed.forEach_testConvertUchar3Int3Uchar3(inV, out);
   3448             verifyResultsConvertInt3Uchar3(inV, out, true);
   3449         } catch (Exception e) {
   3450             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Int3Uchar3: " + e.toString());
   3451         }
   3452     }
   3453 
   3454     private void verifyResultsConvertInt3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
   3455         int[] arrayInV = new int[INPUTSIZE * 4];
   3456         inV.copyTo(arrayInV);
   3457         byte[] arrayOut = new byte[INPUTSIZE * 4];
   3458         out.copyTo(arrayOut);
   3459         for (int i = 0; i < INPUTSIZE; i++) {
   3460             for (int j = 0; j < 3 ; j++) {
   3461                 // Extract the inputs.
   3462                 ArgumentsIntUchar args = new ArgumentsIntUchar();
   3463                 args.inV = arrayInV[i * 4 + j];
   3464                 // Figure out what the outputs should have been.
   3465                 CoreMathVerifier.computeConvert(args);
   3466                 // Validate the outputs.
   3467                 boolean valid = true;
   3468                 if (args.out != arrayOut[i * 4 + j]) {
   3469                     valid = false;
   3470                 }
   3471                 if (!valid) {
   3472                     StringBuilder message = new StringBuilder();
   3473                     message.append("Input inV: ");
   3474                     message.append(String.format("%d", args.inV));
   3475                     message.append("\n");
   3476                     message.append("Expected output out: ");
   3477                     message.append(String.format("0x%x", args.out));
   3478                     message.append("\n");
   3479                     message.append("Actual   output out: ");
   3480                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   3481                     if (args.out != arrayOut[i * 4 + j]) {
   3482                         message.append(" FAIL");
   3483                     }
   3484                     message.append("\n");
   3485                     assertTrue("Incorrect output for checkConvertInt3Uchar3" +
   3486                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3487                 }
   3488             }
   3489         }
   3490     }
   3491 
   3492     private void checkConvertInt4Uchar4() {
   3493         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x2a56f7520cdaf234l, false, 8);
   3494         try {
   3495             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   3496             script.forEach_testConvertUchar4Int4Uchar4(inV, out);
   3497             verifyResultsConvertInt4Uchar4(inV, out, false);
   3498         } catch (Exception e) {
   3499             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Int4Uchar4: " + e.toString());
   3500         }
   3501         try {
   3502             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   3503             scriptRelaxed.forEach_testConvertUchar4Int4Uchar4(inV, out);
   3504             verifyResultsConvertInt4Uchar4(inV, out, true);
   3505         } catch (Exception e) {
   3506             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Int4Uchar4: " + e.toString());
   3507         }
   3508     }
   3509 
   3510     private void verifyResultsConvertInt4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
   3511         int[] arrayInV = new int[INPUTSIZE * 4];
   3512         inV.copyTo(arrayInV);
   3513         byte[] arrayOut = new byte[INPUTSIZE * 4];
   3514         out.copyTo(arrayOut);
   3515         for (int i = 0; i < INPUTSIZE; i++) {
   3516             for (int j = 0; j < 4 ; j++) {
   3517                 // Extract the inputs.
   3518                 ArgumentsIntUchar args = new ArgumentsIntUchar();
   3519                 args.inV = arrayInV[i * 4 + j];
   3520                 // Figure out what the outputs should have been.
   3521                 CoreMathVerifier.computeConvert(args);
   3522                 // Validate the outputs.
   3523                 boolean valid = true;
   3524                 if (args.out != arrayOut[i * 4 + j]) {
   3525                     valid = false;
   3526                 }
   3527                 if (!valid) {
   3528                     StringBuilder message = new StringBuilder();
   3529                     message.append("Input inV: ");
   3530                     message.append(String.format("%d", args.inV));
   3531                     message.append("\n");
   3532                     message.append("Expected output out: ");
   3533                     message.append(String.format("0x%x", args.out));
   3534                     message.append("\n");
   3535                     message.append("Actual   output out: ");
   3536                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   3537                     if (args.out != arrayOut[i * 4 + j]) {
   3538                         message.append(" FAIL");
   3539                     }
   3540                     message.append("\n");
   3541                     assertTrue("Incorrect output for checkConvertInt4Uchar4" +
   3542                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3543                 }
   3544             }
   3545         }
   3546     }
   3547 
   3548     public class ArgumentsUintUchar {
   3549         public int inV;
   3550         public byte out;
   3551     }
   3552 
   3553     private void checkConvertUint2Uchar2() {
   3554         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xd1e11e69b326bcf9l, false, 8);
   3555         try {
   3556             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   3557             script.forEach_testConvertUchar2Uint2Uchar2(inV, out);
   3558             verifyResultsConvertUint2Uchar2(inV, out, false);
   3559         } catch (Exception e) {
   3560             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Uint2Uchar2: " + e.toString());
   3561         }
   3562         try {
   3563             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   3564             scriptRelaxed.forEach_testConvertUchar2Uint2Uchar2(inV, out);
   3565             verifyResultsConvertUint2Uchar2(inV, out, true);
   3566         } catch (Exception e) {
   3567             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Uint2Uchar2: " + e.toString());
   3568         }
   3569     }
   3570 
   3571     private void verifyResultsConvertUint2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
   3572         int[] arrayInV = new int[INPUTSIZE * 2];
   3573         inV.copyTo(arrayInV);
   3574         byte[] arrayOut = new byte[INPUTSIZE * 2];
   3575         out.copyTo(arrayOut);
   3576         for (int i = 0; i < INPUTSIZE; i++) {
   3577             for (int j = 0; j < 2 ; j++) {
   3578                 // Extract the inputs.
   3579                 ArgumentsUintUchar args = new ArgumentsUintUchar();
   3580                 args.inV = arrayInV[i * 2 + j];
   3581                 // Figure out what the outputs should have been.
   3582                 CoreMathVerifier.computeConvert(args);
   3583                 // Validate the outputs.
   3584                 boolean valid = true;
   3585                 if (args.out != arrayOut[i * 2 + j]) {
   3586                     valid = false;
   3587                 }
   3588                 if (!valid) {
   3589                     StringBuilder message = new StringBuilder();
   3590                     message.append("Input inV: ");
   3591                     message.append(String.format("0x%x", args.inV));
   3592                     message.append("\n");
   3593                     message.append("Expected output out: ");
   3594                     message.append(String.format("0x%x", args.out));
   3595                     message.append("\n");
   3596                     message.append("Actual   output out: ");
   3597                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   3598                     if (args.out != arrayOut[i * 2 + j]) {
   3599                         message.append(" FAIL");
   3600                     }
   3601                     message.append("\n");
   3602                     assertTrue("Incorrect output for checkConvertUint2Uchar2" +
   3603                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3604                 }
   3605             }
   3606         }
   3607     }
   3608 
   3609     private void checkConvertUint3Uchar3() {
   3610         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xd1e2e784a941ddd7l, false, 8);
   3611         try {
   3612             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   3613             script.forEach_testConvertUchar3Uint3Uchar3(inV, out);
   3614             verifyResultsConvertUint3Uchar3(inV, out, false);
   3615         } catch (Exception e) {
   3616             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Uint3Uchar3: " + e.toString());
   3617         }
   3618         try {
   3619             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   3620             scriptRelaxed.forEach_testConvertUchar3Uint3Uchar3(inV, out);
   3621             verifyResultsConvertUint3Uchar3(inV, out, true);
   3622         } catch (Exception e) {
   3623             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Uint3Uchar3: " + e.toString());
   3624         }
   3625     }
   3626 
   3627     private void verifyResultsConvertUint3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
   3628         int[] arrayInV = new int[INPUTSIZE * 4];
   3629         inV.copyTo(arrayInV);
   3630         byte[] arrayOut = new byte[INPUTSIZE * 4];
   3631         out.copyTo(arrayOut);
   3632         for (int i = 0; i < INPUTSIZE; i++) {
   3633             for (int j = 0; j < 3 ; j++) {
   3634                 // Extract the inputs.
   3635                 ArgumentsUintUchar args = new ArgumentsUintUchar();
   3636                 args.inV = arrayInV[i * 4 + j];
   3637                 // Figure out what the outputs should have been.
   3638                 CoreMathVerifier.computeConvert(args);
   3639                 // Validate the outputs.
   3640                 boolean valid = true;
   3641                 if (args.out != arrayOut[i * 4 + j]) {
   3642                     valid = false;
   3643                 }
   3644                 if (!valid) {
   3645                     StringBuilder message = new StringBuilder();
   3646                     message.append("Input inV: ");
   3647                     message.append(String.format("0x%x", args.inV));
   3648                     message.append("\n");
   3649                     message.append("Expected output out: ");
   3650                     message.append(String.format("0x%x", args.out));
   3651                     message.append("\n");
   3652                     message.append("Actual   output out: ");
   3653                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   3654                     if (args.out != arrayOut[i * 4 + j]) {
   3655                         message.append(" FAIL");
   3656                     }
   3657                     message.append("\n");
   3658                     assertTrue("Incorrect output for checkConvertUint3Uchar3" +
   3659                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3660                 }
   3661             }
   3662         }
   3663     }
   3664 
   3665     private void checkConvertUint4Uchar4() {
   3666         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xd1e4b09f9f5cfeb5l, false, 8);
   3667         try {
   3668             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   3669             script.forEach_testConvertUchar4Uint4Uchar4(inV, out);
   3670             verifyResultsConvertUint4Uchar4(inV, out, false);
   3671         } catch (Exception e) {
   3672             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Uint4Uchar4: " + e.toString());
   3673         }
   3674         try {
   3675             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   3676             scriptRelaxed.forEach_testConvertUchar4Uint4Uchar4(inV, out);
   3677             verifyResultsConvertUint4Uchar4(inV, out, true);
   3678         } catch (Exception e) {
   3679             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Uint4Uchar4: " + e.toString());
   3680         }
   3681     }
   3682 
   3683     private void verifyResultsConvertUint4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
   3684         int[] arrayInV = new int[INPUTSIZE * 4];
   3685         inV.copyTo(arrayInV);
   3686         byte[] arrayOut = new byte[INPUTSIZE * 4];
   3687         out.copyTo(arrayOut);
   3688         for (int i = 0; i < INPUTSIZE; i++) {
   3689             for (int j = 0; j < 4 ; j++) {
   3690                 // Extract the inputs.
   3691                 ArgumentsUintUchar args = new ArgumentsUintUchar();
   3692                 args.inV = arrayInV[i * 4 + j];
   3693                 // Figure out what the outputs should have been.
   3694                 CoreMathVerifier.computeConvert(args);
   3695                 // Validate the outputs.
   3696                 boolean valid = true;
   3697                 if (args.out != arrayOut[i * 4 + j]) {
   3698                     valid = false;
   3699                 }
   3700                 if (!valid) {
   3701                     StringBuilder message = new StringBuilder();
   3702                     message.append("Input inV: ");
   3703                     message.append(String.format("0x%x", args.inV));
   3704                     message.append("\n");
   3705                     message.append("Expected output out: ");
   3706                     message.append(String.format("0x%x", args.out));
   3707                     message.append("\n");
   3708                     message.append("Actual   output out: ");
   3709                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   3710                     if (args.out != arrayOut[i * 4 + j]) {
   3711                         message.append(" FAIL");
   3712                     }
   3713                     message.append("\n");
   3714                     assertTrue("Incorrect output for checkConvertUint4Uchar4" +
   3715                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3716                 }
   3717             }
   3718         }
   3719     }
   3720 
   3721     public class ArgumentsFloatShort {
   3722         public float inV;
   3723         public short out;
   3724     }
   3725 
   3726     private void checkConvertFloat2Short2() {
   3727         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfb529ef98fcf2692l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
   3728         try {
   3729             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   3730             script.forEach_testConvertShort2Float2Short2(inV, out);
   3731             verifyResultsConvertFloat2Short2(inV, out, false);
   3732         } catch (Exception e) {
   3733             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Float2Short2: " + e.toString());
   3734         }
   3735         try {
   3736             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   3737             scriptRelaxed.forEach_testConvertShort2Float2Short2(inV, out);
   3738             verifyResultsConvertFloat2Short2(inV, out, true);
   3739         } catch (Exception e) {
   3740             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Float2Short2: " + e.toString());
   3741         }
   3742     }
   3743 
   3744     private void verifyResultsConvertFloat2Short2(Allocation inV, Allocation out, boolean relaxed) {
   3745         float[] arrayInV = new float[INPUTSIZE * 2];
   3746         inV.copyTo(arrayInV);
   3747         short[] arrayOut = new short[INPUTSIZE * 2];
   3748         out.copyTo(arrayOut);
   3749         for (int i = 0; i < INPUTSIZE; i++) {
   3750             for (int j = 0; j < 2 ; j++) {
   3751                 // Extract the inputs.
   3752                 ArgumentsFloatShort args = new ArgumentsFloatShort();
   3753                 args.inV = arrayInV[i * 2 + j];
   3754                 // Figure out what the outputs should have been.
   3755                 CoreMathVerifier.computeConvert(args);
   3756                 // Validate the outputs.
   3757                 boolean valid = true;
   3758                 if (args.out != arrayOut[i * 2 + j]) {
   3759                     valid = false;
   3760                 }
   3761                 if (!valid) {
   3762                     StringBuilder message = new StringBuilder();
   3763                     message.append("Input inV: ");
   3764                     message.append(String.format("%14.8g {%8x} %15a",
   3765                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   3766                     message.append("\n");
   3767                     message.append("Expected output out: ");
   3768                     message.append(String.format("%d", args.out));
   3769                     message.append("\n");
   3770                     message.append("Actual   output out: ");
   3771                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   3772                     if (args.out != arrayOut[i * 2 + j]) {
   3773                         message.append(" FAIL");
   3774                     }
   3775                     message.append("\n");
   3776                     assertTrue("Incorrect output for checkConvertFloat2Short2" +
   3777                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3778                 }
   3779             }
   3780         }
   3781     }
   3782 
   3783     private void checkConvertFloat3Short3() {
   3784         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfb54681485ea4770l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
   3785         try {
   3786             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   3787             script.forEach_testConvertShort3Float3Short3(inV, out);
   3788             verifyResultsConvertFloat3Short3(inV, out, false);
   3789         } catch (Exception e) {
   3790             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Float3Short3: " + e.toString());
   3791         }
   3792         try {
   3793             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   3794             scriptRelaxed.forEach_testConvertShort3Float3Short3(inV, out);
   3795             verifyResultsConvertFloat3Short3(inV, out, true);
   3796         } catch (Exception e) {
   3797             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Float3Short3: " + e.toString());
   3798         }
   3799     }
   3800 
   3801     private void verifyResultsConvertFloat3Short3(Allocation inV, Allocation out, boolean relaxed) {
   3802         float[] arrayInV = new float[INPUTSIZE * 4];
   3803         inV.copyTo(arrayInV);
   3804         short[] arrayOut = new short[INPUTSIZE * 4];
   3805         out.copyTo(arrayOut);
   3806         for (int i = 0; i < INPUTSIZE; i++) {
   3807             for (int j = 0; j < 3 ; j++) {
   3808                 // Extract the inputs.
   3809                 ArgumentsFloatShort args = new ArgumentsFloatShort();
   3810                 args.inV = arrayInV[i * 4 + j];
   3811                 // Figure out what the outputs should have been.
   3812                 CoreMathVerifier.computeConvert(args);
   3813                 // Validate the outputs.
   3814                 boolean valid = true;
   3815                 if (args.out != arrayOut[i * 4 + j]) {
   3816                     valid = false;
   3817                 }
   3818                 if (!valid) {
   3819                     StringBuilder message = new StringBuilder();
   3820                     message.append("Input inV: ");
   3821                     message.append(String.format("%14.8g {%8x} %15a",
   3822                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   3823                     message.append("\n");
   3824                     message.append("Expected output out: ");
   3825                     message.append(String.format("%d", args.out));
   3826                     message.append("\n");
   3827                     message.append("Actual   output out: ");
   3828                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   3829                     if (args.out != arrayOut[i * 4 + j]) {
   3830                         message.append(" FAIL");
   3831                     }
   3832                     message.append("\n");
   3833                     assertTrue("Incorrect output for checkConvertFloat3Short3" +
   3834                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3835                 }
   3836             }
   3837         }
   3838     }
   3839 
   3840     private void checkConvertFloat4Short4() {
   3841         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfb56312f7c05684el, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
   3842         try {
   3843             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   3844             script.forEach_testConvertShort4Float4Short4(inV, out);
   3845             verifyResultsConvertFloat4Short4(inV, out, false);
   3846         } catch (Exception e) {
   3847             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Float4Short4: " + e.toString());
   3848         }
   3849         try {
   3850             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   3851             scriptRelaxed.forEach_testConvertShort4Float4Short4(inV, out);
   3852             verifyResultsConvertFloat4Short4(inV, out, true);
   3853         } catch (Exception e) {
   3854             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Float4Short4: " + e.toString());
   3855         }
   3856     }
   3857 
   3858     private void verifyResultsConvertFloat4Short4(Allocation inV, Allocation out, boolean relaxed) {
   3859         float[] arrayInV = new float[INPUTSIZE * 4];
   3860         inV.copyTo(arrayInV);
   3861         short[] arrayOut = new short[INPUTSIZE * 4];
   3862         out.copyTo(arrayOut);
   3863         for (int i = 0; i < INPUTSIZE; i++) {
   3864             for (int j = 0; j < 4 ; j++) {
   3865                 // Extract the inputs.
   3866                 ArgumentsFloatShort args = new ArgumentsFloatShort();
   3867                 args.inV = arrayInV[i * 4 + j];
   3868                 // Figure out what the outputs should have been.
   3869                 CoreMathVerifier.computeConvert(args);
   3870                 // Validate the outputs.
   3871                 boolean valid = true;
   3872                 if (args.out != arrayOut[i * 4 + j]) {
   3873                     valid = false;
   3874                 }
   3875                 if (!valid) {
   3876                     StringBuilder message = new StringBuilder();
   3877                     message.append("Input inV: ");
   3878                     message.append(String.format("%14.8g {%8x} %15a",
   3879                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   3880                     message.append("\n");
   3881                     message.append("Expected output out: ");
   3882                     message.append(String.format("%d", args.out));
   3883                     message.append("\n");
   3884                     message.append("Actual   output out: ");
   3885                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   3886                     if (args.out != arrayOut[i * 4 + j]) {
   3887                         message.append(" FAIL");
   3888                     }
   3889                     message.append("\n");
   3890                     assertTrue("Incorrect output for checkConvertFloat4Short4" +
   3891                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3892                 }
   3893             }
   3894         }
   3895     }
   3896 
   3897     public class ArgumentsCharShort {
   3898         public byte inV;
   3899         public short out;
   3900     }
   3901 
   3902     private void checkConvertChar2Short2() {
   3903         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x58626b4b60f84e52l, true, 7);
   3904         try {
   3905             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   3906             script.forEach_testConvertShort2Char2Short2(inV, out);
   3907             verifyResultsConvertChar2Short2(inV, out, false);
   3908         } catch (Exception e) {
   3909             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Char2Short2: " + e.toString());
   3910         }
   3911         try {
   3912             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   3913             scriptRelaxed.forEach_testConvertShort2Char2Short2(inV, out);
   3914             verifyResultsConvertChar2Short2(inV, out, true);
   3915         } catch (Exception e) {
   3916             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Char2Short2: " + e.toString());
   3917         }
   3918     }
   3919 
   3920     private void verifyResultsConvertChar2Short2(Allocation inV, Allocation out, boolean relaxed) {
   3921         byte[] arrayInV = new byte[INPUTSIZE * 2];
   3922         inV.copyTo(arrayInV);
   3923         short[] arrayOut = new short[INPUTSIZE * 2];
   3924         out.copyTo(arrayOut);
   3925         for (int i = 0; i < INPUTSIZE; i++) {
   3926             for (int j = 0; j < 2 ; j++) {
   3927                 // Extract the inputs.
   3928                 ArgumentsCharShort args = new ArgumentsCharShort();
   3929                 args.inV = arrayInV[i * 2 + j];
   3930                 // Figure out what the outputs should have been.
   3931                 CoreMathVerifier.computeConvert(args);
   3932                 // Validate the outputs.
   3933                 boolean valid = true;
   3934                 if (args.out != arrayOut[i * 2 + j]) {
   3935                     valid = false;
   3936                 }
   3937                 if (!valid) {
   3938                     StringBuilder message = new StringBuilder();
   3939                     message.append("Input inV: ");
   3940                     message.append(String.format("%d", args.inV));
   3941                     message.append("\n");
   3942                     message.append("Expected output out: ");
   3943                     message.append(String.format("%d", args.out));
   3944                     message.append("\n");
   3945                     message.append("Actual   output out: ");
   3946                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   3947                     if (args.out != arrayOut[i * 2 + j]) {
   3948                         message.append(" FAIL");
   3949                     }
   3950                     message.append("\n");
   3951                     assertTrue("Incorrect output for checkConvertChar2Short2" +
   3952                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   3953                 }
   3954             }
   3955         }
   3956     }
   3957 
   3958     private void checkConvertChar3Short3() {
   3959         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x5864346657136f30l, true, 7);
   3960         try {
   3961             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   3962             script.forEach_testConvertShort3Char3Short3(inV, out);
   3963             verifyResultsConvertChar3Short3(inV, out, false);
   3964         } catch (Exception e) {
   3965             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Char3Short3: " + e.toString());
   3966         }
   3967         try {
   3968             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   3969             scriptRelaxed.forEach_testConvertShort3Char3Short3(inV, out);
   3970             verifyResultsConvertChar3Short3(inV, out, true);
   3971         } catch (Exception e) {
   3972             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Char3Short3: " + e.toString());
   3973         }
   3974     }
   3975 
   3976     private void verifyResultsConvertChar3Short3(Allocation inV, Allocation out, boolean relaxed) {
   3977         byte[] arrayInV = new byte[INPUTSIZE * 4];
   3978         inV.copyTo(arrayInV);
   3979         short[] arrayOut = new short[INPUTSIZE * 4];
   3980         out.copyTo(arrayOut);
   3981         for (int i = 0; i < INPUTSIZE; i++) {
   3982             for (int j = 0; j < 3 ; j++) {
   3983                 // Extract the inputs.
   3984                 ArgumentsCharShort args = new ArgumentsCharShort();
   3985                 args.inV = arrayInV[i * 4 + j];
   3986                 // Figure out what the outputs should have been.
   3987                 CoreMathVerifier.computeConvert(args);
   3988                 // Validate the outputs.
   3989                 boolean valid = true;
   3990                 if (args.out != arrayOut[i * 4 + j]) {
   3991                     valid = false;
   3992                 }
   3993                 if (!valid) {
   3994                     StringBuilder message = new StringBuilder();
   3995                     message.append("Input inV: ");
   3996                     message.append(String.format("%d", args.inV));
   3997                     message.append("\n");
   3998                     message.append("Expected output out: ");
   3999                     message.append(String.format("%d", args.out));
   4000                     message.append("\n");
   4001                     message.append("Actual   output out: ");
   4002                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4003                     if (args.out != arrayOut[i * 4 + j]) {
   4004                         message.append(" FAIL");
   4005                     }
   4006                     message.append("\n");
   4007                     assertTrue("Incorrect output for checkConvertChar3Short3" +
   4008                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4009                 }
   4010             }
   4011         }
   4012     }
   4013 
   4014     private void checkConvertChar4Short4() {
   4015         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x5865fd814d2e900el, true, 7);
   4016         try {
   4017             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4018             script.forEach_testConvertShort4Char4Short4(inV, out);
   4019             verifyResultsConvertChar4Short4(inV, out, false);
   4020         } catch (Exception e) {
   4021             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Char4Short4: " + e.toString());
   4022         }
   4023         try {
   4024             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4025             scriptRelaxed.forEach_testConvertShort4Char4Short4(inV, out);
   4026             verifyResultsConvertChar4Short4(inV, out, true);
   4027         } catch (Exception e) {
   4028             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Char4Short4: " + e.toString());
   4029         }
   4030     }
   4031 
   4032     private void verifyResultsConvertChar4Short4(Allocation inV, Allocation out, boolean relaxed) {
   4033         byte[] arrayInV = new byte[INPUTSIZE * 4];
   4034         inV.copyTo(arrayInV);
   4035         short[] arrayOut = new short[INPUTSIZE * 4];
   4036         out.copyTo(arrayOut);
   4037         for (int i = 0; i < INPUTSIZE; i++) {
   4038             for (int j = 0; j < 4 ; j++) {
   4039                 // Extract the inputs.
   4040                 ArgumentsCharShort args = new ArgumentsCharShort();
   4041                 args.inV = arrayInV[i * 4 + j];
   4042                 // Figure out what the outputs should have been.
   4043                 CoreMathVerifier.computeConvert(args);
   4044                 // Validate the outputs.
   4045                 boolean valid = true;
   4046                 if (args.out != arrayOut[i * 4 + j]) {
   4047                     valid = false;
   4048                 }
   4049                 if (!valid) {
   4050                     StringBuilder message = new StringBuilder();
   4051                     message.append("Input inV: ");
   4052                     message.append(String.format("%d", args.inV));
   4053                     message.append("\n");
   4054                     message.append("Expected output out: ");
   4055                     message.append(String.format("%d", args.out));
   4056                     message.append("\n");
   4057                     message.append("Actual   output out: ");
   4058                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4059                     if (args.out != arrayOut[i * 4 + j]) {
   4060                         message.append(" FAIL");
   4061                     }
   4062                     message.append("\n");
   4063                     assertTrue("Incorrect output for checkConvertChar4Short4" +
   4064                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4065                 }
   4066             }
   4067         }
   4068     }
   4069 
   4070     public class ArgumentsUcharShort {
   4071         public byte inV;
   4072         public short out;
   4073     }
   4074 
   4075     private void checkConvertUchar2Short2() {
   4076         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7d308b52fcd067fdl, false, 8);
   4077         try {
   4078             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   4079             script.forEach_testConvertShort2Uchar2Short2(inV, out);
   4080             verifyResultsConvertUchar2Short2(inV, out, false);
   4081         } catch (Exception e) {
   4082             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Uchar2Short2: " + e.toString());
   4083         }
   4084         try {
   4085             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   4086             scriptRelaxed.forEach_testConvertShort2Uchar2Short2(inV, out);
   4087             verifyResultsConvertUchar2Short2(inV, out, true);
   4088         } catch (Exception e) {
   4089             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Uchar2Short2: " + e.toString());
   4090         }
   4091     }
   4092 
   4093     private void verifyResultsConvertUchar2Short2(Allocation inV, Allocation out, boolean relaxed) {
   4094         byte[] arrayInV = new byte[INPUTSIZE * 2];
   4095         inV.copyTo(arrayInV);
   4096         short[] arrayOut = new short[INPUTSIZE * 2];
   4097         out.copyTo(arrayOut);
   4098         for (int i = 0; i < INPUTSIZE; i++) {
   4099             for (int j = 0; j < 2 ; j++) {
   4100                 // Extract the inputs.
   4101                 ArgumentsUcharShort args = new ArgumentsUcharShort();
   4102                 args.inV = arrayInV[i * 2 + j];
   4103                 // Figure out what the outputs should have been.
   4104                 CoreMathVerifier.computeConvert(args);
   4105                 // Validate the outputs.
   4106                 boolean valid = true;
   4107                 if (args.out != arrayOut[i * 2 + j]) {
   4108                     valid = false;
   4109                 }
   4110                 if (!valid) {
   4111                     StringBuilder message = new StringBuilder();
   4112                     message.append("Input inV: ");
   4113                     message.append(String.format("0x%x", args.inV));
   4114                     message.append("\n");
   4115                     message.append("Expected output out: ");
   4116                     message.append(String.format("%d", args.out));
   4117                     message.append("\n");
   4118                     message.append("Actual   output out: ");
   4119                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   4120                     if (args.out != arrayOut[i * 2 + j]) {
   4121                         message.append(" FAIL");
   4122                     }
   4123                     message.append("\n");
   4124                     assertTrue("Incorrect output for checkConvertUchar2Short2" +
   4125                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4126                 }
   4127             }
   4128         }
   4129     }
   4130 
   4131     private void checkConvertUchar3Short3() {
   4132         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7d32546df2eb88dbl, false, 8);
   4133         try {
   4134             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   4135             script.forEach_testConvertShort3Uchar3Short3(inV, out);
   4136             verifyResultsConvertUchar3Short3(inV, out, false);
   4137         } catch (Exception e) {
   4138             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Uchar3Short3: " + e.toString());
   4139         }
   4140         try {
   4141             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   4142             scriptRelaxed.forEach_testConvertShort3Uchar3Short3(inV, out);
   4143             verifyResultsConvertUchar3Short3(inV, out, true);
   4144         } catch (Exception e) {
   4145             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Uchar3Short3: " + e.toString());
   4146         }
   4147     }
   4148 
   4149     private void verifyResultsConvertUchar3Short3(Allocation inV, Allocation out, boolean relaxed) {
   4150         byte[] arrayInV = new byte[INPUTSIZE * 4];
   4151         inV.copyTo(arrayInV);
   4152         short[] arrayOut = new short[INPUTSIZE * 4];
   4153         out.copyTo(arrayOut);
   4154         for (int i = 0; i < INPUTSIZE; i++) {
   4155             for (int j = 0; j < 3 ; j++) {
   4156                 // Extract the inputs.
   4157                 ArgumentsUcharShort args = new ArgumentsUcharShort();
   4158                 args.inV = arrayInV[i * 4 + j];
   4159                 // Figure out what the outputs should have been.
   4160                 CoreMathVerifier.computeConvert(args);
   4161                 // Validate the outputs.
   4162                 boolean valid = true;
   4163                 if (args.out != arrayOut[i * 4 + j]) {
   4164                     valid = false;
   4165                 }
   4166                 if (!valid) {
   4167                     StringBuilder message = new StringBuilder();
   4168                     message.append("Input inV: ");
   4169                     message.append(String.format("0x%x", args.inV));
   4170                     message.append("\n");
   4171                     message.append("Expected output out: ");
   4172                     message.append(String.format("%d", args.out));
   4173                     message.append("\n");
   4174                     message.append("Actual   output out: ");
   4175                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4176                     if (args.out != arrayOut[i * 4 + j]) {
   4177                         message.append(" FAIL");
   4178                     }
   4179                     message.append("\n");
   4180                     assertTrue("Incorrect output for checkConvertUchar3Short3" +
   4181                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4182                 }
   4183             }
   4184         }
   4185     }
   4186 
   4187     private void checkConvertUchar4Short4() {
   4188         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7d341d88e906a9b9l, false, 8);
   4189         try {
   4190             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4191             script.forEach_testConvertShort4Uchar4Short4(inV, out);
   4192             verifyResultsConvertUchar4Short4(inV, out, false);
   4193         } catch (Exception e) {
   4194             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Uchar4Short4: " + e.toString());
   4195         }
   4196         try {
   4197             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4198             scriptRelaxed.forEach_testConvertShort4Uchar4Short4(inV, out);
   4199             verifyResultsConvertUchar4Short4(inV, out, true);
   4200         } catch (Exception e) {
   4201             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Uchar4Short4: " + e.toString());
   4202         }
   4203     }
   4204 
   4205     private void verifyResultsConvertUchar4Short4(Allocation inV, Allocation out, boolean relaxed) {
   4206         byte[] arrayInV = new byte[INPUTSIZE * 4];
   4207         inV.copyTo(arrayInV);
   4208         short[] arrayOut = new short[INPUTSIZE * 4];
   4209         out.copyTo(arrayOut);
   4210         for (int i = 0; i < INPUTSIZE; i++) {
   4211             for (int j = 0; j < 4 ; j++) {
   4212                 // Extract the inputs.
   4213                 ArgumentsUcharShort args = new ArgumentsUcharShort();
   4214                 args.inV = arrayInV[i * 4 + j];
   4215                 // Figure out what the outputs should have been.
   4216                 CoreMathVerifier.computeConvert(args);
   4217                 // Validate the outputs.
   4218                 boolean valid = true;
   4219                 if (args.out != arrayOut[i * 4 + j]) {
   4220                     valid = false;
   4221                 }
   4222                 if (!valid) {
   4223                     StringBuilder message = new StringBuilder();
   4224                     message.append("Input inV: ");
   4225                     message.append(String.format("0x%x", args.inV));
   4226                     message.append("\n");
   4227                     message.append("Expected output out: ");
   4228                     message.append(String.format("%d", args.out));
   4229                     message.append("\n");
   4230                     message.append("Actual   output out: ");
   4231                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4232                     if (args.out != arrayOut[i * 4 + j]) {
   4233                         message.append(" FAIL");
   4234                     }
   4235                     message.append("\n");
   4236                     assertTrue("Incorrect output for checkConvertUchar4Short4" +
   4237                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4238                 }
   4239             }
   4240         }
   4241     }
   4242 
   4243     public class ArgumentsShortShort {
   4244         public short inV;
   4245         public short out;
   4246     }
   4247 
   4248     private void checkConvertShort2Short2() {
   4249         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x94caa18440d14d3el, true, 15);
   4250         try {
   4251             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   4252             script.forEach_testConvertShort2Short2Short2(inV, out);
   4253             verifyResultsConvertShort2Short2(inV, out, false);
   4254         } catch (Exception e) {
   4255             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Short2Short2: " + e.toString());
   4256         }
   4257         try {
   4258             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   4259             scriptRelaxed.forEach_testConvertShort2Short2Short2(inV, out);
   4260             verifyResultsConvertShort2Short2(inV, out, true);
   4261         } catch (Exception e) {
   4262             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Short2Short2: " + e.toString());
   4263         }
   4264     }
   4265 
   4266     private void verifyResultsConvertShort2Short2(Allocation inV, Allocation out, boolean relaxed) {
   4267         short[] arrayInV = new short[INPUTSIZE * 2];
   4268         inV.copyTo(arrayInV);
   4269         short[] arrayOut = new short[INPUTSIZE * 2];
   4270         out.copyTo(arrayOut);
   4271         for (int i = 0; i < INPUTSIZE; i++) {
   4272             for (int j = 0; j < 2 ; j++) {
   4273                 // Extract the inputs.
   4274                 ArgumentsShortShort args = new ArgumentsShortShort();
   4275                 args.inV = arrayInV[i * 2 + j];
   4276                 // Figure out what the outputs should have been.
   4277                 CoreMathVerifier.computeConvert(args);
   4278                 // Validate the outputs.
   4279                 boolean valid = true;
   4280                 if (args.out != arrayOut[i * 2 + j]) {
   4281                     valid = false;
   4282                 }
   4283                 if (!valid) {
   4284                     StringBuilder message = new StringBuilder();
   4285                     message.append("Input inV: ");
   4286                     message.append(String.format("%d", args.inV));
   4287                     message.append("\n");
   4288                     message.append("Expected output out: ");
   4289                     message.append(String.format("%d", args.out));
   4290                     message.append("\n");
   4291                     message.append("Actual   output out: ");
   4292                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   4293                     if (args.out != arrayOut[i * 2 + j]) {
   4294                         message.append(" FAIL");
   4295                     }
   4296                     message.append("\n");
   4297                     assertTrue("Incorrect output for checkConvertShort2Short2" +
   4298                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4299                 }
   4300             }
   4301         }
   4302     }
   4303 
   4304     private void checkConvertShort3Short3() {
   4305         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x94cc6a9f36ec6e1cl, true, 15);
   4306         try {
   4307             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   4308             script.forEach_testConvertShort3Short3Short3(inV, out);
   4309             verifyResultsConvertShort3Short3(inV, out, false);
   4310         } catch (Exception e) {
   4311             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Short3Short3: " + e.toString());
   4312         }
   4313         try {
   4314             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   4315             scriptRelaxed.forEach_testConvertShort3Short3Short3(inV, out);
   4316             verifyResultsConvertShort3Short3(inV, out, true);
   4317         } catch (Exception e) {
   4318             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Short3Short3: " + e.toString());
   4319         }
   4320     }
   4321 
   4322     private void verifyResultsConvertShort3Short3(Allocation inV, Allocation out, boolean relaxed) {
   4323         short[] arrayInV = new short[INPUTSIZE * 4];
   4324         inV.copyTo(arrayInV);
   4325         short[] arrayOut = new short[INPUTSIZE * 4];
   4326         out.copyTo(arrayOut);
   4327         for (int i = 0; i < INPUTSIZE; i++) {
   4328             for (int j = 0; j < 3 ; j++) {
   4329                 // Extract the inputs.
   4330                 ArgumentsShortShort args = new ArgumentsShortShort();
   4331                 args.inV = arrayInV[i * 4 + j];
   4332                 // Figure out what the outputs should have been.
   4333                 CoreMathVerifier.computeConvert(args);
   4334                 // Validate the outputs.
   4335                 boolean valid = true;
   4336                 if (args.out != arrayOut[i * 4 + j]) {
   4337                     valid = false;
   4338                 }
   4339                 if (!valid) {
   4340                     StringBuilder message = new StringBuilder();
   4341                     message.append("Input inV: ");
   4342                     message.append(String.format("%d", args.inV));
   4343                     message.append("\n");
   4344                     message.append("Expected output out: ");
   4345                     message.append(String.format("%d", args.out));
   4346                     message.append("\n");
   4347                     message.append("Actual   output out: ");
   4348                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4349                     if (args.out != arrayOut[i * 4 + j]) {
   4350                         message.append(" FAIL");
   4351                     }
   4352                     message.append("\n");
   4353                     assertTrue("Incorrect output for checkConvertShort3Short3" +
   4354                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4355                 }
   4356             }
   4357         }
   4358     }
   4359 
   4360     private void checkConvertShort4Short4() {
   4361         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x94ce33ba2d078efal, true, 15);
   4362         try {
   4363             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4364             script.forEach_testConvertShort4Short4Short4(inV, out);
   4365             verifyResultsConvertShort4Short4(inV, out, false);
   4366         } catch (Exception e) {
   4367             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Short4Short4: " + e.toString());
   4368         }
   4369         try {
   4370             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4371             scriptRelaxed.forEach_testConvertShort4Short4Short4(inV, out);
   4372             verifyResultsConvertShort4Short4(inV, out, true);
   4373         } catch (Exception e) {
   4374             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Short4Short4: " + e.toString());
   4375         }
   4376     }
   4377 
   4378     private void verifyResultsConvertShort4Short4(Allocation inV, Allocation out, boolean relaxed) {
   4379         short[] arrayInV = new short[INPUTSIZE * 4];
   4380         inV.copyTo(arrayInV);
   4381         short[] arrayOut = new short[INPUTSIZE * 4];
   4382         out.copyTo(arrayOut);
   4383         for (int i = 0; i < INPUTSIZE; i++) {
   4384             for (int j = 0; j < 4 ; j++) {
   4385                 // Extract the inputs.
   4386                 ArgumentsShortShort args = new ArgumentsShortShort();
   4387                 args.inV = arrayInV[i * 4 + j];
   4388                 // Figure out what the outputs should have been.
   4389                 CoreMathVerifier.computeConvert(args);
   4390                 // Validate the outputs.
   4391                 boolean valid = true;
   4392                 if (args.out != arrayOut[i * 4 + j]) {
   4393                     valid = false;
   4394                 }
   4395                 if (!valid) {
   4396                     StringBuilder message = new StringBuilder();
   4397                     message.append("Input inV: ");
   4398                     message.append(String.format("%d", args.inV));
   4399                     message.append("\n");
   4400                     message.append("Expected output out: ");
   4401                     message.append(String.format("%d", args.out));
   4402                     message.append("\n");
   4403                     message.append("Actual   output out: ");
   4404                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4405                     if (args.out != arrayOut[i * 4 + j]) {
   4406                         message.append(" FAIL");
   4407                     }
   4408                     message.append("\n");
   4409                     assertTrue("Incorrect output for checkConvertShort4Short4" +
   4410                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4411                 }
   4412             }
   4413         }
   4414     }
   4415 
   4416     public class ArgumentsUshortShort {
   4417         public short inV;
   4418         public short out;
   4419     }
   4420 
   4421     private void checkConvertUshort2Short2() {
   4422         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xc36a02cb6e1d9cf7l, false, 15);
   4423         try {
   4424             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   4425             script.forEach_testConvertShort2Ushort2Short2(inV, out);
   4426             verifyResultsConvertUshort2Short2(inV, out, false);
   4427         } catch (Exception e) {
   4428             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Ushort2Short2: " + e.toString());
   4429         }
   4430         try {
   4431             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   4432             scriptRelaxed.forEach_testConvertShort2Ushort2Short2(inV, out);
   4433             verifyResultsConvertUshort2Short2(inV, out, true);
   4434         } catch (Exception e) {
   4435             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Ushort2Short2: " + e.toString());
   4436         }
   4437     }
   4438 
   4439     private void verifyResultsConvertUshort2Short2(Allocation inV, Allocation out, boolean relaxed) {
   4440         short[] arrayInV = new short[INPUTSIZE * 2];
   4441         inV.copyTo(arrayInV);
   4442         short[] arrayOut = new short[INPUTSIZE * 2];
   4443         out.copyTo(arrayOut);
   4444         for (int i = 0; i < INPUTSIZE; i++) {
   4445             for (int j = 0; j < 2 ; j++) {
   4446                 // Extract the inputs.
   4447                 ArgumentsUshortShort args = new ArgumentsUshortShort();
   4448                 args.inV = arrayInV[i * 2 + j];
   4449                 // Figure out what the outputs should have been.
   4450                 CoreMathVerifier.computeConvert(args);
   4451                 // Validate the outputs.
   4452                 boolean valid = true;
   4453                 if (args.out != arrayOut[i * 2 + j]) {
   4454                     valid = false;
   4455                 }
   4456                 if (!valid) {
   4457                     StringBuilder message = new StringBuilder();
   4458                     message.append("Input inV: ");
   4459                     message.append(String.format("0x%x", args.inV));
   4460                     message.append("\n");
   4461                     message.append("Expected output out: ");
   4462                     message.append(String.format("%d", args.out));
   4463                     message.append("\n");
   4464                     message.append("Actual   output out: ");
   4465                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   4466                     if (args.out != arrayOut[i * 2 + j]) {
   4467                         message.append(" FAIL");
   4468                     }
   4469                     message.append("\n");
   4470                     assertTrue("Incorrect output for checkConvertUshort2Short2" +
   4471                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4472                 }
   4473             }
   4474         }
   4475     }
   4476 
   4477     private void checkConvertUshort3Short3() {
   4478         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xc36bcbe66438bdd5l, false, 15);
   4479         try {
   4480             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   4481             script.forEach_testConvertShort3Ushort3Short3(inV, out);
   4482             verifyResultsConvertUshort3Short3(inV, out, false);
   4483         } catch (Exception e) {
   4484             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Ushort3Short3: " + e.toString());
   4485         }
   4486         try {
   4487             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   4488             scriptRelaxed.forEach_testConvertShort3Ushort3Short3(inV, out);
   4489             verifyResultsConvertUshort3Short3(inV, out, true);
   4490         } catch (Exception e) {
   4491             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Ushort3Short3: " + e.toString());
   4492         }
   4493     }
   4494 
   4495     private void verifyResultsConvertUshort3Short3(Allocation inV, Allocation out, boolean relaxed) {
   4496         short[] arrayInV = new short[INPUTSIZE * 4];
   4497         inV.copyTo(arrayInV);
   4498         short[] arrayOut = new short[INPUTSIZE * 4];
   4499         out.copyTo(arrayOut);
   4500         for (int i = 0; i < INPUTSIZE; i++) {
   4501             for (int j = 0; j < 3 ; j++) {
   4502                 // Extract the inputs.
   4503                 ArgumentsUshortShort args = new ArgumentsUshortShort();
   4504                 args.inV = arrayInV[i * 4 + j];
   4505                 // Figure out what the outputs should have been.
   4506                 CoreMathVerifier.computeConvert(args);
   4507                 // Validate the outputs.
   4508                 boolean valid = true;
   4509                 if (args.out != arrayOut[i * 4 + j]) {
   4510                     valid = false;
   4511                 }
   4512                 if (!valid) {
   4513                     StringBuilder message = new StringBuilder();
   4514                     message.append("Input inV: ");
   4515                     message.append(String.format("0x%x", args.inV));
   4516                     message.append("\n");
   4517                     message.append("Expected output out: ");
   4518                     message.append(String.format("%d", args.out));
   4519                     message.append("\n");
   4520                     message.append("Actual   output out: ");
   4521                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4522                     if (args.out != arrayOut[i * 4 + j]) {
   4523                         message.append(" FAIL");
   4524                     }
   4525                     message.append("\n");
   4526                     assertTrue("Incorrect output for checkConvertUshort3Short3" +
   4527                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4528                 }
   4529             }
   4530         }
   4531     }
   4532 
   4533     private void checkConvertUshort4Short4() {
   4534         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xc36d95015a53deb3l, false, 15);
   4535         try {
   4536             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4537             script.forEach_testConvertShort4Ushort4Short4(inV, out);
   4538             verifyResultsConvertUshort4Short4(inV, out, false);
   4539         } catch (Exception e) {
   4540             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Ushort4Short4: " + e.toString());
   4541         }
   4542         try {
   4543             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4544             scriptRelaxed.forEach_testConvertShort4Ushort4Short4(inV, out);
   4545             verifyResultsConvertUshort4Short4(inV, out, true);
   4546         } catch (Exception e) {
   4547             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Ushort4Short4: " + e.toString());
   4548         }
   4549     }
   4550 
   4551     private void verifyResultsConvertUshort4Short4(Allocation inV, Allocation out, boolean relaxed) {
   4552         short[] arrayInV = new short[INPUTSIZE * 4];
   4553         inV.copyTo(arrayInV);
   4554         short[] arrayOut = new short[INPUTSIZE * 4];
   4555         out.copyTo(arrayOut);
   4556         for (int i = 0; i < INPUTSIZE; i++) {
   4557             for (int j = 0; j < 4 ; j++) {
   4558                 // Extract the inputs.
   4559                 ArgumentsUshortShort args = new ArgumentsUshortShort();
   4560                 args.inV = arrayInV[i * 4 + j];
   4561                 // Figure out what the outputs should have been.
   4562                 CoreMathVerifier.computeConvert(args);
   4563                 // Validate the outputs.
   4564                 boolean valid = true;
   4565                 if (args.out != arrayOut[i * 4 + j]) {
   4566                     valid = false;
   4567                 }
   4568                 if (!valid) {
   4569                     StringBuilder message = new StringBuilder();
   4570                     message.append("Input inV: ");
   4571                     message.append(String.format("0x%x", args.inV));
   4572                     message.append("\n");
   4573                     message.append("Expected output out: ");
   4574                     message.append(String.format("%d", args.out));
   4575                     message.append("\n");
   4576                     message.append("Actual   output out: ");
   4577                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4578                     if (args.out != arrayOut[i * 4 + j]) {
   4579                         message.append(" FAIL");
   4580                     }
   4581                     message.append("\n");
   4582                     assertTrue("Incorrect output for checkConvertUshort4Short4" +
   4583                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4584                 }
   4585             }
   4586         }
   4587     }
   4588 
   4589     public class ArgumentsIntShort {
   4590         public int inV;
   4591         public short out;
   4592     }
   4593 
   4594     private void checkConvertInt2Short2() {
   4595         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x2a535120b5b27b91l, true, 15);
   4596         try {
   4597             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   4598             script.forEach_testConvertShort2Int2Short2(inV, out);
   4599             verifyResultsConvertInt2Short2(inV, out, false);
   4600         } catch (Exception e) {
   4601             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Int2Short2: " + e.toString());
   4602         }
   4603         try {
   4604             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   4605             scriptRelaxed.forEach_testConvertShort2Int2Short2(inV, out);
   4606             verifyResultsConvertInt2Short2(inV, out, true);
   4607         } catch (Exception e) {
   4608             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Int2Short2: " + e.toString());
   4609         }
   4610     }
   4611 
   4612     private void verifyResultsConvertInt2Short2(Allocation inV, Allocation out, boolean relaxed) {
   4613         int[] arrayInV = new int[INPUTSIZE * 2];
   4614         inV.copyTo(arrayInV);
   4615         short[] arrayOut = new short[INPUTSIZE * 2];
   4616         out.copyTo(arrayOut);
   4617         for (int i = 0; i < INPUTSIZE; i++) {
   4618             for (int j = 0; j < 2 ; j++) {
   4619                 // Extract the inputs.
   4620                 ArgumentsIntShort args = new ArgumentsIntShort();
   4621                 args.inV = arrayInV[i * 2 + j];
   4622                 // Figure out what the outputs should have been.
   4623                 CoreMathVerifier.computeConvert(args);
   4624                 // Validate the outputs.
   4625                 boolean valid = true;
   4626                 if (args.out != arrayOut[i * 2 + j]) {
   4627                     valid = false;
   4628                 }
   4629                 if (!valid) {
   4630                     StringBuilder message = new StringBuilder();
   4631                     message.append("Input inV: ");
   4632                     message.append(String.format("%d", args.inV));
   4633                     message.append("\n");
   4634                     message.append("Expected output out: ");
   4635                     message.append(String.format("%d", args.out));
   4636                     message.append("\n");
   4637                     message.append("Actual   output out: ");
   4638                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   4639                     if (args.out != arrayOut[i * 2 + j]) {
   4640                         message.append(" FAIL");
   4641                     }
   4642                     message.append("\n");
   4643                     assertTrue("Incorrect output for checkConvertInt2Short2" +
   4644                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4645                 }
   4646             }
   4647         }
   4648     }
   4649 
   4650     private void checkConvertInt3Short3() {
   4651         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x2a551a3babcd9c6fl, true, 15);
   4652         try {
   4653             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   4654             script.forEach_testConvertShort3Int3Short3(inV, out);
   4655             verifyResultsConvertInt3Short3(inV, out, false);
   4656         } catch (Exception e) {
   4657             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Int3Short3: " + e.toString());
   4658         }
   4659         try {
   4660             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   4661             scriptRelaxed.forEach_testConvertShort3Int3Short3(inV, out);
   4662             verifyResultsConvertInt3Short3(inV, out, true);
   4663         } catch (Exception e) {
   4664             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Int3Short3: " + e.toString());
   4665         }
   4666     }
   4667 
   4668     private void verifyResultsConvertInt3Short3(Allocation inV, Allocation out, boolean relaxed) {
   4669         int[] arrayInV = new int[INPUTSIZE * 4];
   4670         inV.copyTo(arrayInV);
   4671         short[] arrayOut = new short[INPUTSIZE * 4];
   4672         out.copyTo(arrayOut);
   4673         for (int i = 0; i < INPUTSIZE; i++) {
   4674             for (int j = 0; j < 3 ; j++) {
   4675                 // Extract the inputs.
   4676                 ArgumentsIntShort args = new ArgumentsIntShort();
   4677                 args.inV = arrayInV[i * 4 + j];
   4678                 // Figure out what the outputs should have been.
   4679                 CoreMathVerifier.computeConvert(args);
   4680                 // Validate the outputs.
   4681                 boolean valid = true;
   4682                 if (args.out != arrayOut[i * 4 + j]) {
   4683                     valid = false;
   4684                 }
   4685                 if (!valid) {
   4686                     StringBuilder message = new StringBuilder();
   4687                     message.append("Input inV: ");
   4688                     message.append(String.format("%d", args.inV));
   4689                     message.append("\n");
   4690                     message.append("Expected output out: ");
   4691                     message.append(String.format("%d", args.out));
   4692                     message.append("\n");
   4693                     message.append("Actual   output out: ");
   4694                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4695                     if (args.out != arrayOut[i * 4 + j]) {
   4696                         message.append(" FAIL");
   4697                     }
   4698                     message.append("\n");
   4699                     assertTrue("Incorrect output for checkConvertInt3Short3" +
   4700                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4701                 }
   4702             }
   4703         }
   4704     }
   4705 
   4706     private void checkConvertInt4Short4() {
   4707         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x2a56e356a1e8bd4dl, true, 15);
   4708         try {
   4709             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4710             script.forEach_testConvertShort4Int4Short4(inV, out);
   4711             verifyResultsConvertInt4Short4(inV, out, false);
   4712         } catch (Exception e) {
   4713             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Int4Short4: " + e.toString());
   4714         }
   4715         try {
   4716             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4717             scriptRelaxed.forEach_testConvertShort4Int4Short4(inV, out);
   4718             verifyResultsConvertInt4Short4(inV, out, true);
   4719         } catch (Exception e) {
   4720             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Int4Short4: " + e.toString());
   4721         }
   4722     }
   4723 
   4724     private void verifyResultsConvertInt4Short4(Allocation inV, Allocation out, boolean relaxed) {
   4725         int[] arrayInV = new int[INPUTSIZE * 4];
   4726         inV.copyTo(arrayInV);
   4727         short[] arrayOut = new short[INPUTSIZE * 4];
   4728         out.copyTo(arrayOut);
   4729         for (int i = 0; i < INPUTSIZE; i++) {
   4730             for (int j = 0; j < 4 ; j++) {
   4731                 // Extract the inputs.
   4732                 ArgumentsIntShort args = new ArgumentsIntShort();
   4733                 args.inV = arrayInV[i * 4 + j];
   4734                 // Figure out what the outputs should have been.
   4735                 CoreMathVerifier.computeConvert(args);
   4736                 // Validate the outputs.
   4737                 boolean valid = true;
   4738                 if (args.out != arrayOut[i * 4 + j]) {
   4739                     valid = false;
   4740                 }
   4741                 if (!valid) {
   4742                     StringBuilder message = new StringBuilder();
   4743                     message.append("Input inV: ");
   4744                     message.append(String.format("%d", args.inV));
   4745                     message.append("\n");
   4746                     message.append("Expected output out: ");
   4747                     message.append(String.format("%d", args.out));
   4748                     message.append("\n");
   4749                     message.append("Actual   output out: ");
   4750                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4751                     if (args.out != arrayOut[i * 4 + j]) {
   4752                         message.append(" FAIL");
   4753                     }
   4754                     message.append("\n");
   4755                     assertTrue("Incorrect output for checkConvertInt4Short4" +
   4756                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4757                 }
   4758             }
   4759         }
   4760     }
   4761 
   4762     public class ArgumentsUintShort {
   4763         public int inV;
   4764         public short out;
   4765     }
   4766 
   4767     private void checkConvertUint2Short2() {
   4768         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xd1e10a6e48348812l, false, 15);
   4769         try {
   4770             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   4771             script.forEach_testConvertShort2Uint2Short2(inV, out);
   4772             verifyResultsConvertUint2Short2(inV, out, false);
   4773         } catch (Exception e) {
   4774             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Uint2Short2: " + e.toString());
   4775         }
   4776         try {
   4777             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   4778             scriptRelaxed.forEach_testConvertShort2Uint2Short2(inV, out);
   4779             verifyResultsConvertUint2Short2(inV, out, true);
   4780         } catch (Exception e) {
   4781             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Uint2Short2: " + e.toString());
   4782         }
   4783     }
   4784 
   4785     private void verifyResultsConvertUint2Short2(Allocation inV, Allocation out, boolean relaxed) {
   4786         int[] arrayInV = new int[INPUTSIZE * 2];
   4787         inV.copyTo(arrayInV);
   4788         short[] arrayOut = new short[INPUTSIZE * 2];
   4789         out.copyTo(arrayOut);
   4790         for (int i = 0; i < INPUTSIZE; i++) {
   4791             for (int j = 0; j < 2 ; j++) {
   4792                 // Extract the inputs.
   4793                 ArgumentsUintShort args = new ArgumentsUintShort();
   4794                 args.inV = arrayInV[i * 2 + j];
   4795                 // Figure out what the outputs should have been.
   4796                 CoreMathVerifier.computeConvert(args);
   4797                 // Validate the outputs.
   4798                 boolean valid = true;
   4799                 if (args.out != arrayOut[i * 2 + j]) {
   4800                     valid = false;
   4801                 }
   4802                 if (!valid) {
   4803                     StringBuilder message = new StringBuilder();
   4804                     message.append("Input inV: ");
   4805                     message.append(String.format("0x%x", args.inV));
   4806                     message.append("\n");
   4807                     message.append("Expected output out: ");
   4808                     message.append(String.format("%d", args.out));
   4809                     message.append("\n");
   4810                     message.append("Actual   output out: ");
   4811                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   4812                     if (args.out != arrayOut[i * 2 + j]) {
   4813                         message.append(" FAIL");
   4814                     }
   4815                     message.append("\n");
   4816                     assertTrue("Incorrect output for checkConvertUint2Short2" +
   4817                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4818                 }
   4819             }
   4820         }
   4821     }
   4822 
   4823     private void checkConvertUint3Short3() {
   4824         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xd1e2d3893e4fa8f0l, false, 15);
   4825         try {
   4826             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   4827             script.forEach_testConvertShort3Uint3Short3(inV, out);
   4828             verifyResultsConvertUint3Short3(inV, out, false);
   4829         } catch (Exception e) {
   4830             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Uint3Short3: " + e.toString());
   4831         }
   4832         try {
   4833             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   4834             scriptRelaxed.forEach_testConvertShort3Uint3Short3(inV, out);
   4835             verifyResultsConvertUint3Short3(inV, out, true);
   4836         } catch (Exception e) {
   4837             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Uint3Short3: " + e.toString());
   4838         }
   4839     }
   4840 
   4841     private void verifyResultsConvertUint3Short3(Allocation inV, Allocation out, boolean relaxed) {
   4842         int[] arrayInV = new int[INPUTSIZE * 4];
   4843         inV.copyTo(arrayInV);
   4844         short[] arrayOut = new short[INPUTSIZE * 4];
   4845         out.copyTo(arrayOut);
   4846         for (int i = 0; i < INPUTSIZE; i++) {
   4847             for (int j = 0; j < 3 ; j++) {
   4848                 // Extract the inputs.
   4849                 ArgumentsUintShort args = new ArgumentsUintShort();
   4850                 args.inV = arrayInV[i * 4 + j];
   4851                 // Figure out what the outputs should have been.
   4852                 CoreMathVerifier.computeConvert(args);
   4853                 // Validate the outputs.
   4854                 boolean valid = true;
   4855                 if (args.out != arrayOut[i * 4 + j]) {
   4856                     valid = false;
   4857                 }
   4858                 if (!valid) {
   4859                     StringBuilder message = new StringBuilder();
   4860                     message.append("Input inV: ");
   4861                     message.append(String.format("0x%x", args.inV));
   4862                     message.append("\n");
   4863                     message.append("Expected output out: ");
   4864                     message.append(String.format("%d", args.out));
   4865                     message.append("\n");
   4866                     message.append("Actual   output out: ");
   4867                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4868                     if (args.out != arrayOut[i * 4 + j]) {
   4869                         message.append(" FAIL");
   4870                     }
   4871                     message.append("\n");
   4872                     assertTrue("Incorrect output for checkConvertUint3Short3" +
   4873                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4874                 }
   4875             }
   4876         }
   4877     }
   4878 
   4879     private void checkConvertUint4Short4() {
   4880         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xd1e49ca4346ac9cel, false, 15);
   4881         try {
   4882             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4883             script.forEach_testConvertShort4Uint4Short4(inV, out);
   4884             verifyResultsConvertUint4Short4(inV, out, false);
   4885         } catch (Exception e) {
   4886             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Uint4Short4: " + e.toString());
   4887         }
   4888         try {
   4889             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   4890             scriptRelaxed.forEach_testConvertShort4Uint4Short4(inV, out);
   4891             verifyResultsConvertUint4Short4(inV, out, true);
   4892         } catch (Exception e) {
   4893             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Uint4Short4: " + e.toString());
   4894         }
   4895     }
   4896 
   4897     private void verifyResultsConvertUint4Short4(Allocation inV, Allocation out, boolean relaxed) {
   4898         int[] arrayInV = new int[INPUTSIZE * 4];
   4899         inV.copyTo(arrayInV);
   4900         short[] arrayOut = new short[INPUTSIZE * 4];
   4901         out.copyTo(arrayOut);
   4902         for (int i = 0; i < INPUTSIZE; i++) {
   4903             for (int j = 0; j < 4 ; j++) {
   4904                 // Extract the inputs.
   4905                 ArgumentsUintShort args = new ArgumentsUintShort();
   4906                 args.inV = arrayInV[i * 4 + j];
   4907                 // Figure out what the outputs should have been.
   4908                 CoreMathVerifier.computeConvert(args);
   4909                 // Validate the outputs.
   4910                 boolean valid = true;
   4911                 if (args.out != arrayOut[i * 4 + j]) {
   4912                     valid = false;
   4913                 }
   4914                 if (!valid) {
   4915                     StringBuilder message = new StringBuilder();
   4916                     message.append("Input inV: ");
   4917                     message.append(String.format("0x%x", args.inV));
   4918                     message.append("\n");
   4919                     message.append("Expected output out: ");
   4920                     message.append(String.format("%d", args.out));
   4921                     message.append("\n");
   4922                     message.append("Actual   output out: ");
   4923                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   4924                     if (args.out != arrayOut[i * 4 + j]) {
   4925                         message.append(" FAIL");
   4926                     }
   4927                     message.append("\n");
   4928                     assertTrue("Incorrect output for checkConvertUint4Short4" +
   4929                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4930                 }
   4931             }
   4932         }
   4933     }
   4934 
   4935     public class ArgumentsFloatUshort {
   4936         public float inV;
   4937         public short out;
   4938     }
   4939 
   4940     private void checkConvertFloat2Ushort2() {
   4941         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x36e4b950b708416fl, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
   4942         try {
   4943             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   4944             script.forEach_testConvertUshort2Float2Ushort2(inV, out);
   4945             verifyResultsConvertFloat2Ushort2(inV, out, false);
   4946         } catch (Exception e) {
   4947             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Float2Ushort2: " + e.toString());
   4948         }
   4949         try {
   4950             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   4951             scriptRelaxed.forEach_testConvertUshort2Float2Ushort2(inV, out);
   4952             verifyResultsConvertFloat2Ushort2(inV, out, true);
   4953         } catch (Exception e) {
   4954             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Float2Ushort2: " + e.toString());
   4955         }
   4956     }
   4957 
   4958     private void verifyResultsConvertFloat2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
   4959         float[] arrayInV = new float[INPUTSIZE * 2];
   4960         inV.copyTo(arrayInV);
   4961         short[] arrayOut = new short[INPUTSIZE * 2];
   4962         out.copyTo(arrayOut);
   4963         for (int i = 0; i < INPUTSIZE; i++) {
   4964             for (int j = 0; j < 2 ; j++) {
   4965                 // Extract the inputs.
   4966                 ArgumentsFloatUshort args = new ArgumentsFloatUshort();
   4967                 args.inV = arrayInV[i * 2 + j];
   4968                 // Figure out what the outputs should have been.
   4969                 CoreMathVerifier.computeConvert(args);
   4970                 // Validate the outputs.
   4971                 boolean valid = true;
   4972                 if (args.out != arrayOut[i * 2 + j]) {
   4973                     valid = false;
   4974                 }
   4975                 if (!valid) {
   4976                     StringBuilder message = new StringBuilder();
   4977                     message.append("Input inV: ");
   4978                     message.append(String.format("%14.8g {%8x} %15a",
   4979                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   4980                     message.append("\n");
   4981                     message.append("Expected output out: ");
   4982                     message.append(String.format("0x%x", args.out));
   4983                     message.append("\n");
   4984                     message.append("Actual   output out: ");
   4985                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   4986                     if (args.out != arrayOut[i * 2 + j]) {
   4987                         message.append(" FAIL");
   4988                     }
   4989                     message.append("\n");
   4990                     assertTrue("Incorrect output for checkConvertFloat2Ushort2" +
   4991                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   4992                 }
   4993             }
   4994         }
   4995     }
   4996 
   4997     private void checkConvertFloat3Ushort3() {
   4998         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x373180d80d63d29bl, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
   4999         try {
   5000             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5001             script.forEach_testConvertUshort3Float3Ushort3(inV, out);
   5002             verifyResultsConvertFloat3Ushort3(inV, out, false);
   5003         } catch (Exception e) {
   5004             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Float3Ushort3: " + e.toString());
   5005         }
   5006         try {
   5007             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5008             scriptRelaxed.forEach_testConvertUshort3Float3Ushort3(inV, out);
   5009             verifyResultsConvertFloat3Ushort3(inV, out, true);
   5010         } catch (Exception e) {
   5011             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Float3Ushort3: " + e.toString());
   5012         }
   5013     }
   5014 
   5015     private void verifyResultsConvertFloat3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
   5016         float[] arrayInV = new float[INPUTSIZE * 4];
   5017         inV.copyTo(arrayInV);
   5018         short[] arrayOut = new short[INPUTSIZE * 4];
   5019         out.copyTo(arrayOut);
   5020         for (int i = 0; i < INPUTSIZE; i++) {
   5021             for (int j = 0; j < 3 ; j++) {
   5022                 // Extract the inputs.
   5023                 ArgumentsFloatUshort args = new ArgumentsFloatUshort();
   5024                 args.inV = arrayInV[i * 4 + j];
   5025                 // Figure out what the outputs should have been.
   5026                 CoreMathVerifier.computeConvert(args);
   5027                 // Validate the outputs.
   5028                 boolean valid = true;
   5029                 if (args.out != arrayOut[i * 4 + j]) {
   5030                     valid = false;
   5031                 }
   5032                 if (!valid) {
   5033                     StringBuilder message = new StringBuilder();
   5034                     message.append("Input inV: ");
   5035                     message.append(String.format("%14.8g {%8x} %15a",
   5036                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   5037                     message.append("\n");
   5038                     message.append("Expected output out: ");
   5039                     message.append(String.format("0x%x", args.out));
   5040                     message.append("\n");
   5041                     message.append("Actual   output out: ");
   5042                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5043                     if (args.out != arrayOut[i * 4 + j]) {
   5044                         message.append(" FAIL");
   5045                     }
   5046                     message.append("\n");
   5047                     assertTrue("Incorrect output for checkConvertFloat3Ushort3" +
   5048                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5049                 }
   5050             }
   5051         }
   5052     }
   5053 
   5054     private void checkConvertFloat4Ushort4() {
   5055         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x377e485f63bf63c7l, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
   5056         try {
   5057             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5058             script.forEach_testConvertUshort4Float4Ushort4(inV, out);
   5059             verifyResultsConvertFloat4Ushort4(inV, out, false);
   5060         } catch (Exception e) {
   5061             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Float4Ushort4: " + e.toString());
   5062         }
   5063         try {
   5064             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5065             scriptRelaxed.forEach_testConvertUshort4Float4Ushort4(inV, out);
   5066             verifyResultsConvertFloat4Ushort4(inV, out, true);
   5067         } catch (Exception e) {
   5068             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Float4Ushort4: " + e.toString());
   5069         }
   5070     }
   5071 
   5072     private void verifyResultsConvertFloat4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
   5073         float[] arrayInV = new float[INPUTSIZE * 4];
   5074         inV.copyTo(arrayInV);
   5075         short[] arrayOut = new short[INPUTSIZE * 4];
   5076         out.copyTo(arrayOut);
   5077         for (int i = 0; i < INPUTSIZE; i++) {
   5078             for (int j = 0; j < 4 ; j++) {
   5079                 // Extract the inputs.
   5080                 ArgumentsFloatUshort args = new ArgumentsFloatUshort();
   5081                 args.inV = arrayInV[i * 4 + j];
   5082                 // Figure out what the outputs should have been.
   5083                 CoreMathVerifier.computeConvert(args);
   5084                 // Validate the outputs.
   5085                 boolean valid = true;
   5086                 if (args.out != arrayOut[i * 4 + j]) {
   5087                     valid = false;
   5088                 }
   5089                 if (!valid) {
   5090                     StringBuilder message = new StringBuilder();
   5091                     message.append("Input inV: ");
   5092                     message.append(String.format("%14.8g {%8x} %15a",
   5093                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   5094                     message.append("\n");
   5095                     message.append("Expected output out: ");
   5096                     message.append(String.format("0x%x", args.out));
   5097                     message.append("\n");
   5098                     message.append("Actual   output out: ");
   5099                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5100                     if (args.out != arrayOut[i * 4 + j]) {
   5101                         message.append(" FAIL");
   5102                     }
   5103                     message.append("\n");
   5104                     assertTrue("Incorrect output for checkConvertFloat4Ushort4" +
   5105                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5106                 }
   5107             }
   5108         }
   5109     }
   5110 
   5111     public class ArgumentsCharUshort {
   5112         public byte inV;
   5113         public short out;
   5114     }
   5115 
   5116     private void checkConvertChar2Ushort2() {
   5117         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd88c0b0ed8f1eeafl, false, 7);
   5118         try {
   5119             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5120             script.forEach_testConvertUshort2Char2Ushort2(inV, out);
   5121             verifyResultsConvertChar2Ushort2(inV, out, false);
   5122         } catch (Exception e) {
   5123             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Char2Ushort2: " + e.toString());
   5124         }
   5125         try {
   5126             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5127             scriptRelaxed.forEach_testConvertUshort2Char2Ushort2(inV, out);
   5128             verifyResultsConvertChar2Ushort2(inV, out, true);
   5129         } catch (Exception e) {
   5130             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Char2Ushort2: " + e.toString());
   5131         }
   5132     }
   5133 
   5134     private void verifyResultsConvertChar2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
   5135         byte[] arrayInV = new byte[INPUTSIZE * 2];
   5136         inV.copyTo(arrayInV);
   5137         short[] arrayOut = new short[INPUTSIZE * 2];
   5138         out.copyTo(arrayOut);
   5139         for (int i = 0; i < INPUTSIZE; i++) {
   5140             for (int j = 0; j < 2 ; j++) {
   5141                 // Extract the inputs.
   5142                 ArgumentsCharUshort args = new ArgumentsCharUshort();
   5143                 args.inV = arrayInV[i * 2 + j];
   5144                 // Figure out what the outputs should have been.
   5145                 CoreMathVerifier.computeConvert(args);
   5146                 // Validate the outputs.
   5147                 boolean valid = true;
   5148                 if (args.out != arrayOut[i * 2 + j]) {
   5149                     valid = false;
   5150                 }
   5151                 if (!valid) {
   5152                     StringBuilder message = new StringBuilder();
   5153                     message.append("Input inV: ");
   5154                     message.append(String.format("%d", args.inV));
   5155                     message.append("\n");
   5156                     message.append("Expected output out: ");
   5157                     message.append(String.format("0x%x", args.out));
   5158                     message.append("\n");
   5159                     message.append("Actual   output out: ");
   5160                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   5161                     if (args.out != arrayOut[i * 2 + j]) {
   5162                         message.append(" FAIL");
   5163                     }
   5164                     message.append("\n");
   5165                     assertTrue("Incorrect output for checkConvertChar2Ushort2" +
   5166                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5167                 }
   5168             }
   5169         }
   5170     }
   5171 
   5172     private void checkConvertChar3Ushort3() {
   5173         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xd8d8d2962f4d7fdbl, false, 7);
   5174         try {
   5175             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5176             script.forEach_testConvertUshort3Char3Ushort3(inV, out);
   5177             verifyResultsConvertChar3Ushort3(inV, out, false);
   5178         } catch (Exception e) {
   5179             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Char3Ushort3: " + e.toString());
   5180         }
   5181         try {
   5182             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5183             scriptRelaxed.forEach_testConvertUshort3Char3Ushort3(inV, out);
   5184             verifyResultsConvertChar3Ushort3(inV, out, true);
   5185         } catch (Exception e) {
   5186             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Char3Ushort3: " + e.toString());
   5187         }
   5188     }
   5189 
   5190     private void verifyResultsConvertChar3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
   5191         byte[] arrayInV = new byte[INPUTSIZE * 4];
   5192         inV.copyTo(arrayInV);
   5193         short[] arrayOut = new short[INPUTSIZE * 4];
   5194         out.copyTo(arrayOut);
   5195         for (int i = 0; i < INPUTSIZE; i++) {
   5196             for (int j = 0; j < 3 ; j++) {
   5197                 // Extract the inputs.
   5198                 ArgumentsCharUshort args = new ArgumentsCharUshort();
   5199                 args.inV = arrayInV[i * 4 + j];
   5200                 // Figure out what the outputs should have been.
   5201                 CoreMathVerifier.computeConvert(args);
   5202                 // Validate the outputs.
   5203                 boolean valid = true;
   5204                 if (args.out != arrayOut[i * 4 + j]) {
   5205                     valid = false;
   5206                 }
   5207                 if (!valid) {
   5208                     StringBuilder message = new StringBuilder();
   5209                     message.append("Input inV: ");
   5210                     message.append(String.format("%d", args.inV));
   5211                     message.append("\n");
   5212                     message.append("Expected output out: ");
   5213                     message.append(String.format("0x%x", args.out));
   5214                     message.append("\n");
   5215                     message.append("Actual   output out: ");
   5216                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5217                     if (args.out != arrayOut[i * 4 + j]) {
   5218                         message.append(" FAIL");
   5219                     }
   5220                     message.append("\n");
   5221                     assertTrue("Incorrect output for checkConvertChar3Ushort3" +
   5222                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5223                 }
   5224             }
   5225         }
   5226     }
   5227 
   5228     private void checkConvertChar4Ushort4() {
   5229         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd9259a1d85a91107l, false, 7);
   5230         try {
   5231             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5232             script.forEach_testConvertUshort4Char4Ushort4(inV, out);
   5233             verifyResultsConvertChar4Ushort4(inV, out, false);
   5234         } catch (Exception e) {
   5235             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Char4Ushort4: " + e.toString());
   5236         }
   5237         try {
   5238             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5239             scriptRelaxed.forEach_testConvertUshort4Char4Ushort4(inV, out);
   5240             verifyResultsConvertChar4Ushort4(inV, out, true);
   5241         } catch (Exception e) {
   5242             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Char4Ushort4: " + e.toString());
   5243         }
   5244     }
   5245 
   5246     private void verifyResultsConvertChar4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
   5247         byte[] arrayInV = new byte[INPUTSIZE * 4];
   5248         inV.copyTo(arrayInV);
   5249         short[] arrayOut = new short[INPUTSIZE * 4];
   5250         out.copyTo(arrayOut);
   5251         for (int i = 0; i < INPUTSIZE; i++) {
   5252             for (int j = 0; j < 4 ; j++) {
   5253                 // Extract the inputs.
   5254                 ArgumentsCharUshort args = new ArgumentsCharUshort();
   5255                 args.inV = arrayInV[i * 4 + j];
   5256                 // Figure out what the outputs should have been.
   5257                 CoreMathVerifier.computeConvert(args);
   5258                 // Validate the outputs.
   5259                 boolean valid = true;
   5260                 if (args.out != arrayOut[i * 4 + j]) {
   5261                     valid = false;
   5262                 }
   5263                 if (!valid) {
   5264                     StringBuilder message = new StringBuilder();
   5265                     message.append("Input inV: ");
   5266                     message.append(String.format("%d", args.inV));
   5267                     message.append("\n");
   5268                     message.append("Expected output out: ");
   5269                     message.append(String.format("0x%x", args.out));
   5270                     message.append("\n");
   5271                     message.append("Actual   output out: ");
   5272                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5273                     if (args.out != arrayOut[i * 4 + j]) {
   5274                         message.append(" FAIL");
   5275                     }
   5276                     message.append("\n");
   5277                     assertTrue("Incorrect output for checkConvertChar4Ushort4" +
   5278                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5279                 }
   5280             }
   5281         }
   5282     }
   5283 
   5284     public class ArgumentsUcharUshort {
   5285         public byte inV;
   5286         public short out;
   5287     }
   5288 
   5289     private void checkConvertUchar2Ushort2() {
   5290         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x72b6c56063e3e68l, false, 8);
   5291         try {
   5292             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5293             script.forEach_testConvertUshort2Uchar2Ushort2(inV, out);
   5294             verifyResultsConvertUchar2Ushort2(inV, out, false);
   5295         } catch (Exception e) {
   5296             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Uchar2Ushort2: " + e.toString());
   5297         }
   5298         try {
   5299             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5300             scriptRelaxed.forEach_testConvertUshort2Uchar2Ushort2(inV, out);
   5301             verifyResultsConvertUchar2Ushort2(inV, out, true);
   5302         } catch (Exception e) {
   5303             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Uchar2Ushort2: " + e.toString());
   5304         }
   5305     }
   5306 
   5307     private void verifyResultsConvertUchar2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
   5308         byte[] arrayInV = new byte[INPUTSIZE * 2];
   5309         inV.copyTo(arrayInV);
   5310         short[] arrayOut = new short[INPUTSIZE * 2];
   5311         out.copyTo(arrayOut);
   5312         for (int i = 0; i < INPUTSIZE; i++) {
   5313             for (int j = 0; j < 2 ; j++) {
   5314                 // Extract the inputs.
   5315                 ArgumentsUcharUshort args = new ArgumentsUcharUshort();
   5316                 args.inV = arrayInV[i * 2 + j];
   5317                 // Figure out what the outputs should have been.
   5318                 CoreMathVerifier.computeConvert(args);
   5319                 // Validate the outputs.
   5320                 boolean valid = true;
   5321                 if (args.out != arrayOut[i * 2 + j]) {
   5322                     valid = false;
   5323                 }
   5324                 if (!valid) {
   5325                     StringBuilder message = new StringBuilder();
   5326                     message.append("Input inV: ");
   5327                     message.append(String.format("0x%x", args.inV));
   5328                     message.append("\n");
   5329                     message.append("Expected output out: ");
   5330                     message.append(String.format("0x%x", args.out));
   5331                     message.append("\n");
   5332                     message.append("Actual   output out: ");
   5333                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   5334                     if (args.out != arrayOut[i * 2 + j]) {
   5335                         message.append(" FAIL");
   5336                     }
   5337                     message.append("\n");
   5338                     assertTrue("Incorrect output for checkConvertUchar2Ushort2" +
   5339                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5340                 }
   5341             }
   5342         }
   5343     }
   5344 
   5345     private void checkConvertUchar3Ushort3() {
   5346         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x77833dd5c99cf94l, false, 8);
   5347         try {
   5348             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5349             script.forEach_testConvertUshort3Uchar3Ushort3(inV, out);
   5350             verifyResultsConvertUchar3Ushort3(inV, out, false);
   5351         } catch (Exception e) {
   5352             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Uchar3Ushort3: " + e.toString());
   5353         }
   5354         try {
   5355             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5356             scriptRelaxed.forEach_testConvertUshort3Uchar3Ushort3(inV, out);
   5357             verifyResultsConvertUchar3Ushort3(inV, out, true);
   5358         } catch (Exception e) {
   5359             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Uchar3Ushort3: " + e.toString());
   5360         }
   5361     }
   5362 
   5363     private void verifyResultsConvertUchar3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
   5364         byte[] arrayInV = new byte[INPUTSIZE * 4];
   5365         inV.copyTo(arrayInV);
   5366         short[] arrayOut = new short[INPUTSIZE * 4];
   5367         out.copyTo(arrayOut);
   5368         for (int i = 0; i < INPUTSIZE; i++) {
   5369             for (int j = 0; j < 3 ; j++) {
   5370                 // Extract the inputs.
   5371                 ArgumentsUcharUshort args = new ArgumentsUcharUshort();
   5372                 args.inV = arrayInV[i * 4 + j];
   5373                 // Figure out what the outputs should have been.
   5374                 CoreMathVerifier.computeConvert(args);
   5375                 // Validate the outputs.
   5376                 boolean valid = true;
   5377                 if (args.out != arrayOut[i * 4 + j]) {
   5378                     valid = false;
   5379                 }
   5380                 if (!valid) {
   5381                     StringBuilder message = new StringBuilder();
   5382                     message.append("Input inV: ");
   5383                     message.append(String.format("0x%x", args.inV));
   5384                     message.append("\n");
   5385                     message.append("Expected output out: ");
   5386                     message.append(String.format("0x%x", args.out));
   5387                     message.append("\n");
   5388                     message.append("Actual   output out: ");
   5389                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5390                     if (args.out != arrayOut[i * 4 + j]) {
   5391                         message.append(" FAIL");
   5392                     }
   5393                     message.append("\n");
   5394                     assertTrue("Incorrect output for checkConvertUchar3Ushort3" +
   5395                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5396                 }
   5397             }
   5398         }
   5399     }
   5400 
   5401     private void checkConvertUchar4Ushort4() {
   5402         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7c4fb64b2f560c0l, false, 8);
   5403         try {
   5404             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5405             script.forEach_testConvertUshort4Uchar4Ushort4(inV, out);
   5406             verifyResultsConvertUchar4Ushort4(inV, out, false);
   5407         } catch (Exception e) {
   5408             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Uchar4Ushort4: " + e.toString());
   5409         }
   5410         try {
   5411             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5412             scriptRelaxed.forEach_testConvertUshort4Uchar4Ushort4(inV, out);
   5413             verifyResultsConvertUchar4Ushort4(inV, out, true);
   5414         } catch (Exception e) {
   5415             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Uchar4Ushort4: " + e.toString());
   5416         }
   5417     }
   5418 
   5419     private void verifyResultsConvertUchar4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
   5420         byte[] arrayInV = new byte[INPUTSIZE * 4];
   5421         inV.copyTo(arrayInV);
   5422         short[] arrayOut = new short[INPUTSIZE * 4];
   5423         out.copyTo(arrayOut);
   5424         for (int i = 0; i < INPUTSIZE; i++) {
   5425             for (int j = 0; j < 4 ; j++) {
   5426                 // Extract the inputs.
   5427                 ArgumentsUcharUshort args = new ArgumentsUcharUshort();
   5428                 args.inV = arrayInV[i * 4 + j];
   5429                 // Figure out what the outputs should have been.
   5430                 CoreMathVerifier.computeConvert(args);
   5431                 // Validate the outputs.
   5432                 boolean valid = true;
   5433                 if (args.out != arrayOut[i * 4 + j]) {
   5434                     valid = false;
   5435                 }
   5436                 if (!valid) {
   5437                     StringBuilder message = new StringBuilder();
   5438                     message.append("Input inV: ");
   5439                     message.append(String.format("0x%x", args.inV));
   5440                     message.append("\n");
   5441                     message.append("Expected output out: ");
   5442                     message.append(String.format("0x%x", args.out));
   5443                     message.append("\n");
   5444                     message.append("Actual   output out: ");
   5445                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5446                     if (args.out != arrayOut[i * 4 + j]) {
   5447                         message.append(" FAIL");
   5448                     }
   5449                     message.append("\n");
   5450                     assertTrue("Incorrect output for checkConvertUchar4Ushort4" +
   5451                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5452                 }
   5453             }
   5454         }
   5455     }
   5456 
   5457     public class ArgumentsShortUshort {
   5458         public short inV;
   5459         public short out;
   5460     }
   5461 
   5462     private void checkConvertShort2Ushort2() {
   5463         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xfe0d269c7264c053l, false, 15);
   5464         try {
   5465             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5466             script.forEach_testConvertUshort2Short2Ushort2(inV, out);
   5467             verifyResultsConvertShort2Ushort2(inV, out, false);
   5468         } catch (Exception e) {
   5469             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Short2Ushort2: " + e.toString());
   5470         }
   5471         try {
   5472             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5473             scriptRelaxed.forEach_testConvertUshort2Short2Ushort2(inV, out);
   5474             verifyResultsConvertShort2Ushort2(inV, out, true);
   5475         } catch (Exception e) {
   5476             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Short2Ushort2: " + e.toString());
   5477         }
   5478     }
   5479 
   5480     private void verifyResultsConvertShort2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
   5481         short[] arrayInV = new short[INPUTSIZE * 2];
   5482         inV.copyTo(arrayInV);
   5483         short[] arrayOut = new short[INPUTSIZE * 2];
   5484         out.copyTo(arrayOut);
   5485         for (int i = 0; i < INPUTSIZE; i++) {
   5486             for (int j = 0; j < 2 ; j++) {
   5487                 // Extract the inputs.
   5488                 ArgumentsShortUshort args = new ArgumentsShortUshort();
   5489                 args.inV = arrayInV[i * 2 + j];
   5490                 // Figure out what the outputs should have been.
   5491                 CoreMathVerifier.computeConvert(args);
   5492                 // Validate the outputs.
   5493                 boolean valid = true;
   5494                 if (args.out != arrayOut[i * 2 + j]) {
   5495                     valid = false;
   5496                 }
   5497                 if (!valid) {
   5498                     StringBuilder message = new StringBuilder();
   5499                     message.append("Input inV: ");
   5500                     message.append(String.format("%d", args.inV));
   5501                     message.append("\n");
   5502                     message.append("Expected output out: ");
   5503                     message.append(String.format("0x%x", args.out));
   5504                     message.append("\n");
   5505                     message.append("Actual   output out: ");
   5506                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   5507                     if (args.out != arrayOut[i * 2 + j]) {
   5508                         message.append(" FAIL");
   5509                     }
   5510                     message.append("\n");
   5511                     assertTrue("Incorrect output for checkConvertShort2Ushort2" +
   5512                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5513                 }
   5514             }
   5515         }
   5516     }
   5517 
   5518     private void checkConvertShort3Ushort3() {
   5519         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xfe59ee23c8c0517fl, false, 15);
   5520         try {
   5521             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5522             script.forEach_testConvertUshort3Short3Ushort3(inV, out);
   5523             verifyResultsConvertShort3Ushort3(inV, out, false);
   5524         } catch (Exception e) {
   5525             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Short3Ushort3: " + e.toString());
   5526         }
   5527         try {
   5528             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5529             scriptRelaxed.forEach_testConvertUshort3Short3Ushort3(inV, out);
   5530             verifyResultsConvertShort3Ushort3(inV, out, true);
   5531         } catch (Exception e) {
   5532             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Short3Ushort3: " + e.toString());
   5533         }
   5534     }
   5535 
   5536     private void verifyResultsConvertShort3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
   5537         short[] arrayInV = new short[INPUTSIZE * 4];
   5538         inV.copyTo(arrayInV);
   5539         short[] arrayOut = new short[INPUTSIZE * 4];
   5540         out.copyTo(arrayOut);
   5541         for (int i = 0; i < INPUTSIZE; i++) {
   5542             for (int j = 0; j < 3 ; j++) {
   5543                 // Extract the inputs.
   5544                 ArgumentsShortUshort args = new ArgumentsShortUshort();
   5545                 args.inV = arrayInV[i * 4 + j];
   5546                 // Figure out what the outputs should have been.
   5547                 CoreMathVerifier.computeConvert(args);
   5548                 // Validate the outputs.
   5549                 boolean valid = true;
   5550                 if (args.out != arrayOut[i * 4 + j]) {
   5551                     valid = false;
   5552                 }
   5553                 if (!valid) {
   5554                     StringBuilder message = new StringBuilder();
   5555                     message.append("Input inV: ");
   5556                     message.append(String.format("%d", args.inV));
   5557                     message.append("\n");
   5558                     message.append("Expected output out: ");
   5559                     message.append(String.format("0x%x", args.out));
   5560                     message.append("\n");
   5561                     message.append("Actual   output out: ");
   5562                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5563                     if (args.out != arrayOut[i * 4 + j]) {
   5564                         message.append(" FAIL");
   5565                     }
   5566                     message.append("\n");
   5567                     assertTrue("Incorrect output for checkConvertShort3Ushort3" +
   5568                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5569                 }
   5570             }
   5571         }
   5572     }
   5573 
   5574     private void checkConvertShort4Ushort4() {
   5575         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xfea6b5ab1f1be2abl, false, 15);
   5576         try {
   5577             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5578             script.forEach_testConvertUshort4Short4Ushort4(inV, out);
   5579             verifyResultsConvertShort4Ushort4(inV, out, false);
   5580         } catch (Exception e) {
   5581             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Short4Ushort4: " + e.toString());
   5582         }
   5583         try {
   5584             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5585             scriptRelaxed.forEach_testConvertUshort4Short4Ushort4(inV, out);
   5586             verifyResultsConvertShort4Ushort4(inV, out, true);
   5587         } catch (Exception e) {
   5588             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Short4Ushort4: " + e.toString());
   5589         }
   5590     }
   5591 
   5592     private void verifyResultsConvertShort4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
   5593         short[] arrayInV = new short[INPUTSIZE * 4];
   5594         inV.copyTo(arrayInV);
   5595         short[] arrayOut = new short[INPUTSIZE * 4];
   5596         out.copyTo(arrayOut);
   5597         for (int i = 0; i < INPUTSIZE; i++) {
   5598             for (int j = 0; j < 4 ; j++) {
   5599                 // Extract the inputs.
   5600                 ArgumentsShortUshort args = new ArgumentsShortUshort();
   5601                 args.inV = arrayInV[i * 4 + j];
   5602                 // Figure out what the outputs should have been.
   5603                 CoreMathVerifier.computeConvert(args);
   5604                 // Validate the outputs.
   5605                 boolean valid = true;
   5606                 if (args.out != arrayOut[i * 4 + j]) {
   5607                     valid = false;
   5608                 }
   5609                 if (!valid) {
   5610                     StringBuilder message = new StringBuilder();
   5611                     message.append("Input inV: ");
   5612                     message.append(String.format("%d", args.inV));
   5613                     message.append("\n");
   5614                     message.append("Expected output out: ");
   5615                     message.append(String.format("0x%x", args.out));
   5616                     message.append("\n");
   5617                     message.append("Actual   output out: ");
   5618                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5619                     if (args.out != arrayOut[i * 4 + j]) {
   5620                         message.append(" FAIL");
   5621                     }
   5622                     message.append("\n");
   5623                     assertTrue("Incorrect output for checkConvertShort4Ushort4" +
   5624                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5625                 }
   5626             }
   5627         }
   5628     }
   5629 
   5630     public class ArgumentsUshortUshort {
   5631         public short inV;
   5632         public short out;
   5633     }
   5634 
   5635     private void checkConvertUshort2Ushort2() {
   5636         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xd2d27d910e362466l, false, 16);
   5637         try {
   5638             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5639             script.forEach_testConvertUshort2Ushort2Ushort2(inV, out);
   5640             verifyResultsConvertUshort2Ushort2(inV, out, false);
   5641         } catch (Exception e) {
   5642             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Ushort2Ushort2: " + e.toString());
   5643         }
   5644         try {
   5645             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5646             scriptRelaxed.forEach_testConvertUshort2Ushort2Ushort2(inV, out);
   5647             verifyResultsConvertUshort2Ushort2(inV, out, true);
   5648         } catch (Exception e) {
   5649             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Ushort2Ushort2: " + e.toString());
   5650         }
   5651     }
   5652 
   5653     private void verifyResultsConvertUshort2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
   5654         short[] arrayInV = new short[INPUTSIZE * 2];
   5655         inV.copyTo(arrayInV);
   5656         short[] arrayOut = new short[INPUTSIZE * 2];
   5657         out.copyTo(arrayOut);
   5658         for (int i = 0; i < INPUTSIZE; i++) {
   5659             for (int j = 0; j < 2 ; j++) {
   5660                 // Extract the inputs.
   5661                 ArgumentsUshortUshort args = new ArgumentsUshortUshort();
   5662                 args.inV = arrayInV[i * 2 + j];
   5663                 // Figure out what the outputs should have been.
   5664                 CoreMathVerifier.computeConvert(args);
   5665                 // Validate the outputs.
   5666                 boolean valid = true;
   5667                 if (args.out != arrayOut[i * 2 + j]) {
   5668                     valid = false;
   5669                 }
   5670                 if (!valid) {
   5671                     StringBuilder message = new StringBuilder();
   5672                     message.append("Input inV: ");
   5673                     message.append(String.format("0x%x", args.inV));
   5674                     message.append("\n");
   5675                     message.append("Expected output out: ");
   5676                     message.append(String.format("0x%x", args.out));
   5677                     message.append("\n");
   5678                     message.append("Actual   output out: ");
   5679                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   5680                     if (args.out != arrayOut[i * 2 + j]) {
   5681                         message.append(" FAIL");
   5682                     }
   5683                     message.append("\n");
   5684                     assertTrue("Incorrect output for checkConvertUshort2Ushort2" +
   5685                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5686                 }
   5687             }
   5688         }
   5689     }
   5690 
   5691     private void checkConvertUshort3Ushort3() {
   5692         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xd31f45186491b592l, false, 16);
   5693         try {
   5694             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5695             script.forEach_testConvertUshort3Ushort3Ushort3(inV, out);
   5696             verifyResultsConvertUshort3Ushort3(inV, out, false);
   5697         } catch (Exception e) {
   5698             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Ushort3Ushort3: " + e.toString());
   5699         }
   5700         try {
   5701             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5702             scriptRelaxed.forEach_testConvertUshort3Ushort3Ushort3(inV, out);
   5703             verifyResultsConvertUshort3Ushort3(inV, out, true);
   5704         } catch (Exception e) {
   5705             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Ushort3Ushort3: " + e.toString());
   5706         }
   5707     }
   5708 
   5709     private void verifyResultsConvertUshort3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
   5710         short[] arrayInV = new short[INPUTSIZE * 4];
   5711         inV.copyTo(arrayInV);
   5712         short[] arrayOut = new short[INPUTSIZE * 4];
   5713         out.copyTo(arrayOut);
   5714         for (int i = 0; i < INPUTSIZE; i++) {
   5715             for (int j = 0; j < 3 ; j++) {
   5716                 // Extract the inputs.
   5717                 ArgumentsUshortUshort args = new ArgumentsUshortUshort();
   5718                 args.inV = arrayInV[i * 4 + j];
   5719                 // Figure out what the outputs should have been.
   5720                 CoreMathVerifier.computeConvert(args);
   5721                 // Validate the outputs.
   5722                 boolean valid = true;
   5723                 if (args.out != arrayOut[i * 4 + j]) {
   5724                     valid = false;
   5725                 }
   5726                 if (!valid) {
   5727                     StringBuilder message = new StringBuilder();
   5728                     message.append("Input inV: ");
   5729                     message.append(String.format("0x%x", args.inV));
   5730                     message.append("\n");
   5731                     message.append("Expected output out: ");
   5732                     message.append(String.format("0x%x", args.out));
   5733                     message.append("\n");
   5734                     message.append("Actual   output out: ");
   5735                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5736                     if (args.out != arrayOut[i * 4 + j]) {
   5737                         message.append(" FAIL");
   5738                     }
   5739                     message.append("\n");
   5740                     assertTrue("Incorrect output for checkConvertUshort3Ushort3" +
   5741                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5742                 }
   5743             }
   5744         }
   5745     }
   5746 
   5747     private void checkConvertUshort4Ushort4() {
   5748         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xd36c0c9fbaed46bel, false, 16);
   5749         try {
   5750             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5751             script.forEach_testConvertUshort4Ushort4Ushort4(inV, out);
   5752             verifyResultsConvertUshort4Ushort4(inV, out, false);
   5753         } catch (Exception e) {
   5754             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Ushort4Ushort4: " + e.toString());
   5755         }
   5756         try {
   5757             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5758             scriptRelaxed.forEach_testConvertUshort4Ushort4Ushort4(inV, out);
   5759             verifyResultsConvertUshort4Ushort4(inV, out, true);
   5760         } catch (Exception e) {
   5761             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Ushort4Ushort4: " + e.toString());
   5762         }
   5763     }
   5764 
   5765     private void verifyResultsConvertUshort4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
   5766         short[] arrayInV = new short[INPUTSIZE * 4];
   5767         inV.copyTo(arrayInV);
   5768         short[] arrayOut = new short[INPUTSIZE * 4];
   5769         out.copyTo(arrayOut);
   5770         for (int i = 0; i < INPUTSIZE; i++) {
   5771             for (int j = 0; j < 4 ; j++) {
   5772                 // Extract the inputs.
   5773                 ArgumentsUshortUshort args = new ArgumentsUshortUshort();
   5774                 args.inV = arrayInV[i * 4 + j];
   5775                 // Figure out what the outputs should have been.
   5776                 CoreMathVerifier.computeConvert(args);
   5777                 // Validate the outputs.
   5778                 boolean valid = true;
   5779                 if (args.out != arrayOut[i * 4 + j]) {
   5780                     valid = false;
   5781                 }
   5782                 if (!valid) {
   5783                     StringBuilder message = new StringBuilder();
   5784                     message.append("Input inV: ");
   5785                     message.append(String.format("0x%x", args.inV));
   5786                     message.append("\n");
   5787                     message.append("Expected output out: ");
   5788                     message.append(String.format("0x%x", args.out));
   5789                     message.append("\n");
   5790                     message.append("Actual   output out: ");
   5791                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5792                     if (args.out != arrayOut[i * 4 + j]) {
   5793                         message.append(" FAIL");
   5794                     }
   5795                     message.append("\n");
   5796                     assertTrue("Incorrect output for checkConvertUshort4Ushort4" +
   5797                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5798                 }
   5799             }
   5800         }
   5801     }
   5802 
   5803     public class ArgumentsIntUshort {
   5804         public int inV;
   5805         public short out;
   5806     }
   5807 
   5808     private void checkConvertInt2Ushort2() {
   5809         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x1c02a5e414378844l, false, 16);
   5810         try {
   5811             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5812             script.forEach_testConvertUshort2Int2Ushort2(inV, out);
   5813             verifyResultsConvertInt2Ushort2(inV, out, false);
   5814         } catch (Exception e) {
   5815             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Int2Ushort2: " + e.toString());
   5816         }
   5817         try {
   5818             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5819             scriptRelaxed.forEach_testConvertUshort2Int2Ushort2(inV, out);
   5820             verifyResultsConvertInt2Ushort2(inV, out, true);
   5821         } catch (Exception e) {
   5822             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Int2Ushort2: " + e.toString());
   5823         }
   5824     }
   5825 
   5826     private void verifyResultsConvertInt2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
   5827         int[] arrayInV = new int[INPUTSIZE * 2];
   5828         inV.copyTo(arrayInV);
   5829         short[] arrayOut = new short[INPUTSIZE * 2];
   5830         out.copyTo(arrayOut);
   5831         for (int i = 0; i < INPUTSIZE; i++) {
   5832             for (int j = 0; j < 2 ; j++) {
   5833                 // Extract the inputs.
   5834                 ArgumentsIntUshort args = new ArgumentsIntUshort();
   5835                 args.inV = arrayInV[i * 2 + j];
   5836                 // Figure out what the outputs should have been.
   5837                 CoreMathVerifier.computeConvert(args);
   5838                 // Validate the outputs.
   5839                 boolean valid = true;
   5840                 if (args.out != arrayOut[i * 2 + j]) {
   5841                     valid = false;
   5842                 }
   5843                 if (!valid) {
   5844                     StringBuilder message = new StringBuilder();
   5845                     message.append("Input inV: ");
   5846                     message.append(String.format("%d", args.inV));
   5847                     message.append("\n");
   5848                     message.append("Expected output out: ");
   5849                     message.append(String.format("0x%x", args.out));
   5850                     message.append("\n");
   5851                     message.append("Actual   output out: ");
   5852                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   5853                     if (args.out != arrayOut[i * 2 + j]) {
   5854                         message.append(" FAIL");
   5855                     }
   5856                     message.append("\n");
   5857                     assertTrue("Incorrect output for checkConvertInt2Ushort2" +
   5858                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5859                 }
   5860             }
   5861         }
   5862     }
   5863 
   5864     private void checkConvertInt3Ushort3() {
   5865         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x1c4f6d6b6a931970l, false, 16);
   5866         try {
   5867             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5868             script.forEach_testConvertUshort3Int3Ushort3(inV, out);
   5869             verifyResultsConvertInt3Ushort3(inV, out, false);
   5870         } catch (Exception e) {
   5871             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Int3Ushort3: " + e.toString());
   5872         }
   5873         try {
   5874             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   5875             scriptRelaxed.forEach_testConvertUshort3Int3Ushort3(inV, out);
   5876             verifyResultsConvertInt3Ushort3(inV, out, true);
   5877         } catch (Exception e) {
   5878             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Int3Ushort3: " + e.toString());
   5879         }
   5880     }
   5881 
   5882     private void verifyResultsConvertInt3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
   5883         int[] arrayInV = new int[INPUTSIZE * 4];
   5884         inV.copyTo(arrayInV);
   5885         short[] arrayOut = new short[INPUTSIZE * 4];
   5886         out.copyTo(arrayOut);
   5887         for (int i = 0; i < INPUTSIZE; i++) {
   5888             for (int j = 0; j < 3 ; j++) {
   5889                 // Extract the inputs.
   5890                 ArgumentsIntUshort args = new ArgumentsIntUshort();
   5891                 args.inV = arrayInV[i * 4 + j];
   5892                 // Figure out what the outputs should have been.
   5893                 CoreMathVerifier.computeConvert(args);
   5894                 // Validate the outputs.
   5895                 boolean valid = true;
   5896                 if (args.out != arrayOut[i * 4 + j]) {
   5897                     valid = false;
   5898                 }
   5899                 if (!valid) {
   5900                     StringBuilder message = new StringBuilder();
   5901                     message.append("Input inV: ");
   5902                     message.append(String.format("%d", args.inV));
   5903                     message.append("\n");
   5904                     message.append("Expected output out: ");
   5905                     message.append(String.format("0x%x", args.out));
   5906                     message.append("\n");
   5907                     message.append("Actual   output out: ");
   5908                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5909                     if (args.out != arrayOut[i * 4 + j]) {
   5910                         message.append(" FAIL");
   5911                     }
   5912                     message.append("\n");
   5913                     assertTrue("Incorrect output for checkConvertInt3Ushort3" +
   5914                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5915                 }
   5916             }
   5917         }
   5918     }
   5919 
   5920     private void checkConvertInt4Ushort4() {
   5921         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x1c9c34f2c0eeaa9cl, false, 16);
   5922         try {
   5923             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5924             script.forEach_testConvertUshort4Int4Ushort4(inV, out);
   5925             verifyResultsConvertInt4Ushort4(inV, out, false);
   5926         } catch (Exception e) {
   5927             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Int4Ushort4: " + e.toString());
   5928         }
   5929         try {
   5930             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   5931             scriptRelaxed.forEach_testConvertUshort4Int4Ushort4(inV, out);
   5932             verifyResultsConvertInt4Ushort4(inV, out, true);
   5933         } catch (Exception e) {
   5934             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Int4Ushort4: " + e.toString());
   5935         }
   5936     }
   5937 
   5938     private void verifyResultsConvertInt4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
   5939         int[] arrayInV = new int[INPUTSIZE * 4];
   5940         inV.copyTo(arrayInV);
   5941         short[] arrayOut = new short[INPUTSIZE * 4];
   5942         out.copyTo(arrayOut);
   5943         for (int i = 0; i < INPUTSIZE; i++) {
   5944             for (int j = 0; j < 4 ; j++) {
   5945                 // Extract the inputs.
   5946                 ArgumentsIntUshort args = new ArgumentsIntUshort();
   5947                 args.inV = arrayInV[i * 4 + j];
   5948                 // Figure out what the outputs should have been.
   5949                 CoreMathVerifier.computeConvert(args);
   5950                 // Validate the outputs.
   5951                 boolean valid = true;
   5952                 if (args.out != arrayOut[i * 4 + j]) {
   5953                     valid = false;
   5954                 }
   5955                 if (!valid) {
   5956                     StringBuilder message = new StringBuilder();
   5957                     message.append("Input inV: ");
   5958                     message.append(String.format("%d", args.inV));
   5959                     message.append("\n");
   5960                     message.append("Expected output out: ");
   5961                     message.append(String.format("0x%x", args.out));
   5962                     message.append("\n");
   5963                     message.append("Actual   output out: ");
   5964                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   5965                     if (args.out != arrayOut[i * 4 + j]) {
   5966                         message.append(" FAIL");
   5967                     }
   5968                     message.append("\n");
   5969                     assertTrue("Incorrect output for checkConvertInt4Ushort4" +
   5970                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   5971                 }
   5972             }
   5973         }
   5974     }
   5975 
   5976     public class ArgumentsUintUshort {
   5977         public int inV;
   5978         public short out;
   5979     }
   5980 
   5981     private void checkConvertUint2Ushort2() {
   5982         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x40d0c5ebb00fa1efl, false, 16);
   5983         try {
   5984             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5985             script.forEach_testConvertUshort2Uint2Ushort2(inV, out);
   5986             verifyResultsConvertUint2Ushort2(inV, out, false);
   5987         } catch (Exception e) {
   5988             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Uint2Ushort2: " + e.toString());
   5989         }
   5990         try {
   5991             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   5992             scriptRelaxed.forEach_testConvertUshort2Uint2Ushort2(inV, out);
   5993             verifyResultsConvertUint2Ushort2(inV, out, true);
   5994         } catch (Exception e) {
   5995             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Uint2Ushort2: " + e.toString());
   5996         }
   5997     }
   5998 
   5999     private void verifyResultsConvertUint2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
   6000         int[] arrayInV = new int[INPUTSIZE * 2];
   6001         inV.copyTo(arrayInV);
   6002         short[] arrayOut = new short[INPUTSIZE * 2];
   6003         out.copyTo(arrayOut);
   6004         for (int i = 0; i < INPUTSIZE; i++) {
   6005             for (int j = 0; j < 2 ; j++) {
   6006                 // Extract the inputs.
   6007                 ArgumentsUintUshort args = new ArgumentsUintUshort();
   6008                 args.inV = arrayInV[i * 2 + j];
   6009                 // Figure out what the outputs should have been.
   6010                 CoreMathVerifier.computeConvert(args);
   6011                 // Validate the outputs.
   6012                 boolean valid = true;
   6013                 if (args.out != arrayOut[i * 2 + j]) {
   6014                     valid = false;
   6015                 }
   6016                 if (!valid) {
   6017                     StringBuilder message = new StringBuilder();
   6018                     message.append("Input inV: ");
   6019                     message.append(String.format("0x%x", args.inV));
   6020                     message.append("\n");
   6021                     message.append("Expected output out: ");
   6022                     message.append(String.format("0x%x", args.out));
   6023                     message.append("\n");
   6024                     message.append("Actual   output out: ");
   6025                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   6026                     if (args.out != arrayOut[i * 2 + j]) {
   6027                         message.append(" FAIL");
   6028                     }
   6029                     message.append("\n");
   6030                     assertTrue("Incorrect output for checkConvertUint2Ushort2" +
   6031                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6032                 }
   6033             }
   6034         }
   6035     }
   6036 
   6037     private void checkConvertUint3Ushort3() {
   6038         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x411d8d73066b331bl, false, 16);
   6039         try {
   6040             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   6041             script.forEach_testConvertUshort3Uint3Ushort3(inV, out);
   6042             verifyResultsConvertUint3Ushort3(inV, out, false);
   6043         } catch (Exception e) {
   6044             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Uint3Ushort3: " + e.toString());
   6045         }
   6046         try {
   6047             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   6048             scriptRelaxed.forEach_testConvertUshort3Uint3Ushort3(inV, out);
   6049             verifyResultsConvertUint3Ushort3(inV, out, true);
   6050         } catch (Exception e) {
   6051             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Uint3Ushort3: " + e.toString());
   6052         }
   6053     }
   6054 
   6055     private void verifyResultsConvertUint3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
   6056         int[] arrayInV = new int[INPUTSIZE * 4];
   6057         inV.copyTo(arrayInV);
   6058         short[] arrayOut = new short[INPUTSIZE * 4];
   6059         out.copyTo(arrayOut);
   6060         for (int i = 0; i < INPUTSIZE; i++) {
   6061             for (int j = 0; j < 3 ; j++) {
   6062                 // Extract the inputs.
   6063                 ArgumentsUintUshort args = new ArgumentsUintUshort();
   6064                 args.inV = arrayInV[i * 4 + j];
   6065                 // Figure out what the outputs should have been.
   6066                 CoreMathVerifier.computeConvert(args);
   6067                 // Validate the outputs.
   6068                 boolean valid = true;
   6069                 if (args.out != arrayOut[i * 4 + j]) {
   6070                     valid = false;
   6071                 }
   6072                 if (!valid) {
   6073                     StringBuilder message = new StringBuilder();
   6074                     message.append("Input inV: ");
   6075                     message.append(String.format("0x%x", args.inV));
   6076                     message.append("\n");
   6077                     message.append("Expected output out: ");
   6078                     message.append(String.format("0x%x", args.out));
   6079                     message.append("\n");
   6080                     message.append("Actual   output out: ");
   6081                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   6082                     if (args.out != arrayOut[i * 4 + j]) {
   6083                         message.append(" FAIL");
   6084                     }
   6085                     message.append("\n");
   6086                     assertTrue("Incorrect output for checkConvertUint3Ushort3" +
   6087                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6088                 }
   6089             }
   6090         }
   6091     }
   6092 
   6093     private void checkConvertUint4Ushort4() {
   6094         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x416a54fa5cc6c447l, false, 16);
   6095         try {
   6096             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   6097             script.forEach_testConvertUshort4Uint4Ushort4(inV, out);
   6098             verifyResultsConvertUint4Ushort4(inV, out, false);
   6099         } catch (Exception e) {
   6100             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Uint4Ushort4: " + e.toString());
   6101         }
   6102         try {
   6103             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   6104             scriptRelaxed.forEach_testConvertUshort4Uint4Ushort4(inV, out);
   6105             verifyResultsConvertUint4Ushort4(inV, out, true);
   6106         } catch (Exception e) {
   6107             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Uint4Ushort4: " + e.toString());
   6108         }
   6109     }
   6110 
   6111     private void verifyResultsConvertUint4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
   6112         int[] arrayInV = new int[INPUTSIZE * 4];
   6113         inV.copyTo(arrayInV);
   6114         short[] arrayOut = new short[INPUTSIZE * 4];
   6115         out.copyTo(arrayOut);
   6116         for (int i = 0; i < INPUTSIZE; i++) {
   6117             for (int j = 0; j < 4 ; j++) {
   6118                 // Extract the inputs.
   6119                 ArgumentsUintUshort args = new ArgumentsUintUshort();
   6120                 args.inV = arrayInV[i * 4 + j];
   6121                 // Figure out what the outputs should have been.
   6122                 CoreMathVerifier.computeConvert(args);
   6123                 // Validate the outputs.
   6124                 boolean valid = true;
   6125                 if (args.out != arrayOut[i * 4 + j]) {
   6126                     valid = false;
   6127                 }
   6128                 if (!valid) {
   6129                     StringBuilder message = new StringBuilder();
   6130                     message.append("Input inV: ");
   6131                     message.append(String.format("0x%x", args.inV));
   6132                     message.append("\n");
   6133                     message.append("Expected output out: ");
   6134                     message.append(String.format("0x%x", args.out));
   6135                     message.append("\n");
   6136                     message.append("Actual   output out: ");
   6137                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   6138                     if (args.out != arrayOut[i * 4 + j]) {
   6139                         message.append(" FAIL");
   6140                     }
   6141                     message.append("\n");
   6142                     assertTrue("Incorrect output for checkConvertUint4Ushort4" +
   6143                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6144                 }
   6145             }
   6146         }
   6147     }
   6148 
   6149     public class ArgumentsFloatInt {
   6150         public float inV;
   6151         public int out;
   6152     }
   6153 
   6154     private void checkConvertFloat2Int2() {
   6155         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8fb63fb7c069dd5dl, -2.1474835210000000000e+09, 2.1474835200000000000e+09);
   6156         try {
   6157             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   6158             script.forEach_testConvertInt2Float2Int2(inV, out);
   6159             verifyResultsConvertFloat2Int2(inV, out, false);
   6160         } catch (Exception e) {
   6161             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Float2Int2: " + e.toString());
   6162         }
   6163         try {
   6164             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   6165             scriptRelaxed.forEach_testConvertInt2Float2Int2(inV, out);
   6166             verifyResultsConvertFloat2Int2(inV, out, true);
   6167         } catch (Exception e) {
   6168             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Float2Int2: " + e.toString());
   6169         }
   6170     }
   6171 
   6172     private void verifyResultsConvertFloat2Int2(Allocation inV, Allocation out, boolean relaxed) {
   6173         float[] arrayInV = new float[INPUTSIZE * 2];
   6174         inV.copyTo(arrayInV);
   6175         int[] arrayOut = new int[INPUTSIZE * 2];
   6176         out.copyTo(arrayOut);
   6177         for (int i = 0; i < INPUTSIZE; i++) {
   6178             for (int j = 0; j < 2 ; j++) {
   6179                 // Extract the inputs.
   6180                 ArgumentsFloatInt args = new ArgumentsFloatInt();
   6181                 args.inV = arrayInV[i * 2 + j];
   6182                 // Figure out what the outputs should have been.
   6183                 CoreMathVerifier.computeConvert(args);
   6184                 // Validate the outputs.
   6185                 boolean valid = true;
   6186                 if (args.out != arrayOut[i * 2 + j]) {
   6187                     valid = false;
   6188                 }
   6189                 if (!valid) {
   6190                     StringBuilder message = new StringBuilder();
   6191                     message.append("Input inV: ");
   6192                     message.append(String.format("%14.8g {%8x} %15a",
   6193                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   6194                     message.append("\n");
   6195                     message.append("Expected output out: ");
   6196                     message.append(String.format("%d", args.out));
   6197                     message.append("\n");
   6198                     message.append("Actual   output out: ");
   6199                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   6200                     if (args.out != arrayOut[i * 2 + j]) {
   6201                         message.append(" FAIL");
   6202                     }
   6203                     message.append("\n");
   6204                     assertTrue("Incorrect output for checkConvertFloat2Int2" +
   6205                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6206                 }
   6207             }
   6208         }
   6209     }
   6210 
   6211     private void checkConvertFloat3Int3() {
   6212         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8fb63ff70a11ed93l, -2.1474835210000000000e+09, 2.1474835200000000000e+09);
   6213         try {
   6214             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   6215             script.forEach_testConvertInt3Float3Int3(inV, out);
   6216             verifyResultsConvertFloat3Int3(inV, out, false);
   6217         } catch (Exception e) {
   6218             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Float3Int3: " + e.toString());
   6219         }
   6220         try {
   6221             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   6222             scriptRelaxed.forEach_testConvertInt3Float3Int3(inV, out);
   6223             verifyResultsConvertFloat3Int3(inV, out, true);
   6224         } catch (Exception e) {
   6225             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Float3Int3: " + e.toString());
   6226         }
   6227     }
   6228 
   6229     private void verifyResultsConvertFloat3Int3(Allocation inV, Allocation out, boolean relaxed) {
   6230         float[] arrayInV = new float[INPUTSIZE * 4];
   6231         inV.copyTo(arrayInV);
   6232         int[] arrayOut = new int[INPUTSIZE * 4];
   6233         out.copyTo(arrayOut);
   6234         for (int i = 0; i < INPUTSIZE; i++) {
   6235             for (int j = 0; j < 3 ; j++) {
   6236                 // Extract the inputs.
   6237                 ArgumentsFloatInt args = new ArgumentsFloatInt();
   6238                 args.inV = arrayInV[i * 4 + j];
   6239                 // Figure out what the outputs should have been.
   6240                 CoreMathVerifier.computeConvert(args);
   6241                 // Validate the outputs.
   6242                 boolean valid = true;
   6243                 if (args.out != arrayOut[i * 4 + j]) {
   6244                     valid = false;
   6245                 }
   6246                 if (!valid) {
   6247                     StringBuilder message = new StringBuilder();
   6248                     message.append("Input inV: ");
   6249                     message.append(String.format("%14.8g {%8x} %15a",
   6250                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   6251                     message.append("\n");
   6252                     message.append("Expected output out: ");
   6253                     message.append(String.format("%d", args.out));
   6254                     message.append("\n");
   6255                     message.append("Actual   output out: ");
   6256                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   6257                     if (args.out != arrayOut[i * 4 + j]) {
   6258                         message.append(" FAIL");
   6259                     }
   6260                     message.append("\n");
   6261                     assertTrue("Incorrect output for checkConvertFloat3Int3" +
   6262                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6263                 }
   6264             }
   6265         }
   6266     }
   6267 
   6268     private void checkConvertFloat4Int4() {
   6269         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8fb6403653b9fdc9l, -2.1474835210000000000e+09, 2.1474835200000000000e+09);
   6270         try {
   6271             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   6272             script.forEach_testConvertInt4Float4Int4(inV, out);
   6273             verifyResultsConvertFloat4Int4(inV, out, false);
   6274         } catch (Exception e) {
   6275             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Float4Int4: " + e.toString());
   6276         }
   6277         try {
   6278             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   6279             scriptRelaxed.forEach_testConvertInt4Float4Int4(inV, out);
   6280             verifyResultsConvertFloat4Int4(inV, out, true);
   6281         } catch (Exception e) {
   6282             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Float4Int4: " + e.toString());
   6283         }
   6284     }
   6285 
   6286     private void verifyResultsConvertFloat4Int4(Allocation inV, Allocation out, boolean relaxed) {
   6287         float[] arrayInV = new float[INPUTSIZE * 4];
   6288         inV.copyTo(arrayInV);
   6289         int[] arrayOut = new int[INPUTSIZE * 4];
   6290         out.copyTo(arrayOut);
   6291         for (int i = 0; i < INPUTSIZE; i++) {
   6292             for (int j = 0; j < 4 ; j++) {
   6293                 // Extract the inputs.
   6294                 ArgumentsFloatInt args = new ArgumentsFloatInt();
   6295                 args.inV = arrayInV[i * 4 + j];
   6296                 // Figure out what the outputs should have been.
   6297                 CoreMathVerifier.computeConvert(args);
   6298                 // Validate the outputs.
   6299                 boolean valid = true;
   6300                 if (args.out != arrayOut[i * 4 + j]) {
   6301                     valid = false;
   6302                 }
   6303                 if (!valid) {
   6304                     StringBuilder message = new StringBuilder();
   6305                     message.append("Input inV: ");
   6306                     message.append(String.format("%14.8g {%8x} %15a",
   6307                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   6308                     message.append("\n");
   6309                     message.append("Expected output out: ");
   6310                     message.append(String.format("%d", args.out));
   6311                     message.append("\n");
   6312                     message.append("Actual   output out: ");
   6313                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   6314                     if (args.out != arrayOut[i * 4 + j]) {
   6315                         message.append(" FAIL");
   6316                     }
   6317                     message.append("\n");
   6318                     assertTrue("Incorrect output for checkConvertFloat4Int4" +
   6319                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6320                 }
   6321             }
   6322         }
   6323     }
   6324 
   6325     public class ArgumentsCharInt {
   6326         public byte inV;
   6327         public int out;
   6328     }
   6329 
   6330     private void checkConvertChar2Int2() {
   6331         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x880244ac94c6831dl, true, 7);
   6332         try {
   6333             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   6334             script.forEach_testConvertInt2Char2Int2(inV, out);
   6335             verifyResultsConvertChar2Int2(inV, out, false);
   6336         } catch (Exception e) {
   6337             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Char2Int2: " + e.toString());
   6338         }
   6339         try {
   6340             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   6341             scriptRelaxed.forEach_testConvertInt2Char2Int2(inV, out);
   6342             verifyResultsConvertChar2Int2(inV, out, true);
   6343         } catch (Exception e) {
   6344             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Char2Int2: " + e.toString());
   6345         }
   6346     }
   6347 
   6348     private void verifyResultsConvertChar2Int2(Allocation inV, Allocation out, boolean relaxed) {
   6349         byte[] arrayInV = new byte[INPUTSIZE * 2];
   6350         inV.copyTo(arrayInV);
   6351         int[] arrayOut = new int[INPUTSIZE * 2];
   6352         out.copyTo(arrayOut);
   6353         for (int i = 0; i < INPUTSIZE; i++) {
   6354             for (int j = 0; j < 2 ; j++) {
   6355                 // Extract the inputs.
   6356                 ArgumentsCharInt args = new ArgumentsCharInt();
   6357                 args.inV = arrayInV[i * 2 + j];
   6358                 // Figure out what the outputs should have been.
   6359                 CoreMathVerifier.computeConvert(args);
   6360                 // Validate the outputs.
   6361                 boolean valid = true;
   6362                 if (args.out != arrayOut[i * 2 + j]) {
   6363                     valid = false;
   6364                 }
   6365                 if (!valid) {
   6366                     StringBuilder message = new StringBuilder();
   6367                     message.append("Input inV: ");
   6368                     message.append(String.format("%d", args.inV));
   6369                     message.append("\n");
   6370                     message.append("Expected output out: ");
   6371                     message.append(String.format("%d", args.out));
   6372                     message.append("\n");
   6373                     message.append("Actual   output out: ");
   6374                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   6375                     if (args.out != arrayOut[i * 2 + j]) {
   6376                         message.append(" FAIL");
   6377                     }
   6378                     message.append("\n");
   6379                     assertTrue("Incorrect output for checkConvertChar2Int2" +
   6380                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6381                 }
   6382             }
   6383         }
   6384     }
   6385 
   6386     private void checkConvertChar3Int3() {
   6387         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x880244ebde6e9353l, true, 7);
   6388         try {
   6389             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   6390             script.forEach_testConvertInt3Char3Int3(inV, out);
   6391             verifyResultsConvertChar3Int3(inV, out, false);
   6392         } catch (Exception e) {
   6393             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Char3Int3: " + e.toString());
   6394         }
   6395         try {
   6396             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   6397             scriptRelaxed.forEach_testConvertInt3Char3Int3(inV, out);
   6398             verifyResultsConvertChar3Int3(inV, out, true);
   6399         } catch (Exception e) {
   6400             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Char3Int3: " + e.toString());
   6401         }
   6402     }
   6403 
   6404     private void verifyResultsConvertChar3Int3(Allocation inV, Allocation out, boolean relaxed) {
   6405         byte[] arrayInV = new byte[INPUTSIZE * 4];
   6406         inV.copyTo(arrayInV);
   6407         int[] arrayOut = new int[INPUTSIZE * 4];
   6408         out.copyTo(arrayOut);
   6409         for (int i = 0; i < INPUTSIZE; i++) {
   6410             for (int j = 0; j < 3 ; j++) {
   6411                 // Extract the inputs.
   6412                 ArgumentsCharInt args = new ArgumentsCharInt();
   6413                 args.inV = arrayInV[i * 4 + j];
   6414                 // Figure out what the outputs should have been.
   6415                 CoreMathVerifier.computeConvert(args);
   6416                 // Validate the outputs.
   6417                 boolean valid = true;
   6418                 if (args.out != arrayOut[i * 4 + j]) {
   6419                     valid = false;
   6420                 }
   6421                 if (!valid) {
   6422                     StringBuilder message = new StringBuilder();
   6423                     message.append("Input inV: ");
   6424                     message.append(String.format("%d", args.inV));
   6425                     message.append("\n");
   6426                     message.append("Expected output out: ");
   6427                     message.append(String.format("%d", args.out));
   6428                     message.append("\n");
   6429                     message.append("Actual   output out: ");
   6430                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   6431                     if (args.out != arrayOut[i * 4 + j]) {
   6432                         message.append(" FAIL");
   6433                     }
   6434                     message.append("\n");
   6435                     assertTrue("Incorrect output for checkConvertChar3Int3" +
   6436                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6437                 }
   6438             }
   6439         }
   6440     }
   6441 
   6442     private void checkConvertChar4Int4() {
   6443         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x8802452b2816a389l, true, 7);
   6444         try {
   6445             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   6446             script.forEach_testConvertInt4Char4Int4(inV, out);
   6447             verifyResultsConvertChar4Int4(inV, out, false);
   6448         } catch (Exception e) {
   6449             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Char4Int4: " + e.toString());
   6450         }
   6451         try {
   6452             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   6453             scriptRelaxed.forEach_testConvertInt4Char4Int4(inV, out);
   6454             verifyResultsConvertChar4Int4(inV, out, true);
   6455         } catch (Exception e) {
   6456             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Char4Int4: " + e.toString());
   6457         }
   6458     }
   6459 
   6460     private void verifyResultsConvertChar4Int4(Allocation inV, Allocation out, boolean relaxed) {
   6461         byte[] arrayInV = new byte[INPUTSIZE * 4];
   6462         inV.copyTo(arrayInV);
   6463         int[] arrayOut = new int[INPUTSIZE * 4];
   6464         out.copyTo(arrayOut);
   6465         for (int i = 0; i < INPUTSIZE; i++) {
   6466             for (int j = 0; j < 4 ; j++) {
   6467                 // Extract the inputs.
   6468                 ArgumentsCharInt args = new ArgumentsCharInt();
   6469                 args.inV = arrayInV[i * 4 + j];
   6470                 // Figure out what the outputs should have been.
   6471                 CoreMathVerifier.computeConvert(args);
   6472                 // Validate the outputs.
   6473                 boolean valid = true;
   6474                 if (args.out != arrayOut[i * 4 + j]) {
   6475                     valid = false;
   6476                 }
   6477                 if (!valid) {
   6478                     StringBuilder message = new StringBuilder();
   6479                     message.append("Input inV: ");
   6480                     message.append(String.format("%d", args.inV));
   6481                     message.append("\n");
   6482                     message.append("Expected output out: ");
   6483                     message.append(String.format("%d", args.out));
   6484                     message.append("\n");
   6485                     message.append("Actual   output out: ");
   6486                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   6487                     if (args.out != arrayOut[i * 4 + j]) {
   6488                         message.append(" FAIL");
   6489                     }
   6490                     message.append("\n");
   6491                     assertTrue("Incorrect output for checkConvertChar4Int4" +
   6492                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6493                 }
   6494             }
   6495         }
   6496     }
   6497 
   6498     public class ArgumentsUcharInt {
   6499         public byte inV;
   6500         public int out;
   6501     }
   6502 
   6503     private void checkConvertUchar2Int2() {
   6504         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x97cffb96923aa720l, false, 8);
   6505         try {
   6506             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   6507             script.forEach_testConvertInt2Uchar2Int2(inV, out);
   6508             verifyResultsConvertUchar2Int2(inV, out, false);
   6509         } catch (Exception e) {
   6510             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Uchar2Int2: " + e.toString());
   6511         }
   6512         try {
   6513             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   6514             scriptRelaxed.forEach_testConvertInt2Uchar2Int2(inV, out);
   6515             verifyResultsConvertUchar2Int2(inV, out, true);
   6516         } catch (Exception e) {
   6517             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Uchar2Int2: " + e.toString());
   6518         }
   6519     }
   6520 
   6521     private void verifyResultsConvertUchar2Int2(Allocation inV, Allocation out, boolean relaxed) {
   6522         byte[] arrayInV = new byte[INPUTSIZE * 2];
   6523         inV.copyTo(arrayInV);
   6524         int[] arrayOut = new int[INPUTSIZE * 2];
   6525         out.copyTo(arrayOut);
   6526         for (int i = 0; i < INPUTSIZE; i++) {
   6527             for (int j = 0; j < 2 ; j++) {
   6528                 // Extract the inputs.
   6529                 ArgumentsUcharInt args = new ArgumentsUcharInt();
   6530                 args.inV = arrayInV[i * 2 + j];
   6531                 // Figure out what the outputs should have been.
   6532                 CoreMathVerifier.computeConvert(args);
   6533                 // Validate the outputs.
   6534                 boolean valid = true;
   6535                 if (args.out != arrayOut[i * 2 + j]) {
   6536                     valid = false;
   6537                 }
   6538                 if (!valid) {
   6539                     StringBuilder message = new StringBuilder();
   6540                     message.append("Input inV: ");
   6541                     message.append(String.format("0x%x", args.inV));
   6542                     message.append("\n");
   6543                     message.append("Expected output out: ");
   6544                     message.append(String.format("%d", args.out));
   6545                     message.append("\n");
   6546                     message.append("Actual   output out: ");
   6547                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   6548                     if (args.out != arrayOut[i * 2 + j]) {
   6549                         message.append(" FAIL");
   6550                     }
   6551                     message.append("\n");
   6552                     assertTrue("Incorrect output for checkConvertUchar2Int2" +
   6553                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6554                 }
   6555             }
   6556         }
   6557     }
   6558 
   6559     private void checkConvertUchar3Int3() {
   6560         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x97cffbd5dbe2b756l, false, 8);
   6561         try {
   6562             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   6563             script.forEach_testConvertInt3Uchar3Int3(inV, out);
   6564             verifyResultsConvertUchar3Int3(inV, out, false);
   6565         } catch (Exception e) {
   6566             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Uchar3Int3: " + e.toString());
   6567         }
   6568         try {
   6569             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   6570             scriptRelaxed.forEach_testConvertInt3Uchar3Int3(inV, out);
   6571             verifyResultsConvertUchar3Int3(inV, out, true);
   6572         } catch (Exception e) {
   6573             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Uchar3Int3: " + e.toString());
   6574         }
   6575     }
   6576 
   6577     private void verifyResultsConvertUchar3Int3(Allocation inV, Allocation out, boolean relaxed) {
   6578         byte[] arrayInV = new byte[INPUTSIZE * 4];
   6579         inV.copyTo(arrayInV);
   6580         int[] arrayOut = new int[INPUTSIZE * 4];
   6581         out.copyTo(arrayOut);
   6582         for (int i = 0; i < INPUTSIZE; i++) {
   6583             for (int j = 0; j < 3 ; j++) {
   6584                 // Extract the inputs.
   6585                 ArgumentsUcharInt args = new ArgumentsUcharInt();
   6586                 args.inV = arrayInV[i * 4 + j];
   6587                 // Figure out what the outputs should have been.
   6588                 CoreMathVerifier.computeConvert(args);
   6589                 // Validate the outputs.
   6590                 boolean valid = true;
   6591                 if (args.out != arrayOut[i * 4 + j]) {
   6592                     valid = false;
   6593                 }
   6594                 if (!valid) {
   6595                     StringBuilder message = new StringBuilder();
   6596                     message.append("Input inV: ");
   6597                     message.append(String.format("0x%x", args.inV));
   6598                     message.append("\n");
   6599                     message.append("Expected output out: ");
   6600                     message.append(String.format("%d", args.out));
   6601                     message.append("\n");
   6602                     message.append("Actual   output out: ");
   6603                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   6604                     if (args.out != arrayOut[i * 4 + j]) {
   6605                         message.append(" FAIL");
   6606                     }
   6607                     message.append("\n");
   6608                     assertTrue("Incorrect output for checkConvertUchar3Int3" +
   6609                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6610                 }
   6611             }
   6612         }
   6613     }
   6614 
   6615     private void checkConvertUchar4Int4() {
   6616         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x97cffc15258ac78cl, false, 8);
   6617         try {
   6618             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   6619             script.forEach_testConvertInt4Uchar4Int4(inV, out);
   6620             verifyResultsConvertUchar4Int4(inV, out, false);
   6621         } catch (Exception e) {
   6622             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Uchar4Int4: " + e.toString());
   6623         }
   6624         try {
   6625             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   6626             scriptRelaxed.forEach_testConvertInt4Uchar4Int4(inV, out);
   6627             verifyResultsConvertUchar4Int4(inV, out, true);
   6628         } catch (Exception e) {
   6629             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Uchar4Int4: " + e.toString());
   6630         }
   6631     }
   6632 
   6633     private void verifyResultsConvertUchar4Int4(Allocation inV, Allocation out, boolean relaxed) {
   6634         byte[] arrayInV = new byte[INPUTSIZE * 4];
   6635         inV.copyTo(arrayInV);
   6636         int[] arrayOut = new int[INPUTSIZE * 4];
   6637         out.copyTo(arrayOut);
   6638         for (int i = 0; i < INPUTSIZE; i++) {
   6639             for (int j = 0; j < 4 ; j++) {
   6640                 // Extract the inputs.
   6641                 ArgumentsUcharInt args = new ArgumentsUcharInt();
   6642                 args.inV = arrayInV[i * 4 + j];
   6643                 // Figure out what the outputs should have been.
   6644                 CoreMathVerifier.computeConvert(args);
   6645                 // Validate the outputs.
   6646                 boolean valid = true;
   6647                 if (args.out != arrayOut[i * 4 + j]) {
   6648                     valid = false;
   6649                 }
   6650                 if (!valid) {
   6651                     StringBuilder message = new StringBuilder();
   6652                     message.append("Input inV: ");
   6653                     message.append(String.format("0x%x", args.inV));
   6654                     message.append("\n");
   6655                     message.append("Expected output out: ");
   6656                     message.append(String.format("%d", args.out));
   6657                     message.append("\n");
   6658                     message.append("Actual   output out: ");
   6659                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   6660                     if (args.out != arrayOut[i * 4 + j]) {
   6661                         message.append(" FAIL");
   6662                     }
   6663                     message.append("\n");
   6664                     assertTrue("Incorrect output for checkConvertUchar4Int4" +
   6665                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6666                 }
   6667             }
   6668         }
   6669     }
   6670 
   6671     public class ArgumentsShortInt {
   6672         public short inV;
   6673         public int out;
   6674     }
   6675 
   6676     private void checkConvertShort2Int2() {
   6677         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x85693203252a2d69l, true, 15);
   6678         try {
   6679             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   6680             script.forEach_testConvertInt2Short2Int2(inV, out);
   6681             verifyResultsConvertShort2Int2(inV, out, false);
   6682         } catch (Exception e) {
   6683             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Short2Int2: " + e.toString());
   6684         }
   6685         try {
   6686             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   6687             scriptRelaxed.forEach_testConvertInt2Short2Int2(inV, out);
   6688             verifyResultsConvertShort2Int2(inV, out, true);
   6689         } catch (Exception e) {
   6690             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Short2Int2: " + e.toString());
   6691         }
   6692     }
   6693 
   6694     private void verifyResultsConvertShort2Int2(Allocation inV, Allocation out, boolean relaxed) {
   6695         short[] arrayInV = new short[INPUTSIZE * 2];
   6696         inV.copyTo(arrayInV);
   6697         int[] arrayOut = new int[INPUTSIZE * 2];
   6698         out.copyTo(arrayOut);
   6699         for (int i = 0; i < INPUTSIZE; i++) {
   6700             for (int j = 0; j < 2 ; j++) {
   6701                 // Extract the inputs.
   6702                 ArgumentsShortInt args = new ArgumentsShortInt();
   6703                 args.inV = arrayInV[i * 2 + j];
   6704                 // Figure out what the outputs should have been.
   6705                 CoreMathVerifier.computeConvert(args);
   6706                 // Validate the outputs.
   6707                 boolean valid = true;
   6708                 if (args.out != arrayOut[i * 2 + j]) {
   6709                     valid = false;
   6710                 }
   6711                 if (!valid) {
   6712                     StringBuilder message = new StringBuilder();
   6713                     message.append("Input inV: ");
   6714                     message.append(String.format("%d", args.inV));
   6715                     message.append("\n");
   6716                     message.append("Expected output out: ");
   6717                     message.append(String.format("%d", args.out));
   6718                     message.append("\n");
   6719                     message.append("Actual   output out: ");
   6720                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   6721                     if (args.out != arrayOut[i * 2 + j]) {
   6722                         message.append(" FAIL");
   6723                     }
   6724                     message.append("\n");
   6725                     assertTrue("Incorrect output for checkConvertShort2Int2" +
   6726                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6727                 }
   6728             }
   6729         }
   6730     }
   6731 
   6732     private void checkConvertShort3Int3() {
   6733         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x856932426ed23d9fl, true, 15);
   6734         try {
   6735             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   6736             script.forEach_testConvertInt3Short3Int3(inV, out);
   6737             verifyResultsConvertShort3Int3(inV, out, false);
   6738         } catch (Exception e) {
   6739             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Short3Int3: " + e.toString());
   6740         }
   6741         try {
   6742             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   6743             scriptRelaxed.forEach_testConvertInt3Short3Int3(inV, out);
   6744             verifyResultsConvertShort3Int3(inV, out, true);
   6745         } catch (Exception e) {
   6746             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Short3Int3: " + e.toString());
   6747         }
   6748     }
   6749 
   6750     private void verifyResultsConvertShort3Int3(Allocation inV, Allocation out, boolean relaxed) {
   6751         short[] arrayInV = new short[INPUTSIZE * 4];
   6752         inV.copyTo(arrayInV);
   6753         int[] arrayOut = new int[INPUTSIZE * 4];
   6754         out.copyTo(arrayOut);
   6755         for (int i = 0; i < INPUTSIZE; i++) {
   6756             for (int j = 0; j < 3 ; j++) {
   6757                 // Extract the inputs.
   6758                 ArgumentsShortInt args = new ArgumentsShortInt();
   6759                 args.inV = arrayInV[i * 4 + j];
   6760                 // Figure out what the outputs should have been.
   6761                 CoreMathVerifier.computeConvert(args);
   6762                 // Validate the outputs.
   6763                 boolean valid = true;
   6764                 if (args.out != arrayOut[i * 4 + j]) {
   6765                     valid = false;
   6766                 }
   6767                 if (!valid) {
   6768                     StringBuilder message = new StringBuilder();
   6769                     message.append("Input inV: ");
   6770                     message.append(String.format("%d", args.inV));
   6771                     message.append("\n");
   6772                     message.append("Expected output out: ");
   6773                     message.append(String.format("%d", args.out));
   6774                     message.append("\n");
   6775                     message.append("Actual   output out: ");
   6776                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   6777                     if (args.out != arrayOut[i * 4 + j]) {
   6778                         message.append(" FAIL");
   6779                     }
   6780                     message.append("\n");
   6781                     assertTrue("Incorrect output for checkConvertShort3Int3" +
   6782                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6783                 }
   6784             }
   6785         }
   6786     }
   6787 
   6788     private void checkConvertShort4Int4() {
   6789         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x85693281b87a4dd5l, true, 15);
   6790         try {
   6791             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   6792             script.forEach_testConvertInt4Short4Int4(inV, out);
   6793             verifyResultsConvertShort4Int4(inV, out, false);
   6794         } catch (Exception e) {
   6795             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Short4Int4: " + e.toString());
   6796         }
   6797         try {
   6798             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   6799             scriptRelaxed.forEach_testConvertInt4Short4Int4(inV, out);
   6800             verifyResultsConvertShort4Int4(inV, out, true);
   6801         } catch (Exception e) {
   6802             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Short4Int4: " + e.toString());
   6803         }
   6804     }
   6805 
   6806     private void verifyResultsConvertShort4Int4(Allocation inV, Allocation out, boolean relaxed) {
   6807         short[] arrayInV = new short[INPUTSIZE * 4];
   6808         inV.copyTo(arrayInV);
   6809         int[] arrayOut = new int[INPUTSIZE * 4];
   6810         out.copyTo(arrayOut);
   6811         for (int i = 0; i < INPUTSIZE; i++) {
   6812             for (int j = 0; j < 4 ; j++) {
   6813                 // Extract the inputs.
   6814                 ArgumentsShortInt args = new ArgumentsShortInt();
   6815                 args.inV = arrayInV[i * 4 + j];
   6816                 // Figure out what the outputs should have been.
   6817                 CoreMathVerifier.computeConvert(args);
   6818                 // Validate the outputs.
   6819                 boolean valid = true;
   6820                 if (args.out != arrayOut[i * 4 + j]) {
   6821                     valid = false;
   6822                 }
   6823                 if (!valid) {
   6824                     StringBuilder message = new StringBuilder();
   6825                     message.append("Input inV: ");
   6826                     message.append(String.format("%d", args.inV));
   6827                     message.append("\n");
   6828                     message.append("Expected output out: ");
   6829                     message.append(String.format("%d", args.out));
   6830                     message.append("\n");
   6831                     message.append("Actual   output out: ");
   6832                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   6833                     if (args.out != arrayOut[i * 4 + j]) {
   6834                         message.append(" FAIL");
   6835                     }
   6836                     message.append("\n");
   6837                     assertTrue("Incorrect output for checkConvertShort4Int4" +
   6838                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6839                 }
   6840             }
   6841         }
   6842     }
   6843 
   6844     public class ArgumentsUshortInt {
   6845         public short inV;
   6846         public int out;
   6847     }
   6848 
   6849     private void checkConvertUshort2Int2() {
   6850         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x2cf6eb50b7ac39eal, false, 16);
   6851         try {
   6852             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   6853             script.forEach_testConvertInt2Ushort2Int2(inV, out);
   6854             verifyResultsConvertUshort2Int2(inV, out, false);
   6855         } catch (Exception e) {
   6856             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Ushort2Int2: " + e.toString());
   6857         }
   6858         try {
   6859             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   6860             scriptRelaxed.forEach_testConvertInt2Ushort2Int2(inV, out);
   6861             verifyResultsConvertUshort2Int2(inV, out, true);
   6862         } catch (Exception e) {
   6863             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Ushort2Int2: " + e.toString());
   6864         }
   6865     }
   6866 
   6867     private void verifyResultsConvertUshort2Int2(Allocation inV, Allocation out, boolean relaxed) {
   6868         short[] arrayInV = new short[INPUTSIZE * 2];
   6869         inV.copyTo(arrayInV);
   6870         int[] arrayOut = new int[INPUTSIZE * 2];
   6871         out.copyTo(arrayOut);
   6872         for (int i = 0; i < INPUTSIZE; i++) {
   6873             for (int j = 0; j < 2 ; j++) {
   6874                 // Extract the inputs.
   6875                 ArgumentsUshortInt args = new ArgumentsUshortInt();
   6876                 args.inV = arrayInV[i * 2 + j];
   6877                 // Figure out what the outputs should have been.
   6878                 CoreMathVerifier.computeConvert(args);
   6879                 // Validate the outputs.
   6880                 boolean valid = true;
   6881                 if (args.out != arrayOut[i * 2 + j]) {
   6882                     valid = false;
   6883                 }
   6884                 if (!valid) {
   6885                     StringBuilder message = new StringBuilder();
   6886                     message.append("Input inV: ");
   6887                     message.append(String.format("0x%x", args.inV));
   6888                     message.append("\n");
   6889                     message.append("Expected output out: ");
   6890                     message.append(String.format("%d", args.out));
   6891                     message.append("\n");
   6892                     message.append("Actual   output out: ");
   6893                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   6894                     if (args.out != arrayOut[i * 2 + j]) {
   6895                         message.append(" FAIL");
   6896                     }
   6897                     message.append("\n");
   6898                     assertTrue("Incorrect output for checkConvertUshort2Int2" +
   6899                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6900                 }
   6901             }
   6902         }
   6903     }
   6904 
   6905     private void checkConvertUshort3Int3() {
   6906         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x2cf6eb9001544a20l, false, 16);
   6907         try {
   6908             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   6909             script.forEach_testConvertInt3Ushort3Int3(inV, out);
   6910             verifyResultsConvertUshort3Int3(inV, out, false);
   6911         } catch (Exception e) {
   6912             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Ushort3Int3: " + e.toString());
   6913         }
   6914         try {
   6915             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   6916             scriptRelaxed.forEach_testConvertInt3Ushort3Int3(inV, out);
   6917             verifyResultsConvertUshort3Int3(inV, out, true);
   6918         } catch (Exception e) {
   6919             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Ushort3Int3: " + e.toString());
   6920         }
   6921     }
   6922 
   6923     private void verifyResultsConvertUshort3Int3(Allocation inV, Allocation out, boolean relaxed) {
   6924         short[] arrayInV = new short[INPUTSIZE * 4];
   6925         inV.copyTo(arrayInV);
   6926         int[] arrayOut = new int[INPUTSIZE * 4];
   6927         out.copyTo(arrayOut);
   6928         for (int i = 0; i < INPUTSIZE; i++) {
   6929             for (int j = 0; j < 3 ; j++) {
   6930                 // Extract the inputs.
   6931                 ArgumentsUshortInt args = new ArgumentsUshortInt();
   6932                 args.inV = arrayInV[i * 4 + j];
   6933                 // Figure out what the outputs should have been.
   6934                 CoreMathVerifier.computeConvert(args);
   6935                 // Validate the outputs.
   6936                 boolean valid = true;
   6937                 if (args.out != arrayOut[i * 4 + j]) {
   6938                     valid = false;
   6939                 }
   6940                 if (!valid) {
   6941                     StringBuilder message = new StringBuilder();
   6942                     message.append("Input inV: ");
   6943                     message.append(String.format("0x%x", args.inV));
   6944                     message.append("\n");
   6945                     message.append("Expected output out: ");
   6946                     message.append(String.format("%d", args.out));
   6947                     message.append("\n");
   6948                     message.append("Actual   output out: ");
   6949                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   6950                     if (args.out != arrayOut[i * 4 + j]) {
   6951                         message.append(" FAIL");
   6952                     }
   6953                     message.append("\n");
   6954                     assertTrue("Incorrect output for checkConvertUshort3Int3" +
   6955                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   6956                 }
   6957             }
   6958         }
   6959     }
   6960 
   6961     private void checkConvertUshort4Int4() {
   6962         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x2cf6ebcf4afc5a56l, false, 16);
   6963         try {
   6964             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   6965             script.forEach_testConvertInt4Ushort4Int4(inV, out);
   6966             verifyResultsConvertUshort4Int4(inV, out, false);
   6967         } catch (Exception e) {
   6968             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Ushort4Int4: " + e.toString());
   6969         }
   6970         try {
   6971             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   6972             scriptRelaxed.forEach_testConvertInt4Ushort4Int4(inV, out);
   6973             verifyResultsConvertUshort4Int4(inV, out, true);
   6974         } catch (Exception e) {
   6975             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Ushort4Int4: " + e.toString());
   6976         }
   6977     }
   6978 
   6979     private void verifyResultsConvertUshort4Int4(Allocation inV, Allocation out, boolean relaxed) {
   6980         short[] arrayInV = new short[INPUTSIZE * 4];
   6981         inV.copyTo(arrayInV);
   6982         int[] arrayOut = new int[INPUTSIZE * 4];
   6983         out.copyTo(arrayOut);
   6984         for (int i = 0; i < INPUTSIZE; i++) {
   6985             for (int j = 0; j < 4 ; j++) {
   6986                 // Extract the inputs.
   6987                 ArgumentsUshortInt args = new ArgumentsUshortInt();
   6988                 args.inV = arrayInV[i * 4 + j];
   6989                 // Figure out what the outputs should have been.
   6990                 CoreMathVerifier.computeConvert(args);
   6991                 // Validate the outputs.
   6992                 boolean valid = true;
   6993                 if (args.out != arrayOut[i * 4 + j]) {
   6994                     valid = false;
   6995                 }
   6996                 if (!valid) {
   6997                     StringBuilder message = new StringBuilder();
   6998                     message.append("Input inV: ");
   6999                     message.append(String.format("0x%x", args.inV));
   7000                     message.append("\n");
   7001                     message.append("Expected output out: ");
   7002                     message.append(String.format("%d", args.out));
   7003                     message.append("\n");
   7004                     message.append("Actual   output out: ");
   7005                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   7006                     if (args.out != arrayOut[i * 4 + j]) {
   7007                         message.append(" FAIL");
   7008                     }
   7009                     message.append("\n");
   7010                     assertTrue("Incorrect output for checkConvertUshort4Int4" +
   7011                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7012                 }
   7013             }
   7014         }
   7015     }
   7016 
   7017     public class ArgumentsIntInt {
   7018         public int inV;
   7019         public int out;
   7020     }
   7021 
   7022     private void checkConvertInt2Int2() {
   7023         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x501d84049a42354l, true, 31);
   7024         try {
   7025             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   7026             script.forEach_testConvertInt2Int2Int2(inV, out);
   7027             verifyResultsConvertInt2Int2(inV, out, false);
   7028         } catch (Exception e) {
   7029             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Int2Int2: " + e.toString());
   7030         }
   7031         try {
   7032             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   7033             scriptRelaxed.forEach_testConvertInt2Int2Int2(inV, out);
   7034             verifyResultsConvertInt2Int2(inV, out, true);
   7035         } catch (Exception e) {
   7036             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Int2Int2: " + e.toString());
   7037         }
   7038     }
   7039 
   7040     private void verifyResultsConvertInt2Int2(Allocation inV, Allocation out, boolean relaxed) {
   7041         int[] arrayInV = new int[INPUTSIZE * 2];
   7042         inV.copyTo(arrayInV);
   7043         int[] arrayOut = new int[INPUTSIZE * 2];
   7044         out.copyTo(arrayOut);
   7045         for (int i = 0; i < INPUTSIZE; i++) {
   7046             for (int j = 0; j < 2 ; j++) {
   7047                 // Extract the inputs.
   7048                 ArgumentsIntInt args = new ArgumentsIntInt();
   7049                 args.inV = arrayInV[i * 2 + j];
   7050                 // Figure out what the outputs should have been.
   7051                 CoreMathVerifier.computeConvert(args);
   7052                 // Validate the outputs.
   7053                 boolean valid = true;
   7054                 if (args.out != arrayOut[i * 2 + j]) {
   7055                     valid = false;
   7056                 }
   7057                 if (!valid) {
   7058                     StringBuilder message = new StringBuilder();
   7059                     message.append("Input inV: ");
   7060                     message.append(String.format("%d", args.inV));
   7061                     message.append("\n");
   7062                     message.append("Expected output out: ");
   7063                     message.append(String.format("%d", args.out));
   7064                     message.append("\n");
   7065                     message.append("Actual   output out: ");
   7066                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   7067                     if (args.out != arrayOut[i * 2 + j]) {
   7068                         message.append(" FAIL");
   7069                     }
   7070                     message.append("\n");
   7071                     assertTrue("Incorrect output for checkConvertInt2Int2" +
   7072                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7073                 }
   7074             }
   7075         }
   7076     }
   7077 
   7078     private void checkConvertInt3Int3() {
   7079         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x501d87f934c338al, true, 31);
   7080         try {
   7081             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   7082             script.forEach_testConvertInt3Int3Int3(inV, out);
   7083             verifyResultsConvertInt3Int3(inV, out, false);
   7084         } catch (Exception e) {
   7085             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Int3Int3: " + e.toString());
   7086         }
   7087         try {
   7088             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   7089             scriptRelaxed.forEach_testConvertInt3Int3Int3(inV, out);
   7090             verifyResultsConvertInt3Int3(inV, out, true);
   7091         } catch (Exception e) {
   7092             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Int3Int3: " + e.toString());
   7093         }
   7094     }
   7095 
   7096     private void verifyResultsConvertInt3Int3(Allocation inV, Allocation out, boolean relaxed) {
   7097         int[] arrayInV = new int[INPUTSIZE * 4];
   7098         inV.copyTo(arrayInV);
   7099         int[] arrayOut = new int[INPUTSIZE * 4];
   7100         out.copyTo(arrayOut);
   7101         for (int i = 0; i < INPUTSIZE; i++) {
   7102             for (int j = 0; j < 3 ; j++) {
   7103                 // Extract the inputs.
   7104                 ArgumentsIntInt args = new ArgumentsIntInt();
   7105                 args.inV = arrayInV[i * 4 + j];
   7106                 // Figure out what the outputs should have been.
   7107                 CoreMathVerifier.computeConvert(args);
   7108                 // Validate the outputs.
   7109                 boolean valid = true;
   7110                 if (args.out != arrayOut[i * 4 + j]) {
   7111                     valid = false;
   7112                 }
   7113                 if (!valid) {
   7114                     StringBuilder message = new StringBuilder();
   7115                     message.append("Input inV: ");
   7116                     message.append(String.format("%d", args.inV));
   7117                     message.append("\n");
   7118                     message.append("Expected output out: ");
   7119                     message.append(String.format("%d", args.out));
   7120                     message.append("\n");
   7121                     message.append("Actual   output out: ");
   7122                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   7123                     if (args.out != arrayOut[i * 4 + j]) {
   7124                         message.append(" FAIL");
   7125                     }
   7126                     message.append("\n");
   7127                     assertTrue("Incorrect output for checkConvertInt3Int3" +
   7128                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7129                 }
   7130             }
   7131         }
   7132     }
   7133 
   7134     private void checkConvertInt4Int4() {
   7135         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x501d8bedcf443c0l, true, 31);
   7136         try {
   7137             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   7138             script.forEach_testConvertInt4Int4Int4(inV, out);
   7139             verifyResultsConvertInt4Int4(inV, out, false);
   7140         } catch (Exception e) {
   7141             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Int4Int4: " + e.toString());
   7142         }
   7143         try {
   7144             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   7145             scriptRelaxed.forEach_testConvertInt4Int4Int4(inV, out);
   7146             verifyResultsConvertInt4Int4(inV, out, true);
   7147         } catch (Exception e) {
   7148             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Int4Int4: " + e.toString());
   7149         }
   7150     }
   7151 
   7152     private void verifyResultsConvertInt4Int4(Allocation inV, Allocation out, boolean relaxed) {
   7153         int[] arrayInV = new int[INPUTSIZE * 4];
   7154         inV.copyTo(arrayInV);
   7155         int[] arrayOut = new int[INPUTSIZE * 4];
   7156         out.copyTo(arrayOut);
   7157         for (int i = 0; i < INPUTSIZE; i++) {
   7158             for (int j = 0; j < 4 ; j++) {
   7159                 // Extract the inputs.
   7160                 ArgumentsIntInt args = new ArgumentsIntInt();
   7161                 args.inV = arrayInV[i * 4 + j];
   7162                 // Figure out what the outputs should have been.
   7163                 CoreMathVerifier.computeConvert(args);
   7164                 // Validate the outputs.
   7165                 boolean valid = true;
   7166                 if (args.out != arrayOut[i * 4 + j]) {
   7167                     valid = false;
   7168                 }
   7169                 if (!valid) {
   7170                     StringBuilder message = new StringBuilder();
   7171                     message.append("Input inV: ");
   7172                     message.append(String.format("%d", args.inV));
   7173                     message.append("\n");
   7174                     message.append("Expected output out: ");
   7175                     message.append(String.format("%d", args.out));
   7176                     message.append("\n");
   7177                     message.append("Actual   output out: ");
   7178                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   7179                     if (args.out != arrayOut[i * 4 + j]) {
   7180                         message.append(" FAIL");
   7181                     }
   7182                     message.append("\n");
   7183                     assertTrue("Incorrect output for checkConvertInt4Int4" +
   7184                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7185                 }
   7186             }
   7187         }
   7188     }
   7189 
   7190     public class ArgumentsUintInt {
   7191         public int inV;
   7192         public int out;
   7193     }
   7194 
   7195     private void checkConvertUint2Int2() {
   7196         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x70899b043daccaddl, false, 31);
   7197         try {
   7198             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   7199             script.forEach_testConvertInt2Uint2Int2(inV, out);
   7200             verifyResultsConvertUint2Int2(inV, out, false);
   7201         } catch (Exception e) {
   7202             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Uint2Int2: " + e.toString());
   7203         }
   7204         try {
   7205             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   7206             scriptRelaxed.forEach_testConvertInt2Uint2Int2(inV, out);
   7207             verifyResultsConvertUint2Int2(inV, out, true);
   7208         } catch (Exception e) {
   7209             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Uint2Int2: " + e.toString());
   7210         }
   7211     }
   7212 
   7213     private void verifyResultsConvertUint2Int2(Allocation inV, Allocation out, boolean relaxed) {
   7214         int[] arrayInV = new int[INPUTSIZE * 2];
   7215         inV.copyTo(arrayInV);
   7216         int[] arrayOut = new int[INPUTSIZE * 2];
   7217         out.copyTo(arrayOut);
   7218         for (int i = 0; i < INPUTSIZE; i++) {
   7219             for (int j = 0; j < 2 ; j++) {
   7220                 // Extract the inputs.
   7221                 ArgumentsUintInt args = new ArgumentsUintInt();
   7222                 args.inV = arrayInV[i * 2 + j];
   7223                 // Figure out what the outputs should have been.
   7224                 CoreMathVerifier.computeConvert(args);
   7225                 // Validate the outputs.
   7226                 boolean valid = true;
   7227                 if (args.out != arrayOut[i * 2 + j]) {
   7228                     valid = false;
   7229                 }
   7230                 if (!valid) {
   7231                     StringBuilder message = new StringBuilder();
   7232                     message.append("Input inV: ");
   7233                     message.append(String.format("0x%x", args.inV));
   7234                     message.append("\n");
   7235                     message.append("Expected output out: ");
   7236                     message.append(String.format("%d", args.out));
   7237                     message.append("\n");
   7238                     message.append("Actual   output out: ");
   7239                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   7240                     if (args.out != arrayOut[i * 2 + j]) {
   7241                         message.append(" FAIL");
   7242                     }
   7243                     message.append("\n");
   7244                     assertTrue("Incorrect output for checkConvertUint2Int2" +
   7245                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7246                 }
   7247             }
   7248         }
   7249     }
   7250 
   7251     private void checkConvertUint3Int3() {
   7252         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x70899b438754db13l, false, 31);
   7253         try {
   7254             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   7255             script.forEach_testConvertInt3Uint3Int3(inV, out);
   7256             verifyResultsConvertUint3Int3(inV, out, false);
   7257         } catch (Exception e) {
   7258             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Uint3Int3: " + e.toString());
   7259         }
   7260         try {
   7261             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   7262             scriptRelaxed.forEach_testConvertInt3Uint3Int3(inV, out);
   7263             verifyResultsConvertUint3Int3(inV, out, true);
   7264         } catch (Exception e) {
   7265             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Uint3Int3: " + e.toString());
   7266         }
   7267     }
   7268 
   7269     private void verifyResultsConvertUint3Int3(Allocation inV, Allocation out, boolean relaxed) {
   7270         int[] arrayInV = new int[INPUTSIZE * 4];
   7271         inV.copyTo(arrayInV);
   7272         int[] arrayOut = new int[INPUTSIZE * 4];
   7273         out.copyTo(arrayOut);
   7274         for (int i = 0; i < INPUTSIZE; i++) {
   7275             for (int j = 0; j < 3 ; j++) {
   7276                 // Extract the inputs.
   7277                 ArgumentsUintInt args = new ArgumentsUintInt();
   7278                 args.inV = arrayInV[i * 4 + j];
   7279                 // Figure out what the outputs should have been.
   7280                 CoreMathVerifier.computeConvert(args);
   7281                 // Validate the outputs.
   7282                 boolean valid = true;
   7283                 if (args.out != arrayOut[i * 4 + j]) {
   7284                     valid = false;
   7285                 }
   7286                 if (!valid) {
   7287                     StringBuilder message = new StringBuilder();
   7288                     message.append("Input inV: ");
   7289                     message.append(String.format("0x%x", args.inV));
   7290                     message.append("\n");
   7291                     message.append("Expected output out: ");
   7292                     message.append(String.format("%d", args.out));
   7293                     message.append("\n");
   7294                     message.append("Actual   output out: ");
   7295                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   7296                     if (args.out != arrayOut[i * 4 + j]) {
   7297                         message.append(" FAIL");
   7298                     }
   7299                     message.append("\n");
   7300                     assertTrue("Incorrect output for checkConvertUint3Int3" +
   7301                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7302                 }
   7303             }
   7304         }
   7305     }
   7306 
   7307     private void checkConvertUint4Int4() {
   7308         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x70899b82d0fceb49l, false, 31);
   7309         try {
   7310             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   7311             script.forEach_testConvertInt4Uint4Int4(inV, out);
   7312             verifyResultsConvertUint4Int4(inV, out, false);
   7313         } catch (Exception e) {
   7314             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Uint4Int4: " + e.toString());
   7315         }
   7316         try {
   7317             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   7318             scriptRelaxed.forEach_testConvertInt4Uint4Int4(inV, out);
   7319             verifyResultsConvertUint4Int4(inV, out, true);
   7320         } catch (Exception e) {
   7321             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Uint4Int4: " + e.toString());
   7322         }
   7323     }
   7324 
   7325     private void verifyResultsConvertUint4Int4(Allocation inV, Allocation out, boolean relaxed) {
   7326         int[] arrayInV = new int[INPUTSIZE * 4];
   7327         inV.copyTo(arrayInV);
   7328         int[] arrayOut = new int[INPUTSIZE * 4];
   7329         out.copyTo(arrayOut);
   7330         for (int i = 0; i < INPUTSIZE; i++) {
   7331             for (int j = 0; j < 4 ; j++) {
   7332                 // Extract the inputs.
   7333                 ArgumentsUintInt args = new ArgumentsUintInt();
   7334                 args.inV = arrayInV[i * 4 + j];
   7335                 // Figure out what the outputs should have been.
   7336                 CoreMathVerifier.computeConvert(args);
   7337                 // Validate the outputs.
   7338                 boolean valid = true;
   7339                 if (args.out != arrayOut[i * 4 + j]) {
   7340                     valid = false;
   7341                 }
   7342                 if (!valid) {
   7343                     StringBuilder message = new StringBuilder();
   7344                     message.append("Input inV: ");
   7345                     message.append(String.format("0x%x", args.inV));
   7346                     message.append("\n");
   7347                     message.append("Expected output out: ");
   7348                     message.append(String.format("%d", args.out));
   7349                     message.append("\n");
   7350                     message.append("Actual   output out: ");
   7351                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   7352                     if (args.out != arrayOut[i * 4 + j]) {
   7353                         message.append(" FAIL");
   7354                     }
   7355                     message.append("\n");
   7356                     assertTrue("Incorrect output for checkConvertUint4Int4" +
   7357                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7358                 }
   7359             }
   7360         }
   7361     }
   7362 
   7363     public class ArgumentsFloatUint {
   7364         public float inV;
   7365         public int out;
   7366     }
   7367 
   7368     private void checkConvertFloat2Uint2() {
   7369         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x239cb6cd424dca22l, 0.0000000000000000000e+00, 4.2949670400000000000e+09);
   7370         try {
   7371             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   7372             script.forEach_testConvertUint2Float2Uint2(inV, out);
   7373             verifyResultsConvertFloat2Uint2(inV, out, false);
   7374         } catch (Exception e) {
   7375             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Float2Uint2: " + e.toString());
   7376         }
   7377         try {
   7378             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   7379             scriptRelaxed.forEach_testConvertUint2Float2Uint2(inV, out);
   7380             verifyResultsConvertFloat2Uint2(inV, out, true);
   7381         } catch (Exception e) {
   7382             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Float2Uint2: " + e.toString());
   7383         }
   7384     }
   7385 
   7386     private void verifyResultsConvertFloat2Uint2(Allocation inV, Allocation out, boolean relaxed) {
   7387         float[] arrayInV = new float[INPUTSIZE * 2];
   7388         inV.copyTo(arrayInV);
   7389         int[] arrayOut = new int[INPUTSIZE * 2];
   7390         out.copyTo(arrayOut);
   7391         for (int i = 0; i < INPUTSIZE; i++) {
   7392             for (int j = 0; j < 2 ; j++) {
   7393                 // Extract the inputs.
   7394                 ArgumentsFloatUint args = new ArgumentsFloatUint();
   7395                 args.inV = arrayInV[i * 2 + j];
   7396                 // Figure out what the outputs should have been.
   7397                 CoreMathVerifier.computeConvert(args);
   7398                 // Validate the outputs.
   7399                 boolean valid = true;
   7400                 if (args.out != arrayOut[i * 2 + j]) {
   7401                     valid = false;
   7402                 }
   7403                 if (!valid) {
   7404                     StringBuilder message = new StringBuilder();
   7405                     message.append("Input inV: ");
   7406                     message.append(String.format("%14.8g {%8x} %15a",
   7407                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   7408                     message.append("\n");
   7409                     message.append("Expected output out: ");
   7410                     message.append(String.format("0x%x", args.out));
   7411                     message.append("\n");
   7412                     message.append("Actual   output out: ");
   7413                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   7414                     if (args.out != arrayOut[i * 2 + j]) {
   7415                         message.append(" FAIL");
   7416                     }
   7417                     message.append("\n");
   7418                     assertTrue("Incorrect output for checkConvertFloat2Uint2" +
   7419                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7420                 }
   7421             }
   7422         }
   7423     }
   7424 
   7425     private void checkConvertFloat3Uint3() {
   7426         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x239cc16ea1558f16l, 0.0000000000000000000e+00, 4.2949670400000000000e+09);
   7427         try {
   7428             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   7429             script.forEach_testConvertUint3Float3Uint3(inV, out);
   7430             verifyResultsConvertFloat3Uint3(inV, out, false);
   7431         } catch (Exception e) {
   7432             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Float3Uint3: " + e.toString());
   7433         }
   7434         try {
   7435             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   7436             scriptRelaxed.forEach_testConvertUint3Float3Uint3(inV, out);
   7437             verifyResultsConvertFloat3Uint3(inV, out, true);
   7438         } catch (Exception e) {
   7439             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Float3Uint3: " + e.toString());
   7440         }
   7441     }
   7442 
   7443     private void verifyResultsConvertFloat3Uint3(Allocation inV, Allocation out, boolean relaxed) {
   7444         float[] arrayInV = new float[INPUTSIZE * 4];
   7445         inV.copyTo(arrayInV);
   7446         int[] arrayOut = new int[INPUTSIZE * 4];
   7447         out.copyTo(arrayOut);
   7448         for (int i = 0; i < INPUTSIZE; i++) {
   7449             for (int j = 0; j < 3 ; j++) {
   7450                 // Extract the inputs.
   7451                 ArgumentsFloatUint args = new ArgumentsFloatUint();
   7452                 args.inV = arrayInV[i * 4 + j];
   7453                 // Figure out what the outputs should have been.
   7454                 CoreMathVerifier.computeConvert(args);
   7455                 // Validate the outputs.
   7456                 boolean valid = true;
   7457                 if (args.out != arrayOut[i * 4 + j]) {
   7458                     valid = false;
   7459                 }
   7460                 if (!valid) {
   7461                     StringBuilder message = new StringBuilder();
   7462                     message.append("Input inV: ");
   7463                     message.append(String.format("%14.8g {%8x} %15a",
   7464                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   7465                     message.append("\n");
   7466                     message.append("Expected output out: ");
   7467                     message.append(String.format("0x%x", args.out));
   7468                     message.append("\n");
   7469                     message.append("Actual   output out: ");
   7470                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   7471                     if (args.out != arrayOut[i * 4 + j]) {
   7472                         message.append(" FAIL");
   7473                     }
   7474                     message.append("\n");
   7475                     assertTrue("Incorrect output for checkConvertFloat3Uint3" +
   7476                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7477                 }
   7478             }
   7479         }
   7480     }
   7481 
   7482     private void checkConvertFloat4Uint4() {
   7483         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x239ccc10005d540al, 0.0000000000000000000e+00, 4.2949670400000000000e+09);
   7484         try {
   7485             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   7486             script.forEach_testConvertUint4Float4Uint4(inV, out);
   7487             verifyResultsConvertFloat4Uint4(inV, out, false);
   7488         } catch (Exception e) {
   7489             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Float4Uint4: " + e.toString());
   7490         }
   7491         try {
   7492             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   7493             scriptRelaxed.forEach_testConvertUint4Float4Uint4(inV, out);
   7494             verifyResultsConvertFloat4Uint4(inV, out, true);
   7495         } catch (Exception e) {
   7496             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Float4Uint4: " + e.toString());
   7497         }
   7498     }
   7499 
   7500     private void verifyResultsConvertFloat4Uint4(Allocation inV, Allocation out, boolean relaxed) {
   7501         float[] arrayInV = new float[INPUTSIZE * 4];
   7502         inV.copyTo(arrayInV);
   7503         int[] arrayOut = new int[INPUTSIZE * 4];
   7504         out.copyTo(arrayOut);
   7505         for (int i = 0; i < INPUTSIZE; i++) {
   7506             for (int j = 0; j < 4 ; j++) {
   7507                 // Extract the inputs.
   7508                 ArgumentsFloatUint args = new ArgumentsFloatUint();
   7509                 args.inV = arrayInV[i * 4 + j];
   7510                 // Figure out what the outputs should have been.
   7511                 CoreMathVerifier.computeConvert(args);
   7512                 // Validate the outputs.
   7513                 boolean valid = true;
   7514                 if (args.out != arrayOut[i * 4 + j]) {
   7515                     valid = false;
   7516                 }
   7517                 if (!valid) {
   7518                     StringBuilder message = new StringBuilder();
   7519                     message.append("Input inV: ");
   7520                     message.append(String.format("%14.8g {%8x} %15a",
   7521                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   7522                     message.append("\n");
   7523                     message.append("Expected output out: ");
   7524                     message.append(String.format("0x%x", args.out));
   7525                     message.append("\n");
   7526                     message.append("Actual   output out: ");
   7527                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   7528                     if (args.out != arrayOut[i * 4 + j]) {
   7529                         message.append(" FAIL");
   7530                     }
   7531                     message.append("\n");
   7532                     assertTrue("Incorrect output for checkConvertFloat4Uint4" +
   7533                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7534                 }
   7535             }
   7536         }
   7537     }
   7538 
   7539     public class ArgumentsCharUint {
   7540         public byte inV;
   7541         public int out;
   7542     }
   7543 
   7544     private void checkConvertChar2Uint2() {
   7545         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd8618beceddda162l, false, 7);
   7546         try {
   7547             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   7548             script.forEach_testConvertUint2Char2Uint2(inV, out);
   7549             verifyResultsConvertChar2Uint2(inV, out, false);
   7550         } catch (Exception e) {
   7551             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Char2Uint2: " + e.toString());
   7552         }
   7553         try {
   7554             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   7555             scriptRelaxed.forEach_testConvertUint2Char2Uint2(inV, out);
   7556             verifyResultsConvertChar2Uint2(inV, out, true);
   7557         } catch (Exception e) {
   7558             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Char2Uint2: " + e.toString());
   7559         }
   7560     }
   7561 
   7562     private void verifyResultsConvertChar2Uint2(Allocation inV, Allocation out, boolean relaxed) {
   7563         byte[] arrayInV = new byte[INPUTSIZE * 2];
   7564         inV.copyTo(arrayInV);
   7565         int[] arrayOut = new int[INPUTSIZE * 2];
   7566         out.copyTo(arrayOut);
   7567         for (int i = 0; i < INPUTSIZE; i++) {
   7568             for (int j = 0; j < 2 ; j++) {
   7569                 // Extract the inputs.
   7570                 ArgumentsCharUint args = new ArgumentsCharUint();
   7571                 args.inV = arrayInV[i * 2 + j];
   7572                 // Figure out what the outputs should have been.
   7573                 CoreMathVerifier.computeConvert(args);
   7574                 // Validate the outputs.
   7575                 boolean valid = true;
   7576                 if (args.out != arrayOut[i * 2 + j]) {
   7577                     valid = false;
   7578                 }
   7579                 if (!valid) {
   7580                     StringBuilder message = new StringBuilder();
   7581                     message.append("Input inV: ");
   7582                     message.append(String.format("%d", args.inV));
   7583                     message.append("\n");
   7584                     message.append("Expected output out: ");
   7585                     message.append(String.format("0x%x", args.out));
   7586                     message.append("\n");
   7587                     message.append("Actual   output out: ");
   7588                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   7589                     if (args.out != arrayOut[i * 2 + j]) {
   7590                         message.append(" FAIL");
   7591                     }
   7592                     message.append("\n");
   7593                     assertTrue("Incorrect output for checkConvertChar2Uint2" +
   7594                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7595                 }
   7596             }
   7597         }
   7598     }
   7599 
   7600     private void checkConvertChar3Uint3() {
   7601         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xd861968e4ce56656l, false, 7);
   7602         try {
   7603             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   7604             script.forEach_testConvertUint3Char3Uint3(inV, out);
   7605             verifyResultsConvertChar3Uint3(inV, out, false);
   7606         } catch (Exception e) {
   7607             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Char3Uint3: " + e.toString());
   7608         }
   7609         try {
   7610             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   7611             scriptRelaxed.forEach_testConvertUint3Char3Uint3(inV, out);
   7612             verifyResultsConvertChar3Uint3(inV, out, true);
   7613         } catch (Exception e) {
   7614             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Char3Uint3: " + e.toString());
   7615         }
   7616     }
   7617 
   7618     private void verifyResultsConvertChar3Uint3(Allocation inV, Allocation out, boolean relaxed) {
   7619         byte[] arrayInV = new byte[INPUTSIZE * 4];
   7620         inV.copyTo(arrayInV);
   7621         int[] arrayOut = new int[INPUTSIZE * 4];
   7622         out.copyTo(arrayOut);
   7623         for (int i = 0; i < INPUTSIZE; i++) {
   7624             for (int j = 0; j < 3 ; j++) {
   7625                 // Extract the inputs.
   7626                 ArgumentsCharUint args = new ArgumentsCharUint();
   7627                 args.inV = arrayInV[i * 4 + j];
   7628                 // Figure out what the outputs should have been.
   7629                 CoreMathVerifier.computeConvert(args);
   7630                 // Validate the outputs.
   7631                 boolean valid = true;
   7632                 if (args.out != arrayOut[i * 4 + j]) {
   7633                     valid = false;
   7634                 }
   7635                 if (!valid) {
   7636                     StringBuilder message = new StringBuilder();
   7637                     message.append("Input inV: ");
   7638                     message.append(String.format("%d", args.inV));
   7639                     message.append("\n");
   7640                     message.append("Expected output out: ");
   7641                     message.append(String.format("0x%x", args.out));
   7642                     message.append("\n");
   7643                     message.append("Actual   output out: ");
   7644                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   7645                     if (args.out != arrayOut[i * 4 + j]) {
   7646                         message.append(" FAIL");
   7647                     }
   7648                     message.append("\n");
   7649                     assertTrue("Incorrect output for checkConvertChar3Uint3" +
   7650                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7651                 }
   7652             }
   7653         }
   7654     }
   7655 
   7656     private void checkConvertChar4Uint4() {
   7657         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd861a12fabed2b4al, false, 7);
   7658         try {
   7659             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   7660             script.forEach_testConvertUint4Char4Uint4(inV, out);
   7661             verifyResultsConvertChar4Uint4(inV, out, false);
   7662         } catch (Exception e) {
   7663             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Char4Uint4: " + e.toString());
   7664         }
   7665         try {
   7666             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   7667             scriptRelaxed.forEach_testConvertUint4Char4Uint4(inV, out);
   7668             verifyResultsConvertChar4Uint4(inV, out, true);
   7669         } catch (Exception e) {
   7670             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Char4Uint4: " + e.toString());
   7671         }
   7672     }
   7673 
   7674     private void verifyResultsConvertChar4Uint4(Allocation inV, Allocation out, boolean relaxed) {
   7675         byte[] arrayInV = new byte[INPUTSIZE * 4];
   7676         inV.copyTo(arrayInV);
   7677         int[] arrayOut = new int[INPUTSIZE * 4];
   7678         out.copyTo(arrayOut);
   7679         for (int i = 0; i < INPUTSIZE; i++) {
   7680             for (int j = 0; j < 4 ; j++) {
   7681                 // Extract the inputs.
   7682                 ArgumentsCharUint args = new ArgumentsCharUint();
   7683                 args.inV = arrayInV[i * 4 + j];
   7684                 // Figure out what the outputs should have been.
   7685                 CoreMathVerifier.computeConvert(args);
   7686                 // Validate the outputs.
   7687                 boolean valid = true;
   7688                 if (args.out != arrayOut[i * 4 + j]) {
   7689                     valid = false;
   7690                 }
   7691                 if (!valid) {
   7692                     StringBuilder message = new StringBuilder();
   7693                     message.append("Input inV: ");
   7694                     message.append(String.format("%d", args.inV));
   7695                     message.append("\n");
   7696                     message.append("Expected output out: ");
   7697                     message.append(String.format("0x%x", args.out));
   7698                     message.append("\n");
   7699                     message.append("Actual   output out: ");
   7700                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   7701                     if (args.out != arrayOut[i * 4 + j]) {
   7702                         message.append(" FAIL");
   7703                     }
   7704                     message.append("\n");
   7705                     assertTrue("Incorrect output for checkConvertChar4Uint4" +
   7706                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7707                 }
   7708             }
   7709         }
   7710     }
   7711 
   7712     public class ArgumentsUcharUint {
   7713         public byte inV;
   7714         public int out;
   7715     }
   7716 
   7717     private void checkConvertUchar2Uint2() {
   7718         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7fef453a805fade3l, false, 8);
   7719         try {
   7720             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   7721             script.forEach_testConvertUint2Uchar2Uint2(inV, out);
   7722             verifyResultsConvertUchar2Uint2(inV, out, false);
   7723         } catch (Exception e) {
   7724             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Uchar2Uint2: " + e.toString());
   7725         }
   7726         try {
   7727             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   7728             scriptRelaxed.forEach_testConvertUint2Uchar2Uint2(inV, out);
   7729             verifyResultsConvertUchar2Uint2(inV, out, true);
   7730         } catch (Exception e) {
   7731             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Uchar2Uint2: " + e.toString());
   7732         }
   7733     }
   7734 
   7735     private void verifyResultsConvertUchar2Uint2(Allocation inV, Allocation out, boolean relaxed) {
   7736         byte[] arrayInV = new byte[INPUTSIZE * 2];
   7737         inV.copyTo(arrayInV);
   7738         int[] arrayOut = new int[INPUTSIZE * 2];
   7739         out.copyTo(arrayOut);
   7740         for (int i = 0; i < INPUTSIZE; i++) {
   7741             for (int j = 0; j < 2 ; j++) {
   7742                 // Extract the inputs.
   7743                 ArgumentsUcharUint args = new ArgumentsUcharUint();
   7744                 args.inV = arrayInV[i * 2 + j];
   7745                 // Figure out what the outputs should have been.
   7746                 CoreMathVerifier.computeConvert(args);
   7747                 // Validate the outputs.
   7748                 boolean valid = true;
   7749                 if (args.out != arrayOut[i * 2 + j]) {
   7750                     valid = false;
   7751                 }
   7752                 if (!valid) {
   7753                     StringBuilder message = new StringBuilder();
   7754                     message.append("Input inV: ");
   7755                     message.append(String.format("0x%x", args.inV));
   7756                     message.append("\n");
   7757                     message.append("Expected output out: ");
   7758                     message.append(String.format("0x%x", args.out));
   7759                     message.append("\n");
   7760                     message.append("Actual   output out: ");
   7761                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   7762                     if (args.out != arrayOut[i * 2 + j]) {
   7763                         message.append(" FAIL");
   7764                     }
   7765                     message.append("\n");
   7766                     assertTrue("Incorrect output for checkConvertUchar2Uint2" +
   7767                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7768                 }
   7769             }
   7770         }
   7771     }
   7772 
   7773     private void checkConvertUchar3Uint3() {
   7774         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7fef4fdbdf6772d7l, false, 8);
   7775         try {
   7776             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   7777             script.forEach_testConvertUint3Uchar3Uint3(inV, out);
   7778             verifyResultsConvertUchar3Uint3(inV, out, false);
   7779         } catch (Exception e) {
   7780             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Uchar3Uint3: " + e.toString());
   7781         }
   7782         try {
   7783             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   7784             scriptRelaxed.forEach_testConvertUint3Uchar3Uint3(inV, out);
   7785             verifyResultsConvertUchar3Uint3(inV, out, true);
   7786         } catch (Exception e) {
   7787             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Uchar3Uint3: " + e.toString());
   7788         }
   7789     }
   7790 
   7791     private void verifyResultsConvertUchar3Uint3(Allocation inV, Allocation out, boolean relaxed) {
   7792         byte[] arrayInV = new byte[INPUTSIZE * 4];
   7793         inV.copyTo(arrayInV);
   7794         int[] arrayOut = new int[INPUTSIZE * 4];
   7795         out.copyTo(arrayOut);
   7796         for (int i = 0; i < INPUTSIZE; i++) {
   7797             for (int j = 0; j < 3 ; j++) {
   7798                 // Extract the inputs.
   7799                 ArgumentsUcharUint args = new ArgumentsUcharUint();
   7800                 args.inV = arrayInV[i * 4 + j];
   7801                 // Figure out what the outputs should have been.
   7802                 CoreMathVerifier.computeConvert(args);
   7803                 // Validate the outputs.
   7804                 boolean valid = true;
   7805                 if (args.out != arrayOut[i * 4 + j]) {
   7806                     valid = false;
   7807                 }
   7808                 if (!valid) {
   7809                     StringBuilder message = new StringBuilder();
   7810                     message.append("Input inV: ");
   7811                     message.append(String.format("0x%x", args.inV));
   7812                     message.append("\n");
   7813                     message.append("Expected output out: ");
   7814                     message.append(String.format("0x%x", args.out));
   7815                     message.append("\n");
   7816                     message.append("Actual   output out: ");
   7817                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   7818                     if (args.out != arrayOut[i * 4 + j]) {
   7819                         message.append(" FAIL");
   7820                     }
   7821                     message.append("\n");
   7822                     assertTrue("Incorrect output for checkConvertUchar3Uint3" +
   7823                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7824                 }
   7825             }
   7826         }
   7827     }
   7828 
   7829     private void checkConvertUchar4Uint4() {
   7830         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7fef5a7d3e6f37cbl, false, 8);
   7831         try {
   7832             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   7833             script.forEach_testConvertUint4Uchar4Uint4(inV, out);
   7834             verifyResultsConvertUchar4Uint4(inV, out, false);
   7835         } catch (Exception e) {
   7836             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Uchar4Uint4: " + e.toString());
   7837         }
   7838         try {
   7839             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   7840             scriptRelaxed.forEach_testConvertUint4Uchar4Uint4(inV, out);
   7841             verifyResultsConvertUchar4Uint4(inV, out, true);
   7842         } catch (Exception e) {
   7843             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Uchar4Uint4: " + e.toString());
   7844         }
   7845     }
   7846 
   7847     private void verifyResultsConvertUchar4Uint4(Allocation inV, Allocation out, boolean relaxed) {
   7848         byte[] arrayInV = new byte[INPUTSIZE * 4];
   7849         inV.copyTo(arrayInV);
   7850         int[] arrayOut = new int[INPUTSIZE * 4];
   7851         out.copyTo(arrayOut);
   7852         for (int i = 0; i < INPUTSIZE; i++) {
   7853             for (int j = 0; j < 4 ; j++) {
   7854                 // Extract the inputs.
   7855                 ArgumentsUcharUint args = new ArgumentsUcharUint();
   7856                 args.inV = arrayInV[i * 4 + j];
   7857                 // Figure out what the outputs should have been.
   7858                 CoreMathVerifier.computeConvert(args);
   7859                 // Validate the outputs.
   7860                 boolean valid = true;
   7861                 if (args.out != arrayOut[i * 4 + j]) {
   7862                     valid = false;
   7863                 }
   7864                 if (!valid) {
   7865                     StringBuilder message = new StringBuilder();
   7866                     message.append("Input inV: ");
   7867                     message.append(String.format("0x%x", args.inV));
   7868                     message.append("\n");
   7869                     message.append("Expected output out: ");
   7870                     message.append(String.format("0x%x", args.out));
   7871                     message.append("\n");
   7872                     message.append("Actual   output out: ");
   7873                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   7874                     if (args.out != arrayOut[i * 4 + j]) {
   7875                         message.append(" FAIL");
   7876                     }
   7877                     message.append("\n");
   7878                     assertTrue("Incorrect output for checkConvertUchar4Uint4" +
   7879                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7880                 }
   7881             }
   7882         }
   7883     }
   7884 
   7885     public class ArgumentsShortUint {
   7886         public short inV;
   7887         public int out;
   7888     }
   7889 
   7890     private void checkConvertShort2Uint2() {
   7891         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x68ab69772e9b3c26l, false, 15);
   7892         try {
   7893             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   7894             script.forEach_testConvertUint2Short2Uint2(inV, out);
   7895             verifyResultsConvertShort2Uint2(inV, out, false);
   7896         } catch (Exception e) {
   7897             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Short2Uint2: " + e.toString());
   7898         }
   7899         try {
   7900             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   7901             scriptRelaxed.forEach_testConvertUint2Short2Uint2(inV, out);
   7902             verifyResultsConvertShort2Uint2(inV, out, true);
   7903         } catch (Exception e) {
   7904             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Short2Uint2: " + e.toString());
   7905         }
   7906     }
   7907 
   7908     private void verifyResultsConvertShort2Uint2(Allocation inV, Allocation out, boolean relaxed) {
   7909         short[] arrayInV = new short[INPUTSIZE * 2];
   7910         inV.copyTo(arrayInV);
   7911         int[] arrayOut = new int[INPUTSIZE * 2];
   7912         out.copyTo(arrayOut);
   7913         for (int i = 0; i < INPUTSIZE; i++) {
   7914             for (int j = 0; j < 2 ; j++) {
   7915                 // Extract the inputs.
   7916                 ArgumentsShortUint args = new ArgumentsShortUint();
   7917                 args.inV = arrayInV[i * 2 + j];
   7918                 // Figure out what the outputs should have been.
   7919                 CoreMathVerifier.computeConvert(args);
   7920                 // Validate the outputs.
   7921                 boolean valid = true;
   7922                 if (args.out != arrayOut[i * 2 + j]) {
   7923                     valid = false;
   7924                 }
   7925                 if (!valid) {
   7926                     StringBuilder message = new StringBuilder();
   7927                     message.append("Input inV: ");
   7928                     message.append(String.format("%d", args.inV));
   7929                     message.append("\n");
   7930                     message.append("Expected output out: ");
   7931                     message.append(String.format("0x%x", args.out));
   7932                     message.append("\n");
   7933                     message.append("Actual   output out: ");
   7934                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   7935                     if (args.out != arrayOut[i * 2 + j]) {
   7936                         message.append(" FAIL");
   7937                     }
   7938                     message.append("\n");
   7939                     assertTrue("Incorrect output for checkConvertShort2Uint2" +
   7940                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7941                 }
   7942             }
   7943         }
   7944     }
   7945 
   7946     private void checkConvertShort3Uint3() {
   7947         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x68ab74188da3011al, false, 15);
   7948         try {
   7949             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   7950             script.forEach_testConvertUint3Short3Uint3(inV, out);
   7951             verifyResultsConvertShort3Uint3(inV, out, false);
   7952         } catch (Exception e) {
   7953             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Short3Uint3: " + e.toString());
   7954         }
   7955         try {
   7956             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   7957             scriptRelaxed.forEach_testConvertUint3Short3Uint3(inV, out);
   7958             verifyResultsConvertShort3Uint3(inV, out, true);
   7959         } catch (Exception e) {
   7960             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Short3Uint3: " + e.toString());
   7961         }
   7962     }
   7963 
   7964     private void verifyResultsConvertShort3Uint3(Allocation inV, Allocation out, boolean relaxed) {
   7965         short[] arrayInV = new short[INPUTSIZE * 4];
   7966         inV.copyTo(arrayInV);
   7967         int[] arrayOut = new int[INPUTSIZE * 4];
   7968         out.copyTo(arrayOut);
   7969         for (int i = 0; i < INPUTSIZE; i++) {
   7970             for (int j = 0; j < 3 ; j++) {
   7971                 // Extract the inputs.
   7972                 ArgumentsShortUint args = new ArgumentsShortUint();
   7973                 args.inV = arrayInV[i * 4 + j];
   7974                 // Figure out what the outputs should have been.
   7975                 CoreMathVerifier.computeConvert(args);
   7976                 // Validate the outputs.
   7977                 boolean valid = true;
   7978                 if (args.out != arrayOut[i * 4 + j]) {
   7979                     valid = false;
   7980                 }
   7981                 if (!valid) {
   7982                     StringBuilder message = new StringBuilder();
   7983                     message.append("Input inV: ");
   7984                     message.append(String.format("%d", args.inV));
   7985                     message.append("\n");
   7986                     message.append("Expected output out: ");
   7987                     message.append(String.format("0x%x", args.out));
   7988                     message.append("\n");
   7989                     message.append("Actual   output out: ");
   7990                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   7991                     if (args.out != arrayOut[i * 4 + j]) {
   7992                         message.append(" FAIL");
   7993                     }
   7994                     message.append("\n");
   7995                     assertTrue("Incorrect output for checkConvertShort3Uint3" +
   7996                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   7997                 }
   7998             }
   7999         }
   8000     }
   8001 
   8002     private void checkConvertShort4Uint4() {
   8003         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x68ab7eb9ecaac60el, false, 15);
   8004         try {
   8005             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   8006             script.forEach_testConvertUint4Short4Uint4(inV, out);
   8007             verifyResultsConvertShort4Uint4(inV, out, false);
   8008         } catch (Exception e) {
   8009             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Short4Uint4: " + e.toString());
   8010         }
   8011         try {
   8012             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   8013             scriptRelaxed.forEach_testConvertUint4Short4Uint4(inV, out);
   8014             verifyResultsConvertShort4Uint4(inV, out, true);
   8015         } catch (Exception e) {
   8016             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Short4Uint4: " + e.toString());
   8017         }
   8018     }
   8019 
   8020     private void verifyResultsConvertShort4Uint4(Allocation inV, Allocation out, boolean relaxed) {
   8021         short[] arrayInV = new short[INPUTSIZE * 4];
   8022         inV.copyTo(arrayInV);
   8023         int[] arrayOut = new int[INPUTSIZE * 4];
   8024         out.copyTo(arrayOut);
   8025         for (int i = 0; i < INPUTSIZE; i++) {
   8026             for (int j = 0; j < 4 ; j++) {
   8027                 // Extract the inputs.
   8028                 ArgumentsShortUint args = new ArgumentsShortUint();
   8029                 args.inV = arrayInV[i * 4 + j];
   8030                 // Figure out what the outputs should have been.
   8031                 CoreMathVerifier.computeConvert(args);
   8032                 // Validate the outputs.
   8033                 boolean valid = true;
   8034                 if (args.out != arrayOut[i * 4 + j]) {
   8035                     valid = false;
   8036                 }
   8037                 if (!valid) {
   8038                     StringBuilder message = new StringBuilder();
   8039                     message.append("Input inV: ");
   8040                     message.append(String.format("%d", args.inV));
   8041                     message.append("\n");
   8042                     message.append("Expected output out: ");
   8043                     message.append(String.format("0x%x", args.out));
   8044                     message.append("\n");
   8045                     message.append("Actual   output out: ");
   8046                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   8047                     if (args.out != arrayOut[i * 4 + j]) {
   8048                         message.append(" FAIL");
   8049                     }
   8050                     message.append("\n");
   8051                     assertTrue("Incorrect output for checkConvertShort4Uint4" +
   8052                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8053                 }
   8054             }
   8055         }
   8056     }
   8057 
   8058     public class ArgumentsUshortUint {
   8059         public short inV;
   8060         public int out;
   8061     }
   8062 
   8063     private void checkConvertUshort2Uint2() {
   8064         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x8d79897eca7355d1l, false, 16);
   8065         try {
   8066             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   8067             script.forEach_testConvertUint2Ushort2Uint2(inV, out);
   8068             verifyResultsConvertUshort2Uint2(inV, out, false);
   8069         } catch (Exception e) {
   8070             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Ushort2Uint2: " + e.toString());
   8071         }
   8072         try {
   8073             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   8074             scriptRelaxed.forEach_testConvertUint2Ushort2Uint2(inV, out);
   8075             verifyResultsConvertUshort2Uint2(inV, out, true);
   8076         } catch (Exception e) {
   8077             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Ushort2Uint2: " + e.toString());
   8078         }
   8079     }
   8080 
   8081     private void verifyResultsConvertUshort2Uint2(Allocation inV, Allocation out, boolean relaxed) {
   8082         short[] arrayInV = new short[INPUTSIZE * 2];
   8083         inV.copyTo(arrayInV);
   8084         int[] arrayOut = new int[INPUTSIZE * 2];
   8085         out.copyTo(arrayOut);
   8086         for (int i = 0; i < INPUTSIZE; i++) {
   8087             for (int j = 0; j < 2 ; j++) {
   8088                 // Extract the inputs.
   8089                 ArgumentsUshortUint args = new ArgumentsUshortUint();
   8090                 args.inV = arrayInV[i * 2 + j];
   8091                 // Figure out what the outputs should have been.
   8092                 CoreMathVerifier.computeConvert(args);
   8093                 // Validate the outputs.
   8094                 boolean valid = true;
   8095                 if (args.out != arrayOut[i * 2 + j]) {
   8096                     valid = false;
   8097                 }
   8098                 if (!valid) {
   8099                     StringBuilder message = new StringBuilder();
   8100                     message.append("Input inV: ");
   8101                     message.append(String.format("0x%x", args.inV));
   8102                     message.append("\n");
   8103                     message.append("Expected output out: ");
   8104                     message.append(String.format("0x%x", args.out));
   8105                     message.append("\n");
   8106                     message.append("Actual   output out: ");
   8107                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   8108                     if (args.out != arrayOut[i * 2 + j]) {
   8109                         message.append(" FAIL");
   8110                     }
   8111                     message.append("\n");
   8112                     assertTrue("Incorrect output for checkConvertUshort2Uint2" +
   8113                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8114                 }
   8115             }
   8116         }
   8117     }
   8118 
   8119     private void checkConvertUshort3Uint3() {
   8120         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x8d799420297b1ac5l, false, 16);
   8121         try {
   8122             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   8123             script.forEach_testConvertUint3Ushort3Uint3(inV, out);
   8124             verifyResultsConvertUshort3Uint3(inV, out, false);
   8125         } catch (Exception e) {
   8126             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Ushort3Uint3: " + e.toString());
   8127         }
   8128         try {
   8129             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   8130             scriptRelaxed.forEach_testConvertUint3Ushort3Uint3(inV, out);
   8131             verifyResultsConvertUshort3Uint3(inV, out, true);
   8132         } catch (Exception e) {
   8133             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Ushort3Uint3: " + e.toString());
   8134         }
   8135     }
   8136 
   8137     private void verifyResultsConvertUshort3Uint3(Allocation inV, Allocation out, boolean relaxed) {
   8138         short[] arrayInV = new short[INPUTSIZE * 4];
   8139         inV.copyTo(arrayInV);
   8140         int[] arrayOut = new int[INPUTSIZE * 4];
   8141         out.copyTo(arrayOut);
   8142         for (int i = 0; i < INPUTSIZE; i++) {
   8143             for (int j = 0; j < 3 ; j++) {
   8144                 // Extract the inputs.
   8145                 ArgumentsUshortUint args = new ArgumentsUshortUint();
   8146                 args.inV = arrayInV[i * 4 + j];
   8147                 // Figure out what the outputs should have been.
   8148                 CoreMathVerifier.computeConvert(args);
   8149                 // Validate the outputs.
   8150                 boolean valid = true;
   8151                 if (args.out != arrayOut[i * 4 + j]) {
   8152                     valid = false;
   8153                 }
   8154                 if (!valid) {
   8155                     StringBuilder message = new StringBuilder();
   8156                     message.append("Input inV: ");
   8157                     message.append(String.format("0x%x", args.inV));
   8158                     message.append("\n");
   8159                     message.append("Expected output out: ");
   8160                     message.append(String.format("0x%x", args.out));
   8161                     message.append("\n");
   8162                     message.append("Actual   output out: ");
   8163                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   8164                     if (args.out != arrayOut[i * 4 + j]) {
   8165                         message.append(" FAIL");
   8166                     }
   8167                     message.append("\n");
   8168                     assertTrue("Incorrect output for checkConvertUshort3Uint3" +
   8169                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8170                 }
   8171             }
   8172         }
   8173     }
   8174 
   8175     private void checkConvertUshort4Uint4() {
   8176         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x8d799ec18882dfb9l, false, 16);
   8177         try {
   8178             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   8179             script.forEach_testConvertUint4Ushort4Uint4(inV, out);
   8180             verifyResultsConvertUshort4Uint4(inV, out, false);
   8181         } catch (Exception e) {
   8182             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Ushort4Uint4: " + e.toString());
   8183         }
   8184         try {
   8185             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   8186             scriptRelaxed.forEach_testConvertUint4Ushort4Uint4(inV, out);
   8187             verifyResultsConvertUshort4Uint4(inV, out, true);
   8188         } catch (Exception e) {
   8189             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Ushort4Uint4: " + e.toString());
   8190         }
   8191     }
   8192 
   8193     private void verifyResultsConvertUshort4Uint4(Allocation inV, Allocation out, boolean relaxed) {
   8194         short[] arrayInV = new short[INPUTSIZE * 4];
   8195         inV.copyTo(arrayInV);
   8196         int[] arrayOut = new int[INPUTSIZE * 4];
   8197         out.copyTo(arrayOut);
   8198         for (int i = 0; i < INPUTSIZE; i++) {
   8199             for (int j = 0; j < 4 ; j++) {
   8200                 // Extract the inputs.
   8201                 ArgumentsUshortUint args = new ArgumentsUshortUint();
   8202                 args.inV = arrayInV[i * 4 + j];
   8203                 // Figure out what the outputs should have been.
   8204                 CoreMathVerifier.computeConvert(args);
   8205                 // Validate the outputs.
   8206                 boolean valid = true;
   8207                 if (args.out != arrayOut[i * 4 + j]) {
   8208                     valid = false;
   8209                 }
   8210                 if (!valid) {
   8211                     StringBuilder message = new StringBuilder();
   8212                     message.append("Input inV: ");
   8213                     message.append(String.format("0x%x", args.inV));
   8214                     message.append("\n");
   8215                     message.append("Expected output out: ");
   8216                     message.append(String.format("0x%x", args.out));
   8217                     message.append("\n");
   8218                     message.append("Actual   output out: ");
   8219                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   8220                     if (args.out != arrayOut[i * 4 + j]) {
   8221                         message.append(" FAIL");
   8222                     }
   8223                     message.append("\n");
   8224                     assertTrue("Incorrect output for checkConvertUshort4Uint4" +
   8225                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8226                 }
   8227             }
   8228         }
   8229     }
   8230 
   8231     public class ArgumentsIntUint {
   8232         public int inV;
   8233         public int out;
   8234     }
   8235 
   8236     private void checkConvertInt2Uint2() {
   8237         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xd74f55bc4f178a9fl, false, 31);
   8238         try {
   8239             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   8240             script.forEach_testConvertUint2Int2Uint2(inV, out);
   8241             verifyResultsConvertInt2Uint2(inV, out, false);
   8242         } catch (Exception e) {
   8243             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Int2Uint2: " + e.toString());
   8244         }
   8245         try {
   8246             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   8247             scriptRelaxed.forEach_testConvertUint2Int2Uint2(inV, out);
   8248             verifyResultsConvertInt2Uint2(inV, out, true);
   8249         } catch (Exception e) {
   8250             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Int2Uint2: " + e.toString());
   8251         }
   8252     }
   8253 
   8254     private void verifyResultsConvertInt2Uint2(Allocation inV, Allocation out, boolean relaxed) {
   8255         int[] arrayInV = new int[INPUTSIZE * 2];
   8256         inV.copyTo(arrayInV);
   8257         int[] arrayOut = new int[INPUTSIZE * 2];
   8258         out.copyTo(arrayOut);
   8259         for (int i = 0; i < INPUTSIZE; i++) {
   8260             for (int j = 0; j < 2 ; j++) {
   8261                 // Extract the inputs.
   8262                 ArgumentsIntUint args = new ArgumentsIntUint();
   8263                 args.inV = arrayInV[i * 2 + j];
   8264                 // Figure out what the outputs should have been.
   8265                 CoreMathVerifier.computeConvert(args);
   8266                 // Validate the outputs.
   8267                 boolean valid = true;
   8268                 if (args.out != arrayOut[i * 2 + j]) {
   8269                     valid = false;
   8270                 }
   8271                 if (!valid) {
   8272                     StringBuilder message = new StringBuilder();
   8273                     message.append("Input inV: ");
   8274                     message.append(String.format("%d", args.inV));
   8275                     message.append("\n");
   8276                     message.append("Expected output out: ");
   8277                     message.append(String.format("0x%x", args.out));
   8278                     message.append("\n");
   8279                     message.append("Actual   output out: ");
   8280                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   8281                     if (args.out != arrayOut[i * 2 + j]) {
   8282                         message.append(" FAIL");
   8283                     }
   8284                     message.append("\n");
   8285                     assertTrue("Incorrect output for checkConvertInt2Uint2" +
   8286                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8287                 }
   8288             }
   8289         }
   8290     }
   8291 
   8292     private void checkConvertInt3Uint3() {
   8293         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xd74f605dae1f4f93l, false, 31);
   8294         try {
   8295             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   8296             script.forEach_testConvertUint3Int3Uint3(inV, out);
   8297             verifyResultsConvertInt3Uint3(inV, out, false);
   8298         } catch (Exception e) {
   8299             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Int3Uint3: " + e.toString());
   8300         }
   8301         try {
   8302             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   8303             scriptRelaxed.forEach_testConvertUint3Int3Uint3(inV, out);
   8304             verifyResultsConvertInt3Uint3(inV, out, true);
   8305         } catch (Exception e) {
   8306             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Int3Uint3: " + e.toString());
   8307         }
   8308     }
   8309 
   8310     private void verifyResultsConvertInt3Uint3(Allocation inV, Allocation out, boolean relaxed) {
   8311         int[] arrayInV = new int[INPUTSIZE * 4];
   8312         inV.copyTo(arrayInV);
   8313         int[] arrayOut = new int[INPUTSIZE * 4];
   8314         out.copyTo(arrayOut);
   8315         for (int i = 0; i < INPUTSIZE; i++) {
   8316             for (int j = 0; j < 3 ; j++) {
   8317                 // Extract the inputs.
   8318                 ArgumentsIntUint args = new ArgumentsIntUint();
   8319                 args.inV = arrayInV[i * 4 + j];
   8320                 // Figure out what the outputs should have been.
   8321                 CoreMathVerifier.computeConvert(args);
   8322                 // Validate the outputs.
   8323                 boolean valid = true;
   8324                 if (args.out != arrayOut[i * 4 + j]) {
   8325                     valid = false;
   8326                 }
   8327                 if (!valid) {
   8328                     StringBuilder message = new StringBuilder();
   8329                     message.append("Input inV: ");
   8330                     message.append(String.format("%d", args.inV));
   8331                     message.append("\n");
   8332                     message.append("Expected output out: ");
   8333                     message.append(String.format("0x%x", args.out));
   8334                     message.append("\n");
   8335                     message.append("Actual   output out: ");
   8336                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   8337                     if (args.out != arrayOut[i * 4 + j]) {
   8338                         message.append(" FAIL");
   8339                     }
   8340                     message.append("\n");
   8341                     assertTrue("Incorrect output for checkConvertInt3Uint3" +
   8342                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8343                 }
   8344             }
   8345         }
   8346     }
   8347 
   8348     private void checkConvertInt4Uint4() {
   8349         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xd74f6aff0d271487l, false, 31);
   8350         try {
   8351             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   8352             script.forEach_testConvertUint4Int4Uint4(inV, out);
   8353             verifyResultsConvertInt4Uint4(inV, out, false);
   8354         } catch (Exception e) {
   8355             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Int4Uint4: " + e.toString());
   8356         }
   8357         try {
   8358             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   8359             scriptRelaxed.forEach_testConvertUint4Int4Uint4(inV, out);
   8360             verifyResultsConvertInt4Uint4(inV, out, true);
   8361         } catch (Exception e) {
   8362             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Int4Uint4: " + e.toString());
   8363         }
   8364     }
   8365 
   8366     private void verifyResultsConvertInt4Uint4(Allocation inV, Allocation out, boolean relaxed) {
   8367         int[] arrayInV = new int[INPUTSIZE * 4];
   8368         inV.copyTo(arrayInV);
   8369         int[] arrayOut = new int[INPUTSIZE * 4];
   8370         out.copyTo(arrayOut);
   8371         for (int i = 0; i < INPUTSIZE; i++) {
   8372             for (int j = 0; j < 4 ; j++) {
   8373                 // Extract the inputs.
   8374                 ArgumentsIntUint args = new ArgumentsIntUint();
   8375                 args.inV = arrayInV[i * 4 + j];
   8376                 // Figure out what the outputs should have been.
   8377                 CoreMathVerifier.computeConvert(args);
   8378                 // Validate the outputs.
   8379                 boolean valid = true;
   8380                 if (args.out != arrayOut[i * 4 + j]) {
   8381                     valid = false;
   8382                 }
   8383                 if (!valid) {
   8384                     StringBuilder message = new StringBuilder();
   8385                     message.append("Input inV: ");
   8386                     message.append(String.format("%d", args.inV));
   8387                     message.append("\n");
   8388                     message.append("Expected output out: ");
   8389                     message.append(String.format("0x%x", args.out));
   8390                     message.append("\n");
   8391                     message.append("Actual   output out: ");
   8392                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   8393                     if (args.out != arrayOut[i * 4 + j]) {
   8394                         message.append(" FAIL");
   8395                     }
   8396                     message.append("\n");
   8397                     assertTrue("Incorrect output for checkConvertInt4Uint4" +
   8398                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8399                 }
   8400             }
   8401         }
   8402     }
   8403 
   8404     public class ArgumentsUintUint {
   8405         public int inV;
   8406         public int out;
   8407     }
   8408 
   8409     private void checkConvertUint2Uint2() {
   8410         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xe71d0ca64c8baea2l, false, 32);
   8411         try {
   8412             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   8413             script.forEach_testConvertUint2Uint2Uint2(inV, out);
   8414             verifyResultsConvertUint2Uint2(inV, out, false);
   8415         } catch (Exception e) {
   8416             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Uint2Uint2: " + e.toString());
   8417         }
   8418         try {
   8419             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   8420             scriptRelaxed.forEach_testConvertUint2Uint2Uint2(inV, out);
   8421             verifyResultsConvertUint2Uint2(inV, out, true);
   8422         } catch (Exception e) {
   8423             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Uint2Uint2: " + e.toString());
   8424         }
   8425     }
   8426 
   8427     private void verifyResultsConvertUint2Uint2(Allocation inV, Allocation out, boolean relaxed) {
   8428         int[] arrayInV = new int[INPUTSIZE * 2];
   8429         inV.copyTo(arrayInV);
   8430         int[] arrayOut = new int[INPUTSIZE * 2];
   8431         out.copyTo(arrayOut);
   8432         for (int i = 0; i < INPUTSIZE; i++) {
   8433             for (int j = 0; j < 2 ; j++) {
   8434                 // Extract the inputs.
   8435                 ArgumentsUintUint args = new ArgumentsUintUint();
   8436                 args.inV = arrayInV[i * 2 + j];
   8437                 // Figure out what the outputs should have been.
   8438                 CoreMathVerifier.computeConvert(args);
   8439                 // Validate the outputs.
   8440                 boolean valid = true;
   8441                 if (args.out != arrayOut[i * 2 + j]) {
   8442                     valid = false;
   8443                 }
   8444                 if (!valid) {
   8445                     StringBuilder message = new StringBuilder();
   8446                     message.append("Input inV: ");
   8447                     message.append(String.format("0x%x", args.inV));
   8448                     message.append("\n");
   8449                     message.append("Expected output out: ");
   8450                     message.append(String.format("0x%x", args.out));
   8451                     message.append("\n");
   8452                     message.append("Actual   output out: ");
   8453                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   8454                     if (args.out != arrayOut[i * 2 + j]) {
   8455                         message.append(" FAIL");
   8456                     }
   8457                     message.append("\n");
   8458                     assertTrue("Incorrect output for checkConvertUint2Uint2" +
   8459                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8460                 }
   8461             }
   8462         }
   8463     }
   8464 
   8465     private void checkConvertUint3Uint3() {
   8466         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe71d1747ab937396l, false, 32);
   8467         try {
   8468             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   8469             script.forEach_testConvertUint3Uint3Uint3(inV, out);
   8470             verifyResultsConvertUint3Uint3(inV, out, false);
   8471         } catch (Exception e) {
   8472             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Uint3Uint3: " + e.toString());
   8473         }
   8474         try {
   8475             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   8476             scriptRelaxed.forEach_testConvertUint3Uint3Uint3(inV, out);
   8477             verifyResultsConvertUint3Uint3(inV, out, true);
   8478         } catch (Exception e) {
   8479             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Uint3Uint3: " + e.toString());
   8480         }
   8481     }
   8482 
   8483     private void verifyResultsConvertUint3Uint3(Allocation inV, Allocation out, boolean relaxed) {
   8484         int[] arrayInV = new int[INPUTSIZE * 4];
   8485         inV.copyTo(arrayInV);
   8486         int[] arrayOut = new int[INPUTSIZE * 4];
   8487         out.copyTo(arrayOut);
   8488         for (int i = 0; i < INPUTSIZE; i++) {
   8489             for (int j = 0; j < 3 ; j++) {
   8490                 // Extract the inputs.
   8491                 ArgumentsUintUint args = new ArgumentsUintUint();
   8492                 args.inV = arrayInV[i * 4 + j];
   8493                 // Figure out what the outputs should have been.
   8494                 CoreMathVerifier.computeConvert(args);
   8495                 // Validate the outputs.
   8496                 boolean valid = true;
   8497                 if (args.out != arrayOut[i * 4 + j]) {
   8498                     valid = false;
   8499                 }
   8500                 if (!valid) {
   8501                     StringBuilder message = new StringBuilder();
   8502                     message.append("Input inV: ");
   8503                     message.append(String.format("0x%x", args.inV));
   8504                     message.append("\n");
   8505                     message.append("Expected output out: ");
   8506                     message.append(String.format("0x%x", args.out));
   8507                     message.append("\n");
   8508                     message.append("Actual   output out: ");
   8509                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   8510                     if (args.out != arrayOut[i * 4 + j]) {
   8511                         message.append(" FAIL");
   8512                     }
   8513                     message.append("\n");
   8514                     assertTrue("Incorrect output for checkConvertUint3Uint3" +
   8515                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8516                 }
   8517             }
   8518         }
   8519     }
   8520 
   8521     private void checkConvertUint4Uint4() {
   8522         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xe71d21e90a9b388al, false, 32);
   8523         try {
   8524             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   8525             script.forEach_testConvertUint4Uint4Uint4(inV, out);
   8526             verifyResultsConvertUint4Uint4(inV, out, false);
   8527         } catch (Exception e) {
   8528             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Uint4Uint4: " + e.toString());
   8529         }
   8530         try {
   8531             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   8532             scriptRelaxed.forEach_testConvertUint4Uint4Uint4(inV, out);
   8533             verifyResultsConvertUint4Uint4(inV, out, true);
   8534         } catch (Exception e) {
   8535             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Uint4Uint4: " + e.toString());
   8536         }
   8537     }
   8538 
   8539     private void verifyResultsConvertUint4Uint4(Allocation inV, Allocation out, boolean relaxed) {
   8540         int[] arrayInV = new int[INPUTSIZE * 4];
   8541         inV.copyTo(arrayInV);
   8542         int[] arrayOut = new int[INPUTSIZE * 4];
   8543         out.copyTo(arrayOut);
   8544         for (int i = 0; i < INPUTSIZE; i++) {
   8545             for (int j = 0; j < 4 ; j++) {
   8546                 // Extract the inputs.
   8547                 ArgumentsUintUint args = new ArgumentsUintUint();
   8548                 args.inV = arrayInV[i * 4 + j];
   8549                 // Figure out what the outputs should have been.
   8550                 CoreMathVerifier.computeConvert(args);
   8551                 // Validate the outputs.
   8552                 boolean valid = true;
   8553                 if (args.out != arrayOut[i * 4 + j]) {
   8554                     valid = false;
   8555                 }
   8556                 if (!valid) {
   8557                     StringBuilder message = new StringBuilder();
   8558                     message.append("Input inV: ");
   8559                     message.append(String.format("0x%x", args.inV));
   8560                     message.append("\n");
   8561                     message.append("Expected output out: ");
   8562                     message.append(String.format("0x%x", args.out));
   8563                     message.append("\n");
   8564                     message.append("Actual   output out: ");
   8565                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   8566                     if (args.out != arrayOut[i * 4 + j]) {
   8567                         message.append(" FAIL");
   8568                     }
   8569                     message.append("\n");
   8570                     assertTrue("Incorrect output for checkConvertUint4Uint4" +
   8571                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8572                 }
   8573             }
   8574         }
   8575     }
   8576 
   8577     public class ArgumentsDoubleDouble {
   8578         public double inV;
   8579         public Target.Floaty out;
   8580     }
   8581 
   8582     private void checkConvertDouble2Double2() {
   8583         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x345b4a823902786el, -8.5390423905960001625e+307, 8.5390423905960001625e+307);
   8584         try {
   8585             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   8586             script.forEach_testConvertDouble2Double2Double2(inV, out);
   8587             verifyResultsConvertDouble2Double2(inV, out, false);
   8588         } catch (Exception e) {
   8589             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Double2Double2: " + e.toString());
   8590         }
   8591         try {
   8592             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   8593             scriptRelaxed.forEach_testConvertDouble2Double2Double2(inV, out);
   8594             verifyResultsConvertDouble2Double2(inV, out, true);
   8595         } catch (Exception e) {
   8596             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Double2Double2: " + e.toString());
   8597         }
   8598     }
   8599 
   8600     private void verifyResultsConvertDouble2Double2(Allocation inV, Allocation out, boolean relaxed) {
   8601         double[] arrayInV = new double[INPUTSIZE * 2];
   8602         inV.copyTo(arrayInV);
   8603         double[] arrayOut = new double[INPUTSIZE * 2];
   8604         out.copyTo(arrayOut);
   8605         for (int i = 0; i < INPUTSIZE; i++) {
   8606             for (int j = 0; j < 2 ; j++) {
   8607                 // Extract the inputs.
   8608                 ArgumentsDoubleDouble args = new ArgumentsDoubleDouble();
   8609                 args.inV = arrayInV[i * 2 + j];
   8610                 // Figure out what the outputs should have been.
   8611                 Target target = new Target(relaxed);
   8612                 CoreMathVerifier.computeConvert(args, target);
   8613                 // Validate the outputs.
   8614                 boolean valid = true;
   8615                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   8616                     valid = false;
   8617                 }
   8618                 if (!valid) {
   8619                     StringBuilder message = new StringBuilder();
   8620                     message.append("Input inV: ");
   8621                     message.append(String.format("%24.8g {%16x} %31a",
   8622                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   8623                     message.append("\n");
   8624                     message.append("Expected output out: ");
   8625                     message.append(args.out.toString());
   8626                     message.append("\n");
   8627                     message.append("Actual   output out: ");
   8628                     message.append(String.format("%24.8g {%16x} %31a",
   8629                             arrayOut[i * 2 + j], Double.doubleToRawLongBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   8630                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   8631                         message.append(" FAIL");
   8632                     }
   8633                     message.append("\n");
   8634                     assertTrue("Incorrect output for checkConvertDouble2Double2" +
   8635                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8636                 }
   8637             }
   8638         }
   8639     }
   8640 
   8641     private void checkConvertDouble3Double3() {
   8642         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x34a812098f5e099al, -8.5390423905960001625e+307, 8.5390423905960001625e+307);
   8643         try {
   8644             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   8645             script.forEach_testConvertDouble3Double3Double3(inV, out);
   8646             verifyResultsConvertDouble3Double3(inV, out, false);
   8647         } catch (Exception e) {
   8648             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Double3Double3: " + e.toString());
   8649         }
   8650         try {
   8651             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   8652             scriptRelaxed.forEach_testConvertDouble3Double3Double3(inV, out);
   8653             verifyResultsConvertDouble3Double3(inV, out, true);
   8654         } catch (Exception e) {
   8655             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Double3Double3: " + e.toString());
   8656         }
   8657     }
   8658 
   8659     private void verifyResultsConvertDouble3Double3(Allocation inV, Allocation out, boolean relaxed) {
   8660         double[] arrayInV = new double[INPUTSIZE * 4];
   8661         inV.copyTo(arrayInV);
   8662         double[] arrayOut = new double[INPUTSIZE * 4];
   8663         out.copyTo(arrayOut);
   8664         for (int i = 0; i < INPUTSIZE; i++) {
   8665             for (int j = 0; j < 3 ; j++) {
   8666                 // Extract the inputs.
   8667                 ArgumentsDoubleDouble args = new ArgumentsDoubleDouble();
   8668                 args.inV = arrayInV[i * 4 + j];
   8669                 // Figure out what the outputs should have been.
   8670                 Target target = new Target(relaxed);
   8671                 CoreMathVerifier.computeConvert(args, target);
   8672                 // Validate the outputs.
   8673                 boolean valid = true;
   8674                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   8675                     valid = false;
   8676                 }
   8677                 if (!valid) {
   8678                     StringBuilder message = new StringBuilder();
   8679                     message.append("Input inV: ");
   8680                     message.append(String.format("%24.8g {%16x} %31a",
   8681                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   8682                     message.append("\n");
   8683                     message.append("Expected output out: ");
   8684                     message.append(args.out.toString());
   8685                     message.append("\n");
   8686                     message.append("Actual   output out: ");
   8687                     message.append(String.format("%24.8g {%16x} %31a",
   8688                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   8689                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   8690                         message.append(" FAIL");
   8691                     }
   8692                     message.append("\n");
   8693                     assertTrue("Incorrect output for checkConvertDouble3Double3" +
   8694                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8695                 }
   8696             }
   8697         }
   8698     }
   8699 
   8700     private void checkConvertDouble4Double4() {
   8701         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x34f4d990e5b99ac6l, -8.5390423905960001625e+307, 8.5390423905960001625e+307);
   8702         try {
   8703             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   8704             script.forEach_testConvertDouble4Double4Double4(inV, out);
   8705             verifyResultsConvertDouble4Double4(inV, out, false);
   8706         } catch (Exception e) {
   8707             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Double4Double4: " + e.toString());
   8708         }
   8709         try {
   8710             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   8711             scriptRelaxed.forEach_testConvertDouble4Double4Double4(inV, out);
   8712             verifyResultsConvertDouble4Double4(inV, out, true);
   8713         } catch (Exception e) {
   8714             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Double4Double4: " + e.toString());
   8715         }
   8716     }
   8717 
   8718     private void verifyResultsConvertDouble4Double4(Allocation inV, Allocation out, boolean relaxed) {
   8719         double[] arrayInV = new double[INPUTSIZE * 4];
   8720         inV.copyTo(arrayInV);
   8721         double[] arrayOut = new double[INPUTSIZE * 4];
   8722         out.copyTo(arrayOut);
   8723         for (int i = 0; i < INPUTSIZE; i++) {
   8724             for (int j = 0; j < 4 ; j++) {
   8725                 // Extract the inputs.
   8726                 ArgumentsDoubleDouble args = new ArgumentsDoubleDouble();
   8727                 args.inV = arrayInV[i * 4 + j];
   8728                 // Figure out what the outputs should have been.
   8729                 Target target = new Target(relaxed);
   8730                 CoreMathVerifier.computeConvert(args, target);
   8731                 // Validate the outputs.
   8732                 boolean valid = true;
   8733                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   8734                     valid = false;
   8735                 }
   8736                 if (!valid) {
   8737                     StringBuilder message = new StringBuilder();
   8738                     message.append("Input inV: ");
   8739                     message.append(String.format("%24.8g {%16x} %31a",
   8740                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   8741                     message.append("\n");
   8742                     message.append("Expected output out: ");
   8743                     message.append(args.out.toString());
   8744                     message.append("\n");
   8745                     message.append("Actual   output out: ");
   8746                     message.append(String.format("%24.8g {%16x} %31a",
   8747                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   8748                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   8749                         message.append(" FAIL");
   8750                     }
   8751                     message.append("\n");
   8752                     assertTrue("Incorrect output for checkConvertDouble4Double4" +
   8753                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8754                 }
   8755             }
   8756         }
   8757     }
   8758 
   8759     public class ArgumentsLongDouble {
   8760         public long inV;
   8761         public Target.Floaty out;
   8762     }
   8763 
   8764     private void checkConvertLong2Double2() {
   8765         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x7b7807124c70299bl, true, 63);
   8766         try {
   8767             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   8768             script.forEach_testConvertDouble2Long2Double2(inV, out);
   8769             verifyResultsConvertLong2Double2(inV, out, false);
   8770         } catch (Exception e) {
   8771             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Long2Double2: " + e.toString());
   8772         }
   8773         try {
   8774             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   8775             scriptRelaxed.forEach_testConvertDouble2Long2Double2(inV, out);
   8776             verifyResultsConvertLong2Double2(inV, out, true);
   8777         } catch (Exception e) {
   8778             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Long2Double2: " + e.toString());
   8779         }
   8780     }
   8781 
   8782     private void verifyResultsConvertLong2Double2(Allocation inV, Allocation out, boolean relaxed) {
   8783         long[] arrayInV = new long[INPUTSIZE * 2];
   8784         inV.copyTo(arrayInV);
   8785         double[] arrayOut = new double[INPUTSIZE * 2];
   8786         out.copyTo(arrayOut);
   8787         for (int i = 0; i < INPUTSIZE; i++) {
   8788             for (int j = 0; j < 2 ; j++) {
   8789                 // Extract the inputs.
   8790                 ArgumentsLongDouble args = new ArgumentsLongDouble();
   8791                 args.inV = arrayInV[i * 2 + j];
   8792                 // Figure out what the outputs should have been.
   8793                 Target target = new Target(relaxed);
   8794                 CoreMathVerifier.computeConvert(args, target);
   8795                 // Validate the outputs.
   8796                 boolean valid = true;
   8797                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   8798                     valid = false;
   8799                 }
   8800                 if (!valid) {
   8801                     StringBuilder message = new StringBuilder();
   8802                     message.append("Input inV: ");
   8803                     message.append(String.format("%d", args.inV));
   8804                     message.append("\n");
   8805                     message.append("Expected output out: ");
   8806                     message.append(args.out.toString());
   8807                     message.append("\n");
   8808                     message.append("Actual   output out: ");
   8809                     message.append(String.format("%24.8g {%16x} %31a",
   8810                             arrayOut[i * 2 + j], Double.doubleToRawLongBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   8811                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   8812                         message.append(" FAIL");
   8813                     }
   8814                     message.append("\n");
   8815                     assertTrue("Incorrect output for checkConvertLong2Double2" +
   8816                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8817                 }
   8818             }
   8819         }
   8820     }
   8821 
   8822     private void checkConvertLong3Double3() {
   8823         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x7bc4ce99a2cbbac7l, true, 63);
   8824         try {
   8825             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   8826             script.forEach_testConvertDouble3Long3Double3(inV, out);
   8827             verifyResultsConvertLong3Double3(inV, out, false);
   8828         } catch (Exception e) {
   8829             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Long3Double3: " + e.toString());
   8830         }
   8831         try {
   8832             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   8833             scriptRelaxed.forEach_testConvertDouble3Long3Double3(inV, out);
   8834             verifyResultsConvertLong3Double3(inV, out, true);
   8835         } catch (Exception e) {
   8836             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Long3Double3: " + e.toString());
   8837         }
   8838     }
   8839 
   8840     private void verifyResultsConvertLong3Double3(Allocation inV, Allocation out, boolean relaxed) {
   8841         long[] arrayInV = new long[INPUTSIZE * 4];
   8842         inV.copyTo(arrayInV);
   8843         double[] arrayOut = new double[INPUTSIZE * 4];
   8844         out.copyTo(arrayOut);
   8845         for (int i = 0; i < INPUTSIZE; i++) {
   8846             for (int j = 0; j < 3 ; j++) {
   8847                 // Extract the inputs.
   8848                 ArgumentsLongDouble args = new ArgumentsLongDouble();
   8849                 args.inV = arrayInV[i * 4 + j];
   8850                 // Figure out what the outputs should have been.
   8851                 Target target = new Target(relaxed);
   8852                 CoreMathVerifier.computeConvert(args, target);
   8853                 // Validate the outputs.
   8854                 boolean valid = true;
   8855                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   8856                     valid = false;
   8857                 }
   8858                 if (!valid) {
   8859                     StringBuilder message = new StringBuilder();
   8860                     message.append("Input inV: ");
   8861                     message.append(String.format("%d", args.inV));
   8862                     message.append("\n");
   8863                     message.append("Expected output out: ");
   8864                     message.append(args.out.toString());
   8865                     message.append("\n");
   8866                     message.append("Actual   output out: ");
   8867                     message.append(String.format("%24.8g {%16x} %31a",
   8868                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   8869                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   8870                         message.append(" FAIL");
   8871                     }
   8872                     message.append("\n");
   8873                     assertTrue("Incorrect output for checkConvertLong3Double3" +
   8874                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8875                 }
   8876             }
   8877         }
   8878     }
   8879 
   8880     private void checkConvertLong4Double4() {
   8881         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x7c119620f9274bf3l, true, 63);
   8882         try {
   8883             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   8884             script.forEach_testConvertDouble4Long4Double4(inV, out);
   8885             verifyResultsConvertLong4Double4(inV, out, false);
   8886         } catch (Exception e) {
   8887             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Long4Double4: " + e.toString());
   8888         }
   8889         try {
   8890             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   8891             scriptRelaxed.forEach_testConvertDouble4Long4Double4(inV, out);
   8892             verifyResultsConvertLong4Double4(inV, out, true);
   8893         } catch (Exception e) {
   8894             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Long4Double4: " + e.toString());
   8895         }
   8896     }
   8897 
   8898     private void verifyResultsConvertLong4Double4(Allocation inV, Allocation out, boolean relaxed) {
   8899         long[] arrayInV = new long[INPUTSIZE * 4];
   8900         inV.copyTo(arrayInV);
   8901         double[] arrayOut = new double[INPUTSIZE * 4];
   8902         out.copyTo(arrayOut);
   8903         for (int i = 0; i < INPUTSIZE; i++) {
   8904             for (int j = 0; j < 4 ; j++) {
   8905                 // Extract the inputs.
   8906                 ArgumentsLongDouble args = new ArgumentsLongDouble();
   8907                 args.inV = arrayInV[i * 4 + j];
   8908                 // Figure out what the outputs should have been.
   8909                 Target target = new Target(relaxed);
   8910                 CoreMathVerifier.computeConvert(args, target);
   8911                 // Validate the outputs.
   8912                 boolean valid = true;
   8913                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   8914                     valid = false;
   8915                 }
   8916                 if (!valid) {
   8917                     StringBuilder message = new StringBuilder();
   8918                     message.append("Input inV: ");
   8919                     message.append(String.format("%d", args.inV));
   8920                     message.append("\n");
   8921                     message.append("Expected output out: ");
   8922                     message.append(args.out.toString());
   8923                     message.append("\n");
   8924                     message.append("Actual   output out: ");
   8925                     message.append(String.format("%24.8g {%16x} %31a",
   8926                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   8927                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   8928                         message.append(" FAIL");
   8929                     }
   8930                     message.append("\n");
   8931                     assertTrue("Incorrect output for checkConvertLong4Double4" +
   8932                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8933                 }
   8934             }
   8935         }
   8936     }
   8937 
   8938     public class ArgumentsUlongDouble {
   8939         public long inV;
   8940         public Target.Floaty out;
   8941     }
   8942 
   8943     private void checkConvertUlong2Double2() {
   8944         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xaa17685979bc7954l, false, 64);
   8945         try {
   8946             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   8947             script.forEach_testConvertDouble2Ulong2Double2(inV, out);
   8948             verifyResultsConvertUlong2Double2(inV, out, false);
   8949         } catch (Exception e) {
   8950             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Ulong2Double2: " + e.toString());
   8951         }
   8952         try {
   8953             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   8954             scriptRelaxed.forEach_testConvertDouble2Ulong2Double2(inV, out);
   8955             verifyResultsConvertUlong2Double2(inV, out, true);
   8956         } catch (Exception e) {
   8957             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Ulong2Double2: " + e.toString());
   8958         }
   8959     }
   8960 
   8961     private void verifyResultsConvertUlong2Double2(Allocation inV, Allocation out, boolean relaxed) {
   8962         long[] arrayInV = new long[INPUTSIZE * 2];
   8963         inV.copyTo(arrayInV);
   8964         double[] arrayOut = new double[INPUTSIZE * 2];
   8965         out.copyTo(arrayOut);
   8966         for (int i = 0; i < INPUTSIZE; i++) {
   8967             for (int j = 0; j < 2 ; j++) {
   8968                 // Extract the inputs.
   8969                 ArgumentsUlongDouble args = new ArgumentsUlongDouble();
   8970                 args.inV = arrayInV[i * 2 + j];
   8971                 // Figure out what the outputs should have been.
   8972                 Target target = new Target(relaxed);
   8973                 CoreMathVerifier.computeConvert(args, target);
   8974                 // Validate the outputs.
   8975                 boolean valid = true;
   8976                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   8977                     valid = false;
   8978                 }
   8979                 if (!valid) {
   8980                     StringBuilder message = new StringBuilder();
   8981                     message.append("Input inV: ");
   8982                     message.append(String.format("0x%x", args.inV));
   8983                     message.append("\n");
   8984                     message.append("Expected output out: ");
   8985                     message.append(args.out.toString());
   8986                     message.append("\n");
   8987                     message.append("Actual   output out: ");
   8988                     message.append(String.format("%24.8g {%16x} %31a",
   8989                             arrayOut[i * 2 + j], Double.doubleToRawLongBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   8990                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   8991                         message.append(" FAIL");
   8992                     }
   8993                     message.append("\n");
   8994                     assertTrue("Incorrect output for checkConvertUlong2Double2" +
   8995                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   8996                 }
   8997             }
   8998         }
   8999     }
   9000 
   9001     private void checkConvertUlong3Double3() {
   9002         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xaa642fe0d0180a80l, false, 64);
   9003         try {
   9004             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   9005             script.forEach_testConvertDouble3Ulong3Double3(inV, out);
   9006             verifyResultsConvertUlong3Double3(inV, out, false);
   9007         } catch (Exception e) {
   9008             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Ulong3Double3: " + e.toString());
   9009         }
   9010         try {
   9011             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   9012             scriptRelaxed.forEach_testConvertDouble3Ulong3Double3(inV, out);
   9013             verifyResultsConvertUlong3Double3(inV, out, true);
   9014         } catch (Exception e) {
   9015             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Ulong3Double3: " + e.toString());
   9016         }
   9017     }
   9018 
   9019     private void verifyResultsConvertUlong3Double3(Allocation inV, Allocation out, boolean relaxed) {
   9020         long[] arrayInV = new long[INPUTSIZE * 4];
   9021         inV.copyTo(arrayInV);
   9022         double[] arrayOut = new double[INPUTSIZE * 4];
   9023         out.copyTo(arrayOut);
   9024         for (int i = 0; i < INPUTSIZE; i++) {
   9025             for (int j = 0; j < 3 ; j++) {
   9026                 // Extract the inputs.
   9027                 ArgumentsUlongDouble args = new ArgumentsUlongDouble();
   9028                 args.inV = arrayInV[i * 4 + j];
   9029                 // Figure out what the outputs should have been.
   9030                 Target target = new Target(relaxed);
   9031                 CoreMathVerifier.computeConvert(args, target);
   9032                 // Validate the outputs.
   9033                 boolean valid = true;
   9034                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   9035                     valid = false;
   9036                 }
   9037                 if (!valid) {
   9038                     StringBuilder message = new StringBuilder();
   9039                     message.append("Input inV: ");
   9040                     message.append(String.format("0x%x", args.inV));
   9041                     message.append("\n");
   9042                     message.append("Expected output out: ");
   9043                     message.append(args.out.toString());
   9044                     message.append("\n");
   9045                     message.append("Actual   output out: ");
   9046                     message.append(String.format("%24.8g {%16x} %31a",
   9047                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   9048                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   9049                         message.append(" FAIL");
   9050                     }
   9051                     message.append("\n");
   9052                     assertTrue("Incorrect output for checkConvertUlong3Double3" +
   9053                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9054                 }
   9055             }
   9056         }
   9057     }
   9058 
   9059     private void checkConvertUlong4Double4() {
   9060         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xaab0f76826739bacl, false, 64);
   9061         try {
   9062             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   9063             script.forEach_testConvertDouble4Ulong4Double4(inV, out);
   9064             verifyResultsConvertUlong4Double4(inV, out, false);
   9065         } catch (Exception e) {
   9066             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Ulong4Double4: " + e.toString());
   9067         }
   9068         try {
   9069             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   9070             scriptRelaxed.forEach_testConvertDouble4Ulong4Double4(inV, out);
   9071             verifyResultsConvertUlong4Double4(inV, out, true);
   9072         } catch (Exception e) {
   9073             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Ulong4Double4: " + e.toString());
   9074         }
   9075     }
   9076 
   9077     private void verifyResultsConvertUlong4Double4(Allocation inV, Allocation out, boolean relaxed) {
   9078         long[] arrayInV = new long[INPUTSIZE * 4];
   9079         inV.copyTo(arrayInV);
   9080         double[] arrayOut = new double[INPUTSIZE * 4];
   9081         out.copyTo(arrayOut);
   9082         for (int i = 0; i < INPUTSIZE; i++) {
   9083             for (int j = 0; j < 4 ; j++) {
   9084                 // Extract the inputs.
   9085                 ArgumentsUlongDouble args = new ArgumentsUlongDouble();
   9086                 args.inV = arrayInV[i * 4 + j];
   9087                 // Figure out what the outputs should have been.
   9088                 Target target = new Target(relaxed);
   9089                 CoreMathVerifier.computeConvert(args, target);
   9090                 // Validate the outputs.
   9091                 boolean valid = true;
   9092                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   9093                     valid = false;
   9094                 }
   9095                 if (!valid) {
   9096                     StringBuilder message = new StringBuilder();
   9097                     message.append("Input inV: ");
   9098                     message.append(String.format("0x%x", args.inV));
   9099                     message.append("\n");
   9100                     message.append("Expected output out: ");
   9101                     message.append(args.out.toString());
   9102                     message.append("\n");
   9103                     message.append("Actual   output out: ");
   9104                     message.append(String.format("%24.8g {%16x} %31a",
   9105                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   9106                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   9107                         message.append(" FAIL");
   9108                     }
   9109                     message.append("\n");
   9110                     assertTrue("Incorrect output for checkConvertUlong4Double4" +
   9111                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9112                 }
   9113             }
   9114         }
   9115     }
   9116 
   9117     public class ArgumentsDoubleLong {
   9118         public double inV;
   9119         public long out;
   9120     }
   9121 
   9122     private void checkConvertDouble2Long2() {
   9123         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xcbf84dc0430cbe95l, -9.2233720368547747840e+18, 9.2233720368547747840e+18);
   9124         try {
   9125             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   9126             script.forEach_testConvertLong2Double2Long2(inV, out);
   9127             verifyResultsConvertDouble2Long2(inV, out, false);
   9128         } catch (Exception e) {
   9129             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Double2Long2: " + e.toString());
   9130         }
   9131         try {
   9132             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   9133             scriptRelaxed.forEach_testConvertLong2Double2Long2(inV, out);
   9134             verifyResultsConvertDouble2Long2(inV, out, true);
   9135         } catch (Exception e) {
   9136             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Double2Long2: " + e.toString());
   9137         }
   9138     }
   9139 
   9140     private void verifyResultsConvertDouble2Long2(Allocation inV, Allocation out, boolean relaxed) {
   9141         double[] arrayInV = new double[INPUTSIZE * 2];
   9142         inV.copyTo(arrayInV);
   9143         long[] arrayOut = new long[INPUTSIZE * 2];
   9144         out.copyTo(arrayOut);
   9145         for (int i = 0; i < INPUTSIZE; i++) {
   9146             for (int j = 0; j < 2 ; j++) {
   9147                 // Extract the inputs.
   9148                 ArgumentsDoubleLong args = new ArgumentsDoubleLong();
   9149                 args.inV = arrayInV[i * 2 + j];
   9150                 // Figure out what the outputs should have been.
   9151                 CoreMathVerifier.computeConvert(args);
   9152                 // Validate the outputs.
   9153                 boolean valid = true;
   9154                 if (args.out != arrayOut[i * 2 + j]) {
   9155                     valid = false;
   9156                 }
   9157                 if (!valid) {
   9158                     StringBuilder message = new StringBuilder();
   9159                     message.append("Input inV: ");
   9160                     message.append(String.format("%24.8g {%16x} %31a",
   9161                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   9162                     message.append("\n");
   9163                     message.append("Expected output out: ");
   9164                     message.append(String.format("%d", args.out));
   9165                     message.append("\n");
   9166                     message.append("Actual   output out: ");
   9167                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   9168                     if (args.out != arrayOut[i * 2 + j]) {
   9169                         message.append(" FAIL");
   9170                     }
   9171                     message.append("\n");
   9172                     assertTrue("Incorrect output for checkConvertDouble2Long2" +
   9173                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9174                 }
   9175             }
   9176         }
   9177     }
   9178 
   9179     private void checkConvertDouble3Long3() {
   9180         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0xcbf85861a2148389l, -9.2233720368547747840e+18, 9.2233720368547747840e+18);
   9181         try {
   9182             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   9183             script.forEach_testConvertLong3Double3Long3(inV, out);
   9184             verifyResultsConvertDouble3Long3(inV, out, false);
   9185         } catch (Exception e) {
   9186             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Double3Long3: " + e.toString());
   9187         }
   9188         try {
   9189             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   9190             scriptRelaxed.forEach_testConvertLong3Double3Long3(inV, out);
   9191             verifyResultsConvertDouble3Long3(inV, out, true);
   9192         } catch (Exception e) {
   9193             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Double3Long3: " + e.toString());
   9194         }
   9195     }
   9196 
   9197     private void verifyResultsConvertDouble3Long3(Allocation inV, Allocation out, boolean relaxed) {
   9198         double[] arrayInV = new double[INPUTSIZE * 4];
   9199         inV.copyTo(arrayInV);
   9200         long[] arrayOut = new long[INPUTSIZE * 4];
   9201         out.copyTo(arrayOut);
   9202         for (int i = 0; i < INPUTSIZE; i++) {
   9203             for (int j = 0; j < 3 ; j++) {
   9204                 // Extract the inputs.
   9205                 ArgumentsDoubleLong args = new ArgumentsDoubleLong();
   9206                 args.inV = arrayInV[i * 4 + j];
   9207                 // Figure out what the outputs should have been.
   9208                 CoreMathVerifier.computeConvert(args);
   9209                 // Validate the outputs.
   9210                 boolean valid = true;
   9211                 if (args.out != arrayOut[i * 4 + j]) {
   9212                     valid = false;
   9213                 }
   9214                 if (!valid) {
   9215                     StringBuilder message = new StringBuilder();
   9216                     message.append("Input inV: ");
   9217                     message.append(String.format("%24.8g {%16x} %31a",
   9218                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   9219                     message.append("\n");
   9220                     message.append("Expected output out: ");
   9221                     message.append(String.format("%d", args.out));
   9222                     message.append("\n");
   9223                     message.append("Actual   output out: ");
   9224                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   9225                     if (args.out != arrayOut[i * 4 + j]) {
   9226                         message.append(" FAIL");
   9227                     }
   9228                     message.append("\n");
   9229                     assertTrue("Incorrect output for checkConvertDouble3Long3" +
   9230                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9231                 }
   9232             }
   9233         }
   9234     }
   9235 
   9236     private void checkConvertDouble4Long4() {
   9237         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xcbf86303011c487dl, -9.2233720368547747840e+18, 9.2233720368547747840e+18);
   9238         try {
   9239             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   9240             script.forEach_testConvertLong4Double4Long4(inV, out);
   9241             verifyResultsConvertDouble4Long4(inV, out, false);
   9242         } catch (Exception e) {
   9243             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Double4Long4: " + e.toString());
   9244         }
   9245         try {
   9246             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   9247             scriptRelaxed.forEach_testConvertLong4Double4Long4(inV, out);
   9248             verifyResultsConvertDouble4Long4(inV, out, true);
   9249         } catch (Exception e) {
   9250             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Double4Long4: " + e.toString());
   9251         }
   9252     }
   9253 
   9254     private void verifyResultsConvertDouble4Long4(Allocation inV, Allocation out, boolean relaxed) {
   9255         double[] arrayInV = new double[INPUTSIZE * 4];
   9256         inV.copyTo(arrayInV);
   9257         long[] arrayOut = new long[INPUTSIZE * 4];
   9258         out.copyTo(arrayOut);
   9259         for (int i = 0; i < INPUTSIZE; i++) {
   9260             for (int j = 0; j < 4 ; j++) {
   9261                 // Extract the inputs.
   9262                 ArgumentsDoubleLong args = new ArgumentsDoubleLong();
   9263                 args.inV = arrayInV[i * 4 + j];
   9264                 // Figure out what the outputs should have been.
   9265                 CoreMathVerifier.computeConvert(args);
   9266                 // Validate the outputs.
   9267                 boolean valid = true;
   9268                 if (args.out != arrayOut[i * 4 + j]) {
   9269                     valid = false;
   9270                 }
   9271                 if (!valid) {
   9272                     StringBuilder message = new StringBuilder();
   9273                     message.append("Input inV: ");
   9274                     message.append(String.format("%24.8g {%16x} %31a",
   9275                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   9276                     message.append("\n");
   9277                     message.append("Expected output out: ");
   9278                     message.append(String.format("%d", args.out));
   9279                     message.append("\n");
   9280                     message.append("Actual   output out: ");
   9281                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   9282                     if (args.out != arrayOut[i * 4 + j]) {
   9283                         message.append(" FAIL");
   9284                     }
   9285                     message.append("\n");
   9286                     assertTrue("Incorrect output for checkConvertDouble4Long4" +
   9287                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9288                 }
   9289             }
   9290         }
   9291     }
   9292 
   9293     public class ArgumentsLongLong {
   9294         public long inV;
   9295         public long out;
   9296     }
   9297 
   9298     private void checkConvertLong2Long2() {
   9299         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xb570c607c81d242al, true, 63);
   9300         try {
   9301             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   9302             script.forEach_testConvertLong2Long2Long2(inV, out);
   9303             verifyResultsConvertLong2Long2(inV, out, false);
   9304         } catch (Exception e) {
   9305             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Long2Long2: " + e.toString());
   9306         }
   9307         try {
   9308             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   9309             scriptRelaxed.forEach_testConvertLong2Long2Long2(inV, out);
   9310             verifyResultsConvertLong2Long2(inV, out, true);
   9311         } catch (Exception e) {
   9312             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Long2Long2: " + e.toString());
   9313         }
   9314     }
   9315 
   9316     private void verifyResultsConvertLong2Long2(Allocation inV, Allocation out, boolean relaxed) {
   9317         long[] arrayInV = new long[INPUTSIZE * 2];
   9318         inV.copyTo(arrayInV);
   9319         long[] arrayOut = new long[INPUTSIZE * 2];
   9320         out.copyTo(arrayOut);
   9321         for (int i = 0; i < INPUTSIZE; i++) {
   9322             for (int j = 0; j < 2 ; j++) {
   9323                 // Extract the inputs.
   9324                 ArgumentsLongLong args = new ArgumentsLongLong();
   9325                 args.inV = arrayInV[i * 2 + j];
   9326                 // Figure out what the outputs should have been.
   9327                 CoreMathVerifier.computeConvert(args);
   9328                 // Validate the outputs.
   9329                 boolean valid = true;
   9330                 if (args.out != arrayOut[i * 2 + j]) {
   9331                     valid = false;
   9332                 }
   9333                 if (!valid) {
   9334                     StringBuilder message = new StringBuilder();
   9335                     message.append("Input inV: ");
   9336                     message.append(String.format("%d", args.inV));
   9337                     message.append("\n");
   9338                     message.append("Expected output out: ");
   9339                     message.append(String.format("%d", args.out));
   9340                     message.append("\n");
   9341                     message.append("Actual   output out: ");
   9342                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   9343                     if (args.out != arrayOut[i * 2 + j]) {
   9344                         message.append(" FAIL");
   9345                     }
   9346                     message.append("\n");
   9347                     assertTrue("Incorrect output for checkConvertLong2Long2" +
   9348                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9349                 }
   9350             }
   9351         }
   9352     }
   9353 
   9354     private void checkConvertLong3Long3() {
   9355         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xb570d0a92724e91el, true, 63);
   9356         try {
   9357             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   9358             script.forEach_testConvertLong3Long3Long3(inV, out);
   9359             verifyResultsConvertLong3Long3(inV, out, false);
   9360         } catch (Exception e) {
   9361             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Long3Long3: " + e.toString());
   9362         }
   9363         try {
   9364             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   9365             scriptRelaxed.forEach_testConvertLong3Long3Long3(inV, out);
   9366             verifyResultsConvertLong3Long3(inV, out, true);
   9367         } catch (Exception e) {
   9368             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Long3Long3: " + e.toString());
   9369         }
   9370     }
   9371 
   9372     private void verifyResultsConvertLong3Long3(Allocation inV, Allocation out, boolean relaxed) {
   9373         long[] arrayInV = new long[INPUTSIZE * 4];
   9374         inV.copyTo(arrayInV);
   9375         long[] arrayOut = new long[INPUTSIZE * 4];
   9376         out.copyTo(arrayOut);
   9377         for (int i = 0; i < INPUTSIZE; i++) {
   9378             for (int j = 0; j < 3 ; j++) {
   9379                 // Extract the inputs.
   9380                 ArgumentsLongLong args = new ArgumentsLongLong();
   9381                 args.inV = arrayInV[i * 4 + j];
   9382                 // Figure out what the outputs should have been.
   9383                 CoreMathVerifier.computeConvert(args);
   9384                 // Validate the outputs.
   9385                 boolean valid = true;
   9386                 if (args.out != arrayOut[i * 4 + j]) {
   9387                     valid = false;
   9388                 }
   9389                 if (!valid) {
   9390                     StringBuilder message = new StringBuilder();
   9391                     message.append("Input inV: ");
   9392                     message.append(String.format("%d", args.inV));
   9393                     message.append("\n");
   9394                     message.append("Expected output out: ");
   9395                     message.append(String.format("%d", args.out));
   9396                     message.append("\n");
   9397                     message.append("Actual   output out: ");
   9398                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   9399                     if (args.out != arrayOut[i * 4 + j]) {
   9400                         message.append(" FAIL");
   9401                     }
   9402                     message.append("\n");
   9403                     assertTrue("Incorrect output for checkConvertLong3Long3" +
   9404                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9405                 }
   9406             }
   9407         }
   9408     }
   9409 
   9410     private void checkConvertLong4Long4() {
   9411         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xb570db4a862cae12l, true, 63);
   9412         try {
   9413             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   9414             script.forEach_testConvertLong4Long4Long4(inV, out);
   9415             verifyResultsConvertLong4Long4(inV, out, false);
   9416         } catch (Exception e) {
   9417             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Long4Long4: " + e.toString());
   9418         }
   9419         try {
   9420             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   9421             scriptRelaxed.forEach_testConvertLong4Long4Long4(inV, out);
   9422             verifyResultsConvertLong4Long4(inV, out, true);
   9423         } catch (Exception e) {
   9424             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Long4Long4: " + e.toString());
   9425         }
   9426     }
   9427 
   9428     private void verifyResultsConvertLong4Long4(Allocation inV, Allocation out, boolean relaxed) {
   9429         long[] arrayInV = new long[INPUTSIZE * 4];
   9430         inV.copyTo(arrayInV);
   9431         long[] arrayOut = new long[INPUTSIZE * 4];
   9432         out.copyTo(arrayOut);
   9433         for (int i = 0; i < INPUTSIZE; i++) {
   9434             for (int j = 0; j < 4 ; j++) {
   9435                 // Extract the inputs.
   9436                 ArgumentsLongLong args = new ArgumentsLongLong();
   9437                 args.inV = arrayInV[i * 4 + j];
   9438                 // Figure out what the outputs should have been.
   9439                 CoreMathVerifier.computeConvert(args);
   9440                 // Validate the outputs.
   9441                 boolean valid = true;
   9442                 if (args.out != arrayOut[i * 4 + j]) {
   9443                     valid = false;
   9444                 }
   9445                 if (!valid) {
   9446                     StringBuilder message = new StringBuilder();
   9447                     message.append("Input inV: ");
   9448                     message.append(String.format("%d", args.inV));
   9449                     message.append("\n");
   9450                     message.append("Expected output out: ");
   9451                     message.append(String.format("%d", args.out));
   9452                     message.append("\n");
   9453                     message.append("Actual   output out: ");
   9454                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   9455                     if (args.out != arrayOut[i * 4 + j]) {
   9456                         message.append(" FAIL");
   9457                     }
   9458                     message.append("\n");
   9459                     assertTrue("Incorrect output for checkConvertLong4Long4" +
   9460                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9461                 }
   9462             }
   9463         }
   9464     }
   9465 
   9466     public class ArgumentsUlongLong {
   9467         public long inV;
   9468         public long out;
   9469     }
   9470 
   9471     private void checkConvertUlong2Long2() {
   9472         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x5cfe7f555a9f30abl, false, 63);
   9473         try {
   9474             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   9475             script.forEach_testConvertLong2Ulong2Long2(inV, out);
   9476             verifyResultsConvertUlong2Long2(inV, out, false);
   9477         } catch (Exception e) {
   9478             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Ulong2Long2: " + e.toString());
   9479         }
   9480         try {
   9481             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   9482             scriptRelaxed.forEach_testConvertLong2Ulong2Long2(inV, out);
   9483             verifyResultsConvertUlong2Long2(inV, out, true);
   9484         } catch (Exception e) {
   9485             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Ulong2Long2: " + e.toString());
   9486         }
   9487     }
   9488 
   9489     private void verifyResultsConvertUlong2Long2(Allocation inV, Allocation out, boolean relaxed) {
   9490         long[] arrayInV = new long[INPUTSIZE * 2];
   9491         inV.copyTo(arrayInV);
   9492         long[] arrayOut = new long[INPUTSIZE * 2];
   9493         out.copyTo(arrayOut);
   9494         for (int i = 0; i < INPUTSIZE; i++) {
   9495             for (int j = 0; j < 2 ; j++) {
   9496                 // Extract the inputs.
   9497                 ArgumentsUlongLong args = new ArgumentsUlongLong();
   9498                 args.inV = arrayInV[i * 2 + j];
   9499                 // Figure out what the outputs should have been.
   9500                 CoreMathVerifier.computeConvert(args);
   9501                 // Validate the outputs.
   9502                 boolean valid = true;
   9503                 if (args.out != arrayOut[i * 2 + j]) {
   9504                     valid = false;
   9505                 }
   9506                 if (!valid) {
   9507                     StringBuilder message = new StringBuilder();
   9508                     message.append("Input inV: ");
   9509                     message.append(String.format("0x%x", args.inV));
   9510                     message.append("\n");
   9511                     message.append("Expected output out: ");
   9512                     message.append(String.format("%d", args.out));
   9513                     message.append("\n");
   9514                     message.append("Actual   output out: ");
   9515                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   9516                     if (args.out != arrayOut[i * 2 + j]) {
   9517                         message.append(" FAIL");
   9518                     }
   9519                     message.append("\n");
   9520                     assertTrue("Incorrect output for checkConvertUlong2Long2" +
   9521                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9522                 }
   9523             }
   9524         }
   9525     }
   9526 
   9527     private void checkConvertUlong3Long3() {
   9528         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x5cfe89f6b9a6f59fl, false, 63);
   9529         try {
   9530             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   9531             script.forEach_testConvertLong3Ulong3Long3(inV, out);
   9532             verifyResultsConvertUlong3Long3(inV, out, false);
   9533         } catch (Exception e) {
   9534             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Ulong3Long3: " + e.toString());
   9535         }
   9536         try {
   9537             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   9538             scriptRelaxed.forEach_testConvertLong3Ulong3Long3(inV, out);
   9539             verifyResultsConvertUlong3Long3(inV, out, true);
   9540         } catch (Exception e) {
   9541             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Ulong3Long3: " + e.toString());
   9542         }
   9543     }
   9544 
   9545     private void verifyResultsConvertUlong3Long3(Allocation inV, Allocation out, boolean relaxed) {
   9546         long[] arrayInV = new long[INPUTSIZE * 4];
   9547         inV.copyTo(arrayInV);
   9548         long[] arrayOut = new long[INPUTSIZE * 4];
   9549         out.copyTo(arrayOut);
   9550         for (int i = 0; i < INPUTSIZE; i++) {
   9551             for (int j = 0; j < 3 ; j++) {
   9552                 // Extract the inputs.
   9553                 ArgumentsUlongLong args = new ArgumentsUlongLong();
   9554                 args.inV = arrayInV[i * 4 + j];
   9555                 // Figure out what the outputs should have been.
   9556                 CoreMathVerifier.computeConvert(args);
   9557                 // Validate the outputs.
   9558                 boolean valid = true;
   9559                 if (args.out != arrayOut[i * 4 + j]) {
   9560                     valid = false;
   9561                 }
   9562                 if (!valid) {
   9563                     StringBuilder message = new StringBuilder();
   9564                     message.append("Input inV: ");
   9565                     message.append(String.format("0x%x", args.inV));
   9566                     message.append("\n");
   9567                     message.append("Expected output out: ");
   9568                     message.append(String.format("%d", args.out));
   9569                     message.append("\n");
   9570                     message.append("Actual   output out: ");
   9571                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   9572                     if (args.out != arrayOut[i * 4 + j]) {
   9573                         message.append(" FAIL");
   9574                     }
   9575                     message.append("\n");
   9576                     assertTrue("Incorrect output for checkConvertUlong3Long3" +
   9577                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9578                 }
   9579             }
   9580         }
   9581     }
   9582 
   9583     private void checkConvertUlong4Long4() {
   9584         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x5cfe949818aeba93l, false, 63);
   9585         try {
   9586             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   9587             script.forEach_testConvertLong4Ulong4Long4(inV, out);
   9588             verifyResultsConvertUlong4Long4(inV, out, false);
   9589         } catch (Exception e) {
   9590             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Ulong4Long4: " + e.toString());
   9591         }
   9592         try {
   9593             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   9594             scriptRelaxed.forEach_testConvertLong4Ulong4Long4(inV, out);
   9595             verifyResultsConvertUlong4Long4(inV, out, true);
   9596         } catch (Exception e) {
   9597             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Ulong4Long4: " + e.toString());
   9598         }
   9599     }
   9600 
   9601     private void verifyResultsConvertUlong4Long4(Allocation inV, Allocation out, boolean relaxed) {
   9602         long[] arrayInV = new long[INPUTSIZE * 4];
   9603         inV.copyTo(arrayInV);
   9604         long[] arrayOut = new long[INPUTSIZE * 4];
   9605         out.copyTo(arrayOut);
   9606         for (int i = 0; i < INPUTSIZE; i++) {
   9607             for (int j = 0; j < 4 ; j++) {
   9608                 // Extract the inputs.
   9609                 ArgumentsUlongLong args = new ArgumentsUlongLong();
   9610                 args.inV = arrayInV[i * 4 + j];
   9611                 // Figure out what the outputs should have been.
   9612                 CoreMathVerifier.computeConvert(args);
   9613                 // Validate the outputs.
   9614                 boolean valid = true;
   9615                 if (args.out != arrayOut[i * 4 + j]) {
   9616                     valid = false;
   9617                 }
   9618                 if (!valid) {
   9619                     StringBuilder message = new StringBuilder();
   9620                     message.append("Input inV: ");
   9621                     message.append(String.format("0x%x", args.inV));
   9622                     message.append("\n");
   9623                     message.append("Expected output out: ");
   9624                     message.append(String.format("%d", args.out));
   9625                     message.append("\n");
   9626                     message.append("Actual   output out: ");
   9627                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   9628                     if (args.out != arrayOut[i * 4 + j]) {
   9629                         message.append(" FAIL");
   9630                     }
   9631                     message.append("\n");
   9632                     assertTrue("Incorrect output for checkConvertUlong4Long4" +
   9633                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9634                 }
   9635             }
   9636         }
   9637     }
   9638 
   9639     public class ArgumentsDoubleUlong {
   9640         public double inV;
   9641         public long out;
   9642     }
   9643 
   9644     private void checkConvertDouble2Ulong2() {
   9645         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x42b56e3b7e12ff5el, 0.0000000000000000000e+00, 1.8446744073709549568e+19);
   9646         try {
   9647             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
   9648             script.forEach_testConvertUlong2Double2Ulong2(inV, out);
   9649             verifyResultsConvertDouble2Ulong2(inV, out, false);
   9650         } catch (Exception e) {
   9651             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong2Double2Ulong2: " + e.toString());
   9652         }
   9653         try {
   9654             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
   9655             scriptRelaxed.forEach_testConvertUlong2Double2Ulong2(inV, out);
   9656             verifyResultsConvertDouble2Ulong2(inV, out, true);
   9657         } catch (Exception e) {
   9658             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong2Double2Ulong2: " + e.toString());
   9659         }
   9660     }
   9661 
   9662     private void verifyResultsConvertDouble2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
   9663         double[] arrayInV = new double[INPUTSIZE * 2];
   9664         inV.copyTo(arrayInV);
   9665         long[] arrayOut = new long[INPUTSIZE * 2];
   9666         out.copyTo(arrayOut);
   9667         for (int i = 0; i < INPUTSIZE; i++) {
   9668             for (int j = 0; j < 2 ; j++) {
   9669                 // Extract the inputs.
   9670                 ArgumentsDoubleUlong args = new ArgumentsDoubleUlong();
   9671                 args.inV = arrayInV[i * 2 + j];
   9672                 // Figure out what the outputs should have been.
   9673                 CoreMathVerifier.computeConvert(args);
   9674                 // Validate the outputs.
   9675                 boolean valid = true;
   9676                 if (args.out != arrayOut[i * 2 + j]) {
   9677                     valid = false;
   9678                 }
   9679                 if (!valid) {
   9680                     StringBuilder message = new StringBuilder();
   9681                     message.append("Input inV: ");
   9682                     message.append(String.format("%24.8g {%16x} %31a",
   9683                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   9684                     message.append("\n");
   9685                     message.append("Expected output out: ");
   9686                     message.append(String.format("0x%x", args.out));
   9687                     message.append("\n");
   9688                     message.append("Actual   output out: ");
   9689                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   9690                     if (args.out != arrayOut[i * 2 + j]) {
   9691                         message.append(" FAIL");
   9692                     }
   9693                     message.append("\n");
   9694                     assertTrue("Incorrect output for checkConvertDouble2Ulong2" +
   9695                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9696                 }
   9697             }
   9698         }
   9699     }
   9700 
   9701     private void checkConvertDouble3Ulong3() {
   9702         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x42b73756742e203cl, 0.0000000000000000000e+00, 1.8446744073709549568e+19);
   9703         try {
   9704             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
   9705             script.forEach_testConvertUlong3Double3Ulong3(inV, out);
   9706             verifyResultsConvertDouble3Ulong3(inV, out, false);
   9707         } catch (Exception e) {
   9708             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong3Double3Ulong3: " + e.toString());
   9709         }
   9710         try {
   9711             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
   9712             scriptRelaxed.forEach_testConvertUlong3Double3Ulong3(inV, out);
   9713             verifyResultsConvertDouble3Ulong3(inV, out, true);
   9714         } catch (Exception e) {
   9715             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong3Double3Ulong3: " + e.toString());
   9716         }
   9717     }
   9718 
   9719     private void verifyResultsConvertDouble3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
   9720         double[] arrayInV = new double[INPUTSIZE * 4];
   9721         inV.copyTo(arrayInV);
   9722         long[] arrayOut = new long[INPUTSIZE * 4];
   9723         out.copyTo(arrayOut);
   9724         for (int i = 0; i < INPUTSIZE; i++) {
   9725             for (int j = 0; j < 3 ; j++) {
   9726                 // Extract the inputs.
   9727                 ArgumentsDoubleUlong args = new ArgumentsDoubleUlong();
   9728                 args.inV = arrayInV[i * 4 + j];
   9729                 // Figure out what the outputs should have been.
   9730                 CoreMathVerifier.computeConvert(args);
   9731                 // Validate the outputs.
   9732                 boolean valid = true;
   9733                 if (args.out != arrayOut[i * 4 + j]) {
   9734                     valid = false;
   9735                 }
   9736                 if (!valid) {
   9737                     StringBuilder message = new StringBuilder();
   9738                     message.append("Input inV: ");
   9739                     message.append(String.format("%24.8g {%16x} %31a",
   9740                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   9741                     message.append("\n");
   9742                     message.append("Expected output out: ");
   9743                     message.append(String.format("0x%x", args.out));
   9744                     message.append("\n");
   9745                     message.append("Actual   output out: ");
   9746                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   9747                     if (args.out != arrayOut[i * 4 + j]) {
   9748                         message.append(" FAIL");
   9749                     }
   9750                     message.append("\n");
   9751                     assertTrue("Incorrect output for checkConvertDouble3Ulong3" +
   9752                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9753                 }
   9754             }
   9755         }
   9756     }
   9757 
   9758     private void checkConvertDouble4Ulong4() {
   9759         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x42b900716a49411al, 0.0000000000000000000e+00, 1.8446744073709549568e+19);
   9760         try {
   9761             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
   9762             script.forEach_testConvertUlong4Double4Ulong4(inV, out);
   9763             verifyResultsConvertDouble4Ulong4(inV, out, false);
   9764         } catch (Exception e) {
   9765             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong4Double4Ulong4: " + e.toString());
   9766         }
   9767         try {
   9768             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
   9769             scriptRelaxed.forEach_testConvertUlong4Double4Ulong4(inV, out);
   9770             verifyResultsConvertDouble4Ulong4(inV, out, true);
   9771         } catch (Exception e) {
   9772             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong4Double4Ulong4: " + e.toString());
   9773         }
   9774     }
   9775 
   9776     private void verifyResultsConvertDouble4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
   9777         double[] arrayInV = new double[INPUTSIZE * 4];
   9778         inV.copyTo(arrayInV);
   9779         long[] arrayOut = new long[INPUTSIZE * 4];
   9780         out.copyTo(arrayOut);
   9781         for (int i = 0; i < INPUTSIZE; i++) {
   9782             for (int j = 0; j < 4 ; j++) {
   9783                 // Extract the inputs.
   9784                 ArgumentsDoubleUlong args = new ArgumentsDoubleUlong();
   9785                 args.inV = arrayInV[i * 4 + j];
   9786                 // Figure out what the outputs should have been.
   9787                 CoreMathVerifier.computeConvert(args);
   9788                 // Validate the outputs.
   9789                 boolean valid = true;
   9790                 if (args.out != arrayOut[i * 4 + j]) {
   9791                     valid = false;
   9792                 }
   9793                 if (!valid) {
   9794                     StringBuilder message = new StringBuilder();
   9795                     message.append("Input inV: ");
   9796                     message.append(String.format("%24.8g {%16x} %31a",
   9797                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   9798                     message.append("\n");
   9799                     message.append("Expected output out: ");
   9800                     message.append(String.format("0x%x", args.out));
   9801                     message.append("\n");
   9802                     message.append("Actual   output out: ");
   9803                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   9804                     if (args.out != arrayOut[i * 4 + j]) {
   9805                         message.append(" FAIL");
   9806                     }
   9807                     message.append("\n");
   9808                     assertTrue("Incorrect output for checkConvertDouble4Ulong4" +
   9809                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9810                 }
   9811             }
   9812         }
   9813     }
   9814 
   9815     public class ArgumentsLongUlong {
   9816         public long inV;
   9817         public long out;
   9818     }
   9819 
   9820     private void checkConvertLong2Ulong2() {
   9821         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x79f1a23ed7d40f65l, false, 63);
   9822         try {
   9823             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
   9824             script.forEach_testConvertUlong2Long2Ulong2(inV, out);
   9825             verifyResultsConvertLong2Ulong2(inV, out, false);
   9826         } catch (Exception e) {
   9827             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong2Long2Ulong2: " + e.toString());
   9828         }
   9829         try {
   9830             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
   9831             scriptRelaxed.forEach_testConvertUlong2Long2Ulong2(inV, out);
   9832             verifyResultsConvertLong2Ulong2(inV, out, true);
   9833         } catch (Exception e) {
   9834             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong2Long2Ulong2: " + e.toString());
   9835         }
   9836     }
   9837 
   9838     private void verifyResultsConvertLong2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
   9839         long[] arrayInV = new long[INPUTSIZE * 2];
   9840         inV.copyTo(arrayInV);
   9841         long[] arrayOut = new long[INPUTSIZE * 2];
   9842         out.copyTo(arrayOut);
   9843         for (int i = 0; i < INPUTSIZE; i++) {
   9844             for (int j = 0; j < 2 ; j++) {
   9845                 // Extract the inputs.
   9846                 ArgumentsLongUlong args = new ArgumentsLongUlong();
   9847                 args.inV = arrayInV[i * 2 + j];
   9848                 // Figure out what the outputs should have been.
   9849                 CoreMathVerifier.computeConvert(args);
   9850                 // Validate the outputs.
   9851                 boolean valid = true;
   9852                 if (args.out != arrayOut[i * 2 + j]) {
   9853                     valid = false;
   9854                 }
   9855                 if (!valid) {
   9856                     StringBuilder message = new StringBuilder();
   9857                     message.append("Input inV: ");
   9858                     message.append(String.format("%d", args.inV));
   9859                     message.append("\n");
   9860                     message.append("Expected output out: ");
   9861                     message.append(String.format("0x%x", args.out));
   9862                     message.append("\n");
   9863                     message.append("Actual   output out: ");
   9864                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   9865                     if (args.out != arrayOut[i * 2 + j]) {
   9866                         message.append(" FAIL");
   9867                     }
   9868                     message.append("\n");
   9869                     assertTrue("Incorrect output for checkConvertLong2Ulong2" +
   9870                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9871                 }
   9872             }
   9873         }
   9874     }
   9875 
   9876     private void checkConvertLong3Ulong3() {
   9877         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x79f36b59cdef3043l, false, 63);
   9878         try {
   9879             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
   9880             script.forEach_testConvertUlong3Long3Ulong3(inV, out);
   9881             verifyResultsConvertLong3Ulong3(inV, out, false);
   9882         } catch (Exception e) {
   9883             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong3Long3Ulong3: " + e.toString());
   9884         }
   9885         try {
   9886             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
   9887             scriptRelaxed.forEach_testConvertUlong3Long3Ulong3(inV, out);
   9888             verifyResultsConvertLong3Ulong3(inV, out, true);
   9889         } catch (Exception e) {
   9890             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong3Long3Ulong3: " + e.toString());
   9891         }
   9892     }
   9893 
   9894     private void verifyResultsConvertLong3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
   9895         long[] arrayInV = new long[INPUTSIZE * 4];
   9896         inV.copyTo(arrayInV);
   9897         long[] arrayOut = new long[INPUTSIZE * 4];
   9898         out.copyTo(arrayOut);
   9899         for (int i = 0; i < INPUTSIZE; i++) {
   9900             for (int j = 0; j < 3 ; j++) {
   9901                 // Extract the inputs.
   9902                 ArgumentsLongUlong args = new ArgumentsLongUlong();
   9903                 args.inV = arrayInV[i * 4 + j];
   9904                 // Figure out what the outputs should have been.
   9905                 CoreMathVerifier.computeConvert(args);
   9906                 // Validate the outputs.
   9907                 boolean valid = true;
   9908                 if (args.out != arrayOut[i * 4 + j]) {
   9909                     valid = false;
   9910                 }
   9911                 if (!valid) {
   9912                     StringBuilder message = new StringBuilder();
   9913                     message.append("Input inV: ");
   9914                     message.append(String.format("%d", args.inV));
   9915                     message.append("\n");
   9916                     message.append("Expected output out: ");
   9917                     message.append(String.format("0x%x", args.out));
   9918                     message.append("\n");
   9919                     message.append("Actual   output out: ");
   9920                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   9921                     if (args.out != arrayOut[i * 4 + j]) {
   9922                         message.append(" FAIL");
   9923                     }
   9924                     message.append("\n");
   9925                     assertTrue("Incorrect output for checkConvertLong3Ulong3" +
   9926                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9927                 }
   9928             }
   9929         }
   9930     }
   9931 
   9932     private void checkConvertLong4Ulong4() {
   9933         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x79f53474c40a5121l, false, 63);
   9934         try {
   9935             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
   9936             script.forEach_testConvertUlong4Long4Ulong4(inV, out);
   9937             verifyResultsConvertLong4Ulong4(inV, out, false);
   9938         } catch (Exception e) {
   9939             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong4Long4Ulong4: " + e.toString());
   9940         }
   9941         try {
   9942             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
   9943             scriptRelaxed.forEach_testConvertUlong4Long4Ulong4(inV, out);
   9944             verifyResultsConvertLong4Ulong4(inV, out, true);
   9945         } catch (Exception e) {
   9946             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong4Long4Ulong4: " + e.toString());
   9947         }
   9948     }
   9949 
   9950     private void verifyResultsConvertLong4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
   9951         long[] arrayInV = new long[INPUTSIZE * 4];
   9952         inV.copyTo(arrayInV);
   9953         long[] arrayOut = new long[INPUTSIZE * 4];
   9954         out.copyTo(arrayOut);
   9955         for (int i = 0; i < INPUTSIZE; i++) {
   9956             for (int j = 0; j < 4 ; j++) {
   9957                 // Extract the inputs.
   9958                 ArgumentsLongUlong args = new ArgumentsLongUlong();
   9959                 args.inV = arrayInV[i * 4 + j];
   9960                 // Figure out what the outputs should have been.
   9961                 CoreMathVerifier.computeConvert(args);
   9962                 // Validate the outputs.
   9963                 boolean valid = true;
   9964                 if (args.out != arrayOut[i * 4 + j]) {
   9965                     valid = false;
   9966                 }
   9967                 if (!valid) {
   9968                     StringBuilder message = new StringBuilder();
   9969                     message.append("Input inV: ");
   9970                     message.append(String.format("%d", args.inV));
   9971                     message.append("\n");
   9972                     message.append("Expected output out: ");
   9973                     message.append(String.format("0x%x", args.out));
   9974                     message.append("\n");
   9975                     message.append("Actual   output out: ");
   9976                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   9977                     if (args.out != arrayOut[i * 4 + j]) {
   9978                         message.append(" FAIL");
   9979                     }
   9980                     message.append("\n");
   9981                     assertTrue("Incorrect output for checkConvertLong4Ulong4" +
   9982                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   9983                 }
   9984             }
   9985         }
   9986     }
   9987 
   9988     public class ArgumentsUlongUlong {
   9989         public long inV;
   9990         public long out;
   9991     }
   9992 
   9993     private void checkConvertUlong2Ulong2() {
   9994         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x9ebfc24673ac2910l, false, 64);
   9995         try {
   9996             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
   9997             script.forEach_testConvertUlong2Ulong2Ulong2(inV, out);
   9998             verifyResultsConvertUlong2Ulong2(inV, out, false);
   9999         } catch (Exception e) {
   10000             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong2Ulong2Ulong2: " + e.toString());
   10001         }
   10002         try {
   10003             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
   10004             scriptRelaxed.forEach_testConvertUlong2Ulong2Ulong2(inV, out);
   10005             verifyResultsConvertUlong2Ulong2(inV, out, true);
   10006         } catch (Exception e) {
   10007             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong2Ulong2Ulong2: " + e.toString());
   10008         }
   10009     }
   10010 
   10011     private void verifyResultsConvertUlong2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
   10012         long[] arrayInV = new long[INPUTSIZE * 2];
   10013         inV.copyTo(arrayInV);
   10014         long[] arrayOut = new long[INPUTSIZE * 2];
   10015         out.copyTo(arrayOut);
   10016         for (int i = 0; i < INPUTSIZE; i++) {
   10017             for (int j = 0; j < 2 ; j++) {
   10018                 // Extract the inputs.
   10019                 ArgumentsUlongUlong args = new ArgumentsUlongUlong();
   10020                 args.inV = arrayInV[i * 2 + j];
   10021                 // Figure out what the outputs should have been.
   10022                 CoreMathVerifier.computeConvert(args);
   10023                 // Validate the outputs.
   10024                 boolean valid = true;
   10025                 if (args.out != arrayOut[i * 2 + j]) {
   10026                     valid = false;
   10027                 }
   10028                 if (!valid) {
   10029                     StringBuilder message = new StringBuilder();
   10030                     message.append("Input inV: ");
   10031                     message.append(String.format("0x%x", args.inV));
   10032                     message.append("\n");
   10033                     message.append("Expected output out: ");
   10034                     message.append(String.format("0x%x", args.out));
   10035                     message.append("\n");
   10036                     message.append("Actual   output out: ");
   10037                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   10038                     if (args.out != arrayOut[i * 2 + j]) {
   10039                         message.append(" FAIL");
   10040                     }
   10041                     message.append("\n");
   10042                     assertTrue("Incorrect output for checkConvertUlong2Ulong2" +
   10043                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10044                 }
   10045             }
   10046         }
   10047     }
   10048 
   10049     private void checkConvertUlong3Ulong3() {
   10050         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x9ec18b6169c749eel, false, 64);
   10051         try {
   10052             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
   10053             script.forEach_testConvertUlong3Ulong3Ulong3(inV, out);
   10054             verifyResultsConvertUlong3Ulong3(inV, out, false);
   10055         } catch (Exception e) {
   10056             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong3Ulong3Ulong3: " + e.toString());
   10057         }
   10058         try {
   10059             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
   10060             scriptRelaxed.forEach_testConvertUlong3Ulong3Ulong3(inV, out);
   10061             verifyResultsConvertUlong3Ulong3(inV, out, true);
   10062         } catch (Exception e) {
   10063             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong3Ulong3Ulong3: " + e.toString());
   10064         }
   10065     }
   10066 
   10067     private void verifyResultsConvertUlong3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
   10068         long[] arrayInV = new long[INPUTSIZE * 4];
   10069         inV.copyTo(arrayInV);
   10070         long[] arrayOut = new long[INPUTSIZE * 4];
   10071         out.copyTo(arrayOut);
   10072         for (int i = 0; i < INPUTSIZE; i++) {
   10073             for (int j = 0; j < 3 ; j++) {
   10074                 // Extract the inputs.
   10075                 ArgumentsUlongUlong args = new ArgumentsUlongUlong();
   10076                 args.inV = arrayInV[i * 4 + j];
   10077                 // Figure out what the outputs should have been.
   10078                 CoreMathVerifier.computeConvert(args);
   10079                 // Validate the outputs.
   10080                 boolean valid = true;
   10081                 if (args.out != arrayOut[i * 4 + j]) {
   10082                     valid = false;
   10083                 }
   10084                 if (!valid) {
   10085                     StringBuilder message = new StringBuilder();
   10086                     message.append("Input inV: ");
   10087                     message.append(String.format("0x%x", args.inV));
   10088                     message.append("\n");
   10089                     message.append("Expected output out: ");
   10090                     message.append(String.format("0x%x", args.out));
   10091                     message.append("\n");
   10092                     message.append("Actual   output out: ");
   10093                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   10094                     if (args.out != arrayOut[i * 4 + j]) {
   10095                         message.append(" FAIL");
   10096                     }
   10097                     message.append("\n");
   10098                     assertTrue("Incorrect output for checkConvertUlong3Ulong3" +
   10099                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10100                 }
   10101             }
   10102         }
   10103     }
   10104 
   10105     private void checkConvertUlong4Ulong4() {
   10106         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x9ec3547c5fe26accl, false, 64);
   10107         try {
   10108             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
   10109             script.forEach_testConvertUlong4Ulong4Ulong4(inV, out);
   10110             verifyResultsConvertUlong4Ulong4(inV, out, false);
   10111         } catch (Exception e) {
   10112             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong4Ulong4Ulong4: " + e.toString());
   10113         }
   10114         try {
   10115             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
   10116             scriptRelaxed.forEach_testConvertUlong4Ulong4Ulong4(inV, out);
   10117             verifyResultsConvertUlong4Ulong4(inV, out, true);
   10118         } catch (Exception e) {
   10119             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUlong4Ulong4Ulong4: " + e.toString());
   10120         }
   10121     }
   10122 
   10123     private void verifyResultsConvertUlong4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
   10124         long[] arrayInV = new long[INPUTSIZE * 4];
   10125         inV.copyTo(arrayInV);
   10126         long[] arrayOut = new long[INPUTSIZE * 4];
   10127         out.copyTo(arrayOut);
   10128         for (int i = 0; i < INPUTSIZE; i++) {
   10129             for (int j = 0; j < 4 ; j++) {
   10130                 // Extract the inputs.
   10131                 ArgumentsUlongUlong args = new ArgumentsUlongUlong();
   10132                 args.inV = arrayInV[i * 4 + j];
   10133                 // Figure out what the outputs should have been.
   10134                 CoreMathVerifier.computeConvert(args);
   10135                 // Validate the outputs.
   10136                 boolean valid = true;
   10137                 if (args.out != arrayOut[i * 4 + j]) {
   10138                     valid = false;
   10139                 }
   10140                 if (!valid) {
   10141                     StringBuilder message = new StringBuilder();
   10142                     message.append("Input inV: ");
   10143                     message.append(String.format("0x%x", args.inV));
   10144                     message.append("\n");
   10145                     message.append("Expected output out: ");
   10146                     message.append(String.format("0x%x", args.out));
   10147                     message.append("\n");
   10148                     message.append("Actual   output out: ");
   10149                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   10150                     if (args.out != arrayOut[i * 4 + j]) {
   10151                         message.append(" FAIL");
   10152                     }
   10153                     message.append("\n");
   10154                     assertTrue("Incorrect output for checkConvertUlong4Ulong4" +
   10155                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10156                 }
   10157             }
   10158         }
   10159     }
   10160 
   10161     public class ArgumentsDoubleFloat {
   10162         public double inV;
   10163         public Target.Floaty out;
   10164     }
   10165 
   10166     private void checkConvertDouble2Float2() {
   10167         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x42b4cec67d6d9a2dl, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
   10168         try {
   10169             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
   10170             script.forEach_testConvertFloat2Double2Float2(inV, out);
   10171             verifyResultsConvertDouble2Float2(inV, out, false);
   10172         } catch (Exception e) {
   10173             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Double2Float2: " + e.toString());
   10174         }
   10175         try {
   10176             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
   10177             scriptRelaxed.forEach_testConvertFloat2Double2Float2(inV, out);
   10178             verifyResultsConvertDouble2Float2(inV, out, true);
   10179         } catch (Exception e) {
   10180             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Double2Float2: " + e.toString());
   10181         }
   10182     }
   10183 
   10184     private void verifyResultsConvertDouble2Float2(Allocation inV, Allocation out, boolean relaxed) {
   10185         double[] arrayInV = new double[INPUTSIZE * 2];
   10186         inV.copyTo(arrayInV);
   10187         float[] arrayOut = new float[INPUTSIZE * 2];
   10188         out.copyTo(arrayOut);
   10189         for (int i = 0; i < INPUTSIZE; i++) {
   10190             for (int j = 0; j < 2 ; j++) {
   10191                 // Extract the inputs.
   10192                 ArgumentsDoubleFloat args = new ArgumentsDoubleFloat();
   10193                 args.inV = arrayInV[i * 2 + j];
   10194                 // Figure out what the outputs should have been.
   10195                 Target target = new Target(relaxed);
   10196                 CoreMathVerifier.computeConvert(args, target);
   10197                 // Validate the outputs.
   10198                 boolean valid = true;
   10199                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   10200                     valid = false;
   10201                 }
   10202                 if (!valid) {
   10203                     StringBuilder message = new StringBuilder();
   10204                     message.append("Input inV: ");
   10205                     message.append(String.format("%24.8g {%16x} %31a",
   10206                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   10207                     message.append("\n");
   10208                     message.append("Expected output out: ");
   10209                     message.append(args.out.toString());
   10210                     message.append("\n");
   10211                     message.append("Actual   output out: ");
   10212                     message.append(String.format("%14.8g {%8x} %15a",
   10213                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   10214                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   10215                         message.append(" FAIL");
   10216                     }
   10217                     message.append("\n");
   10218                     assertTrue("Incorrect output for checkConvertDouble2Float2" +
   10219                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10220                 }
   10221             }
   10222         }
   10223     }
   10224 
   10225     private void checkConvertDouble3Float3() {
   10226         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x42b697e17388bb0bl, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
   10227         try {
   10228             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
   10229             script.forEach_testConvertFloat3Double3Float3(inV, out);
   10230             verifyResultsConvertDouble3Float3(inV, out, false);
   10231         } catch (Exception e) {
   10232             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Double3Float3: " + e.toString());
   10233         }
   10234         try {
   10235             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
   10236             scriptRelaxed.forEach_testConvertFloat3Double3Float3(inV, out);
   10237             verifyResultsConvertDouble3Float3(inV, out, true);
   10238         } catch (Exception e) {
   10239             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Double3Float3: " + e.toString());
   10240         }
   10241     }
   10242 
   10243     private void verifyResultsConvertDouble3Float3(Allocation inV, Allocation out, boolean relaxed) {
   10244         double[] arrayInV = new double[INPUTSIZE * 4];
   10245         inV.copyTo(arrayInV);
   10246         float[] arrayOut = new float[INPUTSIZE * 4];
   10247         out.copyTo(arrayOut);
   10248         for (int i = 0; i < INPUTSIZE; i++) {
   10249             for (int j = 0; j < 3 ; j++) {
   10250                 // Extract the inputs.
   10251                 ArgumentsDoubleFloat args = new ArgumentsDoubleFloat();
   10252                 args.inV = arrayInV[i * 4 + j];
   10253                 // Figure out what the outputs should have been.
   10254                 Target target = new Target(relaxed);
   10255                 CoreMathVerifier.computeConvert(args, target);
   10256                 // Validate the outputs.
   10257                 boolean valid = true;
   10258                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10259                     valid = false;
   10260                 }
   10261                 if (!valid) {
   10262                     StringBuilder message = new StringBuilder();
   10263                     message.append("Input inV: ");
   10264                     message.append(String.format("%24.8g {%16x} %31a",
   10265                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   10266                     message.append("\n");
   10267                     message.append("Expected output out: ");
   10268                     message.append(args.out.toString());
   10269                     message.append("\n");
   10270                     message.append("Actual   output out: ");
   10271                     message.append(String.format("%14.8g {%8x} %15a",
   10272                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   10273                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10274                         message.append(" FAIL");
   10275                     }
   10276                     message.append("\n");
   10277                     assertTrue("Incorrect output for checkConvertDouble3Float3" +
   10278                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10279                 }
   10280             }
   10281         }
   10282     }
   10283 
   10284     private void checkConvertDouble4Float4() {
   10285         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x42b860fc69a3dbe9l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
   10286         try {
   10287             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
   10288             script.forEach_testConvertFloat4Double4Float4(inV, out);
   10289             verifyResultsConvertDouble4Float4(inV, out, false);
   10290         } catch (Exception e) {
   10291             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Double4Float4: " + e.toString());
   10292         }
   10293         try {
   10294             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
   10295             scriptRelaxed.forEach_testConvertFloat4Double4Float4(inV, out);
   10296             verifyResultsConvertDouble4Float4(inV, out, true);
   10297         } catch (Exception e) {
   10298             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Double4Float4: " + e.toString());
   10299         }
   10300     }
   10301 
   10302     private void verifyResultsConvertDouble4Float4(Allocation inV, Allocation out, boolean relaxed) {
   10303         double[] arrayInV = new double[INPUTSIZE * 4];
   10304         inV.copyTo(arrayInV);
   10305         float[] arrayOut = new float[INPUTSIZE * 4];
   10306         out.copyTo(arrayOut);
   10307         for (int i = 0; i < INPUTSIZE; i++) {
   10308             for (int j = 0; j < 4 ; j++) {
   10309                 // Extract the inputs.
   10310                 ArgumentsDoubleFloat args = new ArgumentsDoubleFloat();
   10311                 args.inV = arrayInV[i * 4 + j];
   10312                 // Figure out what the outputs should have been.
   10313                 Target target = new Target(relaxed);
   10314                 CoreMathVerifier.computeConvert(args, target);
   10315                 // Validate the outputs.
   10316                 boolean valid = true;
   10317                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10318                     valid = false;
   10319                 }
   10320                 if (!valid) {
   10321                     StringBuilder message = new StringBuilder();
   10322                     message.append("Input inV: ");
   10323                     message.append(String.format("%24.8g {%16x} %31a",
   10324                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   10325                     message.append("\n");
   10326                     message.append("Expected output out: ");
   10327                     message.append(args.out.toString());
   10328                     message.append("\n");
   10329                     message.append("Actual   output out: ");
   10330                     message.append(String.format("%14.8g {%8x} %15a",
   10331                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   10332                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10333                         message.append(" FAIL");
   10334                     }
   10335                     message.append("\n");
   10336                     assertTrue("Incorrect output for checkConvertDouble4Float4" +
   10337                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10338                 }
   10339             }
   10340         }
   10341     }
   10342 
   10343     public class ArgumentsLongFloat {
   10344         public long inV;
   10345         public Target.Floaty out;
   10346     }
   10347 
   10348     private void checkConvertLong2Float2() {
   10349         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x79f102c9d72eaa34l, true, 63);
   10350         try {
   10351             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
   10352             script.forEach_testConvertFloat2Long2Float2(inV, out);
   10353             verifyResultsConvertLong2Float2(inV, out, false);
   10354         } catch (Exception e) {
   10355             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Long2Float2: " + e.toString());
   10356         }
   10357         try {
   10358             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
   10359             scriptRelaxed.forEach_testConvertFloat2Long2Float2(inV, out);
   10360             verifyResultsConvertLong2Float2(inV, out, true);
   10361         } catch (Exception e) {
   10362             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Long2Float2: " + e.toString());
   10363         }
   10364     }
   10365 
   10366     private void verifyResultsConvertLong2Float2(Allocation inV, Allocation out, boolean relaxed) {
   10367         long[] arrayInV = new long[INPUTSIZE * 2];
   10368         inV.copyTo(arrayInV);
   10369         float[] arrayOut = new float[INPUTSIZE * 2];
   10370         out.copyTo(arrayOut);
   10371         for (int i = 0; i < INPUTSIZE; i++) {
   10372             for (int j = 0; j < 2 ; j++) {
   10373                 // Extract the inputs.
   10374                 ArgumentsLongFloat args = new ArgumentsLongFloat();
   10375                 args.inV = arrayInV[i * 2 + j];
   10376                 // Figure out what the outputs should have been.
   10377                 Target target = new Target(relaxed);
   10378                 CoreMathVerifier.computeConvert(args, target);
   10379                 // Validate the outputs.
   10380                 boolean valid = true;
   10381                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   10382                     valid = false;
   10383                 }
   10384                 if (!valid) {
   10385                     StringBuilder message = new StringBuilder();
   10386                     message.append("Input inV: ");
   10387                     message.append(String.format("%d", args.inV));
   10388                     message.append("\n");
   10389                     message.append("Expected output out: ");
   10390                     message.append(args.out.toString());
   10391                     message.append("\n");
   10392                     message.append("Actual   output out: ");
   10393                     message.append(String.format("%14.8g {%8x} %15a",
   10394                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   10395                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   10396                         message.append(" FAIL");
   10397                     }
   10398                     message.append("\n");
   10399                     assertTrue("Incorrect output for checkConvertLong2Float2" +
   10400                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10401                 }
   10402             }
   10403         }
   10404     }
   10405 
   10406     private void checkConvertLong3Float3() {
   10407         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x79f2cbe4cd49cb12l, true, 63);
   10408         try {
   10409             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
   10410             script.forEach_testConvertFloat3Long3Float3(inV, out);
   10411             verifyResultsConvertLong3Float3(inV, out, false);
   10412         } catch (Exception e) {
   10413             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Long3Float3: " + e.toString());
   10414         }
   10415         try {
   10416             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
   10417             scriptRelaxed.forEach_testConvertFloat3Long3Float3(inV, out);
   10418             verifyResultsConvertLong3Float3(inV, out, true);
   10419         } catch (Exception e) {
   10420             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Long3Float3: " + e.toString());
   10421         }
   10422     }
   10423 
   10424     private void verifyResultsConvertLong3Float3(Allocation inV, Allocation out, boolean relaxed) {
   10425         long[] arrayInV = new long[INPUTSIZE * 4];
   10426         inV.copyTo(arrayInV);
   10427         float[] arrayOut = new float[INPUTSIZE * 4];
   10428         out.copyTo(arrayOut);
   10429         for (int i = 0; i < INPUTSIZE; i++) {
   10430             for (int j = 0; j < 3 ; j++) {
   10431                 // Extract the inputs.
   10432                 ArgumentsLongFloat args = new ArgumentsLongFloat();
   10433                 args.inV = arrayInV[i * 4 + j];
   10434                 // Figure out what the outputs should have been.
   10435                 Target target = new Target(relaxed);
   10436                 CoreMathVerifier.computeConvert(args, target);
   10437                 // Validate the outputs.
   10438                 boolean valid = true;
   10439                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10440                     valid = false;
   10441                 }
   10442                 if (!valid) {
   10443                     StringBuilder message = new StringBuilder();
   10444                     message.append("Input inV: ");
   10445                     message.append(String.format("%d", args.inV));
   10446                     message.append("\n");
   10447                     message.append("Expected output out: ");
   10448                     message.append(args.out.toString());
   10449                     message.append("\n");
   10450                     message.append("Actual   output out: ");
   10451                     message.append(String.format("%14.8g {%8x} %15a",
   10452                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   10453                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10454                         message.append(" FAIL");
   10455                     }
   10456                     message.append("\n");
   10457                     assertTrue("Incorrect output for checkConvertLong3Float3" +
   10458                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10459                 }
   10460             }
   10461         }
   10462     }
   10463 
   10464     private void checkConvertLong4Float4() {
   10465         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x79f494ffc364ebf0l, true, 63);
   10466         try {
   10467             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
   10468             script.forEach_testConvertFloat4Long4Float4(inV, out);
   10469             verifyResultsConvertLong4Float4(inV, out, false);
   10470         } catch (Exception e) {
   10471             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Long4Float4: " + e.toString());
   10472         }
   10473         try {
   10474             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
   10475             scriptRelaxed.forEach_testConvertFloat4Long4Float4(inV, out);
   10476             verifyResultsConvertLong4Float4(inV, out, true);
   10477         } catch (Exception e) {
   10478             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Long4Float4: " + e.toString());
   10479         }
   10480     }
   10481 
   10482     private void verifyResultsConvertLong4Float4(Allocation inV, Allocation out, boolean relaxed) {
   10483         long[] arrayInV = new long[INPUTSIZE * 4];
   10484         inV.copyTo(arrayInV);
   10485         float[] arrayOut = new float[INPUTSIZE * 4];
   10486         out.copyTo(arrayOut);
   10487         for (int i = 0; i < INPUTSIZE; i++) {
   10488             for (int j = 0; j < 4 ; j++) {
   10489                 // Extract the inputs.
   10490                 ArgumentsLongFloat args = new ArgumentsLongFloat();
   10491                 args.inV = arrayInV[i * 4 + j];
   10492                 // Figure out what the outputs should have been.
   10493                 Target target = new Target(relaxed);
   10494                 CoreMathVerifier.computeConvert(args, target);
   10495                 // Validate the outputs.
   10496                 boolean valid = true;
   10497                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10498                     valid = false;
   10499                 }
   10500                 if (!valid) {
   10501                     StringBuilder message = new StringBuilder();
   10502                     message.append("Input inV: ");
   10503                     message.append(String.format("%d", args.inV));
   10504                     message.append("\n");
   10505                     message.append("Expected output out: ");
   10506                     message.append(args.out.toString());
   10507                     message.append("\n");
   10508                     message.append("Actual   output out: ");
   10509                     message.append(String.format("%14.8g {%8x} %15a",
   10510                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   10511                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10512                         message.append(" FAIL");
   10513                     }
   10514                     message.append("\n");
   10515                     assertTrue("Incorrect output for checkConvertLong4Float4" +
   10516                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10517                 }
   10518             }
   10519         }
   10520     }
   10521 
   10522     public class ArgumentsUlongFloat {
   10523         public long inV;
   10524         public Target.Floaty out;
   10525     }
   10526 
   10527     private void checkConvertUlong2Float2() {
   10528         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x9ebf22d17306c3dfl, false, 64);
   10529         try {
   10530             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
   10531             script.forEach_testConvertFloat2Ulong2Float2(inV, out);
   10532             verifyResultsConvertUlong2Float2(inV, out, false);
   10533         } catch (Exception e) {
   10534             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Ulong2Float2: " + e.toString());
   10535         }
   10536         try {
   10537             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
   10538             scriptRelaxed.forEach_testConvertFloat2Ulong2Float2(inV, out);
   10539             verifyResultsConvertUlong2Float2(inV, out, true);
   10540         } catch (Exception e) {
   10541             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat2Ulong2Float2: " + e.toString());
   10542         }
   10543     }
   10544 
   10545     private void verifyResultsConvertUlong2Float2(Allocation inV, Allocation out, boolean relaxed) {
   10546         long[] arrayInV = new long[INPUTSIZE * 2];
   10547         inV.copyTo(arrayInV);
   10548         float[] arrayOut = new float[INPUTSIZE * 2];
   10549         out.copyTo(arrayOut);
   10550         for (int i = 0; i < INPUTSIZE; i++) {
   10551             for (int j = 0; j < 2 ; j++) {
   10552                 // Extract the inputs.
   10553                 ArgumentsUlongFloat args = new ArgumentsUlongFloat();
   10554                 args.inV = arrayInV[i * 2 + j];
   10555                 // Figure out what the outputs should have been.
   10556                 Target target = new Target(relaxed);
   10557                 CoreMathVerifier.computeConvert(args, target);
   10558                 // Validate the outputs.
   10559                 boolean valid = true;
   10560                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   10561                     valid = false;
   10562                 }
   10563                 if (!valid) {
   10564                     StringBuilder message = new StringBuilder();
   10565                     message.append("Input inV: ");
   10566                     message.append(String.format("0x%x", args.inV));
   10567                     message.append("\n");
   10568                     message.append("Expected output out: ");
   10569                     message.append(args.out.toString());
   10570                     message.append("\n");
   10571                     message.append("Actual   output out: ");
   10572                     message.append(String.format("%14.8g {%8x} %15a",
   10573                             arrayOut[i * 2 + j], Float.floatToRawIntBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   10574                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   10575                         message.append(" FAIL");
   10576                     }
   10577                     message.append("\n");
   10578                     assertTrue("Incorrect output for checkConvertUlong2Float2" +
   10579                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10580                 }
   10581             }
   10582         }
   10583     }
   10584 
   10585     private void checkConvertUlong3Float3() {
   10586         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x9ec0ebec6921e4bdl, false, 64);
   10587         try {
   10588             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
   10589             script.forEach_testConvertFloat3Ulong3Float3(inV, out);
   10590             verifyResultsConvertUlong3Float3(inV, out, false);
   10591         } catch (Exception e) {
   10592             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Ulong3Float3: " + e.toString());
   10593         }
   10594         try {
   10595             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
   10596             scriptRelaxed.forEach_testConvertFloat3Ulong3Float3(inV, out);
   10597             verifyResultsConvertUlong3Float3(inV, out, true);
   10598         } catch (Exception e) {
   10599             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat3Ulong3Float3: " + e.toString());
   10600         }
   10601     }
   10602 
   10603     private void verifyResultsConvertUlong3Float3(Allocation inV, Allocation out, boolean relaxed) {
   10604         long[] arrayInV = new long[INPUTSIZE * 4];
   10605         inV.copyTo(arrayInV);
   10606         float[] arrayOut = new float[INPUTSIZE * 4];
   10607         out.copyTo(arrayOut);
   10608         for (int i = 0; i < INPUTSIZE; i++) {
   10609             for (int j = 0; j < 3 ; j++) {
   10610                 // Extract the inputs.
   10611                 ArgumentsUlongFloat args = new ArgumentsUlongFloat();
   10612                 args.inV = arrayInV[i * 4 + j];
   10613                 // Figure out what the outputs should have been.
   10614                 Target target = new Target(relaxed);
   10615                 CoreMathVerifier.computeConvert(args, target);
   10616                 // Validate the outputs.
   10617                 boolean valid = true;
   10618                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10619                     valid = false;
   10620                 }
   10621                 if (!valid) {
   10622                     StringBuilder message = new StringBuilder();
   10623                     message.append("Input inV: ");
   10624                     message.append(String.format("0x%x", args.inV));
   10625                     message.append("\n");
   10626                     message.append("Expected output out: ");
   10627                     message.append(args.out.toString());
   10628                     message.append("\n");
   10629                     message.append("Actual   output out: ");
   10630                     message.append(String.format("%14.8g {%8x} %15a",
   10631                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   10632                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10633                         message.append(" FAIL");
   10634                     }
   10635                     message.append("\n");
   10636                     assertTrue("Incorrect output for checkConvertUlong3Float3" +
   10637                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10638                 }
   10639             }
   10640         }
   10641     }
   10642 
   10643     private void checkConvertUlong4Float4() {
   10644         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x9ec2b5075f3d059bl, false, 64);
   10645         try {
   10646             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
   10647             script.forEach_testConvertFloat4Ulong4Float4(inV, out);
   10648             verifyResultsConvertUlong4Float4(inV, out, false);
   10649         } catch (Exception e) {
   10650             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Ulong4Float4: " + e.toString());
   10651         }
   10652         try {
   10653             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
   10654             scriptRelaxed.forEach_testConvertFloat4Ulong4Float4(inV, out);
   10655             verifyResultsConvertUlong4Float4(inV, out, true);
   10656         } catch (Exception e) {
   10657             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertFloat4Ulong4Float4: " + e.toString());
   10658         }
   10659     }
   10660 
   10661     private void verifyResultsConvertUlong4Float4(Allocation inV, Allocation out, boolean relaxed) {
   10662         long[] arrayInV = new long[INPUTSIZE * 4];
   10663         inV.copyTo(arrayInV);
   10664         float[] arrayOut = new float[INPUTSIZE * 4];
   10665         out.copyTo(arrayOut);
   10666         for (int i = 0; i < INPUTSIZE; i++) {
   10667             for (int j = 0; j < 4 ; j++) {
   10668                 // Extract the inputs.
   10669                 ArgumentsUlongFloat args = new ArgumentsUlongFloat();
   10670                 args.inV = arrayInV[i * 4 + j];
   10671                 // Figure out what the outputs should have been.
   10672                 Target target = new Target(relaxed);
   10673                 CoreMathVerifier.computeConvert(args, target);
   10674                 // Validate the outputs.
   10675                 boolean valid = true;
   10676                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10677                     valid = false;
   10678                 }
   10679                 if (!valid) {
   10680                     StringBuilder message = new StringBuilder();
   10681                     message.append("Input inV: ");
   10682                     message.append(String.format("0x%x", args.inV));
   10683                     message.append("\n");
   10684                     message.append("Expected output out: ");
   10685                     message.append(args.out.toString());
   10686                     message.append("\n");
   10687                     message.append("Actual   output out: ");
   10688                     message.append(String.format("%14.8g {%8x} %15a",
   10689                             arrayOut[i * 4 + j], Float.floatToRawIntBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   10690                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   10691                         message.append(" FAIL");
   10692                     }
   10693                     message.append("\n");
   10694                     assertTrue("Incorrect output for checkConvertUlong4Float4" +
   10695                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10696                 }
   10697             }
   10698         }
   10699     }
   10700 
   10701     public class ArgumentsDoubleChar {
   10702         public double inV;
   10703         public byte out;
   10704     }
   10705 
   10706     private void checkConvertDouble2Char2() {
   10707         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xcbf84b7bef094a17l, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
   10708         try {
   10709             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   10710             script.forEach_testConvertChar2Double2Char2(inV, out);
   10711             verifyResultsConvertDouble2Char2(inV, out, false);
   10712         } catch (Exception e) {
   10713             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Double2Char2: " + e.toString());
   10714         }
   10715         try {
   10716             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   10717             scriptRelaxed.forEach_testConvertChar2Double2Char2(inV, out);
   10718             verifyResultsConvertDouble2Char2(inV, out, true);
   10719         } catch (Exception e) {
   10720             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Double2Char2: " + e.toString());
   10721         }
   10722     }
   10723 
   10724     private void verifyResultsConvertDouble2Char2(Allocation inV, Allocation out, boolean relaxed) {
   10725         double[] arrayInV = new double[INPUTSIZE * 2];
   10726         inV.copyTo(arrayInV);
   10727         byte[] arrayOut = new byte[INPUTSIZE * 2];
   10728         out.copyTo(arrayOut);
   10729         for (int i = 0; i < INPUTSIZE; i++) {
   10730             for (int j = 0; j < 2 ; j++) {
   10731                 // Extract the inputs.
   10732                 ArgumentsDoubleChar args = new ArgumentsDoubleChar();
   10733                 args.inV = arrayInV[i * 2 + j];
   10734                 // Figure out what the outputs should have been.
   10735                 CoreMathVerifier.computeConvert(args);
   10736                 // Validate the outputs.
   10737                 boolean valid = true;
   10738                 if (args.out != arrayOut[i * 2 + j]) {
   10739                     valid = false;
   10740                 }
   10741                 if (!valid) {
   10742                     StringBuilder message = new StringBuilder();
   10743                     message.append("Input inV: ");
   10744                     message.append(String.format("%24.8g {%16x} %31a",
   10745                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   10746                     message.append("\n");
   10747                     message.append("Expected output out: ");
   10748                     message.append(String.format("%d", args.out));
   10749                     message.append("\n");
   10750                     message.append("Actual   output out: ");
   10751                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   10752                     if (args.out != arrayOut[i * 2 + j]) {
   10753                         message.append(" FAIL");
   10754                     }
   10755                     message.append("\n");
   10756                     assertTrue("Incorrect output for checkConvertDouble2Char2" +
   10757                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10758                 }
   10759             }
   10760         }
   10761     }
   10762 
   10763     private void checkConvertDouble3Char3() {
   10764         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0xcbf8561d4e110f0bl, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
   10765         try {
   10766             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   10767             script.forEach_testConvertChar3Double3Char3(inV, out);
   10768             verifyResultsConvertDouble3Char3(inV, out, false);
   10769         } catch (Exception e) {
   10770             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Double3Char3: " + e.toString());
   10771         }
   10772         try {
   10773             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   10774             scriptRelaxed.forEach_testConvertChar3Double3Char3(inV, out);
   10775             verifyResultsConvertDouble3Char3(inV, out, true);
   10776         } catch (Exception e) {
   10777             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Double3Char3: " + e.toString());
   10778         }
   10779     }
   10780 
   10781     private void verifyResultsConvertDouble3Char3(Allocation inV, Allocation out, boolean relaxed) {
   10782         double[] arrayInV = new double[INPUTSIZE * 4];
   10783         inV.copyTo(arrayInV);
   10784         byte[] arrayOut = new byte[INPUTSIZE * 4];
   10785         out.copyTo(arrayOut);
   10786         for (int i = 0; i < INPUTSIZE; i++) {
   10787             for (int j = 0; j < 3 ; j++) {
   10788                 // Extract the inputs.
   10789                 ArgumentsDoubleChar args = new ArgumentsDoubleChar();
   10790                 args.inV = arrayInV[i * 4 + j];
   10791                 // Figure out what the outputs should have been.
   10792                 CoreMathVerifier.computeConvert(args);
   10793                 // Validate the outputs.
   10794                 boolean valid = true;
   10795                 if (args.out != arrayOut[i * 4 + j]) {
   10796                     valid = false;
   10797                 }
   10798                 if (!valid) {
   10799                     StringBuilder message = new StringBuilder();
   10800                     message.append("Input inV: ");
   10801                     message.append(String.format("%24.8g {%16x} %31a",
   10802                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   10803                     message.append("\n");
   10804                     message.append("Expected output out: ");
   10805                     message.append(String.format("%d", args.out));
   10806                     message.append("\n");
   10807                     message.append("Actual   output out: ");
   10808                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   10809                     if (args.out != arrayOut[i * 4 + j]) {
   10810                         message.append(" FAIL");
   10811                     }
   10812                     message.append("\n");
   10813                     assertTrue("Incorrect output for checkConvertDouble3Char3" +
   10814                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10815                 }
   10816             }
   10817         }
   10818     }
   10819 
   10820     private void checkConvertDouble4Char4() {
   10821         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xcbf860bead18d3ffl, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
   10822         try {
   10823             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   10824             script.forEach_testConvertChar4Double4Char4(inV, out);
   10825             verifyResultsConvertDouble4Char4(inV, out, false);
   10826         } catch (Exception e) {
   10827             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Double4Char4: " + e.toString());
   10828         }
   10829         try {
   10830             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   10831             scriptRelaxed.forEach_testConvertChar4Double4Char4(inV, out);
   10832             verifyResultsConvertDouble4Char4(inV, out, true);
   10833         } catch (Exception e) {
   10834             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Double4Char4: " + e.toString());
   10835         }
   10836     }
   10837 
   10838     private void verifyResultsConvertDouble4Char4(Allocation inV, Allocation out, boolean relaxed) {
   10839         double[] arrayInV = new double[INPUTSIZE * 4];
   10840         inV.copyTo(arrayInV);
   10841         byte[] arrayOut = new byte[INPUTSIZE * 4];
   10842         out.copyTo(arrayOut);
   10843         for (int i = 0; i < INPUTSIZE; i++) {
   10844             for (int j = 0; j < 4 ; j++) {
   10845                 // Extract the inputs.
   10846                 ArgumentsDoubleChar args = new ArgumentsDoubleChar();
   10847                 args.inV = arrayInV[i * 4 + j];
   10848                 // Figure out what the outputs should have been.
   10849                 CoreMathVerifier.computeConvert(args);
   10850                 // Validate the outputs.
   10851                 boolean valid = true;
   10852                 if (args.out != arrayOut[i * 4 + j]) {
   10853                     valid = false;
   10854                 }
   10855                 if (!valid) {
   10856                     StringBuilder message = new StringBuilder();
   10857                     message.append("Input inV: ");
   10858                     message.append(String.format("%24.8g {%16x} %31a",
   10859                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   10860                     message.append("\n");
   10861                     message.append("Expected output out: ");
   10862                     message.append(String.format("%d", args.out));
   10863                     message.append("\n");
   10864                     message.append("Actual   output out: ");
   10865                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   10866                     if (args.out != arrayOut[i * 4 + j]) {
   10867                         message.append(" FAIL");
   10868                     }
   10869                     message.append("\n");
   10870                     assertTrue("Incorrect output for checkConvertDouble4Char4" +
   10871                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10872                 }
   10873             }
   10874         }
   10875     }
   10876 
   10877     public class ArgumentsLongChar {
   10878         public long inV;
   10879         public byte out;
   10880     }
   10881 
   10882     private void checkConvertLong2Char2() {
   10883         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xb570c3c37419afacl, true, 7);
   10884         try {
   10885             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   10886             script.forEach_testConvertChar2Long2Char2(inV, out);
   10887             verifyResultsConvertLong2Char2(inV, out, false);
   10888         } catch (Exception e) {
   10889             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Long2Char2: " + e.toString());
   10890         }
   10891         try {
   10892             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   10893             scriptRelaxed.forEach_testConvertChar2Long2Char2(inV, out);
   10894             verifyResultsConvertLong2Char2(inV, out, true);
   10895         } catch (Exception e) {
   10896             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Long2Char2: " + e.toString());
   10897         }
   10898     }
   10899 
   10900     private void verifyResultsConvertLong2Char2(Allocation inV, Allocation out, boolean relaxed) {
   10901         long[] arrayInV = new long[INPUTSIZE * 2];
   10902         inV.copyTo(arrayInV);
   10903         byte[] arrayOut = new byte[INPUTSIZE * 2];
   10904         out.copyTo(arrayOut);
   10905         for (int i = 0; i < INPUTSIZE; i++) {
   10906             for (int j = 0; j < 2 ; j++) {
   10907                 // Extract the inputs.
   10908                 ArgumentsLongChar args = new ArgumentsLongChar();
   10909                 args.inV = arrayInV[i * 2 + j];
   10910                 // Figure out what the outputs should have been.
   10911                 CoreMathVerifier.computeConvert(args);
   10912                 // Validate the outputs.
   10913                 boolean valid = true;
   10914                 if (args.out != arrayOut[i * 2 + j]) {
   10915                     valid = false;
   10916                 }
   10917                 if (!valid) {
   10918                     StringBuilder message = new StringBuilder();
   10919                     message.append("Input inV: ");
   10920                     message.append(String.format("%d", args.inV));
   10921                     message.append("\n");
   10922                     message.append("Expected output out: ");
   10923                     message.append(String.format("%d", args.out));
   10924                     message.append("\n");
   10925                     message.append("Actual   output out: ");
   10926                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   10927                     if (args.out != arrayOut[i * 2 + j]) {
   10928                         message.append(" FAIL");
   10929                     }
   10930                     message.append("\n");
   10931                     assertTrue("Incorrect output for checkConvertLong2Char2" +
   10932                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10933                 }
   10934             }
   10935         }
   10936     }
   10937 
   10938     private void checkConvertLong3Char3() {
   10939         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xb570ce64d32174a0l, true, 7);
   10940         try {
   10941             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   10942             script.forEach_testConvertChar3Long3Char3(inV, out);
   10943             verifyResultsConvertLong3Char3(inV, out, false);
   10944         } catch (Exception e) {
   10945             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Long3Char3: " + e.toString());
   10946         }
   10947         try {
   10948             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   10949             scriptRelaxed.forEach_testConvertChar3Long3Char3(inV, out);
   10950             verifyResultsConvertLong3Char3(inV, out, true);
   10951         } catch (Exception e) {
   10952             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Long3Char3: " + e.toString());
   10953         }
   10954     }
   10955 
   10956     private void verifyResultsConvertLong3Char3(Allocation inV, Allocation out, boolean relaxed) {
   10957         long[] arrayInV = new long[INPUTSIZE * 4];
   10958         inV.copyTo(arrayInV);
   10959         byte[] arrayOut = new byte[INPUTSIZE * 4];
   10960         out.copyTo(arrayOut);
   10961         for (int i = 0; i < INPUTSIZE; i++) {
   10962             for (int j = 0; j < 3 ; j++) {
   10963                 // Extract the inputs.
   10964                 ArgumentsLongChar args = new ArgumentsLongChar();
   10965                 args.inV = arrayInV[i * 4 + j];
   10966                 // Figure out what the outputs should have been.
   10967                 CoreMathVerifier.computeConvert(args);
   10968                 // Validate the outputs.
   10969                 boolean valid = true;
   10970                 if (args.out != arrayOut[i * 4 + j]) {
   10971                     valid = false;
   10972                 }
   10973                 if (!valid) {
   10974                     StringBuilder message = new StringBuilder();
   10975                     message.append("Input inV: ");
   10976                     message.append(String.format("%d", args.inV));
   10977                     message.append("\n");
   10978                     message.append("Expected output out: ");
   10979                     message.append(String.format("%d", args.out));
   10980                     message.append("\n");
   10981                     message.append("Actual   output out: ");
   10982                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   10983                     if (args.out != arrayOut[i * 4 + j]) {
   10984                         message.append(" FAIL");
   10985                     }
   10986                     message.append("\n");
   10987                     assertTrue("Incorrect output for checkConvertLong3Char3" +
   10988                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   10989                 }
   10990             }
   10991         }
   10992     }
   10993 
   10994     private void checkConvertLong4Char4() {
   10995         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xb570d90632293994l, true, 7);
   10996         try {
   10997             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   10998             script.forEach_testConvertChar4Long4Char4(inV, out);
   10999             verifyResultsConvertLong4Char4(inV, out, false);
   11000         } catch (Exception e) {
   11001             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Long4Char4: " + e.toString());
   11002         }
   11003         try {
   11004             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   11005             scriptRelaxed.forEach_testConvertChar4Long4Char4(inV, out);
   11006             verifyResultsConvertLong4Char4(inV, out, true);
   11007         } catch (Exception e) {
   11008             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Long4Char4: " + e.toString());
   11009         }
   11010     }
   11011 
   11012     private void verifyResultsConvertLong4Char4(Allocation inV, Allocation out, boolean relaxed) {
   11013         long[] arrayInV = new long[INPUTSIZE * 4];
   11014         inV.copyTo(arrayInV);
   11015         byte[] arrayOut = new byte[INPUTSIZE * 4];
   11016         out.copyTo(arrayOut);
   11017         for (int i = 0; i < INPUTSIZE; i++) {
   11018             for (int j = 0; j < 4 ; j++) {
   11019                 // Extract the inputs.
   11020                 ArgumentsLongChar args = new ArgumentsLongChar();
   11021                 args.inV = arrayInV[i * 4 + j];
   11022                 // Figure out what the outputs should have been.
   11023                 CoreMathVerifier.computeConvert(args);
   11024                 // Validate the outputs.
   11025                 boolean valid = true;
   11026                 if (args.out != arrayOut[i * 4 + j]) {
   11027                     valid = false;
   11028                 }
   11029                 if (!valid) {
   11030                     StringBuilder message = new StringBuilder();
   11031                     message.append("Input inV: ");
   11032                     message.append(String.format("%d", args.inV));
   11033                     message.append("\n");
   11034                     message.append("Expected output out: ");
   11035                     message.append(String.format("%d", args.out));
   11036                     message.append("\n");
   11037                     message.append("Actual   output out: ");
   11038                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   11039                     if (args.out != arrayOut[i * 4 + j]) {
   11040                         message.append(" FAIL");
   11041                     }
   11042                     message.append("\n");
   11043                     assertTrue("Incorrect output for checkConvertLong4Char4" +
   11044                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11045                 }
   11046             }
   11047         }
   11048     }
   11049 
   11050     public class ArgumentsUlongChar {
   11051         public long inV;
   11052         public byte out;
   11053     }
   11054 
   11055     private void checkConvertUlong2Char2() {
   11056         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x5cfe7d11069bbc2dl, false, 7);
   11057         try {
   11058             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   11059             script.forEach_testConvertChar2Ulong2Char2(inV, out);
   11060             verifyResultsConvertUlong2Char2(inV, out, false);
   11061         } catch (Exception e) {
   11062             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Ulong2Char2: " + e.toString());
   11063         }
   11064         try {
   11065             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
   11066             scriptRelaxed.forEach_testConvertChar2Ulong2Char2(inV, out);
   11067             verifyResultsConvertUlong2Char2(inV, out, true);
   11068         } catch (Exception e) {
   11069             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar2Ulong2Char2: " + e.toString());
   11070         }
   11071     }
   11072 
   11073     private void verifyResultsConvertUlong2Char2(Allocation inV, Allocation out, boolean relaxed) {
   11074         long[] arrayInV = new long[INPUTSIZE * 2];
   11075         inV.copyTo(arrayInV);
   11076         byte[] arrayOut = new byte[INPUTSIZE * 2];
   11077         out.copyTo(arrayOut);
   11078         for (int i = 0; i < INPUTSIZE; i++) {
   11079             for (int j = 0; j < 2 ; j++) {
   11080                 // Extract the inputs.
   11081                 ArgumentsUlongChar args = new ArgumentsUlongChar();
   11082                 args.inV = arrayInV[i * 2 + j];
   11083                 // Figure out what the outputs should have been.
   11084                 CoreMathVerifier.computeConvert(args);
   11085                 // Validate the outputs.
   11086                 boolean valid = true;
   11087                 if (args.out != arrayOut[i * 2 + j]) {
   11088                     valid = false;
   11089                 }
   11090                 if (!valid) {
   11091                     StringBuilder message = new StringBuilder();
   11092                     message.append("Input inV: ");
   11093                     message.append(String.format("0x%x", args.inV));
   11094                     message.append("\n");
   11095                     message.append("Expected output out: ");
   11096                     message.append(String.format("%d", args.out));
   11097                     message.append("\n");
   11098                     message.append("Actual   output out: ");
   11099                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   11100                     if (args.out != arrayOut[i * 2 + j]) {
   11101                         message.append(" FAIL");
   11102                     }
   11103                     message.append("\n");
   11104                     assertTrue("Incorrect output for checkConvertUlong2Char2" +
   11105                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11106                 }
   11107             }
   11108         }
   11109     }
   11110 
   11111     private void checkConvertUlong3Char3() {
   11112         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x5cfe87b265a38121l, false, 7);
   11113         try {
   11114             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   11115             script.forEach_testConvertChar3Ulong3Char3(inV, out);
   11116             verifyResultsConvertUlong3Char3(inV, out, false);
   11117         } catch (Exception e) {
   11118             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Ulong3Char3: " + e.toString());
   11119         }
   11120         try {
   11121             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
   11122             scriptRelaxed.forEach_testConvertChar3Ulong3Char3(inV, out);
   11123             verifyResultsConvertUlong3Char3(inV, out, true);
   11124         } catch (Exception e) {
   11125             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar3Ulong3Char3: " + e.toString());
   11126         }
   11127     }
   11128 
   11129     private void verifyResultsConvertUlong3Char3(Allocation inV, Allocation out, boolean relaxed) {
   11130         long[] arrayInV = new long[INPUTSIZE * 4];
   11131         inV.copyTo(arrayInV);
   11132         byte[] arrayOut = new byte[INPUTSIZE * 4];
   11133         out.copyTo(arrayOut);
   11134         for (int i = 0; i < INPUTSIZE; i++) {
   11135             for (int j = 0; j < 3 ; j++) {
   11136                 // Extract the inputs.
   11137                 ArgumentsUlongChar args = new ArgumentsUlongChar();
   11138                 args.inV = arrayInV[i * 4 + j];
   11139                 // Figure out what the outputs should have been.
   11140                 CoreMathVerifier.computeConvert(args);
   11141                 // Validate the outputs.
   11142                 boolean valid = true;
   11143                 if (args.out != arrayOut[i * 4 + j]) {
   11144                     valid = false;
   11145                 }
   11146                 if (!valid) {
   11147                     StringBuilder message = new StringBuilder();
   11148                     message.append("Input inV: ");
   11149                     message.append(String.format("0x%x", args.inV));
   11150                     message.append("\n");
   11151                     message.append("Expected output out: ");
   11152                     message.append(String.format("%d", args.out));
   11153                     message.append("\n");
   11154                     message.append("Actual   output out: ");
   11155                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   11156                     if (args.out != arrayOut[i * 4 + j]) {
   11157                         message.append(" FAIL");
   11158                     }
   11159                     message.append("\n");
   11160                     assertTrue("Incorrect output for checkConvertUlong3Char3" +
   11161                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11162                 }
   11163             }
   11164         }
   11165     }
   11166 
   11167     private void checkConvertUlong4Char4() {
   11168         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x5cfe9253c4ab4615l, false, 7);
   11169         try {
   11170             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   11171             script.forEach_testConvertChar4Ulong4Char4(inV, out);
   11172             verifyResultsConvertUlong4Char4(inV, out, false);
   11173         } catch (Exception e) {
   11174             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Ulong4Char4: " + e.toString());
   11175         }
   11176         try {
   11177             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
   11178             scriptRelaxed.forEach_testConvertChar4Ulong4Char4(inV, out);
   11179             verifyResultsConvertUlong4Char4(inV, out, true);
   11180         } catch (Exception e) {
   11181             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertChar4Ulong4Char4: " + e.toString());
   11182         }
   11183     }
   11184 
   11185     private void verifyResultsConvertUlong4Char4(Allocation inV, Allocation out, boolean relaxed) {
   11186         long[] arrayInV = new long[INPUTSIZE * 4];
   11187         inV.copyTo(arrayInV);
   11188         byte[] arrayOut = new byte[INPUTSIZE * 4];
   11189         out.copyTo(arrayOut);
   11190         for (int i = 0; i < INPUTSIZE; i++) {
   11191             for (int j = 0; j < 4 ; j++) {
   11192                 // Extract the inputs.
   11193                 ArgumentsUlongChar args = new ArgumentsUlongChar();
   11194                 args.inV = arrayInV[i * 4 + j];
   11195                 // Figure out what the outputs should have been.
   11196                 CoreMathVerifier.computeConvert(args);
   11197                 // Validate the outputs.
   11198                 boolean valid = true;
   11199                 if (args.out != arrayOut[i * 4 + j]) {
   11200                     valid = false;
   11201                 }
   11202                 if (!valid) {
   11203                     StringBuilder message = new StringBuilder();
   11204                     message.append("Input inV: ");
   11205                     message.append(String.format("0x%x", args.inV));
   11206                     message.append("\n");
   11207                     message.append("Expected output out: ");
   11208                     message.append(String.format("%d", args.out));
   11209                     message.append("\n");
   11210                     message.append("Actual   output out: ");
   11211                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   11212                     if (args.out != arrayOut[i * 4 + j]) {
   11213                         message.append(" FAIL");
   11214                     }
   11215                     message.append("\n");
   11216                     assertTrue("Incorrect output for checkConvertUlong4Char4" +
   11217                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11218                 }
   11219             }
   11220         }
   11221     }
   11222 
   11223     public class ArgumentsDoubleUchar {
   11224         public double inV;
   11225         public byte out;
   11226     }
   11227 
   11228     private void checkConvertDouble2Uchar2() {
   11229         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x42b56bf72a0f8ae0l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
   11230         try {
   11231             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   11232             script.forEach_testConvertUchar2Double2Uchar2(inV, out);
   11233             verifyResultsConvertDouble2Uchar2(inV, out, false);
   11234         } catch (Exception e) {
   11235             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Double2Uchar2: " + e.toString());
   11236         }
   11237         try {
   11238             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   11239             scriptRelaxed.forEach_testConvertUchar2Double2Uchar2(inV, out);
   11240             verifyResultsConvertDouble2Uchar2(inV, out, true);
   11241         } catch (Exception e) {
   11242             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Double2Uchar2: " + e.toString());
   11243         }
   11244     }
   11245 
   11246     private void verifyResultsConvertDouble2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
   11247         double[] arrayInV = new double[INPUTSIZE * 2];
   11248         inV.copyTo(arrayInV);
   11249         byte[] arrayOut = new byte[INPUTSIZE * 2];
   11250         out.copyTo(arrayOut);
   11251         for (int i = 0; i < INPUTSIZE; i++) {
   11252             for (int j = 0; j < 2 ; j++) {
   11253                 // Extract the inputs.
   11254                 ArgumentsDoubleUchar args = new ArgumentsDoubleUchar();
   11255                 args.inV = arrayInV[i * 2 + j];
   11256                 // Figure out what the outputs should have been.
   11257                 CoreMathVerifier.computeConvert(args);
   11258                 // Validate the outputs.
   11259                 boolean valid = true;
   11260                 if (args.out != arrayOut[i * 2 + j]) {
   11261                     valid = false;
   11262                 }
   11263                 if (!valid) {
   11264                     StringBuilder message = new StringBuilder();
   11265                     message.append("Input inV: ");
   11266                     message.append(String.format("%24.8g {%16x} %31a",
   11267                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   11268                     message.append("\n");
   11269                     message.append("Expected output out: ");
   11270                     message.append(String.format("0x%x", args.out));
   11271                     message.append("\n");
   11272                     message.append("Actual   output out: ");
   11273                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   11274                     if (args.out != arrayOut[i * 2 + j]) {
   11275                         message.append(" FAIL");
   11276                     }
   11277                     message.append("\n");
   11278                     assertTrue("Incorrect output for checkConvertDouble2Uchar2" +
   11279                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11280                 }
   11281             }
   11282         }
   11283     }
   11284 
   11285     private void checkConvertDouble3Uchar3() {
   11286         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x42b73512202aabbel, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
   11287         try {
   11288             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   11289             script.forEach_testConvertUchar3Double3Uchar3(inV, out);
   11290             verifyResultsConvertDouble3Uchar3(inV, out, false);
   11291         } catch (Exception e) {
   11292             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Double3Uchar3: " + e.toString());
   11293         }
   11294         try {
   11295             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   11296             scriptRelaxed.forEach_testConvertUchar3Double3Uchar3(inV, out);
   11297             verifyResultsConvertDouble3Uchar3(inV, out, true);
   11298         } catch (Exception e) {
   11299             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Double3Uchar3: " + e.toString());
   11300         }
   11301     }
   11302 
   11303     private void verifyResultsConvertDouble3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
   11304         double[] arrayInV = new double[INPUTSIZE * 4];
   11305         inV.copyTo(arrayInV);
   11306         byte[] arrayOut = new byte[INPUTSIZE * 4];
   11307         out.copyTo(arrayOut);
   11308         for (int i = 0; i < INPUTSIZE; i++) {
   11309             for (int j = 0; j < 3 ; j++) {
   11310                 // Extract the inputs.
   11311                 ArgumentsDoubleUchar args = new ArgumentsDoubleUchar();
   11312                 args.inV = arrayInV[i * 4 + j];
   11313                 // Figure out what the outputs should have been.
   11314                 CoreMathVerifier.computeConvert(args);
   11315                 // Validate the outputs.
   11316                 boolean valid = true;
   11317                 if (args.out != arrayOut[i * 4 + j]) {
   11318                     valid = false;
   11319                 }
   11320                 if (!valid) {
   11321                     StringBuilder message = new StringBuilder();
   11322                     message.append("Input inV: ");
   11323                     message.append(String.format("%24.8g {%16x} %31a",
   11324                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   11325                     message.append("\n");
   11326                     message.append("Expected output out: ");
   11327                     message.append(String.format("0x%x", args.out));
   11328                     message.append("\n");
   11329                     message.append("Actual   output out: ");
   11330                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   11331                     if (args.out != arrayOut[i * 4 + j]) {
   11332                         message.append(" FAIL");
   11333                     }
   11334                     message.append("\n");
   11335                     assertTrue("Incorrect output for checkConvertDouble3Uchar3" +
   11336                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11337                 }
   11338             }
   11339         }
   11340     }
   11341 
   11342     private void checkConvertDouble4Uchar4() {
   11343         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x42b8fe2d1645cc9cl, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
   11344         try {
   11345             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   11346             script.forEach_testConvertUchar4Double4Uchar4(inV, out);
   11347             verifyResultsConvertDouble4Uchar4(inV, out, false);
   11348         } catch (Exception e) {
   11349             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Double4Uchar4: " + e.toString());
   11350         }
   11351         try {
   11352             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   11353             scriptRelaxed.forEach_testConvertUchar4Double4Uchar4(inV, out);
   11354             verifyResultsConvertDouble4Uchar4(inV, out, true);
   11355         } catch (Exception e) {
   11356             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Double4Uchar4: " + e.toString());
   11357         }
   11358     }
   11359 
   11360     private void verifyResultsConvertDouble4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
   11361         double[] arrayInV = new double[INPUTSIZE * 4];
   11362         inV.copyTo(arrayInV);
   11363         byte[] arrayOut = new byte[INPUTSIZE * 4];
   11364         out.copyTo(arrayOut);
   11365         for (int i = 0; i < INPUTSIZE; i++) {
   11366             for (int j = 0; j < 4 ; j++) {
   11367                 // Extract the inputs.
   11368                 ArgumentsDoubleUchar args = new ArgumentsDoubleUchar();
   11369                 args.inV = arrayInV[i * 4 + j];
   11370                 // Figure out what the outputs should have been.
   11371                 CoreMathVerifier.computeConvert(args);
   11372                 // Validate the outputs.
   11373                 boolean valid = true;
   11374                 if (args.out != arrayOut[i * 4 + j]) {
   11375                     valid = false;
   11376                 }
   11377                 if (!valid) {
   11378                     StringBuilder message = new StringBuilder();
   11379                     message.append("Input inV: ");
   11380                     message.append(String.format("%24.8g {%16x} %31a",
   11381                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   11382                     message.append("\n");
   11383                     message.append("Expected output out: ");
   11384                     message.append(String.format("0x%x", args.out));
   11385                     message.append("\n");
   11386                     message.append("Actual   output out: ");
   11387                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   11388                     if (args.out != arrayOut[i * 4 + j]) {
   11389                         message.append(" FAIL");
   11390                     }
   11391                     message.append("\n");
   11392                     assertTrue("Incorrect output for checkConvertDouble4Uchar4" +
   11393                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11394                 }
   11395             }
   11396         }
   11397     }
   11398 
   11399     public class ArgumentsLongUchar {
   11400         public long inV;
   11401         public byte out;
   11402     }
   11403 
   11404     private void checkConvertLong2Uchar2() {
   11405         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x79f19ffa83d09ae7l, false, 8);
   11406         try {
   11407             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   11408             script.forEach_testConvertUchar2Long2Uchar2(inV, out);
   11409             verifyResultsConvertLong2Uchar2(inV, out, false);
   11410         } catch (Exception e) {
   11411             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Long2Uchar2: " + e.toString());
   11412         }
   11413         try {
   11414             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   11415             scriptRelaxed.forEach_testConvertUchar2Long2Uchar2(inV, out);
   11416             verifyResultsConvertLong2Uchar2(inV, out, true);
   11417         } catch (Exception e) {
   11418             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Long2Uchar2: " + e.toString());
   11419         }
   11420     }
   11421 
   11422     private void verifyResultsConvertLong2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
   11423         long[] arrayInV = new long[INPUTSIZE * 2];
   11424         inV.copyTo(arrayInV);
   11425         byte[] arrayOut = new byte[INPUTSIZE * 2];
   11426         out.copyTo(arrayOut);
   11427         for (int i = 0; i < INPUTSIZE; i++) {
   11428             for (int j = 0; j < 2 ; j++) {
   11429                 // Extract the inputs.
   11430                 ArgumentsLongUchar args = new ArgumentsLongUchar();
   11431                 args.inV = arrayInV[i * 2 + j];
   11432                 // Figure out what the outputs should have been.
   11433                 CoreMathVerifier.computeConvert(args);
   11434                 // Validate the outputs.
   11435                 boolean valid = true;
   11436                 if (args.out != arrayOut[i * 2 + j]) {
   11437                     valid = false;
   11438                 }
   11439                 if (!valid) {
   11440                     StringBuilder message = new StringBuilder();
   11441                     message.append("Input inV: ");
   11442                     message.append(String.format("%d", args.inV));
   11443                     message.append("\n");
   11444                     message.append("Expected output out: ");
   11445                     message.append(String.format("0x%x", args.out));
   11446                     message.append("\n");
   11447                     message.append("Actual   output out: ");
   11448                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   11449                     if (args.out != arrayOut[i * 2 + j]) {
   11450                         message.append(" FAIL");
   11451                     }
   11452                     message.append("\n");
   11453                     assertTrue("Incorrect output for checkConvertLong2Uchar2" +
   11454                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11455                 }
   11456             }
   11457         }
   11458     }
   11459 
   11460     private void checkConvertLong3Uchar3() {
   11461         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x79f3691579ebbbc5l, false, 8);
   11462         try {
   11463             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   11464             script.forEach_testConvertUchar3Long3Uchar3(inV, out);
   11465             verifyResultsConvertLong3Uchar3(inV, out, false);
   11466         } catch (Exception e) {
   11467             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Long3Uchar3: " + e.toString());
   11468         }
   11469         try {
   11470             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   11471             scriptRelaxed.forEach_testConvertUchar3Long3Uchar3(inV, out);
   11472             verifyResultsConvertLong3Uchar3(inV, out, true);
   11473         } catch (Exception e) {
   11474             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Long3Uchar3: " + e.toString());
   11475         }
   11476     }
   11477 
   11478     private void verifyResultsConvertLong3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
   11479         long[] arrayInV = new long[INPUTSIZE * 4];
   11480         inV.copyTo(arrayInV);
   11481         byte[] arrayOut = new byte[INPUTSIZE * 4];
   11482         out.copyTo(arrayOut);
   11483         for (int i = 0; i < INPUTSIZE; i++) {
   11484             for (int j = 0; j < 3 ; j++) {
   11485                 // Extract the inputs.
   11486                 ArgumentsLongUchar args = new ArgumentsLongUchar();
   11487                 args.inV = arrayInV[i * 4 + j];
   11488                 // Figure out what the outputs should have been.
   11489                 CoreMathVerifier.computeConvert(args);
   11490                 // Validate the outputs.
   11491                 boolean valid = true;
   11492                 if (args.out != arrayOut[i * 4 + j]) {
   11493                     valid = false;
   11494                 }
   11495                 if (!valid) {
   11496                     StringBuilder message = new StringBuilder();
   11497                     message.append("Input inV: ");
   11498                     message.append(String.format("%d", args.inV));
   11499                     message.append("\n");
   11500                     message.append("Expected output out: ");
   11501                     message.append(String.format("0x%x", args.out));
   11502                     message.append("\n");
   11503                     message.append("Actual   output out: ");
   11504                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   11505                     if (args.out != arrayOut[i * 4 + j]) {
   11506                         message.append(" FAIL");
   11507                     }
   11508                     message.append("\n");
   11509                     assertTrue("Incorrect output for checkConvertLong3Uchar3" +
   11510                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11511                 }
   11512             }
   11513         }
   11514     }
   11515 
   11516     private void checkConvertLong4Uchar4() {
   11517         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x79f532307006dca3l, false, 8);
   11518         try {
   11519             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   11520             script.forEach_testConvertUchar4Long4Uchar4(inV, out);
   11521             verifyResultsConvertLong4Uchar4(inV, out, false);
   11522         } catch (Exception e) {
   11523             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Long4Uchar4: " + e.toString());
   11524         }
   11525         try {
   11526             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   11527             scriptRelaxed.forEach_testConvertUchar4Long4Uchar4(inV, out);
   11528             verifyResultsConvertLong4Uchar4(inV, out, true);
   11529         } catch (Exception e) {
   11530             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Long4Uchar4: " + e.toString());
   11531         }
   11532     }
   11533 
   11534     private void verifyResultsConvertLong4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
   11535         long[] arrayInV = new long[INPUTSIZE * 4];
   11536         inV.copyTo(arrayInV);
   11537         byte[] arrayOut = new byte[INPUTSIZE * 4];
   11538         out.copyTo(arrayOut);
   11539         for (int i = 0; i < INPUTSIZE; i++) {
   11540             for (int j = 0; j < 4 ; j++) {
   11541                 // Extract the inputs.
   11542                 ArgumentsLongUchar args = new ArgumentsLongUchar();
   11543                 args.inV = arrayInV[i * 4 + j];
   11544                 // Figure out what the outputs should have been.
   11545                 CoreMathVerifier.computeConvert(args);
   11546                 // Validate the outputs.
   11547                 boolean valid = true;
   11548                 if (args.out != arrayOut[i * 4 + j]) {
   11549                     valid = false;
   11550                 }
   11551                 if (!valid) {
   11552                     StringBuilder message = new StringBuilder();
   11553                     message.append("Input inV: ");
   11554                     message.append(String.format("%d", args.inV));
   11555                     message.append("\n");
   11556                     message.append("Expected output out: ");
   11557                     message.append(String.format("0x%x", args.out));
   11558                     message.append("\n");
   11559                     message.append("Actual   output out: ");
   11560                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   11561                     if (args.out != arrayOut[i * 4 + j]) {
   11562                         message.append(" FAIL");
   11563                     }
   11564                     message.append("\n");
   11565                     assertTrue("Incorrect output for checkConvertLong4Uchar4" +
   11566                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11567                 }
   11568             }
   11569         }
   11570     }
   11571 
   11572     public class ArgumentsUlongUchar {
   11573         public long inV;
   11574         public byte out;
   11575     }
   11576 
   11577     private void checkConvertUlong2Uchar2() {
   11578         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x9ebfc0021fa8b492l, false, 8);
   11579         try {
   11580             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   11581             script.forEach_testConvertUchar2Ulong2Uchar2(inV, out);
   11582             verifyResultsConvertUlong2Uchar2(inV, out, false);
   11583         } catch (Exception e) {
   11584             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Ulong2Uchar2: " + e.toString());
   11585         }
   11586         try {
   11587             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
   11588             scriptRelaxed.forEach_testConvertUchar2Ulong2Uchar2(inV, out);
   11589             verifyResultsConvertUlong2Uchar2(inV, out, true);
   11590         } catch (Exception e) {
   11591             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar2Ulong2Uchar2: " + e.toString());
   11592         }
   11593     }
   11594 
   11595     private void verifyResultsConvertUlong2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
   11596         long[] arrayInV = new long[INPUTSIZE * 2];
   11597         inV.copyTo(arrayInV);
   11598         byte[] arrayOut = new byte[INPUTSIZE * 2];
   11599         out.copyTo(arrayOut);
   11600         for (int i = 0; i < INPUTSIZE; i++) {
   11601             for (int j = 0; j < 2 ; j++) {
   11602                 // Extract the inputs.
   11603                 ArgumentsUlongUchar args = new ArgumentsUlongUchar();
   11604                 args.inV = arrayInV[i * 2 + j];
   11605                 // Figure out what the outputs should have been.
   11606                 CoreMathVerifier.computeConvert(args);
   11607                 // Validate the outputs.
   11608                 boolean valid = true;
   11609                 if (args.out != arrayOut[i * 2 + j]) {
   11610                     valid = false;
   11611                 }
   11612                 if (!valid) {
   11613                     StringBuilder message = new StringBuilder();
   11614                     message.append("Input inV: ");
   11615                     message.append(String.format("0x%x", args.inV));
   11616                     message.append("\n");
   11617                     message.append("Expected output out: ");
   11618                     message.append(String.format("0x%x", args.out));
   11619                     message.append("\n");
   11620                     message.append("Actual   output out: ");
   11621                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   11622                     if (args.out != arrayOut[i * 2 + j]) {
   11623                         message.append(" FAIL");
   11624                     }
   11625                     message.append("\n");
   11626                     assertTrue("Incorrect output for checkConvertUlong2Uchar2" +
   11627                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11628                 }
   11629             }
   11630         }
   11631     }
   11632 
   11633     private void checkConvertUlong3Uchar3() {
   11634         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x9ec1891d15c3d570l, false, 8);
   11635         try {
   11636             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   11637             script.forEach_testConvertUchar3Ulong3Uchar3(inV, out);
   11638             verifyResultsConvertUlong3Uchar3(inV, out, false);
   11639         } catch (Exception e) {
   11640             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Ulong3Uchar3: " + e.toString());
   11641         }
   11642         try {
   11643             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
   11644             scriptRelaxed.forEach_testConvertUchar3Ulong3Uchar3(inV, out);
   11645             verifyResultsConvertUlong3Uchar3(inV, out, true);
   11646         } catch (Exception e) {
   11647             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar3Ulong3Uchar3: " + e.toString());
   11648         }
   11649     }
   11650 
   11651     private void verifyResultsConvertUlong3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
   11652         long[] arrayInV = new long[INPUTSIZE * 4];
   11653         inV.copyTo(arrayInV);
   11654         byte[] arrayOut = new byte[INPUTSIZE * 4];
   11655         out.copyTo(arrayOut);
   11656         for (int i = 0; i < INPUTSIZE; i++) {
   11657             for (int j = 0; j < 3 ; j++) {
   11658                 // Extract the inputs.
   11659                 ArgumentsUlongUchar args = new ArgumentsUlongUchar();
   11660                 args.inV = arrayInV[i * 4 + j];
   11661                 // Figure out what the outputs should have been.
   11662                 CoreMathVerifier.computeConvert(args);
   11663                 // Validate the outputs.
   11664                 boolean valid = true;
   11665                 if (args.out != arrayOut[i * 4 + j]) {
   11666                     valid = false;
   11667                 }
   11668                 if (!valid) {
   11669                     StringBuilder message = new StringBuilder();
   11670                     message.append("Input inV: ");
   11671                     message.append(String.format("0x%x", args.inV));
   11672                     message.append("\n");
   11673                     message.append("Expected output out: ");
   11674                     message.append(String.format("0x%x", args.out));
   11675                     message.append("\n");
   11676                     message.append("Actual   output out: ");
   11677                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   11678                     if (args.out != arrayOut[i * 4 + j]) {
   11679                         message.append(" FAIL");
   11680                     }
   11681                     message.append("\n");
   11682                     assertTrue("Incorrect output for checkConvertUlong3Uchar3" +
   11683                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11684                 }
   11685             }
   11686         }
   11687     }
   11688 
   11689     private void checkConvertUlong4Uchar4() {
   11690         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x9ec352380bdef64el, false, 8);
   11691         try {
   11692             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   11693             script.forEach_testConvertUchar4Ulong4Uchar4(inV, out);
   11694             verifyResultsConvertUlong4Uchar4(inV, out, false);
   11695         } catch (Exception e) {
   11696             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Ulong4Uchar4: " + e.toString());
   11697         }
   11698         try {
   11699             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
   11700             scriptRelaxed.forEach_testConvertUchar4Ulong4Uchar4(inV, out);
   11701             verifyResultsConvertUlong4Uchar4(inV, out, true);
   11702         } catch (Exception e) {
   11703             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUchar4Ulong4Uchar4: " + e.toString());
   11704         }
   11705     }
   11706 
   11707     private void verifyResultsConvertUlong4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
   11708         long[] arrayInV = new long[INPUTSIZE * 4];
   11709         inV.copyTo(arrayInV);
   11710         byte[] arrayOut = new byte[INPUTSIZE * 4];
   11711         out.copyTo(arrayOut);
   11712         for (int i = 0; i < INPUTSIZE; i++) {
   11713             for (int j = 0; j < 4 ; j++) {
   11714                 // Extract the inputs.
   11715                 ArgumentsUlongUchar args = new ArgumentsUlongUchar();
   11716                 args.inV = arrayInV[i * 4 + j];
   11717                 // Figure out what the outputs should have been.
   11718                 CoreMathVerifier.computeConvert(args);
   11719                 // Validate the outputs.
   11720                 boolean valid = true;
   11721                 if (args.out != arrayOut[i * 4 + j]) {
   11722                     valid = false;
   11723                 }
   11724                 if (!valid) {
   11725                     StringBuilder message = new StringBuilder();
   11726                     message.append("Input inV: ");
   11727                     message.append(String.format("0x%x", args.inV));
   11728                     message.append("\n");
   11729                     message.append("Expected output out: ");
   11730                     message.append(String.format("0x%x", args.out));
   11731                     message.append("\n");
   11732                     message.append("Actual   output out: ");
   11733                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   11734                     if (args.out != arrayOut[i * 4 + j]) {
   11735                         message.append(" FAIL");
   11736                     }
   11737                     message.append("\n");
   11738                     assertTrue("Incorrect output for checkConvertUlong4Uchar4" +
   11739                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11740                 }
   11741             }
   11742         }
   11743     }
   11744 
   11745     public class ArgumentsDoubleShort {
   11746         public double inV;
   11747         public short out;
   11748     }
   11749 
   11750     private void checkConvertDouble2Short2() {
   11751         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x42b557fbbf1d55f9l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
   11752         try {
   11753             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   11754             script.forEach_testConvertShort2Double2Short2(inV, out);
   11755             verifyResultsConvertDouble2Short2(inV, out, false);
   11756         } catch (Exception e) {
   11757             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Double2Short2: " + e.toString());
   11758         }
   11759         try {
   11760             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   11761             scriptRelaxed.forEach_testConvertShort2Double2Short2(inV, out);
   11762             verifyResultsConvertDouble2Short2(inV, out, true);
   11763         } catch (Exception e) {
   11764             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Double2Short2: " + e.toString());
   11765         }
   11766     }
   11767 
   11768     private void verifyResultsConvertDouble2Short2(Allocation inV, Allocation out, boolean relaxed) {
   11769         double[] arrayInV = new double[INPUTSIZE * 2];
   11770         inV.copyTo(arrayInV);
   11771         short[] arrayOut = new short[INPUTSIZE * 2];
   11772         out.copyTo(arrayOut);
   11773         for (int i = 0; i < INPUTSIZE; i++) {
   11774             for (int j = 0; j < 2 ; j++) {
   11775                 // Extract the inputs.
   11776                 ArgumentsDoubleShort args = new ArgumentsDoubleShort();
   11777                 args.inV = arrayInV[i * 2 + j];
   11778                 // Figure out what the outputs should have been.
   11779                 CoreMathVerifier.computeConvert(args);
   11780                 // Validate the outputs.
   11781                 boolean valid = true;
   11782                 if (args.out != arrayOut[i * 2 + j]) {
   11783                     valid = false;
   11784                 }
   11785                 if (!valid) {
   11786                     StringBuilder message = new StringBuilder();
   11787                     message.append("Input inV: ");
   11788                     message.append(String.format("%24.8g {%16x} %31a",
   11789                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   11790                     message.append("\n");
   11791                     message.append("Expected output out: ");
   11792                     message.append(String.format("%d", args.out));
   11793                     message.append("\n");
   11794                     message.append("Actual   output out: ");
   11795                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   11796                     if (args.out != arrayOut[i * 2 + j]) {
   11797                         message.append(" FAIL");
   11798                     }
   11799                     message.append("\n");
   11800                     assertTrue("Incorrect output for checkConvertDouble2Short2" +
   11801                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11802                 }
   11803             }
   11804         }
   11805     }
   11806 
   11807     private void checkConvertDouble3Short3() {
   11808         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x42b72116b53876d7l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
   11809         try {
   11810             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   11811             script.forEach_testConvertShort3Double3Short3(inV, out);
   11812             verifyResultsConvertDouble3Short3(inV, out, false);
   11813         } catch (Exception e) {
   11814             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Double3Short3: " + e.toString());
   11815         }
   11816         try {
   11817             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   11818             scriptRelaxed.forEach_testConvertShort3Double3Short3(inV, out);
   11819             verifyResultsConvertDouble3Short3(inV, out, true);
   11820         } catch (Exception e) {
   11821             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Double3Short3: " + e.toString());
   11822         }
   11823     }
   11824 
   11825     private void verifyResultsConvertDouble3Short3(Allocation inV, Allocation out, boolean relaxed) {
   11826         double[] arrayInV = new double[INPUTSIZE * 4];
   11827         inV.copyTo(arrayInV);
   11828         short[] arrayOut = new short[INPUTSIZE * 4];
   11829         out.copyTo(arrayOut);
   11830         for (int i = 0; i < INPUTSIZE; i++) {
   11831             for (int j = 0; j < 3 ; j++) {
   11832                 // Extract the inputs.
   11833                 ArgumentsDoubleShort args = new ArgumentsDoubleShort();
   11834                 args.inV = arrayInV[i * 4 + j];
   11835                 // Figure out what the outputs should have been.
   11836                 CoreMathVerifier.computeConvert(args);
   11837                 // Validate the outputs.
   11838                 boolean valid = true;
   11839                 if (args.out != arrayOut[i * 4 + j]) {
   11840                     valid = false;
   11841                 }
   11842                 if (!valid) {
   11843                     StringBuilder message = new StringBuilder();
   11844                     message.append("Input inV: ");
   11845                     message.append(String.format("%24.8g {%16x} %31a",
   11846                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   11847                     message.append("\n");
   11848                     message.append("Expected output out: ");
   11849                     message.append(String.format("%d", args.out));
   11850                     message.append("\n");
   11851                     message.append("Actual   output out: ");
   11852                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   11853                     if (args.out != arrayOut[i * 4 + j]) {
   11854                         message.append(" FAIL");
   11855                     }
   11856                     message.append("\n");
   11857                     assertTrue("Incorrect output for checkConvertDouble3Short3" +
   11858                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11859                 }
   11860             }
   11861         }
   11862     }
   11863 
   11864     private void checkConvertDouble4Short4() {
   11865         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x42b8ea31ab5397b5l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
   11866         try {
   11867             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   11868             script.forEach_testConvertShort4Double4Short4(inV, out);
   11869             verifyResultsConvertDouble4Short4(inV, out, false);
   11870         } catch (Exception e) {
   11871             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Double4Short4: " + e.toString());
   11872         }
   11873         try {
   11874             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   11875             scriptRelaxed.forEach_testConvertShort4Double4Short4(inV, out);
   11876             verifyResultsConvertDouble4Short4(inV, out, true);
   11877         } catch (Exception e) {
   11878             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Double4Short4: " + e.toString());
   11879         }
   11880     }
   11881 
   11882     private void verifyResultsConvertDouble4Short4(Allocation inV, Allocation out, boolean relaxed) {
   11883         double[] arrayInV = new double[INPUTSIZE * 4];
   11884         inV.copyTo(arrayInV);
   11885         short[] arrayOut = new short[INPUTSIZE * 4];
   11886         out.copyTo(arrayOut);
   11887         for (int i = 0; i < INPUTSIZE; i++) {
   11888             for (int j = 0; j < 4 ; j++) {
   11889                 // Extract the inputs.
   11890                 ArgumentsDoubleShort args = new ArgumentsDoubleShort();
   11891                 args.inV = arrayInV[i * 4 + j];
   11892                 // Figure out what the outputs should have been.
   11893                 CoreMathVerifier.computeConvert(args);
   11894                 // Validate the outputs.
   11895                 boolean valid = true;
   11896                 if (args.out != arrayOut[i * 4 + j]) {
   11897                     valid = false;
   11898                 }
   11899                 if (!valid) {
   11900                     StringBuilder message = new StringBuilder();
   11901                     message.append("Input inV: ");
   11902                     message.append(String.format("%24.8g {%16x} %31a",
   11903                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   11904                     message.append("\n");
   11905                     message.append("Expected output out: ");
   11906                     message.append(String.format("%d", args.out));
   11907                     message.append("\n");
   11908                     message.append("Actual   output out: ");
   11909                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   11910                     if (args.out != arrayOut[i * 4 + j]) {
   11911                         message.append(" FAIL");
   11912                     }
   11913                     message.append("\n");
   11914                     assertTrue("Incorrect output for checkConvertDouble4Short4" +
   11915                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11916                 }
   11917             }
   11918         }
   11919     }
   11920 
   11921     public class ArgumentsLongShort {
   11922         public long inV;
   11923         public short out;
   11924     }
   11925 
   11926     private void checkConvertLong2Short2() {
   11927         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x79f18bff18de6600l, true, 15);
   11928         try {
   11929             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   11930             script.forEach_testConvertShort2Long2Short2(inV, out);
   11931             verifyResultsConvertLong2Short2(inV, out, false);
   11932         } catch (Exception e) {
   11933             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Long2Short2: " + e.toString());
   11934         }
   11935         try {
   11936             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   11937             scriptRelaxed.forEach_testConvertShort2Long2Short2(inV, out);
   11938             verifyResultsConvertLong2Short2(inV, out, true);
   11939         } catch (Exception e) {
   11940             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Long2Short2: " + e.toString());
   11941         }
   11942     }
   11943 
   11944     private void verifyResultsConvertLong2Short2(Allocation inV, Allocation out, boolean relaxed) {
   11945         long[] arrayInV = new long[INPUTSIZE * 2];
   11946         inV.copyTo(arrayInV);
   11947         short[] arrayOut = new short[INPUTSIZE * 2];
   11948         out.copyTo(arrayOut);
   11949         for (int i = 0; i < INPUTSIZE; i++) {
   11950             for (int j = 0; j < 2 ; j++) {
   11951                 // Extract the inputs.
   11952                 ArgumentsLongShort args = new ArgumentsLongShort();
   11953                 args.inV = arrayInV[i * 2 + j];
   11954                 // Figure out what the outputs should have been.
   11955                 CoreMathVerifier.computeConvert(args);
   11956                 // Validate the outputs.
   11957                 boolean valid = true;
   11958                 if (args.out != arrayOut[i * 2 + j]) {
   11959                     valid = false;
   11960                 }
   11961                 if (!valid) {
   11962                     StringBuilder message = new StringBuilder();
   11963                     message.append("Input inV: ");
   11964                     message.append(String.format("%d", args.inV));
   11965                     message.append("\n");
   11966                     message.append("Expected output out: ");
   11967                     message.append(String.format("%d", args.out));
   11968                     message.append("\n");
   11969                     message.append("Actual   output out: ");
   11970                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   11971                     if (args.out != arrayOut[i * 2 + j]) {
   11972                         message.append(" FAIL");
   11973                     }
   11974                     message.append("\n");
   11975                     assertTrue("Incorrect output for checkConvertLong2Short2" +
   11976                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   11977                 }
   11978             }
   11979         }
   11980     }
   11981 
   11982     private void checkConvertLong3Short3() {
   11983         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x79f3551a0ef986del, true, 15);
   11984         try {
   11985             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   11986             script.forEach_testConvertShort3Long3Short3(inV, out);
   11987             verifyResultsConvertLong3Short3(inV, out, false);
   11988         } catch (Exception e) {
   11989             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Long3Short3: " + e.toString());
   11990         }
   11991         try {
   11992             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   11993             scriptRelaxed.forEach_testConvertShort3Long3Short3(inV, out);
   11994             verifyResultsConvertLong3Short3(inV, out, true);
   11995         } catch (Exception e) {
   11996             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Long3Short3: " + e.toString());
   11997         }
   11998     }
   11999 
   12000     private void verifyResultsConvertLong3Short3(Allocation inV, Allocation out, boolean relaxed) {
   12001         long[] arrayInV = new long[INPUTSIZE * 4];
   12002         inV.copyTo(arrayInV);
   12003         short[] arrayOut = new short[INPUTSIZE * 4];
   12004         out.copyTo(arrayOut);
   12005         for (int i = 0; i < INPUTSIZE; i++) {
   12006             for (int j = 0; j < 3 ; j++) {
   12007                 // Extract the inputs.
   12008                 ArgumentsLongShort args = new ArgumentsLongShort();
   12009                 args.inV = arrayInV[i * 4 + j];
   12010                 // Figure out what the outputs should have been.
   12011                 CoreMathVerifier.computeConvert(args);
   12012                 // Validate the outputs.
   12013                 boolean valid = true;
   12014                 if (args.out != arrayOut[i * 4 + j]) {
   12015                     valid = false;
   12016                 }
   12017                 if (!valid) {
   12018                     StringBuilder message = new StringBuilder();
   12019                     message.append("Input inV: ");
   12020                     message.append(String.format("%d", args.inV));
   12021                     message.append("\n");
   12022                     message.append("Expected output out: ");
   12023                     message.append(String.format("%d", args.out));
   12024                     message.append("\n");
   12025                     message.append("Actual   output out: ");
   12026                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   12027                     if (args.out != arrayOut[i * 4 + j]) {
   12028                         message.append(" FAIL");
   12029                     }
   12030                     message.append("\n");
   12031                     assertTrue("Incorrect output for checkConvertLong3Short3" +
   12032                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12033                 }
   12034             }
   12035         }
   12036     }
   12037 
   12038     private void checkConvertLong4Short4() {
   12039         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x79f51e350514a7bcl, true, 15);
   12040         try {
   12041             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   12042             script.forEach_testConvertShort4Long4Short4(inV, out);
   12043             verifyResultsConvertLong4Short4(inV, out, false);
   12044         } catch (Exception e) {
   12045             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Long4Short4: " + e.toString());
   12046         }
   12047         try {
   12048             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   12049             scriptRelaxed.forEach_testConvertShort4Long4Short4(inV, out);
   12050             verifyResultsConvertLong4Short4(inV, out, true);
   12051         } catch (Exception e) {
   12052             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Long4Short4: " + e.toString());
   12053         }
   12054     }
   12055 
   12056     private void verifyResultsConvertLong4Short4(Allocation inV, Allocation out, boolean relaxed) {
   12057         long[] arrayInV = new long[INPUTSIZE * 4];
   12058         inV.copyTo(arrayInV);
   12059         short[] arrayOut = new short[INPUTSIZE * 4];
   12060         out.copyTo(arrayOut);
   12061         for (int i = 0; i < INPUTSIZE; i++) {
   12062             for (int j = 0; j < 4 ; j++) {
   12063                 // Extract the inputs.
   12064                 ArgumentsLongShort args = new ArgumentsLongShort();
   12065                 args.inV = arrayInV[i * 4 + j];
   12066                 // Figure out what the outputs should have been.
   12067                 CoreMathVerifier.computeConvert(args);
   12068                 // Validate the outputs.
   12069                 boolean valid = true;
   12070                 if (args.out != arrayOut[i * 4 + j]) {
   12071                     valid = false;
   12072                 }
   12073                 if (!valid) {
   12074                     StringBuilder message = new StringBuilder();
   12075                     message.append("Input inV: ");
   12076                     message.append(String.format("%d", args.inV));
   12077                     message.append("\n");
   12078                     message.append("Expected output out: ");
   12079                     message.append(String.format("%d", args.out));
   12080                     message.append("\n");
   12081                     message.append("Actual   output out: ");
   12082                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   12083                     if (args.out != arrayOut[i * 4 + j]) {
   12084                         message.append(" FAIL");
   12085                     }
   12086                     message.append("\n");
   12087                     assertTrue("Incorrect output for checkConvertLong4Short4" +
   12088                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12089                 }
   12090             }
   12091         }
   12092     }
   12093 
   12094     public class ArgumentsUlongShort {
   12095         public long inV;
   12096         public short out;
   12097     }
   12098 
   12099     private void checkConvertUlong2Short2() {
   12100         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x9ebfac06b4b67fabl, false, 15);
   12101         try {
   12102             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   12103             script.forEach_testConvertShort2Ulong2Short2(inV, out);
   12104             verifyResultsConvertUlong2Short2(inV, out, false);
   12105         } catch (Exception e) {
   12106             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Ulong2Short2: " + e.toString());
   12107         }
   12108         try {
   12109             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
   12110             scriptRelaxed.forEach_testConvertShort2Ulong2Short2(inV, out);
   12111             verifyResultsConvertUlong2Short2(inV, out, true);
   12112         } catch (Exception e) {
   12113             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort2Ulong2Short2: " + e.toString());
   12114         }
   12115     }
   12116 
   12117     private void verifyResultsConvertUlong2Short2(Allocation inV, Allocation out, boolean relaxed) {
   12118         long[] arrayInV = new long[INPUTSIZE * 2];
   12119         inV.copyTo(arrayInV);
   12120         short[] arrayOut = new short[INPUTSIZE * 2];
   12121         out.copyTo(arrayOut);
   12122         for (int i = 0; i < INPUTSIZE; i++) {
   12123             for (int j = 0; j < 2 ; j++) {
   12124                 // Extract the inputs.
   12125                 ArgumentsUlongShort args = new ArgumentsUlongShort();
   12126                 args.inV = arrayInV[i * 2 + j];
   12127                 // Figure out what the outputs should have been.
   12128                 CoreMathVerifier.computeConvert(args);
   12129                 // Validate the outputs.
   12130                 boolean valid = true;
   12131                 if (args.out != arrayOut[i * 2 + j]) {
   12132                     valid = false;
   12133                 }
   12134                 if (!valid) {
   12135                     StringBuilder message = new StringBuilder();
   12136                     message.append("Input inV: ");
   12137                     message.append(String.format("0x%x", args.inV));
   12138                     message.append("\n");
   12139                     message.append("Expected output out: ");
   12140                     message.append(String.format("%d", args.out));
   12141                     message.append("\n");
   12142                     message.append("Actual   output out: ");
   12143                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   12144                     if (args.out != arrayOut[i * 2 + j]) {
   12145                         message.append(" FAIL");
   12146                     }
   12147                     message.append("\n");
   12148                     assertTrue("Incorrect output for checkConvertUlong2Short2" +
   12149                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12150                 }
   12151             }
   12152         }
   12153     }
   12154 
   12155     private void checkConvertUlong3Short3() {
   12156         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x9ec17521aad1a089l, false, 15);
   12157         try {
   12158             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   12159             script.forEach_testConvertShort3Ulong3Short3(inV, out);
   12160             verifyResultsConvertUlong3Short3(inV, out, false);
   12161         } catch (Exception e) {
   12162             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Ulong3Short3: " + e.toString());
   12163         }
   12164         try {
   12165             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
   12166             scriptRelaxed.forEach_testConvertShort3Ulong3Short3(inV, out);
   12167             verifyResultsConvertUlong3Short3(inV, out, true);
   12168         } catch (Exception e) {
   12169             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort3Ulong3Short3: " + e.toString());
   12170         }
   12171     }
   12172 
   12173     private void verifyResultsConvertUlong3Short3(Allocation inV, Allocation out, boolean relaxed) {
   12174         long[] arrayInV = new long[INPUTSIZE * 4];
   12175         inV.copyTo(arrayInV);
   12176         short[] arrayOut = new short[INPUTSIZE * 4];
   12177         out.copyTo(arrayOut);
   12178         for (int i = 0; i < INPUTSIZE; i++) {
   12179             for (int j = 0; j < 3 ; j++) {
   12180                 // Extract the inputs.
   12181                 ArgumentsUlongShort args = new ArgumentsUlongShort();
   12182                 args.inV = arrayInV[i * 4 + j];
   12183                 // Figure out what the outputs should have been.
   12184                 CoreMathVerifier.computeConvert(args);
   12185                 // Validate the outputs.
   12186                 boolean valid = true;
   12187                 if (args.out != arrayOut[i * 4 + j]) {
   12188                     valid = false;
   12189                 }
   12190                 if (!valid) {
   12191                     StringBuilder message = new StringBuilder();
   12192                     message.append("Input inV: ");
   12193                     message.append(String.format("0x%x", args.inV));
   12194                     message.append("\n");
   12195                     message.append("Expected output out: ");
   12196                     message.append(String.format("%d", args.out));
   12197                     message.append("\n");
   12198                     message.append("Actual   output out: ");
   12199                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   12200                     if (args.out != arrayOut[i * 4 + j]) {
   12201                         message.append(" FAIL");
   12202                     }
   12203                     message.append("\n");
   12204                     assertTrue("Incorrect output for checkConvertUlong3Short3" +
   12205                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12206                 }
   12207             }
   12208         }
   12209     }
   12210 
   12211     private void checkConvertUlong4Short4() {
   12212         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x9ec33e3ca0ecc167l, false, 15);
   12213         try {
   12214             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   12215             script.forEach_testConvertShort4Ulong4Short4(inV, out);
   12216             verifyResultsConvertUlong4Short4(inV, out, false);
   12217         } catch (Exception e) {
   12218             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Ulong4Short4: " + e.toString());
   12219         }
   12220         try {
   12221             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
   12222             scriptRelaxed.forEach_testConvertShort4Ulong4Short4(inV, out);
   12223             verifyResultsConvertUlong4Short4(inV, out, true);
   12224         } catch (Exception e) {
   12225             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertShort4Ulong4Short4: " + e.toString());
   12226         }
   12227     }
   12228 
   12229     private void verifyResultsConvertUlong4Short4(Allocation inV, Allocation out, boolean relaxed) {
   12230         long[] arrayInV = new long[INPUTSIZE * 4];
   12231         inV.copyTo(arrayInV);
   12232         short[] arrayOut = new short[INPUTSIZE * 4];
   12233         out.copyTo(arrayOut);
   12234         for (int i = 0; i < INPUTSIZE; i++) {
   12235             for (int j = 0; j < 4 ; j++) {
   12236                 // Extract the inputs.
   12237                 ArgumentsUlongShort args = new ArgumentsUlongShort();
   12238                 args.inV = arrayInV[i * 4 + j];
   12239                 // Figure out what the outputs should have been.
   12240                 CoreMathVerifier.computeConvert(args);
   12241                 // Validate the outputs.
   12242                 boolean valid = true;
   12243                 if (args.out != arrayOut[i * 4 + j]) {
   12244                     valid = false;
   12245                 }
   12246                 if (!valid) {
   12247                     StringBuilder message = new StringBuilder();
   12248                     message.append("Input inV: ");
   12249                     message.append(String.format("0x%x", args.inV));
   12250                     message.append("\n");
   12251                     message.append("Expected output out: ");
   12252                     message.append(String.format("%d", args.out));
   12253                     message.append("\n");
   12254                     message.append("Actual   output out: ");
   12255                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   12256                     if (args.out != arrayOut[i * 4 + j]) {
   12257                         message.append(" FAIL");
   12258                     }
   12259                     message.append("\n");
   12260                     assertTrue("Incorrect output for checkConvertUlong4Short4" +
   12261                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12262                 }
   12263             }
   12264         }
   12265     }
   12266 
   12267     public class ArgumentsDoubleUshort {
   12268         public double inV;
   12269         public short out;
   12270     }
   12271 
   12272     private void checkConvertDouble2Ushort2() {
   12273         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x3479ccaea92a37bcl, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
   12274         try {
   12275             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   12276             script.forEach_testConvertUshort2Double2Ushort2(inV, out);
   12277             verifyResultsConvertDouble2Ushort2(inV, out, false);
   12278         } catch (Exception e) {
   12279             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Double2Ushort2: " + e.toString());
   12280         }
   12281         try {
   12282             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   12283             scriptRelaxed.forEach_testConvertUshort2Double2Ushort2(inV, out);
   12284             verifyResultsConvertDouble2Ushort2(inV, out, true);
   12285         } catch (Exception e) {
   12286             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Double2Ushort2: " + e.toString());
   12287         }
   12288     }
   12289 
   12290     private void verifyResultsConvertDouble2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
   12291         double[] arrayInV = new double[INPUTSIZE * 2];
   12292         inV.copyTo(arrayInV);
   12293         short[] arrayOut = new short[INPUTSIZE * 2];
   12294         out.copyTo(arrayOut);
   12295         for (int i = 0; i < INPUTSIZE; i++) {
   12296             for (int j = 0; j < 2 ; j++) {
   12297                 // Extract the inputs.
   12298                 ArgumentsDoubleUshort args = new ArgumentsDoubleUshort();
   12299                 args.inV = arrayInV[i * 2 + j];
   12300                 // Figure out what the outputs should have been.
   12301                 CoreMathVerifier.computeConvert(args);
   12302                 // Validate the outputs.
   12303                 boolean valid = true;
   12304                 if (args.out != arrayOut[i * 2 + j]) {
   12305                     valid = false;
   12306                 }
   12307                 if (!valid) {
   12308                     StringBuilder message = new StringBuilder();
   12309                     message.append("Input inV: ");
   12310                     message.append(String.format("%24.8g {%16x} %31a",
   12311                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   12312                     message.append("\n");
   12313                     message.append("Expected output out: ");
   12314                     message.append(String.format("0x%x", args.out));
   12315                     message.append("\n");
   12316                     message.append("Actual   output out: ");
   12317                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   12318                     if (args.out != arrayOut[i * 2 + j]) {
   12319                         message.append(" FAIL");
   12320                     }
   12321                     message.append("\n");
   12322                     assertTrue("Incorrect output for checkConvertDouble2Ushort2" +
   12323                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12324                 }
   12325             }
   12326         }
   12327     }
   12328 
   12329     private void checkConvertDouble3Ushort3() {
   12330         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x34c69435ff85c8e8l, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
   12331         try {
   12332             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   12333             script.forEach_testConvertUshort3Double3Ushort3(inV, out);
   12334             verifyResultsConvertDouble3Ushort3(inV, out, false);
   12335         } catch (Exception e) {
   12336             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Double3Ushort3: " + e.toString());
   12337         }
   12338         try {
   12339             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   12340             scriptRelaxed.forEach_testConvertUshort3Double3Ushort3(inV, out);
   12341             verifyResultsConvertDouble3Ushort3(inV, out, true);
   12342         } catch (Exception e) {
   12343             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Double3Ushort3: " + e.toString());
   12344         }
   12345     }
   12346 
   12347     private void verifyResultsConvertDouble3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
   12348         double[] arrayInV = new double[INPUTSIZE * 4];
   12349         inV.copyTo(arrayInV);
   12350         short[] arrayOut = new short[INPUTSIZE * 4];
   12351         out.copyTo(arrayOut);
   12352         for (int i = 0; i < INPUTSIZE; i++) {
   12353             for (int j = 0; j < 3 ; j++) {
   12354                 // Extract the inputs.
   12355                 ArgumentsDoubleUshort args = new ArgumentsDoubleUshort();
   12356                 args.inV = arrayInV[i * 4 + j];
   12357                 // Figure out what the outputs should have been.
   12358                 CoreMathVerifier.computeConvert(args);
   12359                 // Validate the outputs.
   12360                 boolean valid = true;
   12361                 if (args.out != arrayOut[i * 4 + j]) {
   12362                     valid = false;
   12363                 }
   12364                 if (!valid) {
   12365                     StringBuilder message = new StringBuilder();
   12366                     message.append("Input inV: ");
   12367                     message.append(String.format("%24.8g {%16x} %31a",
   12368                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   12369                     message.append("\n");
   12370                     message.append("Expected output out: ");
   12371                     message.append(String.format("0x%x", args.out));
   12372                     message.append("\n");
   12373                     message.append("Actual   output out: ");
   12374                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   12375                     if (args.out != arrayOut[i * 4 + j]) {
   12376                         message.append(" FAIL");
   12377                     }
   12378                     message.append("\n");
   12379                     assertTrue("Incorrect output for checkConvertDouble3Ushort3" +
   12380                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12381                 }
   12382             }
   12383         }
   12384     }
   12385 
   12386     private void checkConvertDouble4Ushort4() {
   12387         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x35135bbd55e15a14l, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
   12388         try {
   12389             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   12390             script.forEach_testConvertUshort4Double4Ushort4(inV, out);
   12391             verifyResultsConvertDouble4Ushort4(inV, out, false);
   12392         } catch (Exception e) {
   12393             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Double4Ushort4: " + e.toString());
   12394         }
   12395         try {
   12396             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   12397             scriptRelaxed.forEach_testConvertUshort4Double4Ushort4(inV, out);
   12398             verifyResultsConvertDouble4Ushort4(inV, out, true);
   12399         } catch (Exception e) {
   12400             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Double4Ushort4: " + e.toString());
   12401         }
   12402     }
   12403 
   12404     private void verifyResultsConvertDouble4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
   12405         double[] arrayInV = new double[INPUTSIZE * 4];
   12406         inV.copyTo(arrayInV);
   12407         short[] arrayOut = new short[INPUTSIZE * 4];
   12408         out.copyTo(arrayOut);
   12409         for (int i = 0; i < INPUTSIZE; i++) {
   12410             for (int j = 0; j < 4 ; j++) {
   12411                 // Extract the inputs.
   12412                 ArgumentsDoubleUshort args = new ArgumentsDoubleUshort();
   12413                 args.inV = arrayInV[i * 4 + j];
   12414                 // Figure out what the outputs should have been.
   12415                 CoreMathVerifier.computeConvert(args);
   12416                 // Validate the outputs.
   12417                 boolean valid = true;
   12418                 if (args.out != arrayOut[i * 4 + j]) {
   12419                     valid = false;
   12420                 }
   12421                 if (!valid) {
   12422                     StringBuilder message = new StringBuilder();
   12423                     message.append("Input inV: ");
   12424                     message.append(String.format("%24.8g {%16x} %31a",
   12425                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   12426                     message.append("\n");
   12427                     message.append("Expected output out: ");
   12428                     message.append(String.format("0x%x", args.out));
   12429                     message.append("\n");
   12430                     message.append("Actual   output out: ");
   12431                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   12432                     if (args.out != arrayOut[i * 4 + j]) {
   12433                         message.append(" FAIL");
   12434                     }
   12435                     message.append("\n");
   12436                     assertTrue("Incorrect output for checkConvertDouble4Ushort4" +
   12437                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12438                 }
   12439             }
   12440         }
   12441     }
   12442 
   12443     public class ArgumentsLongUshort {
   12444         public long inV;
   12445         public short out;
   12446     }
   12447 
   12448     private void checkConvertLong2Ushort2() {
   12449         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x7b96893ebc97e8e9l, false, 16);
   12450         try {
   12451             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   12452             script.forEach_testConvertUshort2Long2Ushort2(inV, out);
   12453             verifyResultsConvertLong2Ushort2(inV, out, false);
   12454         } catch (Exception e) {
   12455             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Long2Ushort2: " + e.toString());
   12456         }
   12457         try {
   12458             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   12459             scriptRelaxed.forEach_testConvertUshort2Long2Ushort2(inV, out);
   12460             verifyResultsConvertLong2Ushort2(inV, out, true);
   12461         } catch (Exception e) {
   12462             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Long2Ushort2: " + e.toString());
   12463         }
   12464     }
   12465 
   12466     private void verifyResultsConvertLong2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
   12467         long[] arrayInV = new long[INPUTSIZE * 2];
   12468         inV.copyTo(arrayInV);
   12469         short[] arrayOut = new short[INPUTSIZE * 2];
   12470         out.copyTo(arrayOut);
   12471         for (int i = 0; i < INPUTSIZE; i++) {
   12472             for (int j = 0; j < 2 ; j++) {
   12473                 // Extract the inputs.
   12474                 ArgumentsLongUshort args = new ArgumentsLongUshort();
   12475                 args.inV = arrayInV[i * 2 + j];
   12476                 // Figure out what the outputs should have been.
   12477                 CoreMathVerifier.computeConvert(args);
   12478                 // Validate the outputs.
   12479                 boolean valid = true;
   12480                 if (args.out != arrayOut[i * 2 + j]) {
   12481                     valid = false;
   12482                 }
   12483                 if (!valid) {
   12484                     StringBuilder message = new StringBuilder();
   12485                     message.append("Input inV: ");
   12486                     message.append(String.format("%d", args.inV));
   12487                     message.append("\n");
   12488                     message.append("Expected output out: ");
   12489                     message.append(String.format("0x%x", args.out));
   12490                     message.append("\n");
   12491                     message.append("Actual   output out: ");
   12492                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   12493                     if (args.out != arrayOut[i * 2 + j]) {
   12494                         message.append(" FAIL");
   12495                     }
   12496                     message.append("\n");
   12497                     assertTrue("Incorrect output for checkConvertLong2Ushort2" +
   12498                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12499                 }
   12500             }
   12501         }
   12502     }
   12503 
   12504     private void checkConvertLong3Ushort3() {
   12505         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x7be350c612f37a15l, false, 16);
   12506         try {
   12507             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   12508             script.forEach_testConvertUshort3Long3Ushort3(inV, out);
   12509             verifyResultsConvertLong3Ushort3(inV, out, false);
   12510         } catch (Exception e) {
   12511             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Long3Ushort3: " + e.toString());
   12512         }
   12513         try {
   12514             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   12515             scriptRelaxed.forEach_testConvertUshort3Long3Ushort3(inV, out);
   12516             verifyResultsConvertLong3Ushort3(inV, out, true);
   12517         } catch (Exception e) {
   12518             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Long3Ushort3: " + e.toString());
   12519         }
   12520     }
   12521 
   12522     private void verifyResultsConvertLong3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
   12523         long[] arrayInV = new long[INPUTSIZE * 4];
   12524         inV.copyTo(arrayInV);
   12525         short[] arrayOut = new short[INPUTSIZE * 4];
   12526         out.copyTo(arrayOut);
   12527         for (int i = 0; i < INPUTSIZE; i++) {
   12528             for (int j = 0; j < 3 ; j++) {
   12529                 // Extract the inputs.
   12530                 ArgumentsLongUshort args = new ArgumentsLongUshort();
   12531                 args.inV = arrayInV[i * 4 + j];
   12532                 // Figure out what the outputs should have been.
   12533                 CoreMathVerifier.computeConvert(args);
   12534                 // Validate the outputs.
   12535                 boolean valid = true;
   12536                 if (args.out != arrayOut[i * 4 + j]) {
   12537                     valid = false;
   12538                 }
   12539                 if (!valid) {
   12540                     StringBuilder message = new StringBuilder();
   12541                     message.append("Input inV: ");
   12542                     message.append(String.format("%d", args.inV));
   12543                     message.append("\n");
   12544                     message.append("Expected output out: ");
   12545                     message.append(String.format("0x%x", args.out));
   12546                     message.append("\n");
   12547                     message.append("Actual   output out: ");
   12548                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   12549                     if (args.out != arrayOut[i * 4 + j]) {
   12550                         message.append(" FAIL");
   12551                     }
   12552                     message.append("\n");
   12553                     assertTrue("Incorrect output for checkConvertLong3Ushort3" +
   12554                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12555                 }
   12556             }
   12557         }
   12558     }
   12559 
   12560     private void checkConvertLong4Ushort4() {
   12561         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x7c30184d694f0b41l, false, 16);
   12562         try {
   12563             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   12564             script.forEach_testConvertUshort4Long4Ushort4(inV, out);
   12565             verifyResultsConvertLong4Ushort4(inV, out, false);
   12566         } catch (Exception e) {
   12567             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Long4Ushort4: " + e.toString());
   12568         }
   12569         try {
   12570             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   12571             scriptRelaxed.forEach_testConvertUshort4Long4Ushort4(inV, out);
   12572             verifyResultsConvertLong4Ushort4(inV, out, true);
   12573         } catch (Exception e) {
   12574             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Long4Ushort4: " + e.toString());
   12575         }
   12576     }
   12577 
   12578     private void verifyResultsConvertLong4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
   12579         long[] arrayInV = new long[INPUTSIZE * 4];
   12580         inV.copyTo(arrayInV);
   12581         short[] arrayOut = new short[INPUTSIZE * 4];
   12582         out.copyTo(arrayOut);
   12583         for (int i = 0; i < INPUTSIZE; i++) {
   12584             for (int j = 0; j < 4 ; j++) {
   12585                 // Extract the inputs.
   12586                 ArgumentsLongUshort args = new ArgumentsLongUshort();
   12587                 args.inV = arrayInV[i * 4 + j];
   12588                 // Figure out what the outputs should have been.
   12589                 CoreMathVerifier.computeConvert(args);
   12590                 // Validate the outputs.
   12591                 boolean valid = true;
   12592                 if (args.out != arrayOut[i * 4 + j]) {
   12593                     valid = false;
   12594                 }
   12595                 if (!valid) {
   12596                     StringBuilder message = new StringBuilder();
   12597                     message.append("Input inV: ");
   12598                     message.append(String.format("%d", args.inV));
   12599                     message.append("\n");
   12600                     message.append("Expected output out: ");
   12601                     message.append(String.format("0x%x", args.out));
   12602                     message.append("\n");
   12603                     message.append("Actual   output out: ");
   12604                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   12605                     if (args.out != arrayOut[i * 4 + j]) {
   12606                         message.append(" FAIL");
   12607                     }
   12608                     message.append("\n");
   12609                     assertTrue("Incorrect output for checkConvertLong4Ushort4" +
   12610                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12611                 }
   12612             }
   12613         }
   12614     }
   12615 
   12616     public class ArgumentsUlongUshort {
   12617         public long inV;
   12618         public short out;
   12619     }
   12620 
   12621     private void checkConvertUlong2Ushort2() {
   12622         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xaa35ea85e9e438a2l, false, 16);
   12623         try {
   12624             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   12625             script.forEach_testConvertUshort2Ulong2Ushort2(inV, out);
   12626             verifyResultsConvertUlong2Ushort2(inV, out, false);
   12627         } catch (Exception e) {
   12628             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Ulong2Ushort2: " + e.toString());
   12629         }
   12630         try {
   12631             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
   12632             scriptRelaxed.forEach_testConvertUshort2Ulong2Ushort2(inV, out);
   12633             verifyResultsConvertUlong2Ushort2(inV, out, true);
   12634         } catch (Exception e) {
   12635             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort2Ulong2Ushort2: " + e.toString());
   12636         }
   12637     }
   12638 
   12639     private void verifyResultsConvertUlong2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
   12640         long[] arrayInV = new long[INPUTSIZE * 2];
   12641         inV.copyTo(arrayInV);
   12642         short[] arrayOut = new short[INPUTSIZE * 2];
   12643         out.copyTo(arrayOut);
   12644         for (int i = 0; i < INPUTSIZE; i++) {
   12645             for (int j = 0; j < 2 ; j++) {
   12646                 // Extract the inputs.
   12647                 ArgumentsUlongUshort args = new ArgumentsUlongUshort();
   12648                 args.inV = arrayInV[i * 2 + j];
   12649                 // Figure out what the outputs should have been.
   12650                 CoreMathVerifier.computeConvert(args);
   12651                 // Validate the outputs.
   12652                 boolean valid = true;
   12653                 if (args.out != arrayOut[i * 2 + j]) {
   12654                     valid = false;
   12655                 }
   12656                 if (!valid) {
   12657                     StringBuilder message = new StringBuilder();
   12658                     message.append("Input inV: ");
   12659                     message.append(String.format("0x%x", args.inV));
   12660                     message.append("\n");
   12661                     message.append("Expected output out: ");
   12662                     message.append(String.format("0x%x", args.out));
   12663                     message.append("\n");
   12664                     message.append("Actual   output out: ");
   12665                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   12666                     if (args.out != arrayOut[i * 2 + j]) {
   12667                         message.append(" FAIL");
   12668                     }
   12669                     message.append("\n");
   12670                     assertTrue("Incorrect output for checkConvertUlong2Ushort2" +
   12671                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12672                 }
   12673             }
   12674         }
   12675     }
   12676 
   12677     private void checkConvertUlong3Ushort3() {
   12678         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xaa82b20d403fc9cel, false, 16);
   12679         try {
   12680             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   12681             script.forEach_testConvertUshort3Ulong3Ushort3(inV, out);
   12682             verifyResultsConvertUlong3Ushort3(inV, out, false);
   12683         } catch (Exception e) {
   12684             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Ulong3Ushort3: " + e.toString());
   12685         }
   12686         try {
   12687             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
   12688             scriptRelaxed.forEach_testConvertUshort3Ulong3Ushort3(inV, out);
   12689             verifyResultsConvertUlong3Ushort3(inV, out, true);
   12690         } catch (Exception e) {
   12691             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort3Ulong3Ushort3: " + e.toString());
   12692         }
   12693     }
   12694 
   12695     private void verifyResultsConvertUlong3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
   12696         long[] arrayInV = new long[INPUTSIZE * 4];
   12697         inV.copyTo(arrayInV);
   12698         short[] arrayOut = new short[INPUTSIZE * 4];
   12699         out.copyTo(arrayOut);
   12700         for (int i = 0; i < INPUTSIZE; i++) {
   12701             for (int j = 0; j < 3 ; j++) {
   12702                 // Extract the inputs.
   12703                 ArgumentsUlongUshort args = new ArgumentsUlongUshort();
   12704                 args.inV = arrayInV[i * 4 + j];
   12705                 // Figure out what the outputs should have been.
   12706                 CoreMathVerifier.computeConvert(args);
   12707                 // Validate the outputs.
   12708                 boolean valid = true;
   12709                 if (args.out != arrayOut[i * 4 + j]) {
   12710                     valid = false;
   12711                 }
   12712                 if (!valid) {
   12713                     StringBuilder message = new StringBuilder();
   12714                     message.append("Input inV: ");
   12715                     message.append(String.format("0x%x", args.inV));
   12716                     message.append("\n");
   12717                     message.append("Expected output out: ");
   12718                     message.append(String.format("0x%x", args.out));
   12719                     message.append("\n");
   12720                     message.append("Actual   output out: ");
   12721                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   12722                     if (args.out != arrayOut[i * 4 + j]) {
   12723                         message.append(" FAIL");
   12724                     }
   12725                     message.append("\n");
   12726                     assertTrue("Incorrect output for checkConvertUlong3Ushort3" +
   12727                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12728                 }
   12729             }
   12730         }
   12731     }
   12732 
   12733     private void checkConvertUlong4Ushort4() {
   12734         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xaacf7994969b5afal, false, 16);
   12735         try {
   12736             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   12737             script.forEach_testConvertUshort4Ulong4Ushort4(inV, out);
   12738             verifyResultsConvertUlong4Ushort4(inV, out, false);
   12739         } catch (Exception e) {
   12740             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Ulong4Ushort4: " + e.toString());
   12741         }
   12742         try {
   12743             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
   12744             scriptRelaxed.forEach_testConvertUshort4Ulong4Ushort4(inV, out);
   12745             verifyResultsConvertUlong4Ushort4(inV, out, true);
   12746         } catch (Exception e) {
   12747             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUshort4Ulong4Ushort4: " + e.toString());
   12748         }
   12749     }
   12750 
   12751     private void verifyResultsConvertUlong4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
   12752         long[] arrayInV = new long[INPUTSIZE * 4];
   12753         inV.copyTo(arrayInV);
   12754         short[] arrayOut = new short[INPUTSIZE * 4];
   12755         out.copyTo(arrayOut);
   12756         for (int i = 0; i < INPUTSIZE; i++) {
   12757             for (int j = 0; j < 4 ; j++) {
   12758                 // Extract the inputs.
   12759                 ArgumentsUlongUshort args = new ArgumentsUlongUshort();
   12760                 args.inV = arrayInV[i * 4 + j];
   12761                 // Figure out what the outputs should have been.
   12762                 CoreMathVerifier.computeConvert(args);
   12763                 // Validate the outputs.
   12764                 boolean valid = true;
   12765                 if (args.out != arrayOut[i * 4 + j]) {
   12766                     valid = false;
   12767                 }
   12768                 if (!valid) {
   12769                     StringBuilder message = new StringBuilder();
   12770                     message.append("Input inV: ");
   12771                     message.append(String.format("0x%x", args.inV));
   12772                     message.append("\n");
   12773                     message.append("Expected output out: ");
   12774                     message.append(String.format("0x%x", args.out));
   12775                     message.append("\n");
   12776                     message.append("Actual   output out: ");
   12777                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   12778                     if (args.out != arrayOut[i * 4 + j]) {
   12779                         message.append(" FAIL");
   12780                     }
   12781                     message.append("\n");
   12782                     assertTrue("Incorrect output for checkConvertUlong4Ushort4" +
   12783                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12784                 }
   12785             }
   12786         }
   12787     }
   12788 
   12789     public class ArgumentsDoubleInt {
   12790         public double inV;
   12791         public int out;
   12792     }
   12793 
   12794     private void checkConvertDouble2Int2() {
   12795         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xa57cd81dcaf628fcl, -2.1474836480000000000e+09, 2.1474836470000000000e+09);
   12796         try {
   12797             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   12798             script.forEach_testConvertInt2Double2Int2(inV, out);
   12799             verifyResultsConvertDouble2Int2(inV, out, false);
   12800         } catch (Exception e) {
   12801             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Double2Int2: " + e.toString());
   12802         }
   12803         try {
   12804             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   12805             scriptRelaxed.forEach_testConvertInt2Double2Int2(inV, out);
   12806             verifyResultsConvertDouble2Int2(inV, out, true);
   12807         } catch (Exception e) {
   12808             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Double2Int2: " + e.toString());
   12809         }
   12810     }
   12811 
   12812     private void verifyResultsConvertDouble2Int2(Allocation inV, Allocation out, boolean relaxed) {
   12813         double[] arrayInV = new double[INPUTSIZE * 2];
   12814         inV.copyTo(arrayInV);
   12815         int[] arrayOut = new int[INPUTSIZE * 2];
   12816         out.copyTo(arrayOut);
   12817         for (int i = 0; i < INPUTSIZE; i++) {
   12818             for (int j = 0; j < 2 ; j++) {
   12819                 // Extract the inputs.
   12820                 ArgumentsDoubleInt args = new ArgumentsDoubleInt();
   12821                 args.inV = arrayInV[i * 2 + j];
   12822                 // Figure out what the outputs should have been.
   12823                 CoreMathVerifier.computeConvert(args);
   12824                 // Validate the outputs.
   12825                 boolean valid = true;
   12826                 if (args.out != arrayOut[i * 2 + j]) {
   12827                     valid = false;
   12828                 }
   12829                 if (!valid) {
   12830                     StringBuilder message = new StringBuilder();
   12831                     message.append("Input inV: ");
   12832                     message.append(String.format("%24.8g {%16x} %31a",
   12833                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   12834                     message.append("\n");
   12835                     message.append("Expected output out: ");
   12836                     message.append(String.format("%d", args.out));
   12837                     message.append("\n");
   12838                     message.append("Actual   output out: ");
   12839                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   12840                     if (args.out != arrayOut[i * 2 + j]) {
   12841                         message.append(" FAIL");
   12842                     }
   12843                     message.append("\n");
   12844                     assertTrue("Incorrect output for checkConvertDouble2Int2" +
   12845                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12846                 }
   12847             }
   12848         }
   12849     }
   12850 
   12851     private void checkConvertDouble3Int3() {
   12852         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0xa57cd85d149e3932l, -2.1474836480000000000e+09, 2.1474836470000000000e+09);
   12853         try {
   12854             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   12855             script.forEach_testConvertInt3Double3Int3(inV, out);
   12856             verifyResultsConvertDouble3Int3(inV, out, false);
   12857         } catch (Exception e) {
   12858             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Double3Int3: " + e.toString());
   12859         }
   12860         try {
   12861             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   12862             scriptRelaxed.forEach_testConvertInt3Double3Int3(inV, out);
   12863             verifyResultsConvertDouble3Int3(inV, out, true);
   12864         } catch (Exception e) {
   12865             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Double3Int3: " + e.toString());
   12866         }
   12867     }
   12868 
   12869     private void verifyResultsConvertDouble3Int3(Allocation inV, Allocation out, boolean relaxed) {
   12870         double[] arrayInV = new double[INPUTSIZE * 4];
   12871         inV.copyTo(arrayInV);
   12872         int[] arrayOut = new int[INPUTSIZE * 4];
   12873         out.copyTo(arrayOut);
   12874         for (int i = 0; i < INPUTSIZE; i++) {
   12875             for (int j = 0; j < 3 ; j++) {
   12876                 // Extract the inputs.
   12877                 ArgumentsDoubleInt args = new ArgumentsDoubleInt();
   12878                 args.inV = arrayInV[i * 4 + j];
   12879                 // Figure out what the outputs should have been.
   12880                 CoreMathVerifier.computeConvert(args);
   12881                 // Validate the outputs.
   12882                 boolean valid = true;
   12883                 if (args.out != arrayOut[i * 4 + j]) {
   12884                     valid = false;
   12885                 }
   12886                 if (!valid) {
   12887                     StringBuilder message = new StringBuilder();
   12888                     message.append("Input inV: ");
   12889                     message.append(String.format("%24.8g {%16x} %31a",
   12890                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   12891                     message.append("\n");
   12892                     message.append("Expected output out: ");
   12893                     message.append(String.format("%d", args.out));
   12894                     message.append("\n");
   12895                     message.append("Actual   output out: ");
   12896                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   12897                     if (args.out != arrayOut[i * 4 + j]) {
   12898                         message.append(" FAIL");
   12899                     }
   12900                     message.append("\n");
   12901                     assertTrue("Incorrect output for checkConvertDouble3Int3" +
   12902                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12903                 }
   12904             }
   12905         }
   12906     }
   12907 
   12908     private void checkConvertDouble4Int4() {
   12909         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xa57cd89c5e464968l, -2.1474836480000000000e+09, 2.1474836470000000000e+09);
   12910         try {
   12911             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   12912             script.forEach_testConvertInt4Double4Int4(inV, out);
   12913             verifyResultsConvertDouble4Int4(inV, out, false);
   12914         } catch (Exception e) {
   12915             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Double4Int4: " + e.toString());
   12916         }
   12917         try {
   12918             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   12919             scriptRelaxed.forEach_testConvertInt4Double4Int4(inV, out);
   12920             verifyResultsConvertDouble4Int4(inV, out, true);
   12921         } catch (Exception e) {
   12922             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Double4Int4: " + e.toString());
   12923         }
   12924     }
   12925 
   12926     private void verifyResultsConvertDouble4Int4(Allocation inV, Allocation out, boolean relaxed) {
   12927         double[] arrayInV = new double[INPUTSIZE * 4];
   12928         inV.copyTo(arrayInV);
   12929         int[] arrayOut = new int[INPUTSIZE * 4];
   12930         out.copyTo(arrayOut);
   12931         for (int i = 0; i < INPUTSIZE; i++) {
   12932             for (int j = 0; j < 4 ; j++) {
   12933                 // Extract the inputs.
   12934                 ArgumentsDoubleInt args = new ArgumentsDoubleInt();
   12935                 args.inV = arrayInV[i * 4 + j];
   12936                 // Figure out what the outputs should have been.
   12937                 CoreMathVerifier.computeConvert(args);
   12938                 // Validate the outputs.
   12939                 boolean valid = true;
   12940                 if (args.out != arrayOut[i * 4 + j]) {
   12941                     valid = false;
   12942                 }
   12943                 if (!valid) {
   12944                     StringBuilder message = new StringBuilder();
   12945                     message.append("Input inV: ");
   12946                     message.append(String.format("%24.8g {%16x} %31a",
   12947                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   12948                     message.append("\n");
   12949                     message.append("Expected output out: ");
   12950                     message.append(String.format("%d", args.out));
   12951                     message.append("\n");
   12952                     message.append("Actual   output out: ");
   12953                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   12954                     if (args.out != arrayOut[i * 4 + j]) {
   12955                         message.append(" FAIL");
   12956                     }
   12957                     message.append("\n");
   12958                     assertTrue("Incorrect output for checkConvertDouble4Int4" +
   12959                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   12960                 }
   12961             }
   12962         }
   12963     }
   12964 
   12965     public class ArgumentsLongInt {
   12966         public long inV;
   12967         public int out;
   12968     }
   12969 
   12970     private void checkConvertLong2Int2() {
   12971         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xfe441c66e5deba3bl, true, 31);
   12972         try {
   12973             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   12974             script.forEach_testConvertInt2Long2Int2(inV, out);
   12975             verifyResultsConvertLong2Int2(inV, out, false);
   12976         } catch (Exception e) {
   12977             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Long2Int2: " + e.toString());
   12978         }
   12979         try {
   12980             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   12981             scriptRelaxed.forEach_testConvertInt2Long2Int2(inV, out);
   12982             verifyResultsConvertLong2Int2(inV, out, true);
   12983         } catch (Exception e) {
   12984             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Long2Int2: " + e.toString());
   12985         }
   12986     }
   12987 
   12988     private void verifyResultsConvertLong2Int2(Allocation inV, Allocation out, boolean relaxed) {
   12989         long[] arrayInV = new long[INPUTSIZE * 2];
   12990         inV.copyTo(arrayInV);
   12991         int[] arrayOut = new int[INPUTSIZE * 2];
   12992         out.copyTo(arrayOut);
   12993         for (int i = 0; i < INPUTSIZE; i++) {
   12994             for (int j = 0; j < 2 ; j++) {
   12995                 // Extract the inputs.
   12996                 ArgumentsLongInt args = new ArgumentsLongInt();
   12997                 args.inV = arrayInV[i * 2 + j];
   12998                 // Figure out what the outputs should have been.
   12999                 CoreMathVerifier.computeConvert(args);
   13000                 // Validate the outputs.
   13001                 boolean valid = true;
   13002                 if (args.out != arrayOut[i * 2 + j]) {
   13003                     valid = false;
   13004                 }
   13005                 if (!valid) {
   13006                     StringBuilder message = new StringBuilder();
   13007                     message.append("Input inV: ");
   13008                     message.append(String.format("%d", args.inV));
   13009                     message.append("\n");
   13010                     message.append("Expected output out: ");
   13011                     message.append(String.format("%d", args.out));
   13012                     message.append("\n");
   13013                     message.append("Actual   output out: ");
   13014                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   13015                     if (args.out != arrayOut[i * 2 + j]) {
   13016                         message.append(" FAIL");
   13017                     }
   13018                     message.append("\n");
   13019                     assertTrue("Incorrect output for checkConvertLong2Int2" +
   13020                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13021                 }
   13022             }
   13023         }
   13024     }
   13025 
   13026     private void checkConvertLong3Int3() {
   13027         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xfe441ca62f86ca71l, true, 31);
   13028         try {
   13029             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   13030             script.forEach_testConvertInt3Long3Int3(inV, out);
   13031             verifyResultsConvertLong3Int3(inV, out, false);
   13032         } catch (Exception e) {
   13033             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Long3Int3: " + e.toString());
   13034         }
   13035         try {
   13036             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   13037             scriptRelaxed.forEach_testConvertInt3Long3Int3(inV, out);
   13038             verifyResultsConvertLong3Int3(inV, out, true);
   13039         } catch (Exception e) {
   13040             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Long3Int3: " + e.toString());
   13041         }
   13042     }
   13043 
   13044     private void verifyResultsConvertLong3Int3(Allocation inV, Allocation out, boolean relaxed) {
   13045         long[] arrayInV = new long[INPUTSIZE * 4];
   13046         inV.copyTo(arrayInV);
   13047         int[] arrayOut = new int[INPUTSIZE * 4];
   13048         out.copyTo(arrayOut);
   13049         for (int i = 0; i < INPUTSIZE; i++) {
   13050             for (int j = 0; j < 3 ; j++) {
   13051                 // Extract the inputs.
   13052                 ArgumentsLongInt args = new ArgumentsLongInt();
   13053                 args.inV = arrayInV[i * 4 + j];
   13054                 // Figure out what the outputs should have been.
   13055                 CoreMathVerifier.computeConvert(args);
   13056                 // Validate the outputs.
   13057                 boolean valid = true;
   13058                 if (args.out != arrayOut[i * 4 + j]) {
   13059                     valid = false;
   13060                 }
   13061                 if (!valid) {
   13062                     StringBuilder message = new StringBuilder();
   13063                     message.append("Input inV: ");
   13064                     message.append(String.format("%d", args.inV));
   13065                     message.append("\n");
   13066                     message.append("Expected output out: ");
   13067                     message.append(String.format("%d", args.out));
   13068                     message.append("\n");
   13069                     message.append("Actual   output out: ");
   13070                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   13071                     if (args.out != arrayOut[i * 4 + j]) {
   13072                         message.append(" FAIL");
   13073                     }
   13074                     message.append("\n");
   13075                     assertTrue("Incorrect output for checkConvertLong3Int3" +
   13076                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13077                 }
   13078             }
   13079         }
   13080     }
   13081 
   13082     private void checkConvertLong4Int4() {
   13083         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xfe441ce5792edaa7l, true, 31);
   13084         try {
   13085             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   13086             script.forEach_testConvertInt4Long4Int4(inV, out);
   13087             verifyResultsConvertLong4Int4(inV, out, false);
   13088         } catch (Exception e) {
   13089             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Long4Int4: " + e.toString());
   13090         }
   13091         try {
   13092             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   13093             scriptRelaxed.forEach_testConvertInt4Long4Int4(inV, out);
   13094             verifyResultsConvertLong4Int4(inV, out, true);
   13095         } catch (Exception e) {
   13096             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Long4Int4: " + e.toString());
   13097         }
   13098     }
   13099 
   13100     private void verifyResultsConvertLong4Int4(Allocation inV, Allocation out, boolean relaxed) {
   13101         long[] arrayInV = new long[INPUTSIZE * 4];
   13102         inV.copyTo(arrayInV);
   13103         int[] arrayOut = new int[INPUTSIZE * 4];
   13104         out.copyTo(arrayOut);
   13105         for (int i = 0; i < INPUTSIZE; i++) {
   13106             for (int j = 0; j < 4 ; j++) {
   13107                 // Extract the inputs.
   13108                 ArgumentsLongInt args = new ArgumentsLongInt();
   13109                 args.inV = arrayInV[i * 4 + j];
   13110                 // Figure out what the outputs should have been.
   13111                 CoreMathVerifier.computeConvert(args);
   13112                 // Validate the outputs.
   13113                 boolean valid = true;
   13114                 if (args.out != arrayOut[i * 4 + j]) {
   13115                     valid = false;
   13116                 }
   13117                 if (!valid) {
   13118                     StringBuilder message = new StringBuilder();
   13119                     message.append("Input inV: ");
   13120                     message.append(String.format("%d", args.inV));
   13121                     message.append("\n");
   13122                     message.append("Expected output out: ");
   13123                     message.append(String.format("%d", args.out));
   13124                     message.append("\n");
   13125                     message.append("Actual   output out: ");
   13126                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   13127                     if (args.out != arrayOut[i * 4 + j]) {
   13128                         message.append(" FAIL");
   13129                     }
   13130                     message.append("\n");
   13131                     assertTrue("Incorrect output for checkConvertLong4Int4" +
   13132                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13133                 }
   13134             }
   13135         }
   13136     }
   13137 
   13138     public class ArgumentsUlongInt {
   13139         public long inV;
   13140         public int out;
   13141     }
   13142 
   13143     private void checkConvertUlong2Int2() {
   13144         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xe11d350e352de3el, false, 31);
   13145         try {
   13146             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   13147             script.forEach_testConvertInt2Ulong2Int2(inV, out);
   13148             verifyResultsConvertUlong2Int2(inV, out, false);
   13149         } catch (Exception e) {
   13150             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Ulong2Int2: " + e.toString());
   13151         }
   13152         try {
   13153             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
   13154             scriptRelaxed.forEach_testConvertInt2Ulong2Int2(inV, out);
   13155             verifyResultsConvertUlong2Int2(inV, out, true);
   13156         } catch (Exception e) {
   13157             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt2Ulong2Int2: " + e.toString());
   13158         }
   13159     }
   13160 
   13161     private void verifyResultsConvertUlong2Int2(Allocation inV, Allocation out, boolean relaxed) {
   13162         long[] arrayInV = new long[INPUTSIZE * 2];
   13163         inV.copyTo(arrayInV);
   13164         int[] arrayOut = new int[INPUTSIZE * 2];
   13165         out.copyTo(arrayOut);
   13166         for (int i = 0; i < INPUTSIZE; i++) {
   13167             for (int j = 0; j < 2 ; j++) {
   13168                 // Extract the inputs.
   13169                 ArgumentsUlongInt args = new ArgumentsUlongInt();
   13170                 args.inV = arrayInV[i * 2 + j];
   13171                 // Figure out what the outputs should have been.
   13172                 CoreMathVerifier.computeConvert(args);
   13173                 // Validate the outputs.
   13174                 boolean valid = true;
   13175                 if (args.out != arrayOut[i * 2 + j]) {
   13176                     valid = false;
   13177                 }
   13178                 if (!valid) {
   13179                     StringBuilder message = new StringBuilder();
   13180                     message.append("Input inV: ");
   13181                     message.append(String.format("0x%x", args.inV));
   13182                     message.append("\n");
   13183                     message.append("Expected output out: ");
   13184                     message.append(String.format("%d", args.out));
   13185                     message.append("\n");
   13186                     message.append("Actual   output out: ");
   13187                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   13188                     if (args.out != arrayOut[i * 2 + j]) {
   13189                         message.append(" FAIL");
   13190                     }
   13191                     message.append("\n");
   13192                     assertTrue("Incorrect output for checkConvertUlong2Int2" +
   13193                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13194                 }
   13195             }
   13196         }
   13197     }
   13198 
   13199     private void checkConvertUlong3Int3() {
   13200         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xe11d3902cfaee74l, false, 31);
   13201         try {
   13202             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   13203             script.forEach_testConvertInt3Ulong3Int3(inV, out);
   13204             verifyResultsConvertUlong3Int3(inV, out, false);
   13205         } catch (Exception e) {
   13206             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Ulong3Int3: " + e.toString());
   13207         }
   13208         try {
   13209             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
   13210             scriptRelaxed.forEach_testConvertInt3Ulong3Int3(inV, out);
   13211             verifyResultsConvertUlong3Int3(inV, out, true);
   13212         } catch (Exception e) {
   13213             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt3Ulong3Int3: " + e.toString());
   13214         }
   13215     }
   13216 
   13217     private void verifyResultsConvertUlong3Int3(Allocation inV, Allocation out, boolean relaxed) {
   13218         long[] arrayInV = new long[INPUTSIZE * 4];
   13219         inV.copyTo(arrayInV);
   13220         int[] arrayOut = new int[INPUTSIZE * 4];
   13221         out.copyTo(arrayOut);
   13222         for (int i = 0; i < INPUTSIZE; i++) {
   13223             for (int j = 0; j < 3 ; j++) {
   13224                 // Extract the inputs.
   13225                 ArgumentsUlongInt args = new ArgumentsUlongInt();
   13226                 args.inV = arrayInV[i * 4 + j];
   13227                 // Figure out what the outputs should have been.
   13228                 CoreMathVerifier.computeConvert(args);
   13229                 // Validate the outputs.
   13230                 boolean valid = true;
   13231                 if (args.out != arrayOut[i * 4 + j]) {
   13232                     valid = false;
   13233                 }
   13234                 if (!valid) {
   13235                     StringBuilder message = new StringBuilder();
   13236                     message.append("Input inV: ");
   13237                     message.append(String.format("0x%x", args.inV));
   13238                     message.append("\n");
   13239                     message.append("Expected output out: ");
   13240                     message.append(String.format("%d", args.out));
   13241                     message.append("\n");
   13242                     message.append("Actual   output out: ");
   13243                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   13244                     if (args.out != arrayOut[i * 4 + j]) {
   13245                         message.append(" FAIL");
   13246                     }
   13247                     message.append("\n");
   13248                     assertTrue("Incorrect output for checkConvertUlong3Int3" +
   13249                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13250                 }
   13251             }
   13252         }
   13253     }
   13254 
   13255     private void checkConvertUlong4Int4() {
   13256         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xe11d3cf76a2feaal, false, 31);
   13257         try {
   13258             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   13259             script.forEach_testConvertInt4Ulong4Int4(inV, out);
   13260             verifyResultsConvertUlong4Int4(inV, out, false);
   13261         } catch (Exception e) {
   13262             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Ulong4Int4: " + e.toString());
   13263         }
   13264         try {
   13265             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
   13266             scriptRelaxed.forEach_testConvertInt4Ulong4Int4(inV, out);
   13267             verifyResultsConvertUlong4Int4(inV, out, true);
   13268         } catch (Exception e) {
   13269             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertInt4Ulong4Int4: " + e.toString());
   13270         }
   13271     }
   13272 
   13273     private void verifyResultsConvertUlong4Int4(Allocation inV, Allocation out, boolean relaxed) {
   13274         long[] arrayInV = new long[INPUTSIZE * 4];
   13275         inV.copyTo(arrayInV);
   13276         int[] arrayOut = new int[INPUTSIZE * 4];
   13277         out.copyTo(arrayOut);
   13278         for (int i = 0; i < INPUTSIZE; i++) {
   13279             for (int j = 0; j < 4 ; j++) {
   13280                 // Extract the inputs.
   13281                 ArgumentsUlongInt args = new ArgumentsUlongInt();
   13282                 args.inV = arrayInV[i * 4 + j];
   13283                 // Figure out what the outputs should have been.
   13284                 CoreMathVerifier.computeConvert(args);
   13285                 // Validate the outputs.
   13286                 boolean valid = true;
   13287                 if (args.out != arrayOut[i * 4 + j]) {
   13288                     valid = false;
   13289                 }
   13290                 if (!valid) {
   13291                     StringBuilder message = new StringBuilder();
   13292                     message.append("Input inV: ");
   13293                     message.append(String.format("0x%x", args.inV));
   13294                     message.append("\n");
   13295                     message.append("Expected output out: ");
   13296                     message.append(String.format("%d", args.out));
   13297                     message.append("\n");
   13298                     message.append("Actual   output out: ");
   13299                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   13300                     if (args.out != arrayOut[i * 4 + j]) {
   13301                         message.append(" FAIL");
   13302                     }
   13303                     message.append("\n");
   13304                     assertTrue("Incorrect output for checkConvertUlong4Int4" +
   13305                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13306                 }
   13307             }
   13308         }
   13309     }
   13310 
   13311     public class ArgumentsDoubleUint {
   13312         public double inV;
   13313         public int out;
   13314     }
   13315 
   13316     private void checkConvertDouble2Uint2() {
   13317         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xcbf84ff107de7dd7l, 0.0000000000000000000e+00, 4.2949672950000000000e+09);
   13318         try {
   13319             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   13320             script.forEach_testConvertUint2Double2Uint2(inV, out);
   13321             verifyResultsConvertDouble2Uint2(inV, out, false);
   13322         } catch (Exception e) {
   13323             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Double2Uint2: " + e.toString());
   13324         }
   13325         try {
   13326             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   13327             scriptRelaxed.forEach_testConvertUint2Double2Uint2(inV, out);
   13328             verifyResultsConvertDouble2Uint2(inV, out, true);
   13329         } catch (Exception e) {
   13330             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Double2Uint2: " + e.toString());
   13331         }
   13332     }
   13333 
   13334     private void verifyResultsConvertDouble2Uint2(Allocation inV, Allocation out, boolean relaxed) {
   13335         double[] arrayInV = new double[INPUTSIZE * 2];
   13336         inV.copyTo(arrayInV);
   13337         int[] arrayOut = new int[INPUTSIZE * 2];
   13338         out.copyTo(arrayOut);
   13339         for (int i = 0; i < INPUTSIZE; i++) {
   13340             for (int j = 0; j < 2 ; j++) {
   13341                 // Extract the inputs.
   13342                 ArgumentsDoubleUint args = new ArgumentsDoubleUint();
   13343                 args.inV = arrayInV[i * 2 + j];
   13344                 // Figure out what the outputs should have been.
   13345                 CoreMathVerifier.computeConvert(args);
   13346                 // Validate the outputs.
   13347                 boolean valid = true;
   13348                 if (args.out != arrayOut[i * 2 + j]) {
   13349                     valid = false;
   13350                 }
   13351                 if (!valid) {
   13352                     StringBuilder message = new StringBuilder();
   13353                     message.append("Input inV: ");
   13354                     message.append(String.format("%24.8g {%16x} %31a",
   13355                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   13356                     message.append("\n");
   13357                     message.append("Expected output out: ");
   13358                     message.append(String.format("0x%x", args.out));
   13359                     message.append("\n");
   13360                     message.append("Actual   output out: ");
   13361                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   13362                     if (args.out != arrayOut[i * 2 + j]) {
   13363                         message.append(" FAIL");
   13364                     }
   13365                     message.append("\n");
   13366                     assertTrue("Incorrect output for checkConvertDouble2Uint2" +
   13367                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13368                 }
   13369             }
   13370         }
   13371     }
   13372 
   13373     private void checkConvertDouble3Uint3() {
   13374         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0xcbf85a9266e642cbl, 0.0000000000000000000e+00, 4.2949672950000000000e+09);
   13375         try {
   13376             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   13377             script.forEach_testConvertUint3Double3Uint3(inV, out);
   13378             verifyResultsConvertDouble3Uint3(inV, out, false);
   13379         } catch (Exception e) {
   13380             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Double3Uint3: " + e.toString());
   13381         }
   13382         try {
   13383             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   13384             scriptRelaxed.forEach_testConvertUint3Double3Uint3(inV, out);
   13385             verifyResultsConvertDouble3Uint3(inV, out, true);
   13386         } catch (Exception e) {
   13387             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Double3Uint3: " + e.toString());
   13388         }
   13389     }
   13390 
   13391     private void verifyResultsConvertDouble3Uint3(Allocation inV, Allocation out, boolean relaxed) {
   13392         double[] arrayInV = new double[INPUTSIZE * 4];
   13393         inV.copyTo(arrayInV);
   13394         int[] arrayOut = new int[INPUTSIZE * 4];
   13395         out.copyTo(arrayOut);
   13396         for (int i = 0; i < INPUTSIZE; i++) {
   13397             for (int j = 0; j < 3 ; j++) {
   13398                 // Extract the inputs.
   13399                 ArgumentsDoubleUint args = new ArgumentsDoubleUint();
   13400                 args.inV = arrayInV[i * 4 + j];
   13401                 // Figure out what the outputs should have been.
   13402                 CoreMathVerifier.computeConvert(args);
   13403                 // Validate the outputs.
   13404                 boolean valid = true;
   13405                 if (args.out != arrayOut[i * 4 + j]) {
   13406                     valid = false;
   13407                 }
   13408                 if (!valid) {
   13409                     StringBuilder message = new StringBuilder();
   13410                     message.append("Input inV: ");
   13411                     message.append(String.format("%24.8g {%16x} %31a",
   13412                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   13413                     message.append("\n");
   13414                     message.append("Expected output out: ");
   13415                     message.append(String.format("0x%x", args.out));
   13416                     message.append("\n");
   13417                     message.append("Actual   output out: ");
   13418                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   13419                     if (args.out != arrayOut[i * 4 + j]) {
   13420                         message.append(" FAIL");
   13421                     }
   13422                     message.append("\n");
   13423                     assertTrue("Incorrect output for checkConvertDouble3Uint3" +
   13424                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13425                 }
   13426             }
   13427         }
   13428     }
   13429 
   13430     private void checkConvertDouble4Uint4() {
   13431         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xcbf86533c5ee07bfl, 0.0000000000000000000e+00, 4.2949672950000000000e+09);
   13432         try {
   13433             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   13434             script.forEach_testConvertUint4Double4Uint4(inV, out);
   13435             verifyResultsConvertDouble4Uint4(inV, out, false);
   13436         } catch (Exception e) {
   13437             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Double4Uint4: " + e.toString());
   13438         }
   13439         try {
   13440             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   13441             scriptRelaxed.forEach_testConvertUint4Double4Uint4(inV, out);
   13442             verifyResultsConvertDouble4Uint4(inV, out, true);
   13443         } catch (Exception e) {
   13444             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Double4Uint4: " + e.toString());
   13445         }
   13446     }
   13447 
   13448     private void verifyResultsConvertDouble4Uint4(Allocation inV, Allocation out, boolean relaxed) {
   13449         double[] arrayInV = new double[INPUTSIZE * 4];
   13450         inV.copyTo(arrayInV);
   13451         int[] arrayOut = new int[INPUTSIZE * 4];
   13452         out.copyTo(arrayOut);
   13453         for (int i = 0; i < INPUTSIZE; i++) {
   13454             for (int j = 0; j < 4 ; j++) {
   13455                 // Extract the inputs.
   13456                 ArgumentsDoubleUint args = new ArgumentsDoubleUint();
   13457                 args.inV = arrayInV[i * 4 + j];
   13458                 // Figure out what the outputs should have been.
   13459                 CoreMathVerifier.computeConvert(args);
   13460                 // Validate the outputs.
   13461                 boolean valid = true;
   13462                 if (args.out != arrayOut[i * 4 + j]) {
   13463                     valid = false;
   13464                 }
   13465                 if (!valid) {
   13466                     StringBuilder message = new StringBuilder();
   13467                     message.append("Input inV: ");
   13468                     message.append(String.format("%24.8g {%16x} %31a",
   13469                             args.inV, Double.doubleToRawLongBits(args.inV), args.inV));
   13470                     message.append("\n");
   13471                     message.append("Expected output out: ");
   13472                     message.append(String.format("0x%x", args.out));
   13473                     message.append("\n");
   13474                     message.append("Actual   output out: ");
   13475                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   13476                     if (args.out != arrayOut[i * 4 + j]) {
   13477                         message.append(" FAIL");
   13478                     }
   13479                     message.append("\n");
   13480                     assertTrue("Incorrect output for checkConvertDouble4Uint4" +
   13481                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13482                 }
   13483             }
   13484         }
   13485     }
   13486 
   13487     public class ArgumentsLongUint {
   13488         public long inV;
   13489         public int out;
   13490     }
   13491 
   13492     private void checkConvertLong2Uint2() {
   13493         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xb570c8388ceee36cl, false, 32);
   13494         try {
   13495             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   13496             script.forEach_testConvertUint2Long2Uint2(inV, out);
   13497             verifyResultsConvertLong2Uint2(inV, out, false);
   13498         } catch (Exception e) {
   13499             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Long2Uint2: " + e.toString());
   13500         }
   13501         try {
   13502             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   13503             scriptRelaxed.forEach_testConvertUint2Long2Uint2(inV, out);
   13504             verifyResultsConvertLong2Uint2(inV, out, true);
   13505         } catch (Exception e) {
   13506             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Long2Uint2: " + e.toString());
   13507         }
   13508     }
   13509 
   13510     private void verifyResultsConvertLong2Uint2(Allocation inV, Allocation out, boolean relaxed) {
   13511         long[] arrayInV = new long[INPUTSIZE * 2];
   13512         inV.copyTo(arrayInV);
   13513         int[] arrayOut = new int[INPUTSIZE * 2];
   13514         out.copyTo(arrayOut);
   13515         for (int i = 0; i < INPUTSIZE; i++) {
   13516             for (int j = 0; j < 2 ; j++) {
   13517                 // Extract the inputs.
   13518                 ArgumentsLongUint args = new ArgumentsLongUint();
   13519                 args.inV = arrayInV[i * 2 + j];
   13520                 // Figure out what the outputs should have been.
   13521                 CoreMathVerifier.computeConvert(args);
   13522                 // Validate the outputs.
   13523                 boolean valid = true;
   13524                 if (args.out != arrayOut[i * 2 + j]) {
   13525                     valid = false;
   13526                 }
   13527                 if (!valid) {
   13528                     StringBuilder message = new StringBuilder();
   13529                     message.append("Input inV: ");
   13530                     message.append(String.format("%d", args.inV));
   13531                     message.append("\n");
   13532                     message.append("Expected output out: ");
   13533                     message.append(String.format("0x%x", args.out));
   13534                     message.append("\n");
   13535                     message.append("Actual   output out: ");
   13536                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   13537                     if (args.out != arrayOut[i * 2 + j]) {
   13538                         message.append(" FAIL");
   13539                     }
   13540                     message.append("\n");
   13541                     assertTrue("Incorrect output for checkConvertLong2Uint2" +
   13542                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13543                 }
   13544             }
   13545         }
   13546     }
   13547 
   13548     private void checkConvertLong3Uint3() {
   13549         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xb570d2d9ebf6a860l, false, 32);
   13550         try {
   13551             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   13552             script.forEach_testConvertUint3Long3Uint3(inV, out);
   13553             verifyResultsConvertLong3Uint3(inV, out, false);
   13554         } catch (Exception e) {
   13555             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Long3Uint3: " + e.toString());
   13556         }
   13557         try {
   13558             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   13559             scriptRelaxed.forEach_testConvertUint3Long3Uint3(inV, out);
   13560             verifyResultsConvertLong3Uint3(inV, out, true);
   13561         } catch (Exception e) {
   13562             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Long3Uint3: " + e.toString());
   13563         }
   13564     }
   13565 
   13566     private void verifyResultsConvertLong3Uint3(Allocation inV, Allocation out, boolean relaxed) {
   13567         long[] arrayInV = new long[INPUTSIZE * 4];
   13568         inV.copyTo(arrayInV);
   13569         int[] arrayOut = new int[INPUTSIZE * 4];
   13570         out.copyTo(arrayOut);
   13571         for (int i = 0; i < INPUTSIZE; i++) {
   13572             for (int j = 0; j < 3 ; j++) {
   13573                 // Extract the inputs.
   13574                 ArgumentsLongUint args = new ArgumentsLongUint();
   13575                 args.inV = arrayInV[i * 4 + j];
   13576                 // Figure out what the outputs should have been.
   13577                 CoreMathVerifier.computeConvert(args);
   13578                 // Validate the outputs.
   13579                 boolean valid = true;
   13580                 if (args.out != arrayOut[i * 4 + j]) {
   13581                     valid = false;
   13582                 }
   13583                 if (!valid) {
   13584                     StringBuilder message = new StringBuilder();
   13585                     message.append("Input inV: ");
   13586                     message.append(String.format("%d", args.inV));
   13587                     message.append("\n");
   13588                     message.append("Expected output out: ");
   13589                     message.append(String.format("0x%x", args.out));
   13590                     message.append("\n");
   13591                     message.append("Actual   output out: ");
   13592                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   13593                     if (args.out != arrayOut[i * 4 + j]) {
   13594                         message.append(" FAIL");
   13595                     }
   13596                     message.append("\n");
   13597                     assertTrue("Incorrect output for checkConvertLong3Uint3" +
   13598                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13599                 }
   13600             }
   13601         }
   13602     }
   13603 
   13604     private void checkConvertLong4Uint4() {
   13605         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xb570dd7b4afe6d54l, false, 32);
   13606         try {
   13607             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   13608             script.forEach_testConvertUint4Long4Uint4(inV, out);
   13609             verifyResultsConvertLong4Uint4(inV, out, false);
   13610         } catch (Exception e) {
   13611             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Long4Uint4: " + e.toString());
   13612         }
   13613         try {
   13614             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   13615             scriptRelaxed.forEach_testConvertUint4Long4Uint4(inV, out);
   13616             verifyResultsConvertLong4Uint4(inV, out, true);
   13617         } catch (Exception e) {
   13618             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Long4Uint4: " + e.toString());
   13619         }
   13620     }
   13621 
   13622     private void verifyResultsConvertLong4Uint4(Allocation inV, Allocation out, boolean relaxed) {
   13623         long[] arrayInV = new long[INPUTSIZE * 4];
   13624         inV.copyTo(arrayInV);
   13625         int[] arrayOut = new int[INPUTSIZE * 4];
   13626         out.copyTo(arrayOut);
   13627         for (int i = 0; i < INPUTSIZE; i++) {
   13628             for (int j = 0; j < 4 ; j++) {
   13629                 // Extract the inputs.
   13630                 ArgumentsLongUint args = new ArgumentsLongUint();
   13631                 args.inV = arrayInV[i * 4 + j];
   13632                 // Figure out what the outputs should have been.
   13633                 CoreMathVerifier.computeConvert(args);
   13634                 // Validate the outputs.
   13635                 boolean valid = true;
   13636                 if (args.out != arrayOut[i * 4 + j]) {
   13637                     valid = false;
   13638                 }
   13639                 if (!valid) {
   13640                     StringBuilder message = new StringBuilder();
   13641                     message.append("Input inV: ");
   13642                     message.append(String.format("%d", args.inV));
   13643                     message.append("\n");
   13644                     message.append("Expected output out: ");
   13645                     message.append(String.format("0x%x", args.out));
   13646                     message.append("\n");
   13647                     message.append("Actual   output out: ");
   13648                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   13649                     if (args.out != arrayOut[i * 4 + j]) {
   13650                         message.append(" FAIL");
   13651                     }
   13652                     message.append("\n");
   13653                     assertTrue("Incorrect output for checkConvertLong4Uint4" +
   13654                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13655                 }
   13656             }
   13657         }
   13658     }
   13659 
   13660     public class ArgumentsUlongUint {
   13661         public long inV;
   13662         public int out;
   13663     }
   13664 
   13665     private void checkConvertUlong2Uint2() {
   13666         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x5cfe81861f70efedl, false, 32);
   13667         try {
   13668             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   13669             script.forEach_testConvertUint2Ulong2Uint2(inV, out);
   13670             verifyResultsConvertUlong2Uint2(inV, out, false);
   13671         } catch (Exception e) {
   13672             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Ulong2Uint2: " + e.toString());
   13673         }
   13674         try {
   13675             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
   13676             scriptRelaxed.forEach_testConvertUint2Ulong2Uint2(inV, out);
   13677             verifyResultsConvertUlong2Uint2(inV, out, true);
   13678         } catch (Exception e) {
   13679             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint2Ulong2Uint2: " + e.toString());
   13680         }
   13681     }
   13682 
   13683     private void verifyResultsConvertUlong2Uint2(Allocation inV, Allocation out, boolean relaxed) {
   13684         long[] arrayInV = new long[INPUTSIZE * 2];
   13685         inV.copyTo(arrayInV);
   13686         int[] arrayOut = new int[INPUTSIZE * 2];
   13687         out.copyTo(arrayOut);
   13688         for (int i = 0; i < INPUTSIZE; i++) {
   13689             for (int j = 0; j < 2 ; j++) {
   13690                 // Extract the inputs.
   13691                 ArgumentsUlongUint args = new ArgumentsUlongUint();
   13692                 args.inV = arrayInV[i * 2 + j];
   13693                 // Figure out what the outputs should have been.
   13694                 CoreMathVerifier.computeConvert(args);
   13695                 // Validate the outputs.
   13696                 boolean valid = true;
   13697                 if (args.out != arrayOut[i * 2 + j]) {
   13698                     valid = false;
   13699                 }
   13700                 if (!valid) {
   13701                     StringBuilder message = new StringBuilder();
   13702                     message.append("Input inV: ");
   13703                     message.append(String.format("0x%x", args.inV));
   13704                     message.append("\n");
   13705                     message.append("Expected output out: ");
   13706                     message.append(String.format("0x%x", args.out));
   13707                     message.append("\n");
   13708                     message.append("Actual   output out: ");
   13709                     message.append(String.format("0x%x", arrayOut[i * 2 + j]));
   13710                     if (args.out != arrayOut[i * 2 + j]) {
   13711                         message.append(" FAIL");
   13712                     }
   13713                     message.append("\n");
   13714                     assertTrue("Incorrect output for checkConvertUlong2Uint2" +
   13715                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13716                 }
   13717             }
   13718         }
   13719     }
   13720 
   13721     private void checkConvertUlong3Uint3() {
   13722         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x5cfe8c277e78b4e1l, false, 32);
   13723         try {
   13724             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   13725             script.forEach_testConvertUint3Ulong3Uint3(inV, out);
   13726             verifyResultsConvertUlong3Uint3(inV, out, false);
   13727         } catch (Exception e) {
   13728             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Ulong3Uint3: " + e.toString());
   13729         }
   13730         try {
   13731             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
   13732             scriptRelaxed.forEach_testConvertUint3Ulong3Uint3(inV, out);
   13733             verifyResultsConvertUlong3Uint3(inV, out, true);
   13734         } catch (Exception e) {
   13735             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint3Ulong3Uint3: " + e.toString());
   13736         }
   13737     }
   13738 
   13739     private void verifyResultsConvertUlong3Uint3(Allocation inV, Allocation out, boolean relaxed) {
   13740         long[] arrayInV = new long[INPUTSIZE * 4];
   13741         inV.copyTo(arrayInV);
   13742         int[] arrayOut = new int[INPUTSIZE * 4];
   13743         out.copyTo(arrayOut);
   13744         for (int i = 0; i < INPUTSIZE; i++) {
   13745             for (int j = 0; j < 3 ; j++) {
   13746                 // Extract the inputs.
   13747                 ArgumentsUlongUint args = new ArgumentsUlongUint();
   13748                 args.inV = arrayInV[i * 4 + j];
   13749                 // Figure out what the outputs should have been.
   13750                 CoreMathVerifier.computeConvert(args);
   13751                 // Validate the outputs.
   13752                 boolean valid = true;
   13753                 if (args.out != arrayOut[i * 4 + j]) {
   13754                     valid = false;
   13755                 }
   13756                 if (!valid) {
   13757                     StringBuilder message = new StringBuilder();
   13758                     message.append("Input inV: ");
   13759                     message.append(String.format("0x%x", args.inV));
   13760                     message.append("\n");
   13761                     message.append("Expected output out: ");
   13762                     message.append(String.format("0x%x", args.out));
   13763                     message.append("\n");
   13764                     message.append("Actual   output out: ");
   13765                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   13766                     if (args.out != arrayOut[i * 4 + j]) {
   13767                         message.append(" FAIL");
   13768                     }
   13769                     message.append("\n");
   13770                     assertTrue("Incorrect output for checkConvertUlong3Uint3" +
   13771                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13772                 }
   13773             }
   13774         }
   13775     }
   13776 
   13777     private void checkConvertUlong4Uint4() {
   13778         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x5cfe96c8dd8079d5l, false, 32);
   13779         try {
   13780             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   13781             script.forEach_testConvertUint4Ulong4Uint4(inV, out);
   13782             verifyResultsConvertUlong4Uint4(inV, out, false);
   13783         } catch (Exception e) {
   13784             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Ulong4Uint4: " + e.toString());
   13785         }
   13786         try {
   13787             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
   13788             scriptRelaxed.forEach_testConvertUint4Ulong4Uint4(inV, out);
   13789             verifyResultsConvertUlong4Uint4(inV, out, true);
   13790         } catch (Exception e) {
   13791             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertUint4Ulong4Uint4: " + e.toString());
   13792         }
   13793     }
   13794 
   13795     private void verifyResultsConvertUlong4Uint4(Allocation inV, Allocation out, boolean relaxed) {
   13796         long[] arrayInV = new long[INPUTSIZE * 4];
   13797         inV.copyTo(arrayInV);
   13798         int[] arrayOut = new int[INPUTSIZE * 4];
   13799         out.copyTo(arrayOut);
   13800         for (int i = 0; i < INPUTSIZE; i++) {
   13801             for (int j = 0; j < 4 ; j++) {
   13802                 // Extract the inputs.
   13803                 ArgumentsUlongUint args = new ArgumentsUlongUint();
   13804                 args.inV = arrayInV[i * 4 + j];
   13805                 // Figure out what the outputs should have been.
   13806                 CoreMathVerifier.computeConvert(args);
   13807                 // Validate the outputs.
   13808                 boolean valid = true;
   13809                 if (args.out != arrayOut[i * 4 + j]) {
   13810                     valid = false;
   13811                 }
   13812                 if (!valid) {
   13813                     StringBuilder message = new StringBuilder();
   13814                     message.append("Input inV: ");
   13815                     message.append(String.format("0x%x", args.inV));
   13816                     message.append("\n");
   13817                     message.append("Expected output out: ");
   13818                     message.append(String.format("0x%x", args.out));
   13819                     message.append("\n");
   13820                     message.append("Actual   output out: ");
   13821                     message.append(String.format("0x%x", arrayOut[i * 4 + j]));
   13822                     if (args.out != arrayOut[i * 4 + j]) {
   13823                         message.append(" FAIL");
   13824                     }
   13825                     message.append("\n");
   13826                     assertTrue("Incorrect output for checkConvertUlong4Uint4" +
   13827                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13828                 }
   13829             }
   13830         }
   13831     }
   13832 
   13833     public class ArgumentsFloatDouble {
   13834         public float inV;
   13835         public Target.Floaty out;
   13836     }
   13837 
   13838     private void checkConvertFloat2Double2() {
   13839         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x36c6372446e08221l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
   13840         try {
   13841             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   13842             script.forEach_testConvertDouble2Float2Double2(inV, out);
   13843             verifyResultsConvertFloat2Double2(inV, out, false);
   13844         } catch (Exception e) {
   13845             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Float2Double2: " + e.toString());
   13846         }
   13847         try {
   13848             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   13849             scriptRelaxed.forEach_testConvertDouble2Float2Double2(inV, out);
   13850             verifyResultsConvertFloat2Double2(inV, out, true);
   13851         } catch (Exception e) {
   13852             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Float2Double2: " + e.toString());
   13853         }
   13854     }
   13855 
   13856     private void verifyResultsConvertFloat2Double2(Allocation inV, Allocation out, boolean relaxed) {
   13857         float[] arrayInV = new float[INPUTSIZE * 2];
   13858         inV.copyTo(arrayInV);
   13859         double[] arrayOut = new double[INPUTSIZE * 2];
   13860         out.copyTo(arrayOut);
   13861         for (int i = 0; i < INPUTSIZE; i++) {
   13862             for (int j = 0; j < 2 ; j++) {
   13863                 // Extract the inputs.
   13864                 ArgumentsFloatDouble args = new ArgumentsFloatDouble();
   13865                 args.inV = arrayInV[i * 2 + j];
   13866                 // Figure out what the outputs should have been.
   13867                 Target target = new Target(relaxed);
   13868                 CoreMathVerifier.computeConvert(args, target);
   13869                 // Validate the outputs.
   13870                 boolean valid = true;
   13871                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   13872                     valid = false;
   13873                 }
   13874                 if (!valid) {
   13875                     StringBuilder message = new StringBuilder();
   13876                     message.append("Input inV: ");
   13877                     message.append(String.format("%14.8g {%8x} %15a",
   13878                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   13879                     message.append("\n");
   13880                     message.append("Expected output out: ");
   13881                     message.append(args.out.toString());
   13882                     message.append("\n");
   13883                     message.append("Actual   output out: ");
   13884                     message.append(String.format("%24.8g {%16x} %31a",
   13885                             arrayOut[i * 2 + j], Double.doubleToRawLongBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   13886                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   13887                         message.append(" FAIL");
   13888                     }
   13889                     message.append("\n");
   13890                     assertTrue("Incorrect output for checkConvertFloat2Double2" +
   13891                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13892                 }
   13893             }
   13894         }
   13895     }
   13896 
   13897     private void checkConvertFloat3Double3() {
   13898         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3712feab9d3c134dl, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
   13899         try {
   13900             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   13901             script.forEach_testConvertDouble3Float3Double3(inV, out);
   13902             verifyResultsConvertFloat3Double3(inV, out, false);
   13903         } catch (Exception e) {
   13904             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Float3Double3: " + e.toString());
   13905         }
   13906         try {
   13907             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   13908             scriptRelaxed.forEach_testConvertDouble3Float3Double3(inV, out);
   13909             verifyResultsConvertFloat3Double3(inV, out, true);
   13910         } catch (Exception e) {
   13911             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Float3Double3: " + e.toString());
   13912         }
   13913     }
   13914 
   13915     private void verifyResultsConvertFloat3Double3(Allocation inV, Allocation out, boolean relaxed) {
   13916         float[] arrayInV = new float[INPUTSIZE * 4];
   13917         inV.copyTo(arrayInV);
   13918         double[] arrayOut = new double[INPUTSIZE * 4];
   13919         out.copyTo(arrayOut);
   13920         for (int i = 0; i < INPUTSIZE; i++) {
   13921             for (int j = 0; j < 3 ; j++) {
   13922                 // Extract the inputs.
   13923                 ArgumentsFloatDouble args = new ArgumentsFloatDouble();
   13924                 args.inV = arrayInV[i * 4 + j];
   13925                 // Figure out what the outputs should have been.
   13926                 Target target = new Target(relaxed);
   13927                 CoreMathVerifier.computeConvert(args, target);
   13928                 // Validate the outputs.
   13929                 boolean valid = true;
   13930                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   13931                     valid = false;
   13932                 }
   13933                 if (!valid) {
   13934                     StringBuilder message = new StringBuilder();
   13935                     message.append("Input inV: ");
   13936                     message.append(String.format("%14.8g {%8x} %15a",
   13937                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   13938                     message.append("\n");
   13939                     message.append("Expected output out: ");
   13940                     message.append(args.out.toString());
   13941                     message.append("\n");
   13942                     message.append("Actual   output out: ");
   13943                     message.append(String.format("%24.8g {%16x} %31a",
   13944                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   13945                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   13946                         message.append(" FAIL");
   13947                     }
   13948                     message.append("\n");
   13949                     assertTrue("Incorrect output for checkConvertFloat3Double3" +
   13950                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   13951                 }
   13952             }
   13953         }
   13954     }
   13955 
   13956     private void checkConvertFloat4Double4() {
   13957         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x375fc632f397a479l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
   13958         try {
   13959             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   13960             script.forEach_testConvertDouble4Float4Double4(inV, out);
   13961             verifyResultsConvertFloat4Double4(inV, out, false);
   13962         } catch (Exception e) {
   13963             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Float4Double4: " + e.toString());
   13964         }
   13965         try {
   13966             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   13967             scriptRelaxed.forEach_testConvertDouble4Float4Double4(inV, out);
   13968             verifyResultsConvertFloat4Double4(inV, out, true);
   13969         } catch (Exception e) {
   13970             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Float4Double4: " + e.toString());
   13971         }
   13972     }
   13973 
   13974     private void verifyResultsConvertFloat4Double4(Allocation inV, Allocation out, boolean relaxed) {
   13975         float[] arrayInV = new float[INPUTSIZE * 4];
   13976         inV.copyTo(arrayInV);
   13977         double[] arrayOut = new double[INPUTSIZE * 4];
   13978         out.copyTo(arrayOut);
   13979         for (int i = 0; i < INPUTSIZE; i++) {
   13980             for (int j = 0; j < 4 ; j++) {
   13981                 // Extract the inputs.
   13982                 ArgumentsFloatDouble args = new ArgumentsFloatDouble();
   13983                 args.inV = arrayInV[i * 4 + j];
   13984                 // Figure out what the outputs should have been.
   13985                 Target target = new Target(relaxed);
   13986                 CoreMathVerifier.computeConvert(args, target);
   13987                 // Validate the outputs.
   13988                 boolean valid = true;
   13989                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   13990                     valid = false;
   13991                 }
   13992                 if (!valid) {
   13993                     StringBuilder message = new StringBuilder();
   13994                     message.append("Input inV: ");
   13995                     message.append(String.format("%14.8g {%8x} %15a",
   13996                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   13997                     message.append("\n");
   13998                     message.append("Expected output out: ");
   13999                     message.append(args.out.toString());
   14000                     message.append("\n");
   14001                     message.append("Actual   output out: ");
   14002                     message.append(String.format("%24.8g {%16x} %31a",
   14003                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   14004                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14005                         message.append(" FAIL");
   14006                     }
   14007                     message.append("\n");
   14008                     assertTrue("Incorrect output for checkConvertFloat4Double4" +
   14009                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14010                 }
   14011             }
   14012         }
   14013     }
   14014 
   14015     public class ArgumentsCharDouble {
   14016         public byte inV;
   14017         public Target.Floaty out;
   14018     }
   14019 
   14020     private void checkConvertChar2Double2() {
   14021         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd86d88e268ca2f61l, true, 7);
   14022         try {
   14023             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14024             script.forEach_testConvertDouble2Char2Double2(inV, out);
   14025             verifyResultsConvertChar2Double2(inV, out, false);
   14026         } catch (Exception e) {
   14027             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Char2Double2: " + e.toString());
   14028         }
   14029         try {
   14030             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14031             scriptRelaxed.forEach_testConvertDouble2Char2Double2(inV, out);
   14032             verifyResultsConvertChar2Double2(inV, out, true);
   14033         } catch (Exception e) {
   14034             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Char2Double2: " + e.toString());
   14035         }
   14036     }
   14037 
   14038     private void verifyResultsConvertChar2Double2(Allocation inV, Allocation out, boolean relaxed) {
   14039         byte[] arrayInV = new byte[INPUTSIZE * 2];
   14040         inV.copyTo(arrayInV);
   14041         double[] arrayOut = new double[INPUTSIZE * 2];
   14042         out.copyTo(arrayOut);
   14043         for (int i = 0; i < INPUTSIZE; i++) {
   14044             for (int j = 0; j < 2 ; j++) {
   14045                 // Extract the inputs.
   14046                 ArgumentsCharDouble args = new ArgumentsCharDouble();
   14047                 args.inV = arrayInV[i * 2 + j];
   14048                 // Figure out what the outputs should have been.
   14049                 Target target = new Target(relaxed);
   14050                 CoreMathVerifier.computeConvert(args, target);
   14051                 // Validate the outputs.
   14052                 boolean valid = true;
   14053                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14054                     valid = false;
   14055                 }
   14056                 if (!valid) {
   14057                     StringBuilder message = new StringBuilder();
   14058                     message.append("Input inV: ");
   14059                     message.append(String.format("%d", args.inV));
   14060                     message.append("\n");
   14061                     message.append("Expected output out: ");
   14062                     message.append(args.out.toString());
   14063                     message.append("\n");
   14064                     message.append("Actual   output out: ");
   14065                     message.append(String.format("%24.8g {%16x} %31a",
   14066                             arrayOut[i * 2 + j], Double.doubleToRawLongBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   14067                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14068                         message.append(" FAIL");
   14069                     }
   14070                     message.append("\n");
   14071                     assertTrue("Incorrect output for checkConvertChar2Double2" +
   14072                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14073                 }
   14074             }
   14075         }
   14076     }
   14077 
   14078     private void checkConvertChar3Double3() {
   14079         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xd8ba5069bf25c08dl, true, 7);
   14080         try {
   14081             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14082             script.forEach_testConvertDouble3Char3Double3(inV, out);
   14083             verifyResultsConvertChar3Double3(inV, out, false);
   14084         } catch (Exception e) {
   14085             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Char3Double3: " + e.toString());
   14086         }
   14087         try {
   14088             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14089             scriptRelaxed.forEach_testConvertDouble3Char3Double3(inV, out);
   14090             verifyResultsConvertChar3Double3(inV, out, true);
   14091         } catch (Exception e) {
   14092             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Char3Double3: " + e.toString());
   14093         }
   14094     }
   14095 
   14096     private void verifyResultsConvertChar3Double3(Allocation inV, Allocation out, boolean relaxed) {
   14097         byte[] arrayInV = new byte[INPUTSIZE * 4];
   14098         inV.copyTo(arrayInV);
   14099         double[] arrayOut = new double[INPUTSIZE * 4];
   14100         out.copyTo(arrayOut);
   14101         for (int i = 0; i < INPUTSIZE; i++) {
   14102             for (int j = 0; j < 3 ; j++) {
   14103                 // Extract the inputs.
   14104                 ArgumentsCharDouble args = new ArgumentsCharDouble();
   14105                 args.inV = arrayInV[i * 4 + j];
   14106                 // Figure out what the outputs should have been.
   14107                 Target target = new Target(relaxed);
   14108                 CoreMathVerifier.computeConvert(args, target);
   14109                 // Validate the outputs.
   14110                 boolean valid = true;
   14111                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14112                     valid = false;
   14113                 }
   14114                 if (!valid) {
   14115                     StringBuilder message = new StringBuilder();
   14116                     message.append("Input inV: ");
   14117                     message.append(String.format("%d", args.inV));
   14118                     message.append("\n");
   14119                     message.append("Expected output out: ");
   14120                     message.append(args.out.toString());
   14121                     message.append("\n");
   14122                     message.append("Actual   output out: ");
   14123                     message.append(String.format("%24.8g {%16x} %31a",
   14124                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   14125                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14126                         message.append(" FAIL");
   14127                     }
   14128                     message.append("\n");
   14129                     assertTrue("Incorrect output for checkConvertChar3Double3" +
   14130                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14131                 }
   14132             }
   14133         }
   14134     }
   14135 
   14136     private void checkConvertChar4Double4() {
   14137         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd90717f1158151b9l, true, 7);
   14138         try {
   14139             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   14140             script.forEach_testConvertDouble4Char4Double4(inV, out);
   14141             verifyResultsConvertChar4Double4(inV, out, false);
   14142         } catch (Exception e) {
   14143             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Char4Double4: " + e.toString());
   14144         }
   14145         try {
   14146             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   14147             scriptRelaxed.forEach_testConvertDouble4Char4Double4(inV, out);
   14148             verifyResultsConvertChar4Double4(inV, out, true);
   14149         } catch (Exception e) {
   14150             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Char4Double4: " + e.toString());
   14151         }
   14152     }
   14153 
   14154     private void verifyResultsConvertChar4Double4(Allocation inV, Allocation out, boolean relaxed) {
   14155         byte[] arrayInV = new byte[INPUTSIZE * 4];
   14156         inV.copyTo(arrayInV);
   14157         double[] arrayOut = new double[INPUTSIZE * 4];
   14158         out.copyTo(arrayOut);
   14159         for (int i = 0; i < INPUTSIZE; i++) {
   14160             for (int j = 0; j < 4 ; j++) {
   14161                 // Extract the inputs.
   14162                 ArgumentsCharDouble args = new ArgumentsCharDouble();
   14163                 args.inV = arrayInV[i * 4 + j];
   14164                 // Figure out what the outputs should have been.
   14165                 Target target = new Target(relaxed);
   14166                 CoreMathVerifier.computeConvert(args, target);
   14167                 // Validate the outputs.
   14168                 boolean valid = true;
   14169                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14170                     valid = false;
   14171                 }
   14172                 if (!valid) {
   14173                     StringBuilder message = new StringBuilder();
   14174                     message.append("Input inV: ");
   14175                     message.append(String.format("%d", args.inV));
   14176                     message.append("\n");
   14177                     message.append("Expected output out: ");
   14178                     message.append(args.out.toString());
   14179                     message.append("\n");
   14180                     message.append("Actual   output out: ");
   14181                     message.append(String.format("%24.8g {%16x} %31a",
   14182                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   14183                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14184                         message.append(" FAIL");
   14185                     }
   14186                     message.append("\n");
   14187                     assertTrue("Incorrect output for checkConvertChar4Double4" +
   14188                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14189                 }
   14190             }
   14191         }
   14192     }
   14193 
   14194     public class ArgumentsUcharDouble {
   14195         public byte inV;
   14196         public Target.Floaty out;
   14197     }
   14198 
   14199     private void checkConvertUchar2Double2() {
   14200         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x70cea2996167f1al, false, 8);
   14201         try {
   14202             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14203             script.forEach_testConvertDouble2Uchar2Double2(inV, out);
   14204             verifyResultsConvertUchar2Double2(inV, out, false);
   14205         } catch (Exception e) {
   14206             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Uchar2Double2: " + e.toString());
   14207         }
   14208         try {
   14209             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14210             scriptRelaxed.forEach_testConvertDouble2Uchar2Double2(inV, out);
   14211             verifyResultsConvertUchar2Double2(inV, out, true);
   14212         } catch (Exception e) {
   14213             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Uchar2Double2: " + e.toString());
   14214         }
   14215     }
   14216 
   14217     private void verifyResultsConvertUchar2Double2(Allocation inV, Allocation out, boolean relaxed) {
   14218         byte[] arrayInV = new byte[INPUTSIZE * 2];
   14219         inV.copyTo(arrayInV);
   14220         double[] arrayOut = new double[INPUTSIZE * 2];
   14221         out.copyTo(arrayOut);
   14222         for (int i = 0; i < INPUTSIZE; i++) {
   14223             for (int j = 0; j < 2 ; j++) {
   14224                 // Extract the inputs.
   14225                 ArgumentsUcharDouble args = new ArgumentsUcharDouble();
   14226                 args.inV = arrayInV[i * 2 + j];
   14227                 // Figure out what the outputs should have been.
   14228                 Target target = new Target(relaxed);
   14229                 CoreMathVerifier.computeConvert(args, target);
   14230                 // Validate the outputs.
   14231                 boolean valid = true;
   14232                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14233                     valid = false;
   14234                 }
   14235                 if (!valid) {
   14236                     StringBuilder message = new StringBuilder();
   14237                     message.append("Input inV: ");
   14238                     message.append(String.format("0x%x", args.inV));
   14239                     message.append("\n");
   14240                     message.append("Expected output out: ");
   14241                     message.append(args.out.toString());
   14242                     message.append("\n");
   14243                     message.append("Actual   output out: ");
   14244                     message.append(String.format("%24.8g {%16x} %31a",
   14245                             arrayOut[i * 2 + j], Double.doubleToRawLongBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   14246                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14247                         message.append(" FAIL");
   14248                     }
   14249                     message.append("\n");
   14250                     assertTrue("Incorrect output for checkConvertUchar2Double2" +
   14251                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14252                 }
   14253             }
   14254         }
   14255     }
   14256 
   14257     private void checkConvertUchar3Double3() {
   14258         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x759b1b0ec721046l, false, 8);
   14259         try {
   14260             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14261             script.forEach_testConvertDouble3Uchar3Double3(inV, out);
   14262             verifyResultsConvertUchar3Double3(inV, out, false);
   14263         } catch (Exception e) {
   14264             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Uchar3Double3: " + e.toString());
   14265         }
   14266         try {
   14267             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14268             scriptRelaxed.forEach_testConvertDouble3Uchar3Double3(inV, out);
   14269             verifyResultsConvertUchar3Double3(inV, out, true);
   14270         } catch (Exception e) {
   14271             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Uchar3Double3: " + e.toString());
   14272         }
   14273     }
   14274 
   14275     private void verifyResultsConvertUchar3Double3(Allocation inV, Allocation out, boolean relaxed) {
   14276         byte[] arrayInV = new byte[INPUTSIZE * 4];
   14277         inV.copyTo(arrayInV);
   14278         double[] arrayOut = new double[INPUTSIZE * 4];
   14279         out.copyTo(arrayOut);
   14280         for (int i = 0; i < INPUTSIZE; i++) {
   14281             for (int j = 0; j < 3 ; j++) {
   14282                 // Extract the inputs.
   14283                 ArgumentsUcharDouble args = new ArgumentsUcharDouble();
   14284                 args.inV = arrayInV[i * 4 + j];
   14285                 // Figure out what the outputs should have been.
   14286                 Target target = new Target(relaxed);
   14287                 CoreMathVerifier.computeConvert(args, target);
   14288                 // Validate the outputs.
   14289                 boolean valid = true;
   14290                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14291                     valid = false;
   14292                 }
   14293                 if (!valid) {
   14294                     StringBuilder message = new StringBuilder();
   14295                     message.append("Input inV: ");
   14296                     message.append(String.format("0x%x", args.inV));
   14297                     message.append("\n");
   14298                     message.append("Expected output out: ");
   14299                     message.append(args.out.toString());
   14300                     message.append("\n");
   14301                     message.append("Actual   output out: ");
   14302                     message.append(String.format("%24.8g {%16x} %31a",
   14303                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   14304                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14305                         message.append(" FAIL");
   14306                     }
   14307                     message.append("\n");
   14308                     assertTrue("Incorrect output for checkConvertUchar3Double3" +
   14309                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14310                 }
   14311             }
   14312         }
   14313     }
   14314 
   14315     private void checkConvertUchar4Double4() {
   14316         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7a6793842cda172l, false, 8);
   14317         try {
   14318             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   14319             script.forEach_testConvertDouble4Uchar4Double4(inV, out);
   14320             verifyResultsConvertUchar4Double4(inV, out, false);
   14321         } catch (Exception e) {
   14322             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Uchar4Double4: " + e.toString());
   14323         }
   14324         try {
   14325             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   14326             scriptRelaxed.forEach_testConvertDouble4Uchar4Double4(inV, out);
   14327             verifyResultsConvertUchar4Double4(inV, out, true);
   14328         } catch (Exception e) {
   14329             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Uchar4Double4: " + e.toString());
   14330         }
   14331     }
   14332 
   14333     private void verifyResultsConvertUchar4Double4(Allocation inV, Allocation out, boolean relaxed) {
   14334         byte[] arrayInV = new byte[INPUTSIZE * 4];
   14335         inV.copyTo(arrayInV);
   14336         double[] arrayOut = new double[INPUTSIZE * 4];
   14337         out.copyTo(arrayOut);
   14338         for (int i = 0; i < INPUTSIZE; i++) {
   14339             for (int j = 0; j < 4 ; j++) {
   14340                 // Extract the inputs.
   14341                 ArgumentsUcharDouble args = new ArgumentsUcharDouble();
   14342                 args.inV = arrayInV[i * 4 + j];
   14343                 // Figure out what the outputs should have been.
   14344                 Target target = new Target(relaxed);
   14345                 CoreMathVerifier.computeConvert(args, target);
   14346                 // Validate the outputs.
   14347                 boolean valid = true;
   14348                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14349                     valid = false;
   14350                 }
   14351                 if (!valid) {
   14352                     StringBuilder message = new StringBuilder();
   14353                     message.append("Input inV: ");
   14354                     message.append(String.format("0x%x", args.inV));
   14355                     message.append("\n");
   14356                     message.append("Expected output out: ");
   14357                     message.append(args.out.toString());
   14358                     message.append("\n");
   14359                     message.append("Actual   output out: ");
   14360                     message.append(String.format("%24.8g {%16x} %31a",
   14361                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   14362                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14363                         message.append(" FAIL");
   14364                     }
   14365                     message.append("\n");
   14366                     assertTrue("Incorrect output for checkConvertUchar4Double4" +
   14367                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14368                 }
   14369             }
   14370         }
   14371     }
   14372 
   14373     public class ArgumentsShortDouble {
   14374         public short inV;
   14375         public Target.Floaty out;
   14376     }
   14377 
   14378     private void checkConvertShort2Double2() {
   14379         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xfdeea470023d0105l, true, 15);
   14380         try {
   14381             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14382             script.forEach_testConvertDouble2Short2Double2(inV, out);
   14383             verifyResultsConvertShort2Double2(inV, out, false);
   14384         } catch (Exception e) {
   14385             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Short2Double2: " + e.toString());
   14386         }
   14387         try {
   14388             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14389             scriptRelaxed.forEach_testConvertDouble2Short2Double2(inV, out);
   14390             verifyResultsConvertShort2Double2(inV, out, true);
   14391         } catch (Exception e) {
   14392             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Short2Double2: " + e.toString());
   14393         }
   14394     }
   14395 
   14396     private void verifyResultsConvertShort2Double2(Allocation inV, Allocation out, boolean relaxed) {
   14397         short[] arrayInV = new short[INPUTSIZE * 2];
   14398         inV.copyTo(arrayInV);
   14399         double[] arrayOut = new double[INPUTSIZE * 2];
   14400         out.copyTo(arrayOut);
   14401         for (int i = 0; i < INPUTSIZE; i++) {
   14402             for (int j = 0; j < 2 ; j++) {
   14403                 // Extract the inputs.
   14404                 ArgumentsShortDouble args = new ArgumentsShortDouble();
   14405                 args.inV = arrayInV[i * 2 + j];
   14406                 // Figure out what the outputs should have been.
   14407                 Target target = new Target(relaxed);
   14408                 CoreMathVerifier.computeConvert(args, target);
   14409                 // Validate the outputs.
   14410                 boolean valid = true;
   14411                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14412                     valid = false;
   14413                 }
   14414                 if (!valid) {
   14415                     StringBuilder message = new StringBuilder();
   14416                     message.append("Input inV: ");
   14417                     message.append(String.format("%d", args.inV));
   14418                     message.append("\n");
   14419                     message.append("Expected output out: ");
   14420                     message.append(args.out.toString());
   14421                     message.append("\n");
   14422                     message.append("Actual   output out: ");
   14423                     message.append(String.format("%24.8g {%16x} %31a",
   14424                             arrayOut[i * 2 + j], Double.doubleToRawLongBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   14425                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14426                         message.append(" FAIL");
   14427                     }
   14428                     message.append("\n");
   14429                     assertTrue("Incorrect output for checkConvertShort2Double2" +
   14430                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14431                 }
   14432             }
   14433         }
   14434     }
   14435 
   14436     private void checkConvertShort3Double3() {
   14437         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xfe3b6bf758989231l, true, 15);
   14438         try {
   14439             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14440             script.forEach_testConvertDouble3Short3Double3(inV, out);
   14441             verifyResultsConvertShort3Double3(inV, out, false);
   14442         } catch (Exception e) {
   14443             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Short3Double3: " + e.toString());
   14444         }
   14445         try {
   14446             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14447             scriptRelaxed.forEach_testConvertDouble3Short3Double3(inV, out);
   14448             verifyResultsConvertShort3Double3(inV, out, true);
   14449         } catch (Exception e) {
   14450             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Short3Double3: " + e.toString());
   14451         }
   14452     }
   14453 
   14454     private void verifyResultsConvertShort3Double3(Allocation inV, Allocation out, boolean relaxed) {
   14455         short[] arrayInV = new short[INPUTSIZE * 4];
   14456         inV.copyTo(arrayInV);
   14457         double[] arrayOut = new double[INPUTSIZE * 4];
   14458         out.copyTo(arrayOut);
   14459         for (int i = 0; i < INPUTSIZE; i++) {
   14460             for (int j = 0; j < 3 ; j++) {
   14461                 // Extract the inputs.
   14462                 ArgumentsShortDouble args = new ArgumentsShortDouble();
   14463                 args.inV = arrayInV[i * 4 + j];
   14464                 // Figure out what the outputs should have been.
   14465                 Target target = new Target(relaxed);
   14466                 CoreMathVerifier.computeConvert(args, target);
   14467                 // Validate the outputs.
   14468                 boolean valid = true;
   14469                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14470                     valid = false;
   14471                 }
   14472                 if (!valid) {
   14473                     StringBuilder message = new StringBuilder();
   14474                     message.append("Input inV: ");
   14475                     message.append(String.format("%d", args.inV));
   14476                     message.append("\n");
   14477                     message.append("Expected output out: ");
   14478                     message.append(args.out.toString());
   14479                     message.append("\n");
   14480                     message.append("Actual   output out: ");
   14481                     message.append(String.format("%24.8g {%16x} %31a",
   14482                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   14483                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14484                         message.append(" FAIL");
   14485                     }
   14486                     message.append("\n");
   14487                     assertTrue("Incorrect output for checkConvertShort3Double3" +
   14488                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14489                 }
   14490             }
   14491         }
   14492     }
   14493 
   14494     private void checkConvertShort4Double4() {
   14495         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xfe88337eaef4235dl, true, 15);
   14496         try {
   14497             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   14498             script.forEach_testConvertDouble4Short4Double4(inV, out);
   14499             verifyResultsConvertShort4Double4(inV, out, false);
   14500         } catch (Exception e) {
   14501             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Short4Double4: " + e.toString());
   14502         }
   14503         try {
   14504             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   14505             scriptRelaxed.forEach_testConvertDouble4Short4Double4(inV, out);
   14506             verifyResultsConvertShort4Double4(inV, out, true);
   14507         } catch (Exception e) {
   14508             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Short4Double4: " + e.toString());
   14509         }
   14510     }
   14511 
   14512     private void verifyResultsConvertShort4Double4(Allocation inV, Allocation out, boolean relaxed) {
   14513         short[] arrayInV = new short[INPUTSIZE * 4];
   14514         inV.copyTo(arrayInV);
   14515         double[] arrayOut = new double[INPUTSIZE * 4];
   14516         out.copyTo(arrayOut);
   14517         for (int i = 0; i < INPUTSIZE; i++) {
   14518             for (int j = 0; j < 4 ; j++) {
   14519                 // Extract the inputs.
   14520                 ArgumentsShortDouble args = new ArgumentsShortDouble();
   14521                 args.inV = arrayInV[i * 4 + j];
   14522                 // Figure out what the outputs should have been.
   14523                 Target target = new Target(relaxed);
   14524                 CoreMathVerifier.computeConvert(args, target);
   14525                 // Validate the outputs.
   14526                 boolean valid = true;
   14527                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14528                     valid = false;
   14529                 }
   14530                 if (!valid) {
   14531                     StringBuilder message = new StringBuilder();
   14532                     message.append("Input inV: ");
   14533                     message.append(String.format("%d", args.inV));
   14534                     message.append("\n");
   14535                     message.append("Expected output out: ");
   14536                     message.append(args.out.toString());
   14537                     message.append("\n");
   14538                     message.append("Actual   output out: ");
   14539                     message.append(String.format("%24.8g {%16x} %31a",
   14540                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   14541                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14542                         message.append(" FAIL");
   14543                     }
   14544                     message.append("\n");
   14545                     assertTrue("Incorrect output for checkConvertShort4Double4" +
   14546                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14547                 }
   14548             }
   14549         }
   14550     }
   14551 
   14552     public class ArgumentsUshortDouble {
   14553         public short inV;
   14554         public Target.Floaty out;
   14555     }
   14556 
   14557     private void checkConvertUshort2Double2() {
   14558         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xd2b3fb649e0e6518l, false, 16);
   14559         try {
   14560             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14561             script.forEach_testConvertDouble2Ushort2Double2(inV, out);
   14562             verifyResultsConvertUshort2Double2(inV, out, false);
   14563         } catch (Exception e) {
   14564             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Ushort2Double2: " + e.toString());
   14565         }
   14566         try {
   14567             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14568             scriptRelaxed.forEach_testConvertDouble2Ushort2Double2(inV, out);
   14569             verifyResultsConvertUshort2Double2(inV, out, true);
   14570         } catch (Exception e) {
   14571             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Ushort2Double2: " + e.toString());
   14572         }
   14573     }
   14574 
   14575     private void verifyResultsConvertUshort2Double2(Allocation inV, Allocation out, boolean relaxed) {
   14576         short[] arrayInV = new short[INPUTSIZE * 2];
   14577         inV.copyTo(arrayInV);
   14578         double[] arrayOut = new double[INPUTSIZE * 2];
   14579         out.copyTo(arrayOut);
   14580         for (int i = 0; i < INPUTSIZE; i++) {
   14581             for (int j = 0; j < 2 ; j++) {
   14582                 // Extract the inputs.
   14583                 ArgumentsUshortDouble args = new ArgumentsUshortDouble();
   14584                 args.inV = arrayInV[i * 2 + j];
   14585                 // Figure out what the outputs should have been.
   14586                 Target target = new Target(relaxed);
   14587                 CoreMathVerifier.computeConvert(args, target);
   14588                 // Validate the outputs.
   14589                 boolean valid = true;
   14590                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14591                     valid = false;
   14592                 }
   14593                 if (!valid) {
   14594                     StringBuilder message = new StringBuilder();
   14595                     message.append("Input inV: ");
   14596                     message.append(String.format("0x%x", args.inV));
   14597                     message.append("\n");
   14598                     message.append("Expected output out: ");
   14599                     message.append(args.out.toString());
   14600                     message.append("\n");
   14601                     message.append("Actual   output out: ");
   14602                     message.append(String.format("%24.8g {%16x} %31a",
   14603                             arrayOut[i * 2 + j], Double.doubleToRawLongBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   14604                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14605                         message.append(" FAIL");
   14606                     }
   14607                     message.append("\n");
   14608                     assertTrue("Incorrect output for checkConvertUshort2Double2" +
   14609                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14610                 }
   14611             }
   14612         }
   14613     }
   14614 
   14615     private void checkConvertUshort3Double3() {
   14616         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xd300c2ebf469f644l, false, 16);
   14617         try {
   14618             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14619             script.forEach_testConvertDouble3Ushort3Double3(inV, out);
   14620             verifyResultsConvertUshort3Double3(inV, out, false);
   14621         } catch (Exception e) {
   14622             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Ushort3Double3: " + e.toString());
   14623         }
   14624         try {
   14625             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14626             scriptRelaxed.forEach_testConvertDouble3Ushort3Double3(inV, out);
   14627             verifyResultsConvertUshort3Double3(inV, out, true);
   14628         } catch (Exception e) {
   14629             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Ushort3Double3: " + e.toString());
   14630         }
   14631     }
   14632 
   14633     private void verifyResultsConvertUshort3Double3(Allocation inV, Allocation out, boolean relaxed) {
   14634         short[] arrayInV = new short[INPUTSIZE * 4];
   14635         inV.copyTo(arrayInV);
   14636         double[] arrayOut = new double[INPUTSIZE * 4];
   14637         out.copyTo(arrayOut);
   14638         for (int i = 0; i < INPUTSIZE; i++) {
   14639             for (int j = 0; j < 3 ; j++) {
   14640                 // Extract the inputs.
   14641                 ArgumentsUshortDouble args = new ArgumentsUshortDouble();
   14642                 args.inV = arrayInV[i * 4 + j];
   14643                 // Figure out what the outputs should have been.
   14644                 Target target = new Target(relaxed);
   14645                 CoreMathVerifier.computeConvert(args, target);
   14646                 // Validate the outputs.
   14647                 boolean valid = true;
   14648                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14649                     valid = false;
   14650                 }
   14651                 if (!valid) {
   14652                     StringBuilder message = new StringBuilder();
   14653                     message.append("Input inV: ");
   14654                     message.append(String.format("0x%x", args.inV));
   14655                     message.append("\n");
   14656                     message.append("Expected output out: ");
   14657                     message.append(args.out.toString());
   14658                     message.append("\n");
   14659                     message.append("Actual   output out: ");
   14660                     message.append(String.format("%24.8g {%16x} %31a",
   14661                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   14662                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14663                         message.append(" FAIL");
   14664                     }
   14665                     message.append("\n");
   14666                     assertTrue("Incorrect output for checkConvertUshort3Double3" +
   14667                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14668                 }
   14669             }
   14670         }
   14671     }
   14672 
   14673     private void checkConvertUshort4Double4() {
   14674         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xd34d8a734ac58770l, false, 16);
   14675         try {
   14676             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   14677             script.forEach_testConvertDouble4Ushort4Double4(inV, out);
   14678             verifyResultsConvertUshort4Double4(inV, out, false);
   14679         } catch (Exception e) {
   14680             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Ushort4Double4: " + e.toString());
   14681         }
   14682         try {
   14683             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   14684             scriptRelaxed.forEach_testConvertDouble4Ushort4Double4(inV, out);
   14685             verifyResultsConvertUshort4Double4(inV, out, true);
   14686         } catch (Exception e) {
   14687             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Ushort4Double4: " + e.toString());
   14688         }
   14689     }
   14690 
   14691     private void verifyResultsConvertUshort4Double4(Allocation inV, Allocation out, boolean relaxed) {
   14692         short[] arrayInV = new short[INPUTSIZE * 4];
   14693         inV.copyTo(arrayInV);
   14694         double[] arrayOut = new double[INPUTSIZE * 4];
   14695         out.copyTo(arrayOut);
   14696         for (int i = 0; i < INPUTSIZE; i++) {
   14697             for (int j = 0; j < 4 ; j++) {
   14698                 // Extract the inputs.
   14699                 ArgumentsUshortDouble args = new ArgumentsUshortDouble();
   14700                 args.inV = arrayInV[i * 4 + j];
   14701                 // Figure out what the outputs should have been.
   14702                 Target target = new Target(relaxed);
   14703                 CoreMathVerifier.computeConvert(args, target);
   14704                 // Validate the outputs.
   14705                 boolean valid = true;
   14706                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14707                     valid = false;
   14708                 }
   14709                 if (!valid) {
   14710                     StringBuilder message = new StringBuilder();
   14711                     message.append("Input inV: ");
   14712                     message.append(String.format("0x%x", args.inV));
   14713                     message.append("\n");
   14714                     message.append("Expected output out: ");
   14715                     message.append(args.out.toString());
   14716                     message.append("\n");
   14717                     message.append("Actual   output out: ");
   14718                     message.append(String.format("%24.8g {%16x} %31a",
   14719                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   14720                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14721                         message.append(" FAIL");
   14722                     }
   14723                     message.append("\n");
   14724                     assertTrue("Incorrect output for checkConvertUshort4Double4" +
   14725                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14726                 }
   14727             }
   14728         }
   14729     }
   14730 
   14731     public class ArgumentsIntDouble {
   14732         public int inV;
   14733         public Target.Floaty out;
   14734     }
   14735 
   14736     private void checkConvertInt2Double2() {
   14737         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x1be423b7a40fc8f6l, true, 31);
   14738         try {
   14739             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14740             script.forEach_testConvertDouble2Int2Double2(inV, out);
   14741             verifyResultsConvertInt2Double2(inV, out, false);
   14742         } catch (Exception e) {
   14743             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Int2Double2: " + e.toString());
   14744         }
   14745         try {
   14746             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14747             scriptRelaxed.forEach_testConvertDouble2Int2Double2(inV, out);
   14748             verifyResultsConvertInt2Double2(inV, out, true);
   14749         } catch (Exception e) {
   14750             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Int2Double2: " + e.toString());
   14751         }
   14752     }
   14753 
   14754     private void verifyResultsConvertInt2Double2(Allocation inV, Allocation out, boolean relaxed) {
   14755         int[] arrayInV = new int[INPUTSIZE * 2];
   14756         inV.copyTo(arrayInV);
   14757         double[] arrayOut = new double[INPUTSIZE * 2];
   14758         out.copyTo(arrayOut);
   14759         for (int i = 0; i < INPUTSIZE; i++) {
   14760             for (int j = 0; j < 2 ; j++) {
   14761                 // Extract the inputs.
   14762                 ArgumentsIntDouble args = new ArgumentsIntDouble();
   14763                 args.inV = arrayInV[i * 2 + j];
   14764                 // Figure out what the outputs should have been.
   14765                 Target target = new Target(relaxed);
   14766                 CoreMathVerifier.computeConvert(args, target);
   14767                 // Validate the outputs.
   14768                 boolean valid = true;
   14769                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14770                     valid = false;
   14771                 }
   14772                 if (!valid) {
   14773                     StringBuilder message = new StringBuilder();
   14774                     message.append("Input inV: ");
   14775                     message.append(String.format("%d", args.inV));
   14776                     message.append("\n");
   14777                     message.append("Expected output out: ");
   14778                     message.append(args.out.toString());
   14779                     message.append("\n");
   14780                     message.append("Actual   output out: ");
   14781                     message.append(String.format("%24.8g {%16x} %31a",
   14782                             arrayOut[i * 2 + j], Double.doubleToRawLongBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   14783                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14784                         message.append(" FAIL");
   14785                     }
   14786                     message.append("\n");
   14787                     assertTrue("Incorrect output for checkConvertInt2Double2" +
   14788                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14789                 }
   14790             }
   14791         }
   14792     }
   14793 
   14794     private void checkConvertInt3Double3() {
   14795         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x1c30eb3efa6b5a22l, true, 31);
   14796         try {
   14797             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14798             script.forEach_testConvertDouble3Int3Double3(inV, out);
   14799             verifyResultsConvertInt3Double3(inV, out, false);
   14800         } catch (Exception e) {
   14801             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Int3Double3: " + e.toString());
   14802         }
   14803         try {
   14804             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14805             scriptRelaxed.forEach_testConvertDouble3Int3Double3(inV, out);
   14806             verifyResultsConvertInt3Double3(inV, out, true);
   14807         } catch (Exception e) {
   14808             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Int3Double3: " + e.toString());
   14809         }
   14810     }
   14811 
   14812     private void verifyResultsConvertInt3Double3(Allocation inV, Allocation out, boolean relaxed) {
   14813         int[] arrayInV = new int[INPUTSIZE * 4];
   14814         inV.copyTo(arrayInV);
   14815         double[] arrayOut = new double[INPUTSIZE * 4];
   14816         out.copyTo(arrayOut);
   14817         for (int i = 0; i < INPUTSIZE; i++) {
   14818             for (int j = 0; j < 3 ; j++) {
   14819                 // Extract the inputs.
   14820                 ArgumentsIntDouble args = new ArgumentsIntDouble();
   14821                 args.inV = arrayInV[i * 4 + j];
   14822                 // Figure out what the outputs should have been.
   14823                 Target target = new Target(relaxed);
   14824                 CoreMathVerifier.computeConvert(args, target);
   14825                 // Validate the outputs.
   14826                 boolean valid = true;
   14827                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14828                     valid = false;
   14829                 }
   14830                 if (!valid) {
   14831                     StringBuilder message = new StringBuilder();
   14832                     message.append("Input inV: ");
   14833                     message.append(String.format("%d", args.inV));
   14834                     message.append("\n");
   14835                     message.append("Expected output out: ");
   14836                     message.append(args.out.toString());
   14837                     message.append("\n");
   14838                     message.append("Actual   output out: ");
   14839                     message.append(String.format("%24.8g {%16x} %31a",
   14840                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   14841                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14842                         message.append(" FAIL");
   14843                     }
   14844                     message.append("\n");
   14845                     assertTrue("Incorrect output for checkConvertInt3Double3" +
   14846                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14847                 }
   14848             }
   14849         }
   14850     }
   14851 
   14852     private void checkConvertInt4Double4() {
   14853         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x1c7db2c650c6eb4el, true, 31);
   14854         try {
   14855             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   14856             script.forEach_testConvertDouble4Int4Double4(inV, out);
   14857             verifyResultsConvertInt4Double4(inV, out, false);
   14858         } catch (Exception e) {
   14859             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Int4Double4: " + e.toString());
   14860         }
   14861         try {
   14862             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   14863             scriptRelaxed.forEach_testConvertDouble4Int4Double4(inV, out);
   14864             verifyResultsConvertInt4Double4(inV, out, true);
   14865         } catch (Exception e) {
   14866             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Int4Double4: " + e.toString());
   14867         }
   14868     }
   14869 
   14870     private void verifyResultsConvertInt4Double4(Allocation inV, Allocation out, boolean relaxed) {
   14871         int[] arrayInV = new int[INPUTSIZE * 4];
   14872         inV.copyTo(arrayInV);
   14873         double[] arrayOut = new double[INPUTSIZE * 4];
   14874         out.copyTo(arrayOut);
   14875         for (int i = 0; i < INPUTSIZE; i++) {
   14876             for (int j = 0; j < 4 ; j++) {
   14877                 // Extract the inputs.
   14878                 ArgumentsIntDouble args = new ArgumentsIntDouble();
   14879                 args.inV = arrayInV[i * 4 + j];
   14880                 // Figure out what the outputs should have been.
   14881                 Target target = new Target(relaxed);
   14882                 CoreMathVerifier.computeConvert(args, target);
   14883                 // Validate the outputs.
   14884                 boolean valid = true;
   14885                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14886                     valid = false;
   14887                 }
   14888                 if (!valid) {
   14889                     StringBuilder message = new StringBuilder();
   14890                     message.append("Input inV: ");
   14891                     message.append(String.format("%d", args.inV));
   14892                     message.append("\n");
   14893                     message.append("Expected output out: ");
   14894                     message.append(args.out.toString());
   14895                     message.append("\n");
   14896                     message.append("Actual   output out: ");
   14897                     message.append(String.format("%24.8g {%16x} %31a",
   14898                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   14899                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   14900                         message.append(" FAIL");
   14901                     }
   14902                     message.append("\n");
   14903                     assertTrue("Incorrect output for checkConvertInt4Double4" +
   14904                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14905                 }
   14906             }
   14907         }
   14908     }
   14909 
   14910     public class ArgumentsUintDouble {
   14911         public int inV;
   14912         public Target.Floaty out;
   14913     }
   14914 
   14915     private void checkConvertUint2Double2() {
   14916         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x40b243bf3fe7e2a1l, false, 32);
   14917         try {
   14918             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14919             script.forEach_testConvertDouble2Uint2Double2(inV, out);
   14920             verifyResultsConvertUint2Double2(inV, out, false);
   14921         } catch (Exception e) {
   14922             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Uint2Double2: " + e.toString());
   14923         }
   14924         try {
   14925             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
   14926             scriptRelaxed.forEach_testConvertDouble2Uint2Double2(inV, out);
   14927             verifyResultsConvertUint2Double2(inV, out, true);
   14928         } catch (Exception e) {
   14929             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble2Uint2Double2: " + e.toString());
   14930         }
   14931     }
   14932 
   14933     private void verifyResultsConvertUint2Double2(Allocation inV, Allocation out, boolean relaxed) {
   14934         int[] arrayInV = new int[INPUTSIZE * 2];
   14935         inV.copyTo(arrayInV);
   14936         double[] arrayOut = new double[INPUTSIZE * 2];
   14937         out.copyTo(arrayOut);
   14938         for (int i = 0; i < INPUTSIZE; i++) {
   14939             for (int j = 0; j < 2 ; j++) {
   14940                 // Extract the inputs.
   14941                 ArgumentsUintDouble args = new ArgumentsUintDouble();
   14942                 args.inV = arrayInV[i * 2 + j];
   14943                 // Figure out what the outputs should have been.
   14944                 Target target = new Target(relaxed);
   14945                 CoreMathVerifier.computeConvert(args, target);
   14946                 // Validate the outputs.
   14947                 boolean valid = true;
   14948                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14949                     valid = false;
   14950                 }
   14951                 if (!valid) {
   14952                     StringBuilder message = new StringBuilder();
   14953                     message.append("Input inV: ");
   14954                     message.append(String.format("0x%x", args.inV));
   14955                     message.append("\n");
   14956                     message.append("Expected output out: ");
   14957                     message.append(args.out.toString());
   14958                     message.append("\n");
   14959                     message.append("Actual   output out: ");
   14960                     message.append(String.format("%24.8g {%16x} %31a",
   14961                             arrayOut[i * 2 + j], Double.doubleToRawLongBits(arrayOut[i * 2 + j]), arrayOut[i * 2 + j]));
   14962                     if (!args.out.couldBe(arrayOut[i * 2 + j])) {
   14963                         message.append(" FAIL");
   14964                     }
   14965                     message.append("\n");
   14966                     assertTrue("Incorrect output for checkConvertUint2Double2" +
   14967                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   14968                 }
   14969             }
   14970         }
   14971     }
   14972 
   14973     private void checkConvertUint3Double3() {
   14974         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x40ff0b46964373cdl, false, 32);
   14975         try {
   14976             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14977             script.forEach_testConvertDouble3Uint3Double3(inV, out);
   14978             verifyResultsConvertUint3Double3(inV, out, false);
   14979         } catch (Exception e) {
   14980             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Uint3Double3: " + e.toString());
   14981         }
   14982         try {
   14983             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
   14984             scriptRelaxed.forEach_testConvertDouble3Uint3Double3(inV, out);
   14985             verifyResultsConvertUint3Double3(inV, out, true);
   14986         } catch (Exception e) {
   14987             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble3Uint3Double3: " + e.toString());
   14988         }
   14989     }
   14990 
   14991     private void verifyResultsConvertUint3Double3(Allocation inV, Allocation out, boolean relaxed) {
   14992         int[] arrayInV = new int[INPUTSIZE * 4];
   14993         inV.copyTo(arrayInV);
   14994         double[] arrayOut = new double[INPUTSIZE * 4];
   14995         out.copyTo(arrayOut);
   14996         for (int i = 0; i < INPUTSIZE; i++) {
   14997             for (int j = 0; j < 3 ; j++) {
   14998                 // Extract the inputs.
   14999                 ArgumentsUintDouble args = new ArgumentsUintDouble();
   15000                 args.inV = arrayInV[i * 4 + j];
   15001                 // Figure out what the outputs should have been.
   15002                 Target target = new Target(relaxed);
   15003                 CoreMathVerifier.computeConvert(args, target);
   15004                 // Validate the outputs.
   15005                 boolean valid = true;
   15006                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   15007                     valid = false;
   15008                 }
   15009                 if (!valid) {
   15010                     StringBuilder message = new StringBuilder();
   15011                     message.append("Input inV: ");
   15012                     message.append(String.format("0x%x", args.inV));
   15013                     message.append("\n");
   15014                     message.append("Expected output out: ");
   15015                     message.append(args.out.toString());
   15016                     message.append("\n");
   15017                     message.append("Actual   output out: ");
   15018                     message.append(String.format("%24.8g {%16x} %31a",
   15019                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   15020                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   15021                         message.append(" FAIL");
   15022                     }
   15023                     message.append("\n");
   15024                     assertTrue("Incorrect output for checkConvertUint3Double3" +
   15025                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15026                 }
   15027             }
   15028         }
   15029     }
   15030 
   15031     private void checkConvertUint4Double4() {
   15032         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x414bd2cdec9f04f9l, false, 32);
   15033         try {
   15034             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   15035             script.forEach_testConvertDouble4Uint4Double4(inV, out);
   15036             verifyResultsConvertUint4Double4(inV, out, false);
   15037         } catch (Exception e) {
   15038             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Uint4Double4: " + e.toString());
   15039         }
   15040         try {
   15041             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
   15042             scriptRelaxed.forEach_testConvertDouble4Uint4Double4(inV, out);
   15043             verifyResultsConvertUint4Double4(inV, out, true);
   15044         } catch (Exception e) {
   15045             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertDouble4Uint4Double4: " + e.toString());
   15046         }
   15047     }
   15048 
   15049     private void verifyResultsConvertUint4Double4(Allocation inV, Allocation out, boolean relaxed) {
   15050         int[] arrayInV = new int[INPUTSIZE * 4];
   15051         inV.copyTo(arrayInV);
   15052         double[] arrayOut = new double[INPUTSIZE * 4];
   15053         out.copyTo(arrayOut);
   15054         for (int i = 0; i < INPUTSIZE; i++) {
   15055             for (int j = 0; j < 4 ; j++) {
   15056                 // Extract the inputs.
   15057                 ArgumentsUintDouble args = new ArgumentsUintDouble();
   15058                 args.inV = arrayInV[i * 4 + j];
   15059                 // Figure out what the outputs should have been.
   15060                 Target target = new Target(relaxed);
   15061                 CoreMathVerifier.computeConvert(args, target);
   15062                 // Validate the outputs.
   15063                 boolean valid = true;
   15064                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   15065                     valid = false;
   15066                 }
   15067                 if (!valid) {
   15068                     StringBuilder message = new StringBuilder();
   15069                     message.append("Input inV: ");
   15070                     message.append(String.format("0x%x", args.inV));
   15071                     message.append("\n");
   15072                     message.append("Expected output out: ");
   15073                     message.append(args.out.toString());
   15074                     message.append("\n");
   15075                     message.append("Actual   output out: ");
   15076                     message.append(String.format("%24.8g {%16x} %31a",
   15077                             arrayOut[i * 4 + j], Double.doubleToRawLongBits(arrayOut[i * 4 + j]), arrayOut[i * 4 + j]));
   15078                     if (!args.out.couldBe(arrayOut[i * 4 + j])) {
   15079                         message.append(" FAIL");
   15080                     }
   15081                     message.append("\n");
   15082                     assertTrue("Incorrect output for checkConvertUint4Double4" +
   15083                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15084                 }
   15085             }
   15086         }
   15087     }
   15088 
   15089     public class ArgumentsFloatLong {
   15090         public float inV;
   15091         public long out;
   15092     }
   15093 
   15094     private void checkConvertFloat2Long2() {
   15095         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x239cb49c7d7c0ae0l, -9.2233714870989619200e+18, 9.2233714870989619200e+18);
   15096         try {
   15097             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15098             script.forEach_testConvertLong2Float2Long2(inV, out);
   15099             verifyResultsConvertFloat2Long2(inV, out, false);
   15100         } catch (Exception e) {
   15101             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Float2Long2: " + e.toString());
   15102         }
   15103         try {
   15104             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15105             scriptRelaxed.forEach_testConvertLong2Float2Long2(inV, out);
   15106             verifyResultsConvertFloat2Long2(inV, out, true);
   15107         } catch (Exception e) {
   15108             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Float2Long2: " + e.toString());
   15109         }
   15110     }
   15111 
   15112     private void verifyResultsConvertFloat2Long2(Allocation inV, Allocation out, boolean relaxed) {
   15113         float[] arrayInV = new float[INPUTSIZE * 2];
   15114         inV.copyTo(arrayInV);
   15115         long[] arrayOut = new long[INPUTSIZE * 2];
   15116         out.copyTo(arrayOut);
   15117         for (int i = 0; i < INPUTSIZE; i++) {
   15118             for (int j = 0; j < 2 ; j++) {
   15119                 // Extract the inputs.
   15120                 ArgumentsFloatLong args = new ArgumentsFloatLong();
   15121                 args.inV = arrayInV[i * 2 + j];
   15122                 // Figure out what the outputs should have been.
   15123                 CoreMathVerifier.computeConvert(args);
   15124                 // Validate the outputs.
   15125                 boolean valid = true;
   15126                 if (args.out != arrayOut[i * 2 + j]) {
   15127                     valid = false;
   15128                 }
   15129                 if (!valid) {
   15130                     StringBuilder message = new StringBuilder();
   15131                     message.append("Input inV: ");
   15132                     message.append(String.format("%14.8g {%8x} %15a",
   15133                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   15134                     message.append("\n");
   15135                     message.append("Expected output out: ");
   15136                     message.append(String.format("%d", args.out));
   15137                     message.append("\n");
   15138                     message.append("Actual   output out: ");
   15139                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   15140                     if (args.out != arrayOut[i * 2 + j]) {
   15141                         message.append(" FAIL");
   15142                     }
   15143                     message.append("\n");
   15144                     assertTrue("Incorrect output for checkConvertFloat2Long2" +
   15145                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15146                 }
   15147             }
   15148         }
   15149     }
   15150 
   15151     private void checkConvertFloat3Long3() {
   15152         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x239cbf3ddc83cfd4l, -9.2233714870989619200e+18, 9.2233714870989619200e+18);
   15153         try {
   15154             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   15155             script.forEach_testConvertLong3Float3Long3(inV, out);
   15156             verifyResultsConvertFloat3Long3(inV, out, false);
   15157         } catch (Exception e) {
   15158             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Float3Long3: " + e.toString());
   15159         }
   15160         try {
   15161             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   15162             scriptRelaxed.forEach_testConvertLong3Float3Long3(inV, out);
   15163             verifyResultsConvertFloat3Long3(inV, out, true);
   15164         } catch (Exception e) {
   15165             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Float3Long3: " + e.toString());
   15166         }
   15167     }
   15168 
   15169     private void verifyResultsConvertFloat3Long3(Allocation inV, Allocation out, boolean relaxed) {
   15170         float[] arrayInV = new float[INPUTSIZE * 4];
   15171         inV.copyTo(arrayInV);
   15172         long[] arrayOut = new long[INPUTSIZE * 4];
   15173         out.copyTo(arrayOut);
   15174         for (int i = 0; i < INPUTSIZE; i++) {
   15175             for (int j = 0; j < 3 ; j++) {
   15176                 // Extract the inputs.
   15177                 ArgumentsFloatLong args = new ArgumentsFloatLong();
   15178                 args.inV = arrayInV[i * 4 + j];
   15179                 // Figure out what the outputs should have been.
   15180                 CoreMathVerifier.computeConvert(args);
   15181                 // Validate the outputs.
   15182                 boolean valid = true;
   15183                 if (args.out != arrayOut[i * 4 + j]) {
   15184                     valid = false;
   15185                 }
   15186                 if (!valid) {
   15187                     StringBuilder message = new StringBuilder();
   15188                     message.append("Input inV: ");
   15189                     message.append(String.format("%14.8g {%8x} %15a",
   15190                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   15191                     message.append("\n");
   15192                     message.append("Expected output out: ");
   15193                     message.append(String.format("%d", args.out));
   15194                     message.append("\n");
   15195                     message.append("Actual   output out: ");
   15196                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   15197                     if (args.out != arrayOut[i * 4 + j]) {
   15198                         message.append(" FAIL");
   15199                     }
   15200                     message.append("\n");
   15201                     assertTrue("Incorrect output for checkConvertFloat3Long3" +
   15202                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15203                 }
   15204             }
   15205         }
   15206     }
   15207 
   15208     private void checkConvertFloat4Long4() {
   15209         Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x239cc9df3b8b94c8l, -9.2233714870989619200e+18, 9.2233714870989619200e+18);
   15210         try {
   15211             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   15212             script.forEach_testConvertLong4Float4Long4(inV, out);
   15213             verifyResultsConvertFloat4Long4(inV, out, false);
   15214         } catch (Exception e) {
   15215             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Float4Long4: " + e.toString());
   15216         }
   15217         try {
   15218             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   15219             scriptRelaxed.forEach_testConvertLong4Float4Long4(inV, out);
   15220             verifyResultsConvertFloat4Long4(inV, out, true);
   15221         } catch (Exception e) {
   15222             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Float4Long4: " + e.toString());
   15223         }
   15224     }
   15225 
   15226     private void verifyResultsConvertFloat4Long4(Allocation inV, Allocation out, boolean relaxed) {
   15227         float[] arrayInV = new float[INPUTSIZE * 4];
   15228         inV.copyTo(arrayInV);
   15229         long[] arrayOut = new long[INPUTSIZE * 4];
   15230         out.copyTo(arrayOut);
   15231         for (int i = 0; i < INPUTSIZE; i++) {
   15232             for (int j = 0; j < 4 ; j++) {
   15233                 // Extract the inputs.
   15234                 ArgumentsFloatLong args = new ArgumentsFloatLong();
   15235                 args.inV = arrayInV[i * 4 + j];
   15236                 // Figure out what the outputs should have been.
   15237                 CoreMathVerifier.computeConvert(args);
   15238                 // Validate the outputs.
   15239                 boolean valid = true;
   15240                 if (args.out != arrayOut[i * 4 + j]) {
   15241                     valid = false;
   15242                 }
   15243                 if (!valid) {
   15244                     StringBuilder message = new StringBuilder();
   15245                     message.append("Input inV: ");
   15246                     message.append(String.format("%14.8g {%8x} %15a",
   15247                             args.inV, Float.floatToRawIntBits(args.inV), args.inV));
   15248                     message.append("\n");
   15249                     message.append("Expected output out: ");
   15250                     message.append(String.format("%d", args.out));
   15251                     message.append("\n");
   15252                     message.append("Actual   output out: ");
   15253                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   15254                     if (args.out != arrayOut[i * 4 + j]) {
   15255                         message.append(" FAIL");
   15256                     }
   15257                     message.append("\n");
   15258                     assertTrue("Incorrect output for checkConvertFloat4Long4" +
   15259                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15260                 }
   15261             }
   15262         }
   15263     }
   15264 
   15265     public class ArgumentsCharLong {
   15266         public byte inV;
   15267         public long out;
   15268     }
   15269 
   15270     private void checkConvertChar2Long2() {
   15271         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd86189bc290be220l, true, 7);
   15272         try {
   15273             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15274             script.forEach_testConvertLong2Char2Long2(inV, out);
   15275             verifyResultsConvertChar2Long2(inV, out, false);
   15276         } catch (Exception e) {
   15277             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Char2Long2: " + e.toString());
   15278         }
   15279         try {
   15280             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15281             scriptRelaxed.forEach_testConvertLong2Char2Long2(inV, out);
   15282             verifyResultsConvertChar2Long2(inV, out, true);
   15283         } catch (Exception e) {
   15284             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Char2Long2: " + e.toString());
   15285         }
   15286     }
   15287 
   15288     private void verifyResultsConvertChar2Long2(Allocation inV, Allocation out, boolean relaxed) {
   15289         byte[] arrayInV = new byte[INPUTSIZE * 2];
   15290         inV.copyTo(arrayInV);
   15291         long[] arrayOut = new long[INPUTSIZE * 2];
   15292         out.copyTo(arrayOut);
   15293         for (int i = 0; i < INPUTSIZE; i++) {
   15294             for (int j = 0; j < 2 ; j++) {
   15295                 // Extract the inputs.
   15296                 ArgumentsCharLong args = new ArgumentsCharLong();
   15297                 args.inV = arrayInV[i * 2 + j];
   15298                 // Figure out what the outputs should have been.
   15299                 CoreMathVerifier.computeConvert(args);
   15300                 // Validate the outputs.
   15301                 boolean valid = true;
   15302                 if (args.out != arrayOut[i * 2 + j]) {
   15303                     valid = false;
   15304                 }
   15305                 if (!valid) {
   15306                     StringBuilder message = new StringBuilder();
   15307                     message.append("Input inV: ");
   15308                     message.append(String.format("%d", args.inV));
   15309                     message.append("\n");
   15310                     message.append("Expected output out: ");
   15311                     message.append(String.format("%d", args.out));
   15312                     message.append("\n");
   15313                     message.append("Actual   output out: ");
   15314                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   15315                     if (args.out != arrayOut[i * 2 + j]) {
   15316                         message.append(" FAIL");
   15317                     }
   15318                     message.append("\n");
   15319                     assertTrue("Incorrect output for checkConvertChar2Long2" +
   15320                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15321                 }
   15322             }
   15323         }
   15324     }
   15325 
   15326     private void checkConvertChar3Long3() {
   15327         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xd861945d8813a714l, true, 7);
   15328         try {
   15329             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   15330             script.forEach_testConvertLong3Char3Long3(inV, out);
   15331             verifyResultsConvertChar3Long3(inV, out, false);
   15332         } catch (Exception e) {
   15333             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Char3Long3: " + e.toString());
   15334         }
   15335         try {
   15336             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   15337             scriptRelaxed.forEach_testConvertLong3Char3Long3(inV, out);
   15338             verifyResultsConvertChar3Long3(inV, out, true);
   15339         } catch (Exception e) {
   15340             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Char3Long3: " + e.toString());
   15341         }
   15342     }
   15343 
   15344     private void verifyResultsConvertChar3Long3(Allocation inV, Allocation out, boolean relaxed) {
   15345         byte[] arrayInV = new byte[INPUTSIZE * 4];
   15346         inV.copyTo(arrayInV);
   15347         long[] arrayOut = new long[INPUTSIZE * 4];
   15348         out.copyTo(arrayOut);
   15349         for (int i = 0; i < INPUTSIZE; i++) {
   15350             for (int j = 0; j < 3 ; j++) {
   15351                 // Extract the inputs.
   15352                 ArgumentsCharLong args = new ArgumentsCharLong();
   15353                 args.inV = arrayInV[i * 4 + j];
   15354                 // Figure out what the outputs should have been.
   15355                 CoreMathVerifier.computeConvert(args);
   15356                 // Validate the outputs.
   15357                 boolean valid = true;
   15358                 if (args.out != arrayOut[i * 4 + j]) {
   15359                     valid = false;
   15360                 }
   15361                 if (!valid) {
   15362                     StringBuilder message = new StringBuilder();
   15363                     message.append("Input inV: ");
   15364                     message.append(String.format("%d", args.inV));
   15365                     message.append("\n");
   15366                     message.append("Expected output out: ");
   15367                     message.append(String.format("%d", args.out));
   15368                     message.append("\n");
   15369                     message.append("Actual   output out: ");
   15370                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   15371                     if (args.out != arrayOut[i * 4 + j]) {
   15372                         message.append(" FAIL");
   15373                     }
   15374                     message.append("\n");
   15375                     assertTrue("Incorrect output for checkConvertChar3Long3" +
   15376                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15377                 }
   15378             }
   15379         }
   15380     }
   15381 
   15382     private void checkConvertChar4Long4() {
   15383         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd8619efee71b6c08l, true, 7);
   15384         try {
   15385             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   15386             script.forEach_testConvertLong4Char4Long4(inV, out);
   15387             verifyResultsConvertChar4Long4(inV, out, false);
   15388         } catch (Exception e) {
   15389             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Char4Long4: " + e.toString());
   15390         }
   15391         try {
   15392             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   15393             scriptRelaxed.forEach_testConvertLong4Char4Long4(inV, out);
   15394             verifyResultsConvertChar4Long4(inV, out, true);
   15395         } catch (Exception e) {
   15396             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Char4Long4: " + e.toString());
   15397         }
   15398     }
   15399 
   15400     private void verifyResultsConvertChar4Long4(Allocation inV, Allocation out, boolean relaxed) {
   15401         byte[] arrayInV = new byte[INPUTSIZE * 4];
   15402         inV.copyTo(arrayInV);
   15403         long[] arrayOut = new long[INPUTSIZE * 4];
   15404         out.copyTo(arrayOut);
   15405         for (int i = 0; i < INPUTSIZE; i++) {
   15406             for (int j = 0; j < 4 ; j++) {
   15407                 // Extract the inputs.
   15408                 ArgumentsCharLong args = new ArgumentsCharLong();
   15409                 args.inV = arrayInV[i * 4 + j];
   15410                 // Figure out what the outputs should have been.
   15411                 CoreMathVerifier.computeConvert(args);
   15412                 // Validate the outputs.
   15413                 boolean valid = true;
   15414                 if (args.out != arrayOut[i * 4 + j]) {
   15415                     valid = false;
   15416                 }
   15417                 if (!valid) {
   15418                     StringBuilder message = new StringBuilder();
   15419                     message.append("Input inV: ");
   15420                     message.append(String.format("%d", args.inV));
   15421                     message.append("\n");
   15422                     message.append("Expected output out: ");
   15423                     message.append(String.format("%d", args.out));
   15424                     message.append("\n");
   15425                     message.append("Actual   output out: ");
   15426                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   15427                     if (args.out != arrayOut[i * 4 + j]) {
   15428                         message.append(" FAIL");
   15429                     }
   15430                     message.append("\n");
   15431                     assertTrue("Incorrect output for checkConvertChar4Long4" +
   15432                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15433                 }
   15434             }
   15435         }
   15436     }
   15437 
   15438     public class ArgumentsUcharLong {
   15439         public byte inV;
   15440         public long out;
   15441     }
   15442 
   15443     private void checkConvertUchar2Long2() {
   15444         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7fef4309bb8deea1l, false, 8);
   15445         try {
   15446             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15447             script.forEach_testConvertLong2Uchar2Long2(inV, out);
   15448             verifyResultsConvertUchar2Long2(inV, out, false);
   15449         } catch (Exception e) {
   15450             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Uchar2Long2: " + e.toString());
   15451         }
   15452         try {
   15453             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15454             scriptRelaxed.forEach_testConvertLong2Uchar2Long2(inV, out);
   15455             verifyResultsConvertUchar2Long2(inV, out, true);
   15456         } catch (Exception e) {
   15457             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Uchar2Long2: " + e.toString());
   15458         }
   15459     }
   15460 
   15461     private void verifyResultsConvertUchar2Long2(Allocation inV, Allocation out, boolean relaxed) {
   15462         byte[] arrayInV = new byte[INPUTSIZE * 2];
   15463         inV.copyTo(arrayInV);
   15464         long[] arrayOut = new long[INPUTSIZE * 2];
   15465         out.copyTo(arrayOut);
   15466         for (int i = 0; i < INPUTSIZE; i++) {
   15467             for (int j = 0; j < 2 ; j++) {
   15468                 // Extract the inputs.
   15469                 ArgumentsUcharLong args = new ArgumentsUcharLong();
   15470                 args.inV = arrayInV[i * 2 + j];
   15471                 // Figure out what the outputs should have been.
   15472                 CoreMathVerifier.computeConvert(args);
   15473                 // Validate the outputs.
   15474                 boolean valid = true;
   15475                 if (args.out != arrayOut[i * 2 + j]) {
   15476                     valid = false;
   15477                 }
   15478                 if (!valid) {
   15479                     StringBuilder message = new StringBuilder();
   15480                     message.append("Input inV: ");
   15481                     message.append(String.format("0x%x", args.inV));
   15482                     message.append("\n");
   15483                     message.append("Expected output out: ");
   15484                     message.append(String.format("%d", args.out));
   15485                     message.append("\n");
   15486                     message.append("Actual   output out: ");
   15487                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   15488                     if (args.out != arrayOut[i * 2 + j]) {
   15489                         message.append(" FAIL");
   15490                     }
   15491                     message.append("\n");
   15492                     assertTrue("Incorrect output for checkConvertUchar2Long2" +
   15493                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15494                 }
   15495             }
   15496         }
   15497     }
   15498 
   15499     private void checkConvertUchar3Long3() {
   15500         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7fef4dab1a95b395l, false, 8);
   15501         try {
   15502             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   15503             script.forEach_testConvertLong3Uchar3Long3(inV, out);
   15504             verifyResultsConvertUchar3Long3(inV, out, false);
   15505         } catch (Exception e) {
   15506             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Uchar3Long3: " + e.toString());
   15507         }
   15508         try {
   15509             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   15510             scriptRelaxed.forEach_testConvertLong3Uchar3Long3(inV, out);
   15511             verifyResultsConvertUchar3Long3(inV, out, true);
   15512         } catch (Exception e) {
   15513             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Uchar3Long3: " + e.toString());
   15514         }
   15515     }
   15516 
   15517     private void verifyResultsConvertUchar3Long3(Allocation inV, Allocation out, boolean relaxed) {
   15518         byte[] arrayInV = new byte[INPUTSIZE * 4];
   15519         inV.copyTo(arrayInV);
   15520         long[] arrayOut = new long[INPUTSIZE * 4];
   15521         out.copyTo(arrayOut);
   15522         for (int i = 0; i < INPUTSIZE; i++) {
   15523             for (int j = 0; j < 3 ; j++) {
   15524                 // Extract the inputs.
   15525                 ArgumentsUcharLong args = new ArgumentsUcharLong();
   15526                 args.inV = arrayInV[i * 4 + j];
   15527                 // Figure out what the outputs should have been.
   15528                 CoreMathVerifier.computeConvert(args);
   15529                 // Validate the outputs.
   15530                 boolean valid = true;
   15531                 if (args.out != arrayOut[i * 4 + j]) {
   15532                     valid = false;
   15533                 }
   15534                 if (!valid) {
   15535                     StringBuilder message = new StringBuilder();
   15536                     message.append("Input inV: ");
   15537                     message.append(String.format("0x%x", args.inV));
   15538                     message.append("\n");
   15539                     message.append("Expected output out: ");
   15540                     message.append(String.format("%d", args.out));
   15541                     message.append("\n");
   15542                     message.append("Actual   output out: ");
   15543                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   15544                     if (args.out != arrayOut[i * 4 + j]) {
   15545                         message.append(" FAIL");
   15546                     }
   15547                     message.append("\n");
   15548                     assertTrue("Incorrect output for checkConvertUchar3Long3" +
   15549                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15550                 }
   15551             }
   15552         }
   15553     }
   15554 
   15555     private void checkConvertUchar4Long4() {
   15556         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7fef584c799d7889l, false, 8);
   15557         try {
   15558             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   15559             script.forEach_testConvertLong4Uchar4Long4(inV, out);
   15560             verifyResultsConvertUchar4Long4(inV, out, false);
   15561         } catch (Exception e) {
   15562             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Uchar4Long4: " + e.toString());
   15563         }
   15564         try {
   15565             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   15566             scriptRelaxed.forEach_testConvertLong4Uchar4Long4(inV, out);
   15567             verifyResultsConvertUchar4Long4(inV, out, true);
   15568         } catch (Exception e) {
   15569             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Uchar4Long4: " + e.toString());
   15570         }
   15571     }
   15572 
   15573     private void verifyResultsConvertUchar4Long4(Allocation inV, Allocation out, boolean relaxed) {
   15574         byte[] arrayInV = new byte[INPUTSIZE * 4];
   15575         inV.copyTo(arrayInV);
   15576         long[] arrayOut = new long[INPUTSIZE * 4];
   15577         out.copyTo(arrayOut);
   15578         for (int i = 0; i < INPUTSIZE; i++) {
   15579             for (int j = 0; j < 4 ; j++) {
   15580                 // Extract the inputs.
   15581                 ArgumentsUcharLong args = new ArgumentsUcharLong();
   15582                 args.inV = arrayInV[i * 4 + j];
   15583                 // Figure out what the outputs should have been.
   15584                 CoreMathVerifier.computeConvert(args);
   15585                 // Validate the outputs.
   15586                 boolean valid = true;
   15587                 if (args.out != arrayOut[i * 4 + j]) {
   15588                     valid = false;
   15589                 }
   15590                 if (!valid) {
   15591                     StringBuilder message = new StringBuilder();
   15592                     message.append("Input inV: ");
   15593                     message.append(String.format("0x%x", args.inV));
   15594                     message.append("\n");
   15595                     message.append("Expected output out: ");
   15596                     message.append(String.format("%d", args.out));
   15597                     message.append("\n");
   15598                     message.append("Actual   output out: ");
   15599                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   15600                     if (args.out != arrayOut[i * 4 + j]) {
   15601                         message.append(" FAIL");
   15602                     }
   15603                     message.append("\n");
   15604                     assertTrue("Incorrect output for checkConvertUchar4Long4" +
   15605                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15606                 }
   15607             }
   15608         }
   15609     }
   15610 
   15611     public class ArgumentsShortLong {
   15612         public short inV;
   15613         public long out;
   15614     }
   15615 
   15616     private void checkConvertShort2Long2() {
   15617         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x68ab674669c97ce4l, true, 15);
   15618         try {
   15619             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15620             script.forEach_testConvertLong2Short2Long2(inV, out);
   15621             verifyResultsConvertShort2Long2(inV, out, false);
   15622         } catch (Exception e) {
   15623             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Short2Long2: " + e.toString());
   15624         }
   15625         try {
   15626             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15627             scriptRelaxed.forEach_testConvertLong2Short2Long2(inV, out);
   15628             verifyResultsConvertShort2Long2(inV, out, true);
   15629         } catch (Exception e) {
   15630             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Short2Long2: " + e.toString());
   15631         }
   15632     }
   15633 
   15634     private void verifyResultsConvertShort2Long2(Allocation inV, Allocation out, boolean relaxed) {
   15635         short[] arrayInV = new short[INPUTSIZE * 2];
   15636         inV.copyTo(arrayInV);
   15637         long[] arrayOut = new long[INPUTSIZE * 2];
   15638         out.copyTo(arrayOut);
   15639         for (int i = 0; i < INPUTSIZE; i++) {
   15640             for (int j = 0; j < 2 ; j++) {
   15641                 // Extract the inputs.
   15642                 ArgumentsShortLong args = new ArgumentsShortLong();
   15643                 args.inV = arrayInV[i * 2 + j];
   15644                 // Figure out what the outputs should have been.
   15645                 CoreMathVerifier.computeConvert(args);
   15646                 // Validate the outputs.
   15647                 boolean valid = true;
   15648                 if (args.out != arrayOut[i * 2 + j]) {
   15649                     valid = false;
   15650                 }
   15651                 if (!valid) {
   15652                     StringBuilder message = new StringBuilder();
   15653                     message.append("Input inV: ");
   15654                     message.append(String.format("%d", args.inV));
   15655                     message.append("\n");
   15656                     message.append("Expected output out: ");
   15657                     message.append(String.format("%d", args.out));
   15658                     message.append("\n");
   15659                     message.append("Actual   output out: ");
   15660                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   15661                     if (args.out != arrayOut[i * 2 + j]) {
   15662                         message.append(" FAIL");
   15663                     }
   15664                     message.append("\n");
   15665                     assertTrue("Incorrect output for checkConvertShort2Long2" +
   15666                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15667                 }
   15668             }
   15669         }
   15670     }
   15671 
   15672     private void checkConvertShort3Long3() {
   15673         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x68ab71e7c8d141d8l, true, 15);
   15674         try {
   15675             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   15676             script.forEach_testConvertLong3Short3Long3(inV, out);
   15677             verifyResultsConvertShort3Long3(inV, out, false);
   15678         } catch (Exception e) {
   15679             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Short3Long3: " + e.toString());
   15680         }
   15681         try {
   15682             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   15683             scriptRelaxed.forEach_testConvertLong3Short3Long3(inV, out);
   15684             verifyResultsConvertShort3Long3(inV, out, true);
   15685         } catch (Exception e) {
   15686             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Short3Long3: " + e.toString());
   15687         }
   15688     }
   15689 
   15690     private void verifyResultsConvertShort3Long3(Allocation inV, Allocation out, boolean relaxed) {
   15691         short[] arrayInV = new short[INPUTSIZE * 4];
   15692         inV.copyTo(arrayInV);
   15693         long[] arrayOut = new long[INPUTSIZE * 4];
   15694         out.copyTo(arrayOut);
   15695         for (int i = 0; i < INPUTSIZE; i++) {
   15696             for (int j = 0; j < 3 ; j++) {
   15697                 // Extract the inputs.
   15698                 ArgumentsShortLong args = new ArgumentsShortLong();
   15699                 args.inV = arrayInV[i * 4 + j];
   15700                 // Figure out what the outputs should have been.
   15701                 CoreMathVerifier.computeConvert(args);
   15702                 // Validate the outputs.
   15703                 boolean valid = true;
   15704                 if (args.out != arrayOut[i * 4 + j]) {
   15705                     valid = false;
   15706                 }
   15707                 if (!valid) {
   15708                     StringBuilder message = new StringBuilder();
   15709                     message.append("Input inV: ");
   15710                     message.append(String.format("%d", args.inV));
   15711                     message.append("\n");
   15712                     message.append("Expected output out: ");
   15713                     message.append(String.format("%d", args.out));
   15714                     message.append("\n");
   15715                     message.append("Actual   output out: ");
   15716                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   15717                     if (args.out != arrayOut[i * 4 + j]) {
   15718                         message.append(" FAIL");
   15719                     }
   15720                     message.append("\n");
   15721                     assertTrue("Incorrect output for checkConvertShort3Long3" +
   15722                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15723                 }
   15724             }
   15725         }
   15726     }
   15727 
   15728     private void checkConvertShort4Long4() {
   15729         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x68ab7c8927d906ccl, true, 15);
   15730         try {
   15731             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   15732             script.forEach_testConvertLong4Short4Long4(inV, out);
   15733             verifyResultsConvertShort4Long4(inV, out, false);
   15734         } catch (Exception e) {
   15735             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Short4Long4: " + e.toString());
   15736         }
   15737         try {
   15738             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   15739             scriptRelaxed.forEach_testConvertLong4Short4Long4(inV, out);
   15740             verifyResultsConvertShort4Long4(inV, out, true);
   15741         } catch (Exception e) {
   15742             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Short4Long4: " + e.toString());
   15743         }
   15744     }
   15745 
   15746     private void verifyResultsConvertShort4Long4(Allocation inV, Allocation out, boolean relaxed) {
   15747         short[] arrayInV = new short[INPUTSIZE * 4];
   15748         inV.copyTo(arrayInV);
   15749         long[] arrayOut = new long[INPUTSIZE * 4];
   15750         out.copyTo(arrayOut);
   15751         for (int i = 0; i < INPUTSIZE; i++) {
   15752             for (int j = 0; j < 4 ; j++) {
   15753                 // Extract the inputs.
   15754                 ArgumentsShortLong args = new ArgumentsShortLong();
   15755                 args.inV = arrayInV[i * 4 + j];
   15756                 // Figure out what the outputs should have been.
   15757                 CoreMathVerifier.computeConvert(args);
   15758                 // Validate the outputs.
   15759                 boolean valid = true;
   15760                 if (args.out != arrayOut[i * 4 + j]) {
   15761                     valid = false;
   15762                 }
   15763                 if (!valid) {
   15764                     StringBuilder message = new StringBuilder();
   15765                     message.append("Input inV: ");
   15766                     message.append(String.format("%d", args.inV));
   15767                     message.append("\n");
   15768                     message.append("Expected output out: ");
   15769                     message.append(String.format("%d", args.out));
   15770                     message.append("\n");
   15771                     message.append("Actual   output out: ");
   15772                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   15773                     if (args.out != arrayOut[i * 4 + j]) {
   15774                         message.append(" FAIL");
   15775                     }
   15776                     message.append("\n");
   15777                     assertTrue("Incorrect output for checkConvertShort4Long4" +
   15778                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15779                 }
   15780             }
   15781         }
   15782     }
   15783 
   15784     public class ArgumentsUshortLong {
   15785         public short inV;
   15786         public long out;
   15787     }
   15788 
   15789     private void checkConvertUshort2Long2() {
   15790         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x8d79874e05a1968fl, false, 16);
   15791         try {
   15792             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15793             script.forEach_testConvertLong2Ushort2Long2(inV, out);
   15794             verifyResultsConvertUshort2Long2(inV, out, false);
   15795         } catch (Exception e) {
   15796             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Ushort2Long2: " + e.toString());
   15797         }
   15798         try {
   15799             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15800             scriptRelaxed.forEach_testConvertLong2Ushort2Long2(inV, out);
   15801             verifyResultsConvertUshort2Long2(inV, out, true);
   15802         } catch (Exception e) {
   15803             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Ushort2Long2: " + e.toString());
   15804         }
   15805     }
   15806 
   15807     private void verifyResultsConvertUshort2Long2(Allocation inV, Allocation out, boolean relaxed) {
   15808         short[] arrayInV = new short[INPUTSIZE * 2];
   15809         inV.copyTo(arrayInV);
   15810         long[] arrayOut = new long[INPUTSIZE * 2];
   15811         out.copyTo(arrayOut);
   15812         for (int i = 0; i < INPUTSIZE; i++) {
   15813             for (int j = 0; j < 2 ; j++) {
   15814                 // Extract the inputs.
   15815                 ArgumentsUshortLong args = new ArgumentsUshortLong();
   15816                 args.inV = arrayInV[i * 2 + j];
   15817                 // Figure out what the outputs should have been.
   15818                 CoreMathVerifier.computeConvert(args);
   15819                 // Validate the outputs.
   15820                 boolean valid = true;
   15821                 if (args.out != arrayOut[i * 2 + j]) {
   15822                     valid = false;
   15823                 }
   15824                 if (!valid) {
   15825                     StringBuilder message = new StringBuilder();
   15826                     message.append("Input inV: ");
   15827                     message.append(String.format("0x%x", args.inV));
   15828                     message.append("\n");
   15829                     message.append("Expected output out: ");
   15830                     message.append(String.format("%d", args.out));
   15831                     message.append("\n");
   15832                     message.append("Actual   output out: ");
   15833                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   15834                     if (args.out != arrayOut[i * 2 + j]) {
   15835                         message.append(" FAIL");
   15836                     }
   15837                     message.append("\n");
   15838                     assertTrue("Incorrect output for checkConvertUshort2Long2" +
   15839                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15840                 }
   15841             }
   15842         }
   15843     }
   15844 
   15845     private void checkConvertUshort3Long3() {
   15846         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x8d7991ef64a95b83l, false, 16);
   15847         try {
   15848             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   15849             script.forEach_testConvertLong3Ushort3Long3(inV, out);
   15850             verifyResultsConvertUshort3Long3(inV, out, false);
   15851         } catch (Exception e) {
   15852             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Ushort3Long3: " + e.toString());
   15853         }
   15854         try {
   15855             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   15856             scriptRelaxed.forEach_testConvertLong3Ushort3Long3(inV, out);
   15857             verifyResultsConvertUshort3Long3(inV, out, true);
   15858         } catch (Exception e) {
   15859             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Ushort3Long3: " + e.toString());
   15860         }
   15861     }
   15862 
   15863     private void verifyResultsConvertUshort3Long3(Allocation inV, Allocation out, boolean relaxed) {
   15864         short[] arrayInV = new short[INPUTSIZE * 4];
   15865         inV.copyTo(arrayInV);
   15866         long[] arrayOut = new long[INPUTSIZE * 4];
   15867         out.copyTo(arrayOut);
   15868         for (int i = 0; i < INPUTSIZE; i++) {
   15869             for (int j = 0; j < 3 ; j++) {
   15870                 // Extract the inputs.
   15871                 ArgumentsUshortLong args = new ArgumentsUshortLong();
   15872                 args.inV = arrayInV[i * 4 + j];
   15873                 // Figure out what the outputs should have been.
   15874                 CoreMathVerifier.computeConvert(args);
   15875                 // Validate the outputs.
   15876                 boolean valid = true;
   15877                 if (args.out != arrayOut[i * 4 + j]) {
   15878                     valid = false;
   15879                 }
   15880                 if (!valid) {
   15881                     StringBuilder message = new StringBuilder();
   15882                     message.append("Input inV: ");
   15883                     message.append(String.format("0x%x", args.inV));
   15884                     message.append("\n");
   15885                     message.append("Expected output out: ");
   15886                     message.append(String.format("%d", args.out));
   15887                     message.append("\n");
   15888                     message.append("Actual   output out: ");
   15889                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   15890                     if (args.out != arrayOut[i * 4 + j]) {
   15891                         message.append(" FAIL");
   15892                     }
   15893                     message.append("\n");
   15894                     assertTrue("Incorrect output for checkConvertUshort3Long3" +
   15895                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15896                 }
   15897             }
   15898         }
   15899     }
   15900 
   15901     private void checkConvertUshort4Long4() {
   15902         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x8d799c90c3b12077l, false, 16);
   15903         try {
   15904             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   15905             script.forEach_testConvertLong4Ushort4Long4(inV, out);
   15906             verifyResultsConvertUshort4Long4(inV, out, false);
   15907         } catch (Exception e) {
   15908             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Ushort4Long4: " + e.toString());
   15909         }
   15910         try {
   15911             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   15912             scriptRelaxed.forEach_testConvertLong4Ushort4Long4(inV, out);
   15913             verifyResultsConvertUshort4Long4(inV, out, true);
   15914         } catch (Exception e) {
   15915             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Ushort4Long4: " + e.toString());
   15916         }
   15917     }
   15918 
   15919     private void verifyResultsConvertUshort4Long4(Allocation inV, Allocation out, boolean relaxed) {
   15920         short[] arrayInV = new short[INPUTSIZE * 4];
   15921         inV.copyTo(arrayInV);
   15922         long[] arrayOut = new long[INPUTSIZE * 4];
   15923         out.copyTo(arrayOut);
   15924         for (int i = 0; i < INPUTSIZE; i++) {
   15925             for (int j = 0; j < 4 ; j++) {
   15926                 // Extract the inputs.
   15927                 ArgumentsUshortLong args = new ArgumentsUshortLong();
   15928                 args.inV = arrayInV[i * 4 + j];
   15929                 // Figure out what the outputs should have been.
   15930                 CoreMathVerifier.computeConvert(args);
   15931                 // Validate the outputs.
   15932                 boolean valid = true;
   15933                 if (args.out != arrayOut[i * 4 + j]) {
   15934                     valid = false;
   15935                 }
   15936                 if (!valid) {
   15937                     StringBuilder message = new StringBuilder();
   15938                     message.append("Input inV: ");
   15939                     message.append(String.format("0x%x", args.inV));
   15940                     message.append("\n");
   15941                     message.append("Expected output out: ");
   15942                     message.append(String.format("%d", args.out));
   15943                     message.append("\n");
   15944                     message.append("Actual   output out: ");
   15945                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   15946                     if (args.out != arrayOut[i * 4 + j]) {
   15947                         message.append(" FAIL");
   15948                     }
   15949                     message.append("\n");
   15950                     assertTrue("Incorrect output for checkConvertUshort4Long4" +
   15951                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   15952                 }
   15953             }
   15954         }
   15955     }
   15956 
   15957     public class ArgumentsIntLong {
   15958         public int inV;
   15959         public long out;
   15960     }
   15961 
   15962     private void checkConvertInt2Long2() {
   15963         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xd74f538b8a45cb5dl, true, 31);
   15964         try {
   15965             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15966             script.forEach_testConvertLong2Int2Long2(inV, out);
   15967             verifyResultsConvertInt2Long2(inV, out, false);
   15968         } catch (Exception e) {
   15969             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Int2Long2: " + e.toString());
   15970         }
   15971         try {
   15972             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   15973             scriptRelaxed.forEach_testConvertLong2Int2Long2(inV, out);
   15974             verifyResultsConvertInt2Long2(inV, out, true);
   15975         } catch (Exception e) {
   15976             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Int2Long2: " + e.toString());
   15977         }
   15978     }
   15979 
   15980     private void verifyResultsConvertInt2Long2(Allocation inV, Allocation out, boolean relaxed) {
   15981         int[] arrayInV = new int[INPUTSIZE * 2];
   15982         inV.copyTo(arrayInV);
   15983         long[] arrayOut = new long[INPUTSIZE * 2];
   15984         out.copyTo(arrayOut);
   15985         for (int i = 0; i < INPUTSIZE; i++) {
   15986             for (int j = 0; j < 2 ; j++) {
   15987                 // Extract the inputs.
   15988                 ArgumentsIntLong args = new ArgumentsIntLong();
   15989                 args.inV = arrayInV[i * 2 + j];
   15990                 // Figure out what the outputs should have been.
   15991                 CoreMathVerifier.computeConvert(args);
   15992                 // Validate the outputs.
   15993                 boolean valid = true;
   15994                 if (args.out != arrayOut[i * 2 + j]) {
   15995                     valid = false;
   15996                 }
   15997                 if (!valid) {
   15998                     StringBuilder message = new StringBuilder();
   15999                     message.append("Input inV: ");
   16000                     message.append(String.format("%d", args.inV));
   16001                     message.append("\n");
   16002                     message.append("Expected output out: ");
   16003                     message.append(String.format("%d", args.out));
   16004                     message.append("\n");
   16005                     message.append("Actual   output out: ");
   16006                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   16007                     if (args.out != arrayOut[i * 2 + j]) {
   16008                         message.append(" FAIL");
   16009                     }
   16010                     message.append("\n");
   16011                     assertTrue("Incorrect output for checkConvertInt2Long2" +
   16012                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   16013                 }
   16014             }
   16015         }
   16016     }
   16017 
   16018     private void checkConvertInt3Long3() {
   16019         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xd74f5e2ce94d9051l, true, 31);
   16020         try {
   16021             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   16022             script.forEach_testConvertLong3Int3Long3(inV, out);
   16023             verifyResultsConvertInt3Long3(inV, out, false);
   16024         } catch (Exception e) {
   16025             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Int3Long3: " + e.toString());
   16026         }
   16027         try {
   16028             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   16029             scriptRelaxed.forEach_testConvertLong3Int3Long3(inV, out);
   16030             verifyResultsConvertInt3Long3(inV, out, true);
   16031         } catch (Exception e) {
   16032             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Int3Long3: " + e.toString());
   16033         }
   16034     }
   16035 
   16036     private void verifyResultsConvertInt3Long3(Allocation inV, Allocation out, boolean relaxed) {
   16037         int[] arrayInV = new int[INPUTSIZE * 4];
   16038         inV.copyTo(arrayInV);
   16039         long[] arrayOut = new long[INPUTSIZE * 4];
   16040         out.copyTo(arrayOut);
   16041         for (int i = 0; i < INPUTSIZE; i++) {
   16042             for (int j = 0; j < 3 ; j++) {
   16043                 // Extract the inputs.
   16044                 ArgumentsIntLong args = new ArgumentsIntLong();
   16045                 args.inV = arrayInV[i * 4 + j];
   16046                 // Figure out what the outputs should have been.
   16047                 CoreMathVerifier.computeConvert(args);
   16048                 // Validate the outputs.
   16049                 boolean valid = true;
   16050                 if (args.out != arrayOut[i * 4 + j]) {
   16051                     valid = false;
   16052                 }
   16053                 if (!valid) {
   16054                     StringBuilder message = new StringBuilder();
   16055                     message.append("Input inV: ");
   16056                     message.append(String.format("%d", args.inV));
   16057                     message.append("\n");
   16058                     message.append("Expected output out: ");
   16059                     message.append(String.format("%d", args.out));
   16060                     message.append("\n");
   16061                     message.append("Actual   output out: ");
   16062                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   16063                     if (args.out != arrayOut[i * 4 + j]) {
   16064                         message.append(" FAIL");
   16065                     }
   16066                     message.append("\n");
   16067                     assertTrue("Incorrect output for checkConvertInt3Long3" +
   16068                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   16069                 }
   16070             }
   16071         }
   16072     }
   16073 
   16074     private void checkConvertInt4Long4() {
   16075         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xd74f68ce48555545l, true, 31);
   16076         try {
   16077             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   16078             script.forEach_testConvertLong4Int4Long4(inV, out);
   16079             verifyResultsConvertInt4Long4(inV, out, false);
   16080         } catch (Exception e) {
   16081             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Int4Long4: " + e.toString());
   16082         }
   16083         try {
   16084             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
   16085             scriptRelaxed.forEach_testConvertLong4Int4Long4(inV, out);
   16086             verifyResultsConvertInt4Long4(inV, out, true);
   16087         } catch (Exception e) {
   16088             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong4Int4Long4: " + e.toString());
   16089         }
   16090     }
   16091 
   16092     private void verifyResultsConvertInt4Long4(Allocation inV, Allocation out, boolean relaxed) {
   16093         int[] arrayInV = new int[INPUTSIZE * 4];
   16094         inV.copyTo(arrayInV);
   16095         long[] arrayOut = new long[INPUTSIZE * 4];
   16096         out.copyTo(arrayOut);
   16097         for (int i = 0; i < INPUTSIZE; i++) {
   16098             for (int j = 0; j < 4 ; j++) {
   16099                 // Extract the inputs.
   16100                 ArgumentsIntLong args = new ArgumentsIntLong();
   16101                 args.inV = arrayInV[i * 4 + j];
   16102                 // Figure out what the outputs should have been.
   16103                 CoreMathVerifier.computeConvert(args);
   16104                 // Validate the outputs.
   16105                 boolean valid = true;
   16106                 if (args.out != arrayOut[i * 4 + j]) {
   16107                     valid = false;
   16108                 }
   16109                 if (!valid) {
   16110                     StringBuilder message = new StringBuilder();
   16111                     message.append("Input inV: ");
   16112                     message.append(String.format("%d", args.inV));
   16113                     message.append("\n");
   16114                     message.append("Expected output out: ");
   16115                     message.append(String.format("%d", args.out));
   16116                     message.append("\n");
   16117                     message.append("Actual   output out: ");
   16118                     message.append(String.format("%d", arrayOut[i * 4 + j]));
   16119                     if (args.out != arrayOut[i * 4 + j]) {
   16120                         message.append(" FAIL");
   16121                     }
   16122                     message.append("\n");
   16123                     assertTrue("Incorrect output for checkConvertInt4Long4" +
   16124                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   16125                 }
   16126             }
   16127         }
   16128     }
   16129 
   16130     public class ArgumentsUintLong {
   16131         public int inV;
   16132         public long out;
   16133     }
   16134 
   16135     private void checkConvertUint2Long2() {
   16136         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xe71d0a7587b9ef60l, false, 32);
   16137         try {
   16138             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   16139             script.forEach_testConvertLong2Uint2Long2(inV, out);
   16140             verifyResultsConvertUint2Long2(inV, out, false);
   16141         } catch (Exception e) {
   16142             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Uint2Long2: " + e.toString());
   16143         }
   16144         try {
   16145             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
   16146             scriptRelaxed.forEach_testConvertLong2Uint2Long2(inV, out);
   16147             verifyResultsConvertUint2Long2(inV, out, true);
   16148         } catch (Exception e) {
   16149             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong2Uint2Long2: " + e.toString());
   16150         }
   16151     }
   16152 
   16153     private void verifyResultsConvertUint2Long2(Allocation inV, Allocation out, boolean relaxed) {
   16154         int[] arrayInV = new int[INPUTSIZE * 2];
   16155         inV.copyTo(arrayInV);
   16156         long[] arrayOut = new long[INPUTSIZE * 2];
   16157         out.copyTo(arrayOut);
   16158         for (int i = 0; i < INPUTSIZE; i++) {
   16159             for (int j = 0; j < 2 ; j++) {
   16160                 // Extract the inputs.
   16161                 ArgumentsUintLong args = new ArgumentsUintLong();
   16162                 args.inV = arrayInV[i * 2 + j];
   16163                 // Figure out what the outputs should have been.
   16164                 CoreMathVerifier.computeConvert(args);
   16165                 // Validate the outputs.
   16166                 boolean valid = true;
   16167                 if (args.out != arrayOut[i * 2 + j]) {
   16168                     valid = false;
   16169                 }
   16170                 if (!valid) {
   16171                     StringBuilder message = new StringBuilder();
   16172                     message.append("Input inV: ");
   16173                     message.append(String.format("0x%x", args.inV));
   16174                     message.append("\n");
   16175                     message.append("Expected output out: ");
   16176                     message.append(String.format("%d", args.out));
   16177                     message.append("\n");
   16178                     message.append("Actual   output out: ");
   16179                     message.append(String.format("%d", arrayOut[i * 2 + j]));
   16180                     if (args.out != arrayOut[i * 2 + j]) {
   16181                         message.append(" FAIL");
   16182                     }
   16183                     message.append("\n");
   16184                     assertTrue("Incorrect output for checkConvertUint2Long2" +
   16185                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
   16186                 }
   16187             }
   16188         }
   16189     }
   16190 
   16191     private void checkConvertUint3Long3() {
   16192         Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe71d1516e6c1b454l, false, 32);
   16193         try {
   16194             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   16195             script.forEach_testConvertLong3Uint3Long3(inV, out);
   16196             verifyResultsConvertUint3Long3(inV, out, false);
   16197         } catch (Exception e) {
   16198             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Uint3Long3: " + e.toString());
   16199         }
   16200         try {
   16201             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
   16202             scriptRelaxed.forEach_testConvertLong3Uint3Long3(inV, out);
   16203             verifyResultsConvertUint3Long3(inV, out, true);
   16204         } catch (Exception e) {
   16205             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testConvertLong3Uint3Long3: " + e.toString());
   16206         }
   16207     }
   16208 
   16209     private void verifyResultsConvertUint3Long3(Allocation inV, Allocation out, boolean relaxed) {
   16210         int[] arrayInV = new int[INPUTSIZE * 4];
   16211         inV.copyTo(arrayInV);
   16212         long[] arrayOut = new long[INPUTSIZE * 4];
   16213         out.copyTo(arrayOut);
   16214         for (int i = 0; i < INPUTSIZE; i++) {
   16215             for (int j = 0; j < 3 ; j++) {
   16216                 // Extract the inputs.
   16217                 ArgumentsUintLong args = new ArgumentsUintLong();
   16218                 args.inV = arrayInV[i * 4 + j];
   16219                 // Figure out what the outputs should have been.
   16220                 CoreMathVerifier.computeConvert(args);
   16221                 // Validate the outputs.
   16222                 boolean valid = true;
   16223                 if (args.out != arrayOut[i * 4 + j]) {
   16224                     valid = false;
   16225                 }
   16226                 if (!valid) {
   16227                     StringBuilder message = new StringBuilder();
   16228                     message.append("Input inV: ");
   16229                     message.append(String.format("0x%x", args.inV));
   16230                     message.append("\n");
   16231                     message.append("Expected output out: ");
   16232                     message.append(String.format("%d", args.out));
   16233                     message.append("\n");
   16234                     message.append("Actual   output out: ");