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 package android.renderscript.cts;
     18 
     19 import android.util.Log;
     20 
     21 public class CoreMathVerifier {
     22     static {
     23         System.loadLibrary("coremathtestcpp_jni");
     24     }
     25 
     26     /* The level of precision we expect out of the half_* functions.  floats (f32) have 23 bits of
     27      * mantissa and halfs (f16) have 10 bits.  8192 = 2 ^ (23 - 10).
     28      */
     29     private static final int HALF_PRECISION = 8192;
     30     // The level of precision we expect out of the fast_* functions.
     31     private static final int FAST_PRECISION = 8192;
     32     // The level of precision we expect out of the native_* functions.
     33     private static final int NATIVE_PRECISION = 8192;
     34 
     35     // Static classes used to return multiple values from a few JNI functions.
     36     static public class FrexpResult {
     37         public float significand;
     38         public int exponent;
     39     }
     40 
     41     static public class LgammaResult {
     42         public float lgamma;
     43         public int gammaSign;
     44     }
     45 
     46     static public class RemquoResult {
     47         public float remainder;
     48         public int quotient;
     49     }
     50 
     51     /* We're calling into native:
     52      * - not all functions are available in Java, notably gamma and erf,
     53      * - Java lacks float version of these functions, so we can compare implementations with
     54      *   similar constraints, and
     55      * - handling unsigned integers, especially longs, is painful and error prone in Java.
     56      */
     57     static native float acos(float x);
     58     static native float acosh(float x);
     59     static native float asin(float x);
     60     static native float asinh(float x);
     61     static native float atan(float x);
     62     static native float atan2(float x, float y);
     63     static native float atanh(float x);
     64     static native float cbrt(float x);
     65     static native float ceil(float x);
     66     static native float cos(float x);
     67     static native float cosh(float x);
     68     static native float erf(float x);
     69     static native float erfc(float x);
     70     static native float exp(float x);
     71     static native float exp10(float x);
     72     static native float exp2(float x);
     73     static native float expm1(float x);
     74     static native float floor(float x);
     75     static native FrexpResult frexp(float x);
     76     static native float hypot(float x, float y);
     77     static native int ilogb(float x);
     78     static native float ldexp(float x, int exp);
     79     static native float lgamma(float x);
     80     static native LgammaResult lgamma2(float x);
     81     static native float log(float x);
     82     static native float logb(float x);
     83     static native float log10(float x);
     84     static native float log1p(float x);
     85     static native float log2(float x);
     86     static native byte maxI8(byte x, byte y);
     87     static native byte maxU8(byte x, byte y);
     88     static native short maxI16(short x, short y);
     89     static native short maxU16(short x, short y);
     90     static native int maxI32(int x, int y);
     91     static native int maxU32(int x, int y);
     92     static native long maxI64(long x, long y);
     93     static native long maxU64(long x, long y);
     94     static native byte minI8(byte x, byte y);
     95     static native byte minU8(byte x, byte y);
     96     static native short minI16(short x, short y);
     97     static native short minU16(short x, short y);
     98     static native int minI32(int x, int y);
     99     static native int minU32(int x, int y);
    100     static native long minI64(long x, long y);
    101     static native long minU64(long x, long y);
    102     static native float pow(float x, float y);
    103     static native RemquoResult remquo(float numerator, float denominator);
    104     static native float rint(float x);
    105     static native float round(float x);
    106     static native float sin(float x);
    107     static native float sinh(float x);
    108     static native float sqrt(float x);
    109     static native float tan(float x);
    110     static native float tanh(float x);
    111     static native float tgamma(float x);
    112     static native float trunc(float x);
    113 
    114     static native byte   convertCharToChar(byte x);
    115     static native byte   convertCharToUchar(byte x);
    116     static native short  convertCharToShort(byte x);
    117     static native short  convertCharToUshort(byte x);
    118     static native int    convertCharToInt(byte x);
    119     static native int    convertCharToUint(byte x);
    120     static native long   convertCharToLong(byte x);
    121     static native long   convertCharToUlong(byte x);
    122     static native float  convertCharToFloat(byte x);
    123     static native double convertCharToDouble(byte x);
    124 
    125     static native byte   convertUcharToChar(byte x);
    126     static native byte   convertUcharToUchar(byte x);
    127     static native short  convertUcharToShort(byte x);
    128     static native short  convertUcharToUshort(byte x);
    129     static native int    convertUcharToInt(byte x);
    130     static native int    convertUcharToUint(byte x);
    131     static native long   convertUcharToLong(byte x);
    132     static native long   convertUcharToUlong(byte x);
    133     static native float  convertUcharToFloat(byte x);
    134     static native double convertUcharToDouble(byte x);
    135 
    136     static native byte   convertShortToChar(short x);
    137     static native byte   convertShortToUchar(short x);
    138     static native short  convertShortToShort(short x);
    139     static native short  convertShortToUshort(short x);
    140     static native int    convertShortToInt(short x);
    141     static native int    convertShortToUint(short x);
    142     static native long   convertShortToLong(short x);
    143     static native long   convertShortToUlong(short x);
    144     static native float  convertShortToFloat(short x);
    145     static native double convertShortToDouble(short x);
    146 
    147     static native byte   convertUshortToChar(short x);
    148     static native byte   convertUshortToUchar(short x);
    149     static native short  convertUshortToShort(short x);
    150     static native short  convertUshortToUshort(short x);
    151     static native int    convertUshortToInt(short x);
    152     static native int    convertUshortToUint(short x);
    153     static native long   convertUshortToLong(short x);
    154     static native long   convertUshortToUlong(short x);
    155     static native float  convertUshortToFloat(short x);
    156     static native double convertUshortToDouble(short x);
    157 
    158     static native byte   convertIntToChar(int x);
    159     static native byte   convertIntToUchar(int x);
    160     static native short  convertIntToShort(int x);
    161     static native short  convertIntToUshort(int x);
    162     static native int    convertIntToInt(int x);
    163     static native int    convertIntToUint(int x);
    164     static native long   convertIntToLong(int x);
    165     static native long   convertIntToUlong(int x);
    166     static native float  convertIntToFloat(int x);
    167     static native double convertIntToDouble(int x);
    168 
    169     static native byte   convertUintToChar(int x);
    170     static native byte   convertUintToUchar(int x);
    171     static native short  convertUintToShort(int x);
    172     static native short  convertUintToUshort(int x);
    173     static native int    convertUintToInt(int x);
    174     static native int    convertUintToUint(int x);
    175     static native long   convertUintToLong(int x);
    176     static native long   convertUintToUlong(int x);
    177     static native float  convertUintToFloat(int x);
    178     static native double convertUintToDouble(int x);
    179 
    180     static native byte   convertLongToChar(long x);
    181     static native byte   convertLongToUchar(long x);
    182     static native short  convertLongToShort(long x);
    183     static native short  convertLongToUshort(long x);
    184     static native int    convertLongToInt(long x);
    185     static native int    convertLongToUint(long x);
    186     static native long   convertLongToLong(long x);
    187     static native long   convertLongToUlong(long x);
    188     static native float  convertLongToFloat(long x);
    189     static native double convertLongToDouble(long x);
    190 
    191     static native byte   convertUlongToChar(long x);
    192     static native byte   convertUlongToUchar(long x);
    193     static native short  convertUlongToShort(long x);
    194     static native short  convertUlongToUshort(long x);
    195     static native int    convertUlongToInt(long x);
    196     static native int    convertUlongToUint(long x);
    197     static native long   convertUlongToLong(long x);
    198     static native long   convertUlongToUlong(long x);
    199     static native float  convertUlongToFloat(long x);
    200     static native double convertUlongToDouble(long x);
    201 
    202     static native byte   convertFloatToChar(float x);
    203     static native byte   convertFloatToUchar(float x);
    204     static native short  convertFloatToShort(float x);
    205     static native short  convertFloatToUshort(float x);
    206     static native int    convertFloatToInt(float x);
    207     static native int    convertFloatToUint(float x);
    208     static native long   convertFloatToLong(float x);
    209     static native long   convertFloatToUlong(float x);
    210     static native float  convertFloatToFloat(float x);
    211     static native double convertFloatToDouble(float x);
    212 
    213     static native byte   convertDoubleToChar(double x);
    214     static native byte   convertDoubleToUchar(double x);
    215     static native short  convertDoubleToShort(double x);
    216     static native short  convertDoubleToUshort(double x);
    217     static native int    convertDoubleToInt(double x);
    218     static native int    convertDoubleToUint(double x);
    219     static native long   convertDoubleToLong(double x);
    220     static native long   convertDoubleToUlong(double x);
    221     static native float  convertDoubleToFloat(double x);
    222     static native double convertDoubleToDouble(double x);
    223 
    224     static private Target.Floaty pi(Target t) {
    225         return t.newFloaty(Math.PI);
    226     }
    227 
    228     static private Target.Floaty pi32(Target t) {
    229         return t.new32((float) Math.PI);
    230     }
    231 
    232     static private Target.Floaty any(Target t) {
    233         return t.newFloaty(Double.NEGATIVE_INFINITY, Double.NaN, Double.POSITIVE_INFINITY);
    234     }
    235 
    236     static private Target.Floaty any32(Target t) {
    237         return t.new32(Float.NEGATIVE_INFINITY, Float.NaN, Float.POSITIVE_INFINITY);
    238     }
    239 
    240     static private Target.Floaty acos(double d, Target t) {
    241         Target.Floaty in = t.newFloaty(d);
    242         return t.newFloaty(
    243             Math.acos(in.mid()),
    244             Math.acos(in.min()),
    245             Math.acos(in.max()));
    246     }
    247 
    248     // TODO Remove this function and similar variants that take a float parameter instead of double.
    249     static private Target.Floaty acos(float f, Target t) {
    250         Target.Floaty in = t.new32(f);
    251         return t.new32(
    252             acos(in.mid32()),
    253             acos(in.min32()),
    254             acos(in.max32()));
    255     }
    256 
    257     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
    258     // double-precision version later.
    259     static private Target.Floaty acosh(double d, Target t) {
    260         Target.Floaty in = t.newFloaty(d);
    261         return t.newFloaty(
    262             acosh((float) in.mid()),
    263             acosh((float) in.min()),
    264             acosh((float) in.max()));
    265     }
    266 
    267     static private Target.Floaty acosh(float f, Target t) {
    268         Target.Floaty in = t.new32(f);
    269         return t.new32(
    270             acosh(in.mid32()),
    271             acosh(in.min32()),
    272             acosh(in.max32()));
    273     }
    274 
    275     static private Target.Floaty acospi(double d, Target t) {
    276         return t.divide(acos(d, t), pi(t));
    277     }
    278 
    279     static private Target.Floaty acospi(float f, Target t) {
    280         return t.divide(acos(f, t), pi32(t));
    281     }
    282 
    283     static private Target.Floaty asin(double d, Target t) {
    284         Target.Floaty in = t.newFloaty(d);
    285         return t.newFloaty(
    286             Math.asin(in.mid()),
    287             Math.asin(in.min()),
    288             Math.asin(in.max()));
    289     }
    290 
    291     static private Target.Floaty asin(float f, Target t) {
    292         Target.Floaty in = t.new32(f);
    293         return t.new32(
    294             asin(in.mid32()),
    295             asin(in.min32()),
    296             asin(in.max32()));
    297     }
    298 
    299     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
    300     // double-precision version later.
    301     static private Target.Floaty asinh(double d, Target t) {
    302         Target.Floaty in = t.newFloaty(d);
    303         return t.newFloaty(
    304             asinh((float) in.mid()),
    305             asinh((float) in.min()),
    306             asinh((float) in.max()));
    307     }
    308 
    309     static private Target.Floaty asinh(float f, Target t) {
    310         Target.Floaty in = t.new32(f);
    311         return t.new32(
    312             asinh(in.mid32()),
    313             asinh(in.min32()),
    314             asinh(in.max32()));
    315     }
    316 
    317     static private Target.Floaty asinpi(double d, Target t) {
    318         return t.divide(asin(d, t), pi(t));
    319     }
    320 
    321     static private Target.Floaty asinpi(float f, Target t) {
    322         return t.divide(asin(f, t), pi32(t));
    323     }
    324 
    325     static private Target.Floaty atan(double d, Target t) {
    326         Target.Floaty in = t.newFloaty(d);
    327         return t.newFloaty(
    328             Math.atan(in.mid()),
    329             Math.atan(in.min()),
    330             Math.atan(in.max()));
    331     }
    332 
    333     static private Target.Floaty atan(float f, Target t) {
    334         Target.Floaty in = t.new32(f);
    335         return t.new32(
    336             atan(in.mid32()),
    337             atan(in.min32()),
    338             atan(in.max32()));
    339     }
    340 
    341     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
    342     // double-precision version later.
    343     static private Target.Floaty atanh(double d, Target t) {
    344         Target.Floaty in = t.newFloaty(d);
    345         return t.newFloaty(
    346             atanh((float) in.mid()),
    347             atanh((float) in.min()),
    348             atanh((float) in.max()));
    349     }
    350 
    351     static private Target.Floaty atanh(float f, Target t) {
    352         Target.Floaty in = t.new32(f);
    353         return t.new32(
    354             atanh(in.mid32()),
    355             atanh(in.min32()),
    356             atanh(in.max32()));
    357     }
    358 
    359     static private Target.Floaty atanpi(double d, Target t) {
    360         return t.divide(atan(d, t), pi(t));
    361     }
    362 
    363     static private Target.Floaty atanpi(float f, Target t) {
    364         return t.divide(atan(f, t), pi32(t));
    365     }
    366 
    367     static private Target.Floaty atan2(double y, double x, Target t) {
    368         Target.Floaty numerator = t.newFloaty(y);
    369         Target.Floaty denominator = t.newFloaty(x);
    370         return t.newFloaty(
    371             Math.atan2(numerator.mid(), denominator.mid()),
    372             Math.atan2(numerator.min(), denominator.min()),
    373             Math.atan2(numerator.min(), denominator.max()),
    374             Math.atan2(numerator.max(), denominator.min()),
    375             Math.atan2(numerator.max(), denominator.max()));
    376     }
    377 
    378     static private Target.Floaty atan2(float y, float x, Target t) {
    379         Target.Floaty numerator = t.new32(y);
    380         Target.Floaty denominator = t.new32(x);
    381         return t.new32(
    382             atan2(numerator.mid32(), denominator.mid32()),
    383             atan2(numerator.min32(), denominator.min32()),
    384             atan2(numerator.min32(), denominator.max32()),
    385             atan2(numerator.max32(), denominator.min32()),
    386             atan2(numerator.max32(), denominator.max32()));
    387     }
    388 
    389     static private Target.Floaty atan2pi(double y, double x, Target t) {
    390         return t.divide(atan2(y, x, t), pi(t));
    391     }
    392 
    393     static private Target.Floaty atan2pi(float y, float x, Target t) {
    394         return t.divide(atan2(y, x, t), pi32(t));
    395     }
    396 
    397     static private Target.Floaty cbrt(double d, Target t) {
    398         Target.Floaty in = t.newFloaty(d);
    399         return t.newFloaty(
    400             Math.cbrt(in.mid()),
    401             Math.cbrt(in.min()),
    402             Math.cbrt(in.max()));
    403     }
    404 
    405     static private Target.Floaty cbrt(float f, Target t) {
    406         Target.Floaty in = t.new32(f);
    407         return t.new32(
    408             cbrt(in.mid32()),
    409             cbrt(in.min32()),
    410             cbrt(in.max32()));
    411     }
    412 
    413     static private Target.Floaty clamp(double value, double minValue, double maxValue, Target t) {
    414         return t.newFloaty(Math.min(maxValue, Math.max(minValue, value)));
    415     }
    416 
    417     static private Target.Floaty copysign(double magnitude, double sign, Target t) {
    418         return t.newFloaty(Math.copySign(magnitude, sign));
    419     }
    420 
    421     static private Target.Floaty cos(double d, Target t) {
    422         Target.Floaty in = t.newFloaty(d);
    423         return t.newFloaty(
    424             Math.cos(in.mid()),
    425             Math.cos(in.min()),
    426             Math.cos(in.max()));
    427     }
    428 
    429     static private Target.Floaty cos(float f, Target t) {
    430         Target.Floaty in = t.new32(f);
    431         return t.new32(
    432             cos(in.mid32()),
    433             cos(in.min32()),
    434             cos(in.max32()));
    435     }
    436 
    437     static private Target.Floaty cosh(double d, Target t) {
    438         Target.Floaty in = t.newFloaty(d);
    439         return t.newFloaty(
    440             Math.cosh(in.mid()),
    441             Math.cosh(in.min()),
    442             Math.cosh(in.max()));
    443     }
    444 
    445     static private Target.Floaty cosh(float f, Target t) {
    446         Target.Floaty in = t.new32(f);
    447         return t.new32(
    448             cosh(in.mid32()),
    449             cosh(in.min32()),
    450             cosh(in.max32()));
    451     }
    452 
    453     static private Target.Floaty cospi(double d, Target t) {
    454         Target.Floaty in = t.multiply(t.newFloaty(d), pi(t));
    455         return t.newFloaty(
    456             Math.cos(in.mid()),
    457             Math.cos(in.min()),
    458             Math.cos(in.max()));
    459     }
    460 
    461     static private Target.Floaty cospi(float f, Target t) {
    462         Target.Floaty in = t.multiply(t.new32(f), pi32(t));
    463         return t.new32(
    464             cos(in.mid32()),
    465             cos(in.min32()),
    466             cos(in.max32()));
    467     }
    468 
    469     // Computes the cross product of two double-precision 3D vectors.
    470     static private void cross(double[] v1, double[] v2, Target.Floaty[] out, Target t) {
    471         Target.Floaty a12 = t.multiply(t.newFloaty(v1[1]), t.newFloaty(v2[2]));
    472         Target.Floaty a21 = t.multiply(t.newFloaty(v1[2]), t.newFloaty(v2[1]));
    473         out[0] = t.subtract(a12, a21);
    474         Target.Floaty a02 = t.multiply(t.newFloaty(v1[0]), t.newFloaty(v2[2]));
    475         Target.Floaty a20 = t.multiply(t.newFloaty(v1[2]), t.newFloaty(v2[0]));
    476         out[1] = t.subtract(a20, a02);
    477         Target.Floaty a01 = t.multiply(t.newFloaty(v1[0]), t.newFloaty(v2[1]));
    478         Target.Floaty a10 = t.multiply(t.newFloaty(v1[1]), t.newFloaty(v2[0]));
    479         out[2] = t.subtract(a01, a10);
    480         if (out.length == 4) {
    481             out[3] = t.newFloaty(0.f);
    482         }
    483     }
    484 
    485     // Computes the cross product of two 3D vectors.
    486     static private void cross(float[] v1, float[] v2, Target.Floaty[] out, Target t) {
    487         Target.Floaty a12 = t.multiply(t.new32(v1[1]), t.new32(v2[2]));
    488         Target.Floaty a21 = t.multiply(t.new32(v1[2]), t.new32(v2[1]));
    489         out[0] = t.subtract(a12, a21);
    490         Target.Floaty a02 = t.multiply(t.new32(v1[0]), t.new32(v2[2]));
    491         Target.Floaty a20 = t.multiply(t.new32(v1[2]), t.new32(v2[0]));
    492         out[1] = t.subtract(a20, a02);
    493         Target.Floaty a01 = t.multiply(t.new32(v1[0]), t.new32(v2[1]));
    494         Target.Floaty a10 = t.multiply(t.new32(v1[1]), t.new32(v2[0]));
    495         out[2] = t.subtract(a01, a10);
    496         if (out.length == 4) {
    497             out[3] = t.new32(0.f);
    498         }
    499     }
    500 
    501     static private Target.Floaty divide(double left, double right, Target t) {
    502         Target.Floaty lFloaty = t.newFloaty(left);
    503         Target.Floaty rFloaty = t.newFloaty(right);
    504         return t.divide(lFloaty, rFloaty);
    505     }
    506 
    507     // Convert a double-precision radian value to degrees.
    508     static private Target.Floaty degrees(double d, Target t) {
    509         Target.Floaty in = t.newFloaty(d);
    510         Target.Floaty k = t.newFloaty(180. / Math.PI);
    511         return t.multiply(in, k);
    512     }
    513 
    514     // Returns the distance between two points (in double-precision) in n-dimensional space.
    515     static private Target.Floaty distance(double[] point1, double[] point2, Target t) {
    516         Target.Floaty sum = t.newFloaty(0.f);
    517         for (int i = 0; i < point1.length; i++) {
    518             Target.Floaty diff = t.subtract(t.newFloaty(point1[i]), t.newFloaty(point2[i]));
    519             sum = t.add(sum, t.multiply(diff, diff));
    520         }
    521         Target.Floaty d = t.sqrt(sum);
    522         return d;
    523     }
    524 
    525     // Returns the distance between two points in n-dimensional space.
    526     static private Target.Floaty distance(float[] point1, float[] point2, Target t) {
    527         Target.Floaty sum = t.new32(0.f);
    528         for (int i = 0; i < point1.length; i++) {
    529             Target.Floaty diff = t.subtract(t.new32(point1[i]), t.new32(point2[i]));
    530             sum = t.add(sum, t.multiply(diff, diff));
    531         }
    532         Target.Floaty d = t.sqrt(sum);
    533         return d;
    534     }
    535 
    536     // Computes the error function for a double-precision input.
    537     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
    538     // double-precision version later.
    539     static private Target.Floaty erf(double d, Target t) {
    540         Target.Floaty in = t.newFloaty(d);
    541         return t.newFloaty(
    542             erf((float) in.mid()),
    543             erf((float) in.min()),
    544             erf((float) in.max()));
    545     }
    546 
    547     // Computes the complementary error function for a double-precision input.
    548     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
    549     // double-precision version later.
    550     static private Target.Floaty erfc(double d, Target t) {
    551         Target.Floaty in = t.newFloaty(d);
    552         return t.newFloaty(
    553             erfc((float) in.mid()),
    554             erfc((float) in.min()),
    555             erfc((float) in.max()));
    556     }
    557 
    558     static private Target.Floaty exp(double d, Target t) {
    559         Target.Floaty in = t.newFloaty(d);
    560         return t.newFloaty(
    561             Math.exp(in.mid()),
    562             Math.exp(in.min()),
    563             Math.exp(in.max()));
    564     }
    565 
    566     static private Target.Floaty exp(float f, Target t) {
    567         Target.Floaty in = t.new32(f);
    568         return t.new32(
    569             exp(in.mid32()),
    570             exp(in.min32()),
    571             exp(in.max32()));
    572     }
    573 
    574     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
    575     // double-precision version later.
    576     static private Target.Floaty exp10(double d, Target t) {
    577         Target.Floaty in = t.newFloaty(d);
    578         return t.newFloaty(
    579             exp10((float) in.mid()),
    580             exp10((float) in.min()),
    581             exp10((float) in.max()));
    582     }
    583 
    584     static private Target.Floaty exp10(float f, Target t) {
    585         Target.Floaty in = t.new32(f);
    586         return t.new32(
    587             exp10(in.mid32()),
    588             exp10(in.min32()),
    589             exp10(in.max32()));
    590     }
    591 
    592     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
    593     // double-precision version later.
    594     static private Target.Floaty exp2(double d, Target t) {
    595         Target.Floaty in = t.newFloaty(d);
    596         return t.newFloaty(
    597             exp2((float) in.mid()),
    598             exp2((float) in.min()),
    599             exp2((float) in.max()));
    600     }
    601 
    602     static private Target.Floaty exp2(float f, Target t) {
    603         Target.Floaty in = t.new32(f);
    604         return t.new32(
    605             exp2(in.mid32()),
    606             exp2(in.min32()),
    607             exp2(in.max32()));
    608     }
    609 
    610     static private Target.Floaty expm1(double d, Target t) {
    611         Target.Floaty in = t.newFloaty(d);
    612         return t.newFloaty(
    613             Math.expm1(in.mid()),
    614             Math.expm1(in.min()),
    615             Math.expm1(in.max()));
    616     }
    617 
    618     static private Target.Floaty expm1(float f, Target t) {
    619         Target.Floaty in = t.new32(f);
    620         return t.new32(
    621             expm1(in.mid32()),
    622             expm1(in.min32()),
    623             expm1(in.max32()));
    624     }
    625 
    626     static private Target.Floaty fabs(double d, Target t) {
    627         Target.Floaty in = t.newFloaty(d);
    628         return t.newFloaty(
    629             Math.abs(in.mid()),
    630             Math.abs(in.min()),
    631             Math.abs(in.max()));
    632     }
    633 
    634     static private Target.Floaty fdim(double a, double b, Target t) {
    635         Target.Floaty inA = t.newFloaty(a);
    636         Target.Floaty inB = t.newFloaty(b);
    637         Target.Floaty r = t.subtract(inA, inB);
    638         return t.newFloaty(
    639             Math.max(0., r.mid()),
    640             Math.max(0., r.min()),
    641             Math.max(0., r.max()));
    642     }
    643 
    644     static private Target.Floaty floor(double d, Target t) {
    645         Target.Floaty in = t.newFloaty(d);
    646         return t.newFloaty(
    647                     Math.floor(in.mid()),
    648                     Math.floor(in.min()),
    649                     Math.floor(in.max()));
    650     }
    651 
    652     static private Target.Floaty fma(double m1, double m2, double offset, Target t) {
    653         Target.Floaty inM1 = t.newFloaty(m1);
    654         Target.Floaty inM2 = t.newFloaty(m2);
    655         Target.Floaty inOffset = t.newFloaty(offset);
    656 
    657         return t.add(t.multiply(inM1, inM2), inOffset);
    658     }
    659 
    660     static private Target.Floaty fmax(double a, double b, Target t) {
    661         return t.newFloaty(Math.max(a, b));
    662     }
    663 
    664     static private Target.Floaty fmin(double a, double b, Target t) {
    665         return t.newFloaty(Math.min(a, b));
    666     }
    667 
    668     static private Target.Floaty fmod(double numerator, double denominator, Target t) {
    669         Target.Floaty inNumerator = t.newFloaty(numerator);
    670         Target.Floaty inDenominator = t.newFloaty(denominator);
    671         return t.newFloaty(
    672             numerator % denominator,
    673             inNumerator.min() % inDenominator.min(),
    674             inNumerator.min() % inDenominator.max(),
    675             inNumerator.max() % inDenominator.min(),
    676             inNumerator.max() % inDenominator.max());
    677     }
    678 
    679     // Compute the fractional part of a double value and returns a result that is at most
    680     // 'fractUpperBound'.
    681     static private Target.Floaty fract(double d, Target t, double fractUpperBound) {
    682         return t.newFloaty(Math.min(
    683             d - Math.floor(d),
    684             fractUpperBound));
    685     }
    686 
    687     static private Target.Floaty hypot(double x, double y, Target t) {
    688         Target.Floaty inX = t.newFloaty(x);
    689         Target.Floaty inY = t.newFloaty(y);
    690         return t.newFloaty(
    691             Math.hypot(inX.mid(), inY.mid()),
    692             Math.hypot(inX.min(), inY.min()),
    693             Math.hypot(inX.min(), inY.max()),
    694             Math.hypot(inX.max(), inY.min()),
    695             Math.hypot(inX.max(), inY.max()));
    696     }
    697 
    698     static private Target.Floaty hypot(float x, float y, Target t) {
    699         Target.Floaty inX = t.new32(x);
    700         Target.Floaty inY = t.new32(y);
    701         return t.new32(
    702             hypot(inX.mid32(), inY.mid32()),
    703             hypot(inX.min32(), inY.min32()),
    704             hypot(inX.min32(), inY.max32()),
    705             hypot(inX.max32(), inY.min32()),
    706             hypot(inX.max32(), inY.max32()));
    707     }
    708 
    709     // Returns the length of an n-dimensional vector (in double-precision).
    710     static private Target.Floaty length(double[] array, Target t) {
    711         Target.Floaty sum = t.newFloaty(0.);
    712         for (int i = 0; i < array.length; i++) {
    713             Target.Floaty f = t.newFloaty(array[i]);
    714             sum = t.add(sum, t.multiply(f, f));
    715         }
    716         return t.sqrt(sum);
    717     }
    718 
    719     // Returns the length of the n-dimensional vector.
    720     static private Target.Floaty length(float[] array, Target t) {
    721         Target.Floaty sum = t.new32(0.f);
    722         for (int i = 0; i < array.length; i++) {
    723             Target.Floaty f = t.new32(array[i]);
    724             sum = t.add(sum, t.multiply(f, f));
    725         }
    726         Target.Floaty l = t.sqrt(sum);
    727         return l;
    728     }
    729 
    730     static private Target.Floaty log(double d, Target t) {
    731         Target.Floaty in = t.newFloaty(d);
    732         return t.newFloaty(
    733             Math.log(in.mid()),
    734             Math.log(in.min()),
    735             Math.log(in.max()));
    736     }
    737 
    738     static private Target.Floaty log(float f, Target t) {
    739         Target.Floaty in = t.new32(f);
    740         return t.new32(
    741             log(in.mid32()),
    742             log(in.min32()),
    743             log(in.max32()));
    744     }
    745 
    746     static private Target.Floaty log10(double d, Target t) {
    747         Target.Floaty in = t.newFloaty(d);
    748         return t.newFloaty(
    749             Math.log10(in.mid()),
    750             Math.log10(in.min()),
    751             Math.log10(in.max()));
    752     }
    753 
    754     static private Target.Floaty log10(float f, Target t) {
    755         Target.Floaty in = t.new32(f);
    756         return t.new32(
    757             log10(in.mid32()),
    758             log10(in.min32()),
    759             log10(in.max32()));
    760     }
    761 
    762     static private Target.Floaty log1p(double d, Target t) {
    763         Target.Floaty in = t.newFloaty(d);
    764         return t.newFloaty(
    765             Math.log1p(in.mid()),
    766             Math.log1p(in.min()),
    767             Math.log1p(in.max()));
    768     }
    769 
    770     static private Target.Floaty log1p(float f, Target t) {
    771         Target.Floaty in = t.new32(f);
    772         return t.new32(
    773             log1p(in.mid32()),
    774             log1p(in.min32()),
    775             log1p(in.max32()));
    776     }
    777 
    778     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
    779     // double-precision version later.
    780     static private Target.Floaty log2(double d, Target t) {
    781         Target.Floaty in = t.newFloaty(d);
    782         return t.newFloaty(
    783             log2((float) in.mid()),
    784             log2((float) in.min()),
    785             log2((float) in.max()));
    786     }
    787 
    788     static private Target.Floaty log2(float f, Target t) {
    789         Target.Floaty in = t.new32(f);
    790         return t.new32(
    791             log2(in.mid32()),
    792             log2(in.min32()),
    793             log2(in.max32()));
    794     }
    795 
    796     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
    797     // double-precision version later.
    798     static private Target.Floaty logb(double d, Target t) {
    799         Target.Floaty in = t.newFloaty(d);
    800         return t.newFloaty(
    801             logb((float) in.mid()),
    802             logb((float) in.min()),
    803             logb((float) in.max()));
    804     }
    805 
    806     static private Target.Floaty mad(double m1, double m2, double offset, Target t) {
    807         Target.Floaty ab = t.multiply(t.newFloaty(m1), t.newFloaty(m2));
    808         return t.add(ab, t.newFloaty(offset));
    809     }
    810 
    811     static private Target.Floaty max(double a, double b, Target t) {
    812         return t.newFloaty(Math.max(a, b));
    813     }
    814 
    815     static private Target.Floaty min(double a, double b, Target t) {
    816         return t.newFloaty(Math.min(a, b));
    817     }
    818 
    819     static private Target.Floaty mix(double start, double stop, double fraction, Target t) {
    820         Target.Floaty inStart = t.newFloaty(start);
    821         Target.Floaty inStop = t.newFloaty(stop);
    822         Target.Floaty inFraction = t.newFloaty(fraction);
    823 
    824         Target.Floaty diff = t.subtract(inStop, inStart);
    825         return t.add(inStart, t.multiply(diff, inFraction));
    826     }
    827 
    828     // Normalizes the double-precision n-dimensional vector, i.e. makes it length 1.
    829     static private void normalize(double[] in, Target.Floaty[] out, Target t) {
    830         Target.Floaty l = length(in, t);
    831         boolean isZero = l.get() == 0.;
    832         for (int i = 0; i < in.length; i++) {
    833             out[i] = t.newFloaty(in[i]);
    834             if (!isZero) {
    835                 out[i] = t.divide(out[i], l);
    836             }
    837         }
    838     }
    839 
    840     // Normalizes the n-dimensional vector, i.e. makes it length 1.
    841     static private void normalize(float[] in, Target.Floaty[] out, Target t) {
    842         Target.Floaty l = length(in, t);
    843         boolean isZero = l.get32() == 0.f;
    844         for (int i = 0; i < in.length; i++) {
    845             out[i] = t.new32(in[i]);
    846             if (!isZero) {
    847                 out[i] = t.divide(out[i], l);
    848             }
    849         }
    850     }
    851 
    852     static private Target.Floaty pow(double x, double y, Target t) {
    853         Target.Floaty base = t.newFloaty(x);
    854         Target.Floaty exponent = t.newFloaty(y);
    855         return t.newFloaty(
    856             Math.pow(base.mid(), exponent.mid()),
    857             Math.pow(base.min(), exponent.min()),
    858             Math.pow(base.min(), exponent.max()),
    859             Math.pow(base.max(), exponent.min()),
    860             Math.pow(base.max(), exponent.max()));
    861     }
    862 
    863     static private Target.Floaty powr(float x, float y, Target t) {
    864         Target.Floaty base = t.new32(x);
    865         Target.Floaty exponent = t.new32(y);
    866         return t.new32(
    867             pow(base.mid32(), exponent.mid32()),
    868             pow(base.min32(), exponent.min32()),
    869             pow(base.min32(), exponent.max32()),
    870             pow(base.max32(), exponent.min32()),
    871             pow(base.max32(), exponent.max32()));
    872     }
    873 
    874     static private Target.Floaty radians(double d, Target t) {
    875         Target.Floaty in = t.newFloaty(d);
    876         Target.Floaty k = t.newFloaty(Math.PI / 180);
    877         return t.multiply(in, k);
    878     }
    879 
    880     static private Target.Floaty recip(double d, Target t) {
    881         Target.Floaty in = t.newFloaty(d);
    882         return t.divide(t.newFloaty(1.), in);
    883     }
    884 
    885     static private Target.Floaty recip(float f, Target t) {
    886         Target.Floaty in = t.new32(f);
    887         return t.divide(t.new32(1.f), in);
    888     }
    889 
    890     static private Target.Floaty rint(double d, Target t) {
    891         Target.Floaty in = t.newFloaty(d);
    892         return t.newFloaty(
    893             Math.rint(in.mid()),
    894             Math.rint(in.min()),
    895             Math.rint(in.max()));
    896     }
    897 
    898     static private Target.Floaty rootn(float inV, int inN, Target t) {
    899         /* Rootn of a negative number should be possible only if the number
    900          * is odd.  In cases where the int is very large, our approach will
    901          * lose whether the int is odd, and we'll get a NaN for weird cases
    902          * like rootn(-3.95, 818181881), which should return 1.  We handle the
    903          * case by handling the sign ourselves.  We use copysign to handle the
    904          * negative zero case.
    905          */
    906         float value;
    907         if ((inN & 0x1) == 0x1) {
    908             value = Math.copySign(pow(Math.abs(inV), 1.f / inN),
    909                     inV);
    910         } else {
    911             value = pow(inV, 1.f / inN);
    912         }
    913         if (inN == 0) {
    914             return t.new32(value, Float.NaN);
    915         } else {
    916             return t.new32(value);
    917         }
    918     }
    919 
    920     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
    921     // double-precision version later.
    922     //
    923     // Also, use native round() instead of Math.round() as the latter has different rounding
    924     // behavior in case of ties.
    925     static private Target.Floaty round(double d, Target t) {
    926         Target.Floaty in = t.newFloaty(d);
    927         return t.newFloaty(
    928             round((float) in.mid()),
    929             round((float) in.min()),
    930             round((float) in.max()));
    931     }
    932 
    933     static private Target.Floaty rsqrt(double d, Target t) {
    934         Target.Floaty in = t.newFloaty(d);
    935         return t.divide(t.newFloaty(1.), t.sqrt(in));
    936     }
    937 
    938     static private Target.Floaty rsqrt(float f, Target t) {
    939         Target.Floaty in = t.new32(f);
    940         return t.divide(t.new32(1.f), t.sqrt(in));
    941     }
    942 
    943     static private Target.Floaty sin(double d, Target t) {
    944         Target.Floaty in = t.newFloaty(d);
    945         return t.newFloaty(
    946             Math.sin(in.mid()),
    947             Math.sin(in.min()),
    948             Math.sin(in.max()));
    949     }
    950 
    951     static private Target.Floaty sin(float f, Target t) {
    952         Target.Floaty in = t.new32(f);
    953         return t.new32(
    954             sin(in.mid32()),
    955             sin(in.min32()),
    956             sin(in.max32()));
    957     }
    958 
    959     static private Target.Floaty sinh(double d, Target t) {
    960         Target.Floaty in = t.newFloaty(d);
    961         return t.newFloaty(
    962             Math.sinh(in.mid()),
    963             Math.sinh(in.min()),
    964             Math.sinh(in.max()));
    965     }
    966 
    967     static private Target.Floaty sinh(float f, Target t) {
    968         Target.Floaty in = t.new32(f);
    969         return t.new32(
    970             sinh(in.mid32()),
    971             sinh(in.min32()),
    972             sinh(in.max32()));
    973     }
    974 
    975     static private Target.Floaty sinpi(double d, Target t) {
    976         Target.Floaty in = t.multiply(t.newFloaty(d), pi(t));
    977         return t.newFloaty(
    978             Math.sin(in.mid()),
    979             Math.sin(in.min()),
    980             Math.sin(in.max()));
    981     }
    982 
    983     static private Target.Floaty sinpi(float f, Target t) {
    984         Target.Floaty in = t.multiply(t.new32(f), pi32(t));
    985         return t.new32(
    986             sin(in.mid32()),
    987             sin(in.min32()),
    988             sin(in.max32()));
    989     }
    990 
    991     static private Target.Floaty sqrt(double d, Target t) {
    992         Target.Floaty in = t.newFloaty(d);
    993         return t.sqrt(in);
    994     }
    995 
    996     static private Target.Floaty sqrt(float f, Target t) {
    997         Target.Floaty in = t.new32(f);
    998         return t.sqrt(in);
    999     }
   1000 
   1001     static private Target.Floaty step(double v, double edge, Target t) {
   1002         return t.newFloaty(v < edge ? 0.f : 1.f);
   1003     }
   1004 
   1005     static private Target.Floaty tan(double d, Target t) {
   1006         Target.Floaty in = t.newFloaty(d);
   1007         double min = Math.tan(in.min());
   1008         double max = Math.tan(in.max());
   1009         /* If difference between in.max() and in.min() is larger than PI or if the tan of the min is
   1010          * greater than that of the max, we spanned a discontinuity.
   1011          */
   1012         if (in.max() - in.min() > Math.PI || min > max) {
   1013             return any(t);
   1014         } else {
   1015             return t.newFloaty(Math.tan(d), min, max);
   1016         }
   1017     }
   1018 
   1019     static private Target.Floaty tan(float f, Target t) {
   1020         Target.Floaty in = t.new32(f);
   1021         float min = tan(in.min32());
   1022         float max = tan(in.max32());
   1023         /* If difference between in.max() and in.min() is larger than PI or if the tan of the min is
   1024          * greater than that of the max, we spanned a discontinuity.
   1025          */
   1026         if (in.max() - in.min() > Math.PI || min > max) {
   1027             return any32(t);
   1028         } else {
   1029             return t.new32(tan(f), min, max);
   1030         }
   1031     }
   1032 
   1033     static private Target.Floaty tanh(double d, Target t) {
   1034         Target.Floaty in = t.newFloaty(d);
   1035         return t.newFloaty(
   1036             Math.tanh(in.mid()),
   1037             Math.tanh(in.min()),
   1038             Math.tanh(in.max()));
   1039     }
   1040 
   1041     static private Target.Floaty tanh(float f, Target t) {
   1042         Target.Floaty in = t.new32(f);
   1043         return t.new32(
   1044             tanh(in.mid32()),
   1045             tanh(in.min32()),
   1046             tanh(in.max32()));
   1047     }
   1048 
   1049     static private Target.Floaty tanpi(double d, Target t) {
   1050         Target.Floaty in = t.multiply(t.newFloaty(d), pi(t));
   1051         double min = Math.tan(in.min());
   1052         double max = Math.tan(in.max());
   1053 
   1054         /* If difference between in.max() and in.min() is larger than PI or if the tan of the min is
   1055          * greater than that of the max, we spanned a discontinuity.
   1056          */
   1057         if (in.max() - in.min() > Math.PI || min > max) {
   1058             return any(t);
   1059         } else {
   1060             return t.newFloaty(Math.tan(in.mid()), min, max);
   1061         }
   1062     }
   1063 
   1064     static private Target.Floaty tanpi(float f, Target t) {
   1065         Target.Floaty in = t.multiply(t.new32(f), pi32(t));
   1066         float min = tan(in.min32());
   1067         float max = tan(in.max32());
   1068         /* If difference between in.max() and in.min() is larger than PI or if the tan of the min is
   1069          * greater than that of the max, we spanned a discontinuity.
   1070          */
   1071         if (in.max() - in.min() > Math.PI || min > max) {
   1072             return any32(t);
   1073         } else {
   1074             return t.new32(tan(in.mid32()), min, max);
   1075         }
   1076     }
   1077 
   1078     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
   1079     // double-precision version later.
   1080     static private Target.Floaty tgamma(double d, Target t) {
   1081         Target.Floaty in = t.newFloaty(d);
   1082         return t.newFloaty(
   1083             tgamma((float) in.mid()),
   1084             tgamma((float) in.min()),
   1085             tgamma((float) in.max()));
   1086     }
   1087 
   1088     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
   1089     // double-precision version later.
   1090     static private Target.Floaty trunc(double d, Target t) {
   1091         Target.Floaty in = t.newFloaty(d);
   1092         return t.newFloaty(
   1093             trunc((float) in.mid()),
   1094             trunc((float) in.min()),
   1095             trunc((float) in.max()));
   1096     }
   1097 
   1098     static public void computeAbs(TestAbs.ArgumentsCharUchar args) {
   1099         args.out = (byte)Math.abs(args.inV);
   1100     }
   1101 
   1102     static public void computeAbs(TestAbs.ArgumentsShortUshort args) {
   1103         args.out = (short)Math.abs(args.inV);
   1104     }
   1105 
   1106     static public void computeAbs(TestAbs.ArgumentsIntUint args) {
   1107         args.out = Math.abs(args.inV);
   1108     }
   1109 
   1110     static public void computeAcos(TestAcos.ArgumentsHalfHalf args, Target t) {
   1111         t.setPrecision(4, 4);
   1112         args.out = acos(args.inVDouble, t);
   1113     }
   1114 
   1115     static public void computeAcos(TestAcos.ArgumentsFloatFloat args, Target t) {
   1116         t.setPrecision(4, 128);
   1117         args.out = acos(args.inV, t);
   1118     }
   1119 
   1120     static public void computeAcosh(TestAcosh.ArgumentsHalfHalf args, Target t) {
   1121         t.setPrecision(4, 4);
   1122         args.out = acosh(args.inVDouble, t);
   1123     }
   1124 
   1125     static public void computeAcosh(TestAcosh.ArgumentsFloatFloat args, Target t) {
   1126         t.setPrecision(4, 128);
   1127         args.out = acosh(args.inV, t);
   1128     }
   1129 
   1130     static public void computeAcospi(TestAcospi.ArgumentsHalfHalf args, Target t) {
   1131         t.setPrecision(5, 5);
   1132         args.out = acospi(args.inVDouble, t);
   1133     }
   1134 
   1135     static public void computeAcospi(TestAcospi.ArgumentsFloatFloat args, Target t) {
   1136         t.setPrecision(5, 128);
   1137         args.out = acospi(args.inV, t);
   1138     }
   1139 
   1140     static public void computeAsin(TestAsin.ArgumentsHalfHalf args, Target t) {
   1141         t.setPrecision(4, 4);
   1142         args.out = asin(args.inVDouble, t);
   1143     }
   1144 
   1145     static public void computeAsin(TestAsin.ArgumentsFloatFloat args, Target t) {
   1146         t.setPrecision(4, 128);
   1147         args.out = asin(args.inV, t);
   1148     }
   1149 
   1150     static public void computeAsinh(TestAsinh.ArgumentsHalfHalf args, Target t) {
   1151         t.setPrecision(4, 4);
   1152         args.out = asinh(args.inVDouble, t);
   1153     }
   1154 
   1155     static public void computeAsinh(TestAsinh.ArgumentsFloatFloat args, Target t) {
   1156         t.setPrecision(4, 128);
   1157         args.out = asinh(args.inV, t);
   1158     }
   1159 
   1160     static public void computeAsinpi(TestAsinpi.ArgumentsHalfHalf args, Target t) {
   1161         t.setPrecision(5, 5);
   1162         args.out = asinpi(args.inVDouble, t);
   1163     }
   1164 
   1165     static public void computeAsinpi(TestAsinpi.ArgumentsFloatFloat args, Target t) {
   1166         t.setPrecision(5, 128);
   1167         args.out = asinpi(args.inV, t);
   1168     }
   1169 
   1170     static public void computeAtan(TestAtan.ArgumentsHalfHalf args, Target t) {
   1171         t.setPrecision(5, 5);
   1172         args.out = atan(args.inVDouble, t);
   1173     }
   1174 
   1175     static public void computeAtan(TestAtan.ArgumentsFloatFloat args, Target t) {
   1176         t.setPrecision(5, 128);
   1177         args.out = atan(args.inV, t);
   1178     }
   1179 
   1180     static public void computeAtanh(TestAtanh.ArgumentsHalfHalf args, Target t) {
   1181         t.setPrecision(5, 5);
   1182         args.out = atanh(args.inVDouble, t);
   1183     }
   1184 
   1185     static public void computeAtanh(TestAtanh.ArgumentsFloatFloat args, Target t) {
   1186         t.setPrecision(5, 128);
   1187         args.out = atanh(args.inV, t);
   1188     }
   1189 
   1190     static public void computeAtanpi(TestAtanpi.ArgumentsHalfHalf args, Target t) {
   1191         t.setPrecision(5, 5);
   1192         args.out = atanpi(args.inVDouble, t);
   1193     }
   1194 
   1195     static public void computeAtanpi(TestAtanpi.ArgumentsFloatFloat args, Target t) {
   1196         t.setPrecision(5, 128);
   1197         args.out = atanpi(args.inV, t);
   1198     }
   1199 
   1200     static public void computeAtan2(TestAtan2.ArgumentsHalfHalfHalf args, Target t) {
   1201         t.setPrecision(6, 6);
   1202         args.out = atan2(args.inNumeratorDouble, args.inDenominatorDouble, t);
   1203     }
   1204 
   1205     static public void computeAtan2(TestAtan2.ArgumentsFloatFloatFloat args, Target t) {
   1206         t.setPrecision(6, 128);
   1207         args.out = atan2(args.inNumerator, args.inDenominator, t);
   1208     }
   1209 
   1210     static public void computeAtan2pi(TestAtan2pi.ArgumentsHalfHalfHalf args, Target t) {
   1211         t.setPrecision(6, 6);
   1212         args.out = atan2pi(args.inNumeratorDouble, args.inDenominatorDouble, t);
   1213     }
   1214 
   1215     static public void computeAtan2pi(TestAtan2pi.ArgumentsFloatFloatFloat args, Target t) {
   1216         t.setPrecision(6, 128);
   1217         args.out = atan2pi(args.inNumerator, args.inDenominator, t);
   1218     }
   1219 
   1220     static public void computeCbrt(TestCbrt.ArgumentsHalfHalf args, Target t) {
   1221         t.setPrecision(2, 2);
   1222         args.out = cbrt(args.inVDouble, t);
   1223     }
   1224 
   1225     static public void computeCbrt(TestCbrt.ArgumentsFloatFloat args, Target t) {
   1226         t.setPrecision(2, 128);
   1227         args.out = cbrt(args.inV, t);
   1228     }
   1229 
   1230     static public void computeCeil(TestCeil.ArgumentsHalfHalf args, Target t) {
   1231         t.setPrecision(0, 0);
   1232         Target.Floaty in = t.newFloaty(args.inVDouble);
   1233         args.out = t.newFloaty(
   1234             Math.ceil(in.mid()),
   1235             Math.ceil(in.min()),
   1236             Math.ceil(in.max()));
   1237     }
   1238 
   1239     static public void computeCeil(TestCeil.ArgumentsFloatFloat args, Target t) {
   1240         t.setPrecision(0, 1);
   1241         Target.Floaty in = t.new32(args.inV);
   1242         args.out = t.new32(
   1243             ceil(in.mid32()),
   1244             ceil(in.min32()),
   1245             ceil(in.max32()));
   1246     }
   1247 
   1248     static public void computeClamp(TestClamp.ArgumentsCharCharCharChar args) {
   1249         args.out = minI8(args.inMaxValue, maxI8(args.inValue, args.inMinValue));
   1250     }
   1251 
   1252     static public void computeClamp(TestClamp.ArgumentsUcharUcharUcharUchar args) {
   1253         args.out = minU8(args.inMaxValue, maxU8(args.inValue, args.inMinValue));
   1254     }
   1255 
   1256     static public void computeClamp(TestClamp.ArgumentsShortShortShortShort args) {
   1257         args.out = minI16(args.inMaxValue, maxI16(args.inValue, args.inMinValue));
   1258     }
   1259 
   1260     static public void computeClamp(TestClamp.ArgumentsUshortUshortUshortUshort args) {
   1261         args.out = minU16(args.inMaxValue, maxU16(args.inValue, args.inMinValue));
   1262     }
   1263 
   1264     static public void computeClamp(TestClamp.ArgumentsIntIntIntInt args) {
   1265         args.out = minI32(args.inMaxValue, maxI32(args.inValue, args.inMinValue));
   1266     }
   1267 
   1268     static public void computeClamp(TestClamp.ArgumentsUintUintUintUint args) {
   1269         args.out = minU32(args.inMaxValue, maxU32(args.inValue, args.inMinValue));
   1270     }
   1271 
   1272     static public void computeClamp(TestClamp.ArgumentsHalfHalfHalfHalf args, Target t) {
   1273         t.setPrecision(0, 0);
   1274         args.out = clamp(args.inValueDouble, args.inMinValueDouble, args.inMaxValueDouble, t);
   1275     }
   1276 
   1277     static public void computeClamp(TestClamp.ArgumentsFloatFloatFloatFloat args, Target t) {
   1278         t.setPrecision(0, 0);
   1279         args.out = t.new32(Math.min(args.inMaxValue,
   1280                         Math.max(args.inValue, args.inMinValue)));
   1281     }
   1282 
   1283     static public void computeClamp(TestClamp.ArgumentsLongLongLongLong args) {
   1284         args.out = minI64(args.inMaxValue, maxI64(args.inValue, args.inMinValue));
   1285     }
   1286 
   1287     static public void computeClamp(TestClamp.ArgumentsUlongUlongUlongUlong args) {
   1288         args.out = minU64(args.inMaxValue, maxU64(args.inValue, args.inMinValue));
   1289     }
   1290 
   1291     static public void computeClz(TestClz.ArgumentsCharChar args) {
   1292         int x = args.inValue;
   1293         args.out = (byte) (Integer.numberOfLeadingZeros(x & 0xff) - 24);
   1294     }
   1295 
   1296     static public void computeClz(TestClz.ArgumentsUcharUchar args) {
   1297         int x = args.inValue;
   1298         args.out = (byte) (Integer.numberOfLeadingZeros(x & 0xff) - 24);
   1299     }
   1300 
   1301     static public void computeClz(TestClz.ArgumentsShortShort args) {
   1302         args.out = (short) (Integer.numberOfLeadingZeros(args.inValue & 0xffff) - 16);
   1303     }
   1304 
   1305     static public void computeClz(TestClz.ArgumentsUshortUshort args) {
   1306         args.out = (short) (Integer.numberOfLeadingZeros(args.inValue & 0xffff) - 16);
   1307     }
   1308 
   1309     static public void computeClz(TestClz.ArgumentsIntInt args) {
   1310         args.out = (int) Integer.numberOfLeadingZeros(args.inValue);
   1311     }
   1312 
   1313     static public void computeClz(TestClz.ArgumentsUintUint args) {
   1314         args.out = (int) Integer.numberOfLeadingZeros(args.inValue);
   1315     }
   1316 
   1317 
   1318     static public void computeConvert(TestConvert.ArgumentsCharChar args) {
   1319         args.out = convertCharToChar(args.inV);
   1320     }
   1321     static public void computeConvert(TestConvert.ArgumentsCharUchar args) {
   1322         args.out = convertCharToUchar(args.inV);
   1323     }
   1324     static public void computeConvert(TestConvert.ArgumentsCharShort args) {
   1325         args.out = convertCharToShort(args.inV);
   1326     }
   1327     static public void computeConvert(TestConvert.ArgumentsCharUshort args) {
   1328         args.out = convertCharToUshort(args.inV);
   1329     }
   1330     static public void computeConvert(TestConvert.ArgumentsCharInt args) {
   1331         args.out = convertCharToInt(args.inV);
   1332     }
   1333     static public void computeConvert(TestConvert.ArgumentsCharUint args) {
   1334         args.out = convertCharToUint(args.inV);
   1335     }
   1336     static public void computeConvert(TestConvert.ArgumentsCharLong args) {
   1337         args.out = convertCharToLong(args.inV);
   1338     }
   1339     static public void computeConvert(TestConvert.ArgumentsCharUlong args) {
   1340         args.out = convertCharToUlong(args.inV);
   1341     }
   1342     static public void computeConvert(TestConvert.ArgumentsCharHalf args, Target t) {
   1343         t.setPrecision(0, 0);
   1344         args.out = t.newFloaty(convertCharToDouble(args.inV));
   1345     }
   1346     static public void computeConvert(TestConvert.ArgumentsCharFloat args, Target t) {
   1347         t.setPrecision(0, 0);
   1348         args.out = t.new32(convertCharToFloat(args.inV));
   1349     }
   1350     static public void computeConvert(TestConvert.ArgumentsCharDouble args, Target t) {
   1351         t.setPrecision(0, 0);
   1352         args.out = t.new64(convertCharToDouble(args.inV));
   1353     }
   1354 
   1355     static public void computeConvert(TestConvert.ArgumentsUcharChar args) {
   1356         args.out = convertUcharToChar(args.inV);
   1357     }
   1358     static public void computeConvert(TestConvert.ArgumentsUcharUchar args) {
   1359         args.out = convertUcharToUchar(args.inV);
   1360     }
   1361     static public void computeConvert(TestConvert.ArgumentsUcharShort args) {
   1362         args.out = convertUcharToShort(args.inV);
   1363     }
   1364     static public void computeConvert(TestConvert.ArgumentsUcharUshort args) {
   1365         args.out = convertUcharToUshort(args.inV);
   1366     }
   1367     static public void computeConvert(TestConvert.ArgumentsUcharInt args) {
   1368         args.out = convertUcharToInt(args.inV);
   1369     }
   1370     static public void computeConvert(TestConvert.ArgumentsUcharUint args) {
   1371         args.out = convertUcharToUint(args.inV);
   1372     }
   1373     static public void computeConvert(TestConvert.ArgumentsUcharLong args) {
   1374         args.out = convertUcharToLong(args.inV);
   1375     }
   1376     static public void computeConvert(TestConvert.ArgumentsUcharUlong args) {
   1377         args.out = convertUcharToUlong(args.inV);
   1378     }
   1379     static public void computeConvert(TestConvert.ArgumentsUcharHalf args, Target t) {
   1380         t.setPrecision(0, 0);
   1381         args.out = t.newFloaty(convertUcharToDouble(args.inV));
   1382     }
   1383     static public void computeConvert(TestConvert.ArgumentsUcharFloat args, Target t) {
   1384         t.setPrecision(0, 0);
   1385         args.out = t.new32(convertUcharToFloat(args.inV));
   1386     }
   1387     static public void computeConvert(TestConvert.ArgumentsUcharDouble args, Target t) {
   1388         t.setPrecision(0, 0);
   1389         args.out = t.new64(convertUcharToDouble(args.inV));
   1390     }
   1391 
   1392     static public void computeConvert(TestConvert.ArgumentsShortChar args) {
   1393         args.out = convertShortToChar(args.inV);
   1394     }
   1395     static public void computeConvert(TestConvert.ArgumentsShortUchar args) {
   1396         args.out = convertShortToUchar(args.inV);
   1397     }
   1398     static public void computeConvert(TestConvert.ArgumentsShortShort args) {
   1399         args.out = convertShortToShort(args.inV);
   1400     }
   1401     static public void computeConvert(TestConvert.ArgumentsShortUshort args) {
   1402         args.out = convertShortToUshort(args.inV);
   1403     }
   1404     static public void computeConvert(TestConvert.ArgumentsShortInt args) {
   1405         args.out = convertShortToInt(args.inV);
   1406     }
   1407     static public void computeConvert(TestConvert.ArgumentsShortUint args) {
   1408         args.out = convertShortToUint(args.inV);
   1409     }
   1410     static public void computeConvert(TestConvert.ArgumentsShortLong args) {
   1411         args.out = convertShortToLong(args.inV);
   1412     }
   1413     static public void computeConvert(TestConvert.ArgumentsShortUlong args) {
   1414         args.out = convertShortToUlong(args.inV);
   1415     }
   1416     static public void computeConvert(TestConvert.ArgumentsShortHalf args, Target t) {
   1417         t.setPrecision(1, 1);
   1418         args.out = t.newFloaty(convertShortToDouble(args.inV));
   1419     }
   1420     static public void computeConvert(TestConvert.ArgumentsShortFloat args, Target t) {
   1421         t.setPrecision(0, 0);
   1422         args.out = t.new32(convertShortToFloat(args.inV));
   1423     }
   1424     static public void computeConvert(TestConvert.ArgumentsShortDouble args, Target t) {
   1425         t.setPrecision(0, 0);
   1426         args.out = t.new64(convertShortToDouble(args.inV));
   1427     }
   1428 
   1429     static public void computeConvert(TestConvert.ArgumentsUshortChar args) {
   1430         args.out = convertUshortToChar(args.inV);
   1431     }
   1432     static public void computeConvert(TestConvert.ArgumentsUshortUchar args) {
   1433         args.out = convertUshortToUchar(args.inV);
   1434     }
   1435     static public void computeConvert(TestConvert.ArgumentsUshortShort args) {
   1436         args.out = convertUshortToShort(args.inV);
   1437     }
   1438     static public void computeConvert(TestConvert.ArgumentsUshortUshort args) {
   1439         args.out = convertUshortToUshort(args.inV);
   1440     }
   1441     static public void computeConvert(TestConvert.ArgumentsUshortInt args) {
   1442         args.out = convertUshortToInt(args.inV);
   1443     }
   1444     static public void computeConvert(TestConvert.ArgumentsUshortUint args) {
   1445         args.out = convertUshortToUint(args.inV);
   1446     }
   1447     static public void computeConvert(TestConvert.ArgumentsUshortLong args) {
   1448         args.out = convertUshortToLong(args.inV);
   1449     }
   1450     static public void computeConvert(TestConvert.ArgumentsUshortUlong args) {
   1451         args.out = convertUshortToUlong(args.inV);
   1452     }
   1453     static public void computeConvert(TestConvert.ArgumentsUshortHalf args, Target t) {
   1454         t.setPrecision(1, 1);
   1455         args.out = t.newFloaty(convertUshortToDouble(args.inV));
   1456     }
   1457     static public void computeConvert(TestConvert.ArgumentsUshortFloat args, Target t) {
   1458         t.setPrecision(0, 0);
   1459         args.out = t.new32(convertUshortToFloat(args.inV));
   1460     }
   1461     static public void computeConvert(TestConvert.ArgumentsUshortDouble args, Target t) {
   1462         t.setPrecision(0, 0);
   1463         args.out = t.new64(convertUshortToDouble(args.inV));
   1464     }
   1465 
   1466     static public void computeConvert(TestConvert.ArgumentsIntChar args) {
   1467         args.out = convertIntToChar(args.inV);
   1468     }
   1469     static public void computeConvert(TestConvert.ArgumentsIntUchar args) {
   1470         args.out = convertIntToUchar(args.inV);
   1471     }
   1472     static public void computeConvert(TestConvert.ArgumentsIntShort args) {
   1473         args.out = convertIntToShort(args.inV);
   1474     }
   1475     static public void computeConvert(TestConvert.ArgumentsIntUshort args) {
   1476         args.out = convertIntToUshort(args.inV);
   1477     }
   1478     static public void computeConvert(TestConvert.ArgumentsIntInt args) {
   1479         args.out = convertIntToInt(args.inV);
   1480     }
   1481     static public void computeConvert(TestConvert.ArgumentsIntUint args) {
   1482         args.out = convertIntToUint(args.inV);
   1483     }
   1484     static public void computeConvert(TestConvert.ArgumentsIntLong args) {
   1485         args.out = convertIntToLong(args.inV);
   1486     }
   1487     static public void computeConvert(TestConvert.ArgumentsIntUlong args) {
   1488         args.out = convertIntToUlong(args.inV);
   1489     }
   1490     static public void computeConvert(TestConvert.ArgumentsIntHalf args, Target t) {
   1491         t.setPrecision(1, 1);
   1492         args.out = t.newFloaty(convertIntToDouble(args.inV));
   1493     }
   1494     static public void computeConvert(TestConvert.ArgumentsIntFloat args, Target t) {
   1495         t.setPrecision(1, 1);
   1496         args.out = t.new32(convertIntToFloat(args.inV));
   1497     }
   1498     static public void computeConvert(TestConvert.ArgumentsIntDouble args, Target t) {
   1499         t.setPrecision(0, 0);
   1500         args.out = t.new64(convertIntToDouble(args.inV));
   1501     }
   1502 
   1503     static public void computeConvert(TestConvert.ArgumentsUintChar args) {
   1504         args.out = convertUintToChar(args.inV);
   1505     }
   1506     static public void computeConvert(TestConvert.ArgumentsUintUchar args) {
   1507         args.out = convertUintToUchar(args.inV);
   1508     }
   1509     static public void computeConvert(TestConvert.ArgumentsUintShort args) {
   1510         args.out = convertUintToShort(args.inV);
   1511     }
   1512     static public void computeConvert(TestConvert.ArgumentsUintUshort args) {
   1513         args.out = convertUintToUshort(args.inV);
   1514     }
   1515     static public void computeConvert(TestConvert.ArgumentsUintInt args) {
   1516         args.out = convertUintToInt(args.inV);
   1517     }
   1518     static public void computeConvert(TestConvert.ArgumentsUintUint args) {
   1519         args.out = convertUintToUint(args.inV);
   1520     }
   1521     static public void computeConvert(TestConvert.ArgumentsUintLong args) {
   1522         args.out = convertUintToLong(args.inV);
   1523     }
   1524     static public void computeConvert(TestConvert.ArgumentsUintUlong args) {
   1525         args.out = convertUintToUlong(args.inV);
   1526     }
   1527     static public void computeConvert(TestConvert.ArgumentsUintHalf args, Target t) {
   1528         t.setPrecision(1, 1);
   1529         args.out = t.newFloaty(convertUintToDouble(args.inV));
   1530     }
   1531     static public void computeConvert(TestConvert.ArgumentsUintFloat args, Target t) {
   1532         t.setPrecision(1, 1);
   1533         args.out = t.new32(convertUintToFloat(args.inV));
   1534     }
   1535     static public void computeConvert(TestConvert.ArgumentsUintDouble args, Target t) {
   1536         t.setPrecision(0, 0);
   1537         args.out = t.new64(convertUintToDouble(args.inV));
   1538     }
   1539 
   1540     static public void computeConvert(TestConvert.ArgumentsLongChar args) {
   1541         args.out = convertLongToChar(args.inV);
   1542     }
   1543     static public void computeConvert(TestConvert.ArgumentsLongUchar args) {
   1544         args.out = convertLongToUchar(args.inV);
   1545     }
   1546     static public void computeConvert(TestConvert.ArgumentsLongShort args) {
   1547         args.out = convertLongToShort(args.inV);
   1548     }
   1549     static public void computeConvert(TestConvert.ArgumentsLongUshort args) {
   1550         args.out = convertLongToUshort(args.inV);
   1551     }
   1552     static public void computeConvert(TestConvert.ArgumentsLongInt args) {
   1553         args.out = convertLongToInt(args.inV);
   1554     }
   1555     static public void computeConvert(TestConvert.ArgumentsLongUint args) {
   1556         args.out = convertLongToUint(args.inV);
   1557     }
   1558     static public void computeConvert(TestConvert.ArgumentsLongLong args) {
   1559         args.out = convertLongToLong(args.inV);
   1560     }
   1561     static public void computeConvert(TestConvert.ArgumentsLongUlong args) {
   1562         args.out = convertLongToUlong(args.inV);
   1563     }
   1564     static public void computeConvert(TestConvert.ArgumentsLongHalf args, Target t) {
   1565         t.setPrecision(1, 1);
   1566         args.out = t.newFloaty(convertLongToDouble(args.inV));
   1567     }
   1568     static public void computeConvert(TestConvert.ArgumentsLongFloat args, Target t) {
   1569         t.setPrecision(1, 1);
   1570         args.out = t.new32(convertLongToFloat(args.inV));
   1571     }
   1572     static public void computeConvert(TestConvert.ArgumentsLongDouble args, Target t) {
   1573         t.setPrecision(1, 1);
   1574         args.out = t.new64(convertLongToDouble(args.inV));
   1575     }
   1576 
   1577     static public void computeConvert(TestConvert.ArgumentsUlongChar args) {
   1578         args.out = convertUlongToChar(args.inV);
   1579     }
   1580     static public void computeConvert(TestConvert.ArgumentsUlongUchar args) {
   1581         args.out = convertUlongToUchar(args.inV);
   1582     }
   1583     static public void computeConvert(TestConvert.ArgumentsUlongShort args) {
   1584         args.out = convertUlongToShort(args.inV);
   1585     }
   1586     static public void computeConvert(TestConvert.ArgumentsUlongUshort args) {
   1587         args.out = convertUlongToUshort(args.inV);
   1588     }
   1589     static public void computeConvert(TestConvert.ArgumentsUlongInt args) {
   1590         args.out = convertUlongToInt(args.inV);
   1591     }
   1592     static public void computeConvert(TestConvert.ArgumentsUlongUint args) {
   1593         args.out = convertUlongToUint(args.inV);
   1594     }
   1595     static public void computeConvert(TestConvert.ArgumentsUlongLong args) {
   1596         args.out = convertUlongToLong(args.inV);
   1597     }
   1598     static public void computeConvert(TestConvert.ArgumentsUlongUlong args) {
   1599         args.out = convertUlongToUlong(args.inV);
   1600     }
   1601     static public void computeConvert(TestConvert.ArgumentsUlongHalf args, Target t) {
   1602         t.setPrecision(1, 1);
   1603         args.out = t.newFloaty(convertUlongToDouble(args.inV));
   1604     }
   1605     static public void computeConvert(TestConvert.ArgumentsUlongFloat args, Target t) {
   1606         t.setPrecision(1, 1);
   1607         args.out = t.new32(convertUlongToFloat(args.inV));
   1608     }
   1609     static public void computeConvert(TestConvert.ArgumentsUlongDouble args, Target t) {
   1610         t.setPrecision(1, 1);
   1611         args.out = t.new64(convertUlongToDouble(args.inV));
   1612     }
   1613 
   1614     static public void computeConvert(TestConvert.ArgumentsHalfChar args) {
   1615         args.out = convertDoubleToChar(args.inVDouble);
   1616     }
   1617     static public void computeConvert(TestConvert.ArgumentsHalfUchar args) {
   1618         args.out = convertDoubleToUchar(args.inVDouble);
   1619     }
   1620     static public void computeConvert(TestConvert.ArgumentsHalfShort args) {
   1621         args.out = convertDoubleToShort(args.inVDouble);
   1622     }
   1623     static public void computeConvert(TestConvert.ArgumentsHalfUshort args) {
   1624         args.out = convertDoubleToUshort(args.inVDouble);
   1625     }
   1626     static public void computeConvert(TestConvert.ArgumentsHalfInt args) {
   1627         args.out = convertDoubleToInt(args.inVDouble);
   1628     }
   1629     static public void computeConvert(TestConvert.ArgumentsHalfUint args) {
   1630         args.out = convertDoubleToUint(args.inVDouble);
   1631     }
   1632     static public void computeConvert(TestConvert.ArgumentsHalfLong args) {
   1633         args.out = convertDoubleToLong(args.inVDouble);
   1634     }
   1635     static public void computeConvert(TestConvert.ArgumentsHalfUlong args) {
   1636         args.out = convertDoubleToUlong(args.inVDouble);
   1637     }
   1638     static public void computeConvert(TestConvert.ArgumentsHalfHalf args, Target t) {
   1639         t.setPrecision(0, 0);
   1640         args.out = t.newFloaty(args.inVDouble);
   1641     }
   1642     static public void computeConvert(TestConvert.ArgumentsHalfFloat args, Target t) {
   1643         t.setPrecision(0, 0);
   1644         args.out = t.newFloaty(convertDoubleToFloat(args.inVDouble));
   1645     }
   1646     static public void computeConvert(TestConvert.ArgumentsHalfDouble args, Target t) {
   1647         t.setPrecision(0, 0);
   1648         args.out = t.newFloaty(args.inVDouble);
   1649     }
   1650 
   1651     static public void computeConvert(TestConvert.ArgumentsFloatChar args) {
   1652         args.out = convertFloatToChar(args.inV);
   1653     }
   1654     static public void computeConvert(TestConvert.ArgumentsFloatUchar args) {
   1655         args.out = convertFloatToUchar(args.inV);
   1656     }
   1657     static public void computeConvert(TestConvert.ArgumentsFloatShort args) {
   1658         args.out = convertFloatToShort(args.inV);
   1659     }
   1660     static public void computeConvert(TestConvert.ArgumentsFloatUshort args) {
   1661         args.out = convertFloatToUshort(args.inV);
   1662     }
   1663     static public void computeConvert(TestConvert.ArgumentsFloatInt args) {
   1664         args.out = convertFloatToInt(args.inV);
   1665     }
   1666     static public void computeConvert(TestConvert.ArgumentsFloatUint args) {
   1667         args.out = convertFloatToUint(args.inV);
   1668     }
   1669     static public void computeConvert(TestConvert.ArgumentsFloatLong args) {
   1670         args.out = convertFloatToLong(args.inV);
   1671     }
   1672     static public void computeConvert(TestConvert.ArgumentsFloatUlong args) {
   1673         args.out = convertFloatToUlong(args.inV);
   1674     }
   1675     static public void computeConvert(TestConvert.ArgumentsFloatHalf args, Target t) {
   1676         t.setPrecision(1, 1);
   1677         args.out = t.newFloaty(args.inV);
   1678     }
   1679     static public void computeConvert(TestConvert.ArgumentsFloatFloat args, Target t) {
   1680         t.setPrecision(0, 0);
   1681         args.out = t.new32(convertFloatToFloat(args.inV));
   1682     }
   1683     static public void computeConvert(TestConvert.ArgumentsFloatDouble args, Target t) {
   1684         t.setPrecision(0, 0);
   1685         args.out = t.new64(convertFloatToDouble(args.inV));
   1686     }
   1687 
   1688     static public void computeConvert(TestConvert.ArgumentsDoubleChar args) {
   1689         args.out = convertDoubleToChar(args.inV);
   1690     }
   1691     static public void computeConvert(TestConvert.ArgumentsDoubleUchar args) {
   1692         args.out = convertDoubleToUchar(args.inV);
   1693     }
   1694     static public void computeConvert(TestConvert.ArgumentsDoubleShort args) {
   1695         args.out = convertDoubleToShort(args.inV);
   1696     }
   1697     static public void computeConvert(TestConvert.ArgumentsDoubleUshort args) {
   1698         args.out = convertDoubleToUshort(args.inV);
   1699     }
   1700     static public void computeConvert(TestConvert.ArgumentsDoubleInt args) {
   1701         args.out = convertDoubleToInt(args.inV);
   1702     }
   1703     static public void computeConvert(TestConvert.ArgumentsDoubleUint args) {
   1704         args.out = convertDoubleToUint(args.inV);
   1705     }
   1706     static public void computeConvert(TestConvert.ArgumentsDoubleLong args) {
   1707         args.out = convertDoubleToLong(args.inV);
   1708     }
   1709     static public void computeConvert(TestConvert.ArgumentsDoubleUlong args) {
   1710         args.out = convertDoubleToUlong(args.inV);
   1711     }
   1712     static public void computeConvert(TestConvert.ArgumentsDoubleHalf args, Target t) {
   1713         t.setPrecision(1, 1);
   1714         args.out = t.newFloaty(args.inV);
   1715     }
   1716     static public void computeConvert(TestConvert.ArgumentsDoubleFloat args, Target t) {
   1717         t.setPrecision(1, 1);
   1718         args.out = t.new32(convertDoubleToFloat(args.inV));
   1719     }
   1720     static public void computeConvert(TestConvert.ArgumentsDoubleDouble args, Target t) {
   1721         t.setPrecision(0, 0);
   1722         args.out = t.new64(convertDoubleToDouble(args.inV));
   1723     }
   1724 
   1725     static public void computeCopysign(TestCopysign.ArgumentsHalfHalfHalf args, Target t) {
   1726         t.setPrecision(0, 0);
   1727         args.out = copysign(args.inMagnitudeValueDouble, args.inSignValueDouble, t);
   1728     }
   1729 
   1730     static public void computeCopysign(TestCopysign.ArgumentsFloatFloatFloat args, Target t) {
   1731         t.setPrecision(0, 0);
   1732         args.out = t.new32(Math.copySign(args.inMagnitudeValue, args.inSignValue));
   1733     }
   1734 
   1735     static public void computeCos(TestCos.ArgumentsHalfHalf args, Target t) {
   1736         t.setPrecision(4, 4);
   1737         args.out = cos(args.inVDouble, t);
   1738     }
   1739 
   1740     static public void computeCos(TestCos.ArgumentsFloatFloat args, Target t) {
   1741         t.setPrecision(4, 128);
   1742         args.out = cos(args.inV, t);
   1743     }
   1744 
   1745     static public void computeCosh(TestCosh.ArgumentsHalfHalf args, Target t) {
   1746         t.setPrecision(4, 4);
   1747         args.out = cosh(args.inVDouble, t);
   1748     }
   1749 
   1750     static public void computeCosh(TestCosh.ArgumentsFloatFloat args, Target t) {
   1751         t.setPrecision(4, 128);
   1752         args.out = cosh(args.inV, t);
   1753     }
   1754 
   1755     static public void computeCospi(TestCospi.ArgumentsHalfHalf args, Target t) {
   1756         t.setPrecision(4, 4);
   1757         args.out = cospi(args.inVDouble, t);
   1758     }
   1759 
   1760     static public void computeCospi(TestCospi.ArgumentsFloatFloat args, Target t) {
   1761         t.setPrecision(4, 128);
   1762         args.out = cospi(args.inV, t);
   1763     }
   1764 
   1765     static public void computeCross(TestCross.ArgumentsHalfNHalfNHalfN args, Target t) {
   1766         t.setPrecision(1, 4);
   1767         cross(args.inLeftVectorDouble, args.inRightVectorDouble, args.out, t);
   1768     }
   1769 
   1770     static public void computeCross(TestCross.ArgumentsFloatNFloatNFloatN args, Target t) {
   1771         t.setPrecision(1, 4);
   1772         cross(args.inLeftVector, args.inRightVector, args.out, t);
   1773     }
   1774 
   1775     static public void computeDegrees(TestDegrees.ArgumentsHalfHalf args, Target t) {
   1776         t.setPrecision(3, 3);
   1777         args.out = degrees(args.inVDouble, t);
   1778     }
   1779 
   1780     static public void computeDegrees(TestDegrees.ArgumentsFloatFloat args, Target t) {
   1781         t.setPrecision(3, 3);
   1782         Target.Floaty in = t.new32(args.inV);
   1783         Target.Floaty k = t.new32((float)(180.0 / Math.PI));
   1784         args.out = t.multiply(in, k);
   1785     }
   1786 
   1787     static public void computeDistance(TestDistance.ArgumentsHalfHalfHalf args, Target t) {
   1788         t.setPrecision(1, 1); // TODO double-check precision
   1789         args.out = distance(new double[] {args.inLeftVectorDouble},
   1790                             new double[] {args.inRightVectorDouble}, t);
   1791     }
   1792     static public void computeDistance(TestDistance.ArgumentsHalfNHalfNHalf args, Target t) {
   1793         t.setPrecision(1, 1); // TODO double-check precision
   1794         args.out = distance(args.inLeftVectorDouble, args.inRightVectorDouble, t);
   1795     }
   1796 
   1797     static public void computeDistance(TestDistance.ArgumentsFloatFloatFloat args, Target t) {
   1798         t.setPrecision(1, 1);
   1799         args.out = distance(new float[] {args.inLeftVector}, new float[] {args.inRightVector}, t);
   1800     }
   1801 
   1802     static public void computeDistance(TestDistance.ArgumentsFloatNFloatNFloat args, Target t) {
   1803         t.setPrecision(1, 1);
   1804         args.out = distance(args.inLeftVector, args.inRightVector, t);
   1805     }
   1806 
   1807     static public void computeDot(TestDot.ArgumentsHalfHalfHalf args, Target t) {
   1808         t.setPrecision(1, 4); // TODO double-check precision
   1809         Target.Floaty a = t.newFloaty(args.inLeftVectorDouble);
   1810         Target.Floaty b = t.newFloaty(args.inRightVectorDouble);
   1811         args.out = t.multiply(a, b);
   1812     }
   1813 
   1814     static public void computeDot(TestDot.ArgumentsHalfNHalfNHalf args, Target t) {
   1815         t.setPrecision(1, 4); // TODO double-check precision
   1816         Target.Floaty sum = t.newFloaty(0.);
   1817         for (int i = 0; i < args.inLeftVectorDouble.length; i++) {
   1818             Target.Floaty a = t.newFloaty(args.inLeftVectorDouble[i]);
   1819             Target.Floaty b = t.newFloaty(args.inRightVectorDouble[i]);
   1820             sum = t.add(sum, t.multiply(a, b));
   1821         }
   1822         args.out = sum;
   1823     }
   1824 
   1825     static public void computeDot(TestDot.ArgumentsFloatFloatFloat args, Target t) {
   1826         t.setPrecision(1, 4);
   1827         Target.Floaty a = t.new32(args.inLeftVector);
   1828         Target.Floaty b = t.new32(args.inRightVector);
   1829         args.out = t.multiply(a, b);
   1830     }
   1831 
   1832     static public void computeDot(TestDot.ArgumentsFloatNFloatNFloat args, Target t) {
   1833         t.setPrecision(1, 4);
   1834         Target.Floaty sum = t.new32(0.f);
   1835         for (int i = 0; i < args.inLeftVector.length; i++) {
   1836             Target.Floaty a = t.new32(args.inLeftVector[i]);
   1837             Target.Floaty b = t.new32(args.inRightVector[i]);
   1838             sum = t.add(sum, t.multiply(a, b));
   1839         }
   1840         args.out = sum;
   1841     }
   1842 
   1843     static public void computeErf(TestErf.ArgumentsHalfHalf args, Target t) {
   1844         t.setPrecision(16, 16);
   1845         args.out = erf(args.inVDouble, t);
   1846     }
   1847 
   1848     static public void computeErf(TestErf.ArgumentsFloatFloat args, Target t) {
   1849         t.setPrecision(16, 128);
   1850         Target.Floaty in = t.new32(args.inV);
   1851         args.out = t.new32(
   1852             erf(args.inV),
   1853             erf(in.min32()),
   1854             erf(in.max32()));
   1855     }
   1856 
   1857     static public void computeErfc(TestErfc.ArgumentsHalfHalf args, Target t) {
   1858         t.setPrecision(16, 16);
   1859         args.out = erfc(args.inVDouble, t);
   1860     }
   1861 
   1862     static public void computeErfc(TestErfc.ArgumentsFloatFloat args, Target t) {
   1863         t.setPrecision(16, 128);
   1864         Target.Floaty in = t.new32(args.inV);
   1865         args.out = t.new32(
   1866             erfc(args.inV),
   1867             erfc(in.min32()),
   1868             erfc(in.max32()));
   1869     }
   1870 
   1871     static public void computeExp(TestExp.ArgumentsHalfHalf args, Target t) {
   1872         t.setPrecision(3, 3);
   1873         args.out = exp(args.inVDouble, t);
   1874     }
   1875 
   1876     static public void computeExp(TestExp.ArgumentsFloatFloat args, Target t) {
   1877         t.setPrecision(3, 16);
   1878         args.out = exp(args.inV, t);
   1879     }
   1880 
   1881     static public void computeExp10(TestExp10.ArgumentsHalfHalf args, Target t) {
   1882         t.setPrecision(3, 3);
   1883         args.out = exp10(args.inVDouble, t);
   1884     }
   1885 
   1886     static public void computeExp10(TestExp10.ArgumentsFloatFloat args, Target t) {
   1887         t.setPrecision(3, 32);
   1888         args.out = exp10(args.inV, t);
   1889     }
   1890 
   1891     static public void computeExp2(TestExp2.ArgumentsHalfHalf args, Target t) {
   1892         t.setPrecision(3, 3);
   1893         args.out = exp2(args.inVDouble, t);
   1894     }
   1895 
   1896     static public void computeExp2(TestExp2.ArgumentsFloatFloat args, Target t) {
   1897         t.setPrecision(3, 16);
   1898         args.out = exp2(args.inV, t);
   1899     }
   1900 
   1901     static public void computeExpm1(TestExpm1.ArgumentsHalfHalf args, Target t) {
   1902         t.setPrecision(3, 3);
   1903         args.out = expm1(args.inVDouble, t);
   1904     }
   1905 
   1906     static public void computeExpm1(TestExpm1.ArgumentsFloatFloat args, Target t) {
   1907         t.setPrecision(3, 16);
   1908         args.out = expm1(args.inV, t);
   1909     }
   1910 
   1911     static public void computeFabs(TestFabs.ArgumentsHalfHalf args, Target t) {
   1912         t.setPrecision(0, 0);
   1913         args.out = fabs(args.inVDouble, t);
   1914     }
   1915 
   1916     static public void computeFabs(TestFabs.ArgumentsFloatFloat args, Target t) {
   1917         t.setPrecision(0, 0);
   1918         Target.Floaty in = t.new32(args.inV);
   1919         args.out = t.new32(
   1920             Math.abs(args.inV),
   1921             Math.abs(in.min32()),
   1922             Math.abs(in.max32()));
   1923     }
   1924 
   1925     static public void computeFastDistance(TestFastDistance.ArgumentsFloatFloatFloat args, Target t) {
   1926         t.setPrecision(FAST_PRECISION, FAST_PRECISION);
   1927         args.out = distance(new float[] {args.inLeftVector}, new float[] {args.inRightVector}, t);
   1928     }
   1929 
   1930     static public void computeFastDistance(TestFastDistance.ArgumentsFloatNFloatNFloat args, Target t) {
   1931         t.setPrecision(FAST_PRECISION, FAST_PRECISION);
   1932         args.out = distance(args.inLeftVector, args.inRightVector, t);
   1933     }
   1934 
   1935     static public void computeFastLength(TestFastLength.ArgumentsFloatFloat args, Target t) {
   1936         t.setPrecision(FAST_PRECISION, FAST_PRECISION);
   1937         args.out = length(new float[] {args.inV}, t);
   1938     }
   1939 
   1940     static public void computeFastLength(TestFastLength.ArgumentsFloatNFloat args, Target t) {
   1941         t.setPrecision(FAST_PRECISION, FAST_PRECISION);
   1942         args.out = length(args.inV, t);
   1943     }
   1944 
   1945     static public void computeFastNormalize(TestFastNormalize.ArgumentsFloatFloat args, Target t) {
   1946         t.setPrecision(FAST_PRECISION, FAST_PRECISION);
   1947         Target.Floaty[] out = new Target.Floaty[1];
   1948         normalize(new float[] {args.inV}, out, t);
   1949         args.out = out[0];
   1950     }
   1951 
   1952     static public void computeFastNormalize(TestFastNormalize.ArgumentsFloatNFloatN args, Target t) {
   1953         t.setPrecision(FAST_PRECISION, FAST_PRECISION);
   1954         normalize(args.inV, args.out, t);
   1955     }
   1956 
   1957     static public void computeFdim(TestFdim.ArgumentsHalfHalfHalf args, Target t) {
   1958         t.setPrecision(1, 1);
   1959         args.out = fdim(args.inADouble, args.inBDouble, t);
   1960     }
   1961 
   1962     static public void computeFdim(TestFdim.ArgumentsFloatFloatFloat args, Target t) {
   1963         t.setPrecision(1, 1);
   1964         Target.Floaty inA = t.new32(args.inA);
   1965         Target.Floaty inB = t.new32(args.inB);
   1966         Target.Floaty r = t.subtract(inA, inB);
   1967         args.out = t.new32(
   1968             Math.max(0.f, r.mid32()),
   1969             Math.max(0.f, r.min32()),
   1970             Math.max(0.f, r.max32()));
   1971     }
   1972 
   1973     static public void computeFloor(TestFloor.ArgumentsHalfHalf args, Target t) {
   1974         t.setPrecision(0, 0);
   1975         args.out = floor(args.inVDouble, t);
   1976     }
   1977 
   1978     static public void computeFloor(TestFloor.ArgumentsFloatFloat args, Target t) {
   1979         t.setPrecision(0, 0);
   1980         Target.Floaty in = t.new32(args.inV);
   1981         args.out = t.new32(
   1982             floor(args.inV),
   1983             floor(in.min32()),
   1984             floor(in.max32()));
   1985     }
   1986 
   1987     static public void computeFma(TestFma.ArgumentsHalfHalfHalfHalf args, Target t) {
   1988         t.setPrecision(1, 1);
   1989         args.out = fma(args.inMultiplicand1Double, args.inMultiplicand2Double,
   1990             args.inOffsetDouble, t);
   1991     }
   1992 
   1993     static public void computeFma(TestFma.ArgumentsFloatFloatFloatFloat args, Target t) {
   1994         t.setPrecision(1, 1);
   1995         Target.Floaty ab = t.multiply(t.new32(args.inMultiplicand1), t.new32(args.inMultiplicand2));
   1996         args.out = t.add(ab, t.new32(args.inOffset));
   1997     }
   1998 
   1999     static public void computeFmax(TestFmax.ArgumentsHalfHalfHalf args, Target t) {
   2000         t.setPrecision(0, 0);
   2001         args.out = fmax(args.inADouble, args.inBDouble, t);
   2002     }
   2003 
   2004     static public void computeFmax(TestFmax.ArgumentsFloatFloatFloat args, Target t) {
   2005         t.setPrecision(0, 0);
   2006         Target.Floaty a = t.new32(args.inA);
   2007         Target.Floaty b = t.new32(args.inB);
   2008         args.out = t.new32(
   2009             Math.max(args.inA, args.inB),
   2010             Math.max(a.min32(), b.min32()),
   2011             Math.max(a.min32(), b.max32()),
   2012             Math.max(a.max32(), b.min32()),
   2013             Math.max(a.max32(), b.max32()));
   2014     }
   2015 
   2016     static public void computeFmin(TestFmin.ArgumentsHalfHalfHalf args, Target t) {
   2017         t.setPrecision(0, 0);
   2018         args.out = fmin(args.inADouble, args.inBDouble, t);
   2019     }
   2020 
   2021     static public void computeFmin(TestFmin.ArgumentsFloatFloatFloat args, Target t) {
   2022         t.setPrecision(0, 0);
   2023         Target.Floaty a = t.new32(args.inA);
   2024         Target.Floaty b = t.new32(args.inB);
   2025         args.out = t.new32(
   2026             Math.min(args.inA, args.inB),
   2027             Math.min(a.min32(), b.min32()),
   2028             Math.min(a.min32(), b.max32()),
   2029             Math.min(a.max32(), b.min32()),
   2030             Math.min(a.max32(), b.max32()));
   2031     }
   2032 
   2033     static public void computeFmod(TestFmod.ArgumentsHalfHalfHalf args, Target t) {
   2034         t.setPrecision(1, 1);
   2035         args.out = fmod(args.inNumeratorDouble, args.inDenominatorDouble, t);
   2036     }
   2037 
   2038     static public void computeFmod(TestFmod.ArgumentsFloatFloatFloat args, Target t) {
   2039         t.setPrecision(1, 1);
   2040         Target.Floaty numerator = t.new32(args.inNumerator);
   2041         Target.Floaty denominator = t.new32(args.inDenominator);
   2042         args.out = t.new32(
   2043             args.inNumerator % args.inDenominator,
   2044             numerator.min32() % denominator.min32(),
   2045             numerator.min32() % denominator.max32(),
   2046             numerator.max32() % denominator.min32(),
   2047             numerator.max32() % denominator.max32());
   2048     }
   2049 
   2050     static public void computeFract(TestFract.ArgumentsHalfHalfHalf args, Target t) {
   2051         t.setPrecision(1, 1);
   2052         args.out = fract(args.inVDouble, t, 0.99951171875 /* max float16 smaller than 1.0 */);
   2053         args.outFloor = floor(args.inVDouble, t);
   2054     }
   2055 
   2056     static public void computeFract(TestFract.ArgumentsFloatFloatFloat args, Target t) {
   2057         t.setPrecision(1, 1);
   2058         float floor = floor(args.inV);
   2059         args.outFloor = t.new32(floor);
   2060         // 0x1.fffffep-1f is 0.999999...
   2061         args.out = t.new32(Math.min(args.inV - floor, 0x1.fffffep-1f));
   2062     }
   2063 
   2064     static public void computeFract(TestFract.ArgumentsHalfHalf args, Target t) {
   2065         t.setPrecision(1, 1);
   2066         args.out = fract(args.inVDouble, t, 0.99951171875 /* max float16 smaller than 1.0 */);
   2067     }
   2068 
   2069     static public void computeFract(TestFract.ArgumentsFloatFloat args, Target t) {
   2070         t.setPrecision(1, 1);
   2071         float floor = floor(args.inV);
   2072         // 0x1.fffffep-1f is 0.999999...
   2073         args.out = t.new32(Math.min(args.inV - floor, 0x1.fffffep-1f));
   2074     }
   2075 
   2076     static public void computeFrexp(TestFrexp.ArgumentsFloatIntFloat args, Target t) {
   2077         t.setPrecision(0, 0);
   2078         FrexpResult result = frexp(args.inV);
   2079         args.out = t.new32(result.significand);
   2080         args.outExponent = result.exponent;
   2081     }
   2082 
   2083     static public void computeHalfRecip(TestHalfRecip.ArgumentsFloatFloat args, Target t) {
   2084         t.setPrecision(HALF_PRECISION, HALF_PRECISION);
   2085         args.out = recip(args.inV, t);
   2086     }
   2087 
   2088     static public void computeHalfRsqrt(TestHalfRsqrt.ArgumentsFloatFloat args, Target t) {
   2089         t.setPrecision(HALF_PRECISION, HALF_PRECISION);
   2090         args.out = rsqrt(args.inV, t);
   2091     }
   2092 
   2093     static public void computeHalfSqrt(TestHalfSqrt.ArgumentsFloatFloat args, Target t) {
   2094         t.setPrecision(HALF_PRECISION, HALF_PRECISION);
   2095         args.out = sqrt(args.inV, t);
   2096     }
   2097 
   2098     static public void computeHypot(TestHypot.ArgumentsHalfHalfHalf args, Target t) {
   2099         t.setPrecision(4, 4);
   2100         args.out = hypot(args.inADouble, args.inBDouble, t);
   2101     }
   2102 
   2103     static public void computeHypot(TestHypot.ArgumentsFloatFloatFloat args, Target t) {
   2104         t.setPrecision(4, 4);
   2105         args.out = hypot(args.inA, args.inB, t);
   2106     }
   2107 
   2108     static public String verifyIlogb(TestIlogb.ArgumentsFloatInt args) {
   2109         // Special case when the input is 0.  We accept two different answers.
   2110         if (args.inV == 0.f) {
   2111             if (args.out != -Integer.MAX_VALUE && args.out != Integer.MIN_VALUE) {
   2112                 return "Expected " + Integer.toString(-Integer.MAX_VALUE) + " or " +
   2113                     Integer.toString(Integer.MIN_VALUE);
   2114             }
   2115         } else {
   2116             int result = ilogb(args.inV);
   2117             if (args.out != result) {
   2118                 return "Expected " + Integer.toString(result);
   2119             }
   2120         }
   2121         return null;
   2122     }
   2123 
   2124     static public void computeLdexp(TestLdexp.ArgumentsFloatIntFloat args, Target t) {
   2125         t.setPrecision(1, 1);
   2126         Target.Floaty inMantissa = t.new32(args.inMantissa);
   2127         args.out = t.new32(
   2128             ldexp(inMantissa.mid32(), args.inExponent),
   2129             ldexp(inMantissa.min32(), args.inExponent),
   2130             ldexp(inMantissa.max32(), args.inExponent));
   2131     }
   2132 
   2133     static public void computeLength(TestLength.ArgumentsHalfHalf args, Target t) {
   2134         t.setPrecision(1, 1); // TODO double-check precision
   2135         args.out = length(new double[]{args.inVDouble}, t);
   2136     }
   2137 
   2138     static public void computeLength(TestLength.ArgumentsHalfNHalf args, Target t) {
   2139         t.setPrecision(1, 1); // TODO double-check precision
   2140         args.out = length(args.inVDouble, t);
   2141     }
   2142 
   2143     static public void computeLength(TestLength.ArgumentsFloatFloat args, Target t) {
   2144         t.setPrecision(1, 1);
   2145         args.out = length(new float[]{args.inV}, t);
   2146     }
   2147 
   2148     static public void computeLength(TestLength.ArgumentsFloatNFloat args, Target t) {
   2149         t.setPrecision(1, 1);
   2150         args.out = length(args.inV, t);
   2151     }
   2152 
   2153     static public void computeLgamma(TestLgamma.ArgumentsFloatFloat args, Target t) {
   2154         t.setPrecision(16, 128);
   2155         Target.Floaty in = t.new32(args.inV);
   2156         args.out = t.new32(
   2157             lgamma(in.mid32()),
   2158             lgamma(in.min32()),
   2159             lgamma(in.max32()));
   2160     }
   2161 
   2162     /* TODO Until -0 handling is corrected in bionic & associated drivers, we temporarily
   2163      * disable the verification of -0.  We do this with a custom verifier.  Once bionic
   2164      * is fixed, we can restore computeLgamma and remove verifyLgamma.
   2165     static public void computeLgamma(TestLgamma.ArgumentsFloatIntFloat args, Target t) {
   2166         t.setPrecision(16, 128);
   2167         Target.Floaty in = t.new32(args.inV);
   2168         LgammaResult result = lgamma2(in.mid32());
   2169         LgammaResult resultMin = lgamma2(in.min32());
   2170         LgammaResult resultMax = lgamma2(in.max32());
   2171         args.out = t.new32(result.lgamma, resultMin.lgamma, resultMax.lgamma);
   2172         args.outY = result.gammaSign;
   2173     }
   2174     */
   2175     static public String verifyLgamma(TestLgamma.ArgumentsFloatIntFloat args, Target t) {
   2176         t.setPrecision(16, 128);
   2177         Target.Floaty in = t.new32(args.inV);
   2178         LgammaResult result = lgamma2(in.mid32());
   2179         LgammaResult resultMin = lgamma2(in.min32());
   2180         LgammaResult resultMax = lgamma2(in.max32());
   2181         Target.Floaty expectedOut = t.new32(result.lgamma, resultMin.lgamma, resultMax.lgamma);
   2182         boolean isNegativeZero = args.inV == 0.f && 1.f / args.inV < 0.f;
   2183         /* TODO The current implementation of bionic does not handle the -0.f case correctly.
   2184          * It should set the sign to -1 but sets it to 1.
   2185          */
   2186         if (!expectedOut.couldBe(args.out) ||
   2187             (args.outSignOfGamma != result.gammaSign && !isNegativeZero)) {
   2188             StringBuilder message = new StringBuilder();
   2189             message.append(String.format("Input in %14.8g {%8x}:\n", args.inV, Float.floatToRawIntBits(args.inV)));
   2190             message.append("Expected out: ");
   2191             message.append(expectedOut.toString());
   2192             message.append("\n");
   2193             message.append(String.format("Actual   out: %14.8g {%8x}", args.out, Float.floatToRawIntBits(args.out)));
   2194             message.append(String.format("Expected outSign: %d\n", result.gammaSign));
   2195             message.append(String.format("Actual   outSign: %d\n", args.outSignOfGamma));
   2196             return message.toString();
   2197         }
   2198 
   2199         return null;
   2200     }
   2201 
   2202     static public void computeLog(TestLog.ArgumentsHalfHalf args, Target t) {
   2203         t.setPrecision(3, 3);
   2204         args.out = log(args.inVDouble, t);
   2205     }
   2206 
   2207     // TODO The relaxed ulf for the various log are taken from the old tests.
   2208     // They are not consistent.
   2209     static public void computeLog(TestLog.ArgumentsFloatFloat args, Target t) {
   2210         t.setPrecision(3, 16);
   2211         args.out = log(args.inV, t);
   2212     }
   2213 
   2214     static public void computeLog10(TestLog10.ArgumentsHalfHalf args, Target t) {
   2215         t.setPrecision(3, 3);
   2216         args.out = log10(args.inVDouble, t);
   2217     }
   2218 
   2219     static public void computeLog10(TestLog10.ArgumentsFloatFloat args, Target t) {
   2220         t.setPrecision(3, 16);
   2221         args.out = log10(args.inV, t);
   2222     }
   2223 
   2224     static public void computeLog1p(TestLog1p.ArgumentsHalfHalf args, Target t) {
   2225         t.setPrecision(2, 2);
   2226         args.out = log1p(args.inVDouble, t);
   2227     }
   2228 
   2229     static public void computeLog1p(TestLog1p.ArgumentsFloatFloat args, Target t) {
   2230         t.setPrecision(2, 16);
   2231         args.out = log1p(args.inV, t);
   2232     }
   2233 
   2234     static public void computeLog2(TestLog2.ArgumentsHalfHalf args, Target t) {
   2235         t.setPrecision(3, 3);
   2236         args.out = log2(args.inVDouble, t);
   2237     }
   2238 
   2239     static public void computeLog2(TestLog2.ArgumentsFloatFloat args, Target t) {
   2240         t.setPrecision(3, 128);
   2241         args.out = log2(args.inV, t);
   2242     }
   2243 
   2244     static public void computeLogb(TestLogb.ArgumentsHalfHalf args, Target t) {
   2245         t.setPrecision(0, 0);
   2246         args.out = logb(args.inVDouble, t);
   2247     }
   2248 
   2249     static public void computeLogb(TestLogb.ArgumentsFloatFloat args, Target t) {
   2250         t.setPrecision(0, 0);
   2251         Target.Floaty in = t.new32(args.inV);
   2252         args.out = t.new32(
   2253             logb(in.mid32()),
   2254             logb(in.min32()),
   2255             logb(in.max32()));
   2256     }
   2257 
   2258     static public void computeMad(TestMad.ArgumentsHalfHalfHalfHalf args, Target t) {
   2259         t.setPrecision(4, 4);
   2260         args.out = mad(args.inMultiplicand1Double, args.inMultiplicand2Double, args.inOffsetDouble, t);
   2261     }
   2262 
   2263     static public void computeMad(TestMad.ArgumentsFloatFloatFloatFloat args, Target t) {
   2264         t.setPrecision(1, 4);
   2265         Target.Floaty ab = t.multiply(t.new32(args.inMultiplicand1), t.new32(args.inMultiplicand2));
   2266         args.out = t.add(ab, t.new32(args.inOffset));
   2267     }
   2268 
   2269     static public void computeMax(TestMax.ArgumentsCharCharChar args) {
   2270         args.out = maxI8(args.inA, args.inB);
   2271     }
   2272 
   2273     static public void computeMax(TestMax.ArgumentsUcharUcharUchar args) {
   2274         args.out = maxU8(args.inA, args.inB);
   2275     }
   2276 
   2277     static public void computeMax(TestMax.ArgumentsShortShortShort args) {
   2278         args.out = maxI16(args.inA, args.inB);
   2279     }
   2280 
   2281     static public void computeMax(TestMax.ArgumentsUshortUshortUshort args) {
   2282         args.out = maxU16(args.inA, args.inB);
   2283     }
   2284 
   2285     static public void computeMax(TestMax.ArgumentsIntIntInt args) {
   2286         args.out = maxI32(args.inA, args.inB);
   2287     }
   2288 
   2289     static public void computeMax(TestMax.ArgumentsUintUintUint args) {
   2290         args.out = maxU32(args.inA, args.inB);
   2291     }
   2292 
   2293     static public void computeMax(TestMax.ArgumentsLongLongLong args) {
   2294         args.out = maxI64(args.inA, args.inB);
   2295     }
   2296 
   2297     static public void computeMax(TestMax.ArgumentsUlongUlongUlong args) {
   2298         args.out = maxU64(args.inA, args.inB);
   2299     }
   2300 
   2301     static public void computeMax(TestMax.ArgumentsHalfHalfHalf args, Target t) {
   2302         t.setPrecision(0, 0);
   2303         args.out = max(args.inADouble, args.inBDouble, t);
   2304     }
   2305 
   2306     static public void computeMax(TestMax.ArgumentsFloatFloatFloat args, Target t) {
   2307         t.setPrecision(0, 0);
   2308         Target.Floaty a = t.new32(args.inA);
   2309         Target.Floaty b = t.new32(args.inB);
   2310         args.out = t.new32(
   2311             Math.max(a.mid32(), b.mid32()),
   2312             Math.max(a.min32(), b.min32()),
   2313             Math.max(a.min32(), b.max32()),
   2314             Math.max(a.max32(), b.min32()),
   2315             Math.max(a.max32(), b.max32()));
   2316     }
   2317 
   2318     static public void computeMin(TestMin.ArgumentsCharCharChar args) {
   2319         args.out = minI8(args.inA, args.inB);
   2320     }
   2321 
   2322     static public void computeMin(TestMin.ArgumentsUcharUcharUchar args) {
   2323         args.out = minU8(args.inA, args.inB);
   2324     }
   2325 
   2326     static public void computeMin(TestMin.ArgumentsShortShortShort args) {
   2327         args.out = minI16(args.inA, args.inB);
   2328     }
   2329 
   2330     static public void computeMin(TestMin.ArgumentsUshortUshortUshort args) {
   2331         args.out = minU16(args.inA, args.inB);
   2332     }
   2333 
   2334     static public void computeMin(TestMin.ArgumentsIntIntInt args) {
   2335         args.out = minI32(args.inA, args.inB);
   2336     }
   2337 
   2338     static public void computeMin(TestMin.ArgumentsUintUintUint args) {
   2339         args.out = minU32(args.inA, args.inB);
   2340     }
   2341 
   2342     static public void computeMin(TestMin.ArgumentsLongLongLong args) {
   2343         args.out = minI64(args.inA, args.inB);
   2344     }
   2345 
   2346     static public void computeMin(TestMin.ArgumentsUlongUlongUlong args) {
   2347         args.out = minU64(args.inA, args.inB);
   2348     }
   2349 
   2350     static public void computeMin(TestMin.ArgumentsHalfHalfHalf args, Target t) {
   2351         t.setPrecision(0, 0);
   2352         args.out = min(args.inADouble, args.inBDouble, t);
   2353     }
   2354 
   2355     static public void computeMin(TestMin.ArgumentsFloatFloatFloat args, Target t) {
   2356         t.setPrecision(0, 0);
   2357         args.out = t.new32(Math.min(args.inA, args.inB));
   2358     }
   2359 
   2360     static public void computeMix(TestMix.ArgumentsHalfHalfHalfHalf args, Target t) {
   2361         t.setPrecision(1, 1);
   2362         args.out = mix(args.inStartDouble, args.inStopDouble, args.inFractionDouble, t);
   2363     }
   2364 
   2365     static public void computeMix(TestMix.ArgumentsFloatFloatFloatFloat args, Target t) {
   2366         t.setPrecision(1, 4);
   2367         Target.Floaty start = t.new32(args.inStart);
   2368         Target.Floaty stop = t.new32(args.inStop);
   2369         Target.Floaty diff = t.subtract(stop, start);
   2370         args.out = t.add(start, t.multiply(diff, t.new32(args.inFraction)));
   2371     }
   2372 
   2373     static public void computeModf(TestModf.ArgumentsFloatFloatFloat args, Target t) {
   2374         t.setPrecision(0, 0);
   2375         float ret = (float)(int)args.inV;
   2376         args.outIntegralPart = t.new32(ret);
   2377         args.out = t.new32(args.inV - ret);
   2378     }
   2379 
   2380     static public void computeNan(TestNan.ArgumentsUintFloat args, Target t) {
   2381         t.setPrecision(0, 0);
   2382         // TODO(jeanluc) We're not using the input argument
   2383         args.out = t.new32(Float.NaN);
   2384     }
   2385 
   2386     static public void computeNanHalf(TestNanHalf.ArgumentsHalf args, Target t) {
   2387         t.setPrecision(0, 0);
   2388         args.out = t.newFloaty(Double.NaN);
   2389     }
   2390 
   2391     static public void computeNativeAcos(TestNativeAcos.ArgumentsHalfHalf args, Target t) {
   2392         t.setPrecision(0, 0); // extraAllowedError set in fw/rs/rs_math.spec and generated test files
   2393         args.out = acos(args.inVDouble, t);
   2394     }
   2395 
   2396     static public void computeNativeAcos(TestNativeAcos.ArgumentsFloatFloat args, Target t) {
   2397         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2398         args.out = acos(args.inV, t);
   2399     }
   2400 
   2401     static public void computeNativeAcosh(TestNativeAcosh.ArgumentsHalfHalf args, Target t) {
   2402         t.setPrecision(4, 4);
   2403         args.out = acosh(args.inVDouble, t);
   2404     }
   2405 
   2406     static public void computeNativeAcosh(TestNativeAcosh.ArgumentsFloatFloat args, Target t) {
   2407         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2408         args.out = acosh(args.inV, t);
   2409     }
   2410 
   2411     static public void computeNativeAcospi(TestNativeAcospi.ArgumentsHalfHalf args, Target t) {
   2412         t.setPrecision(0, 0); // extraAllowedError set in fw/rs/rs_math.spec and generated test files
   2413         args.out = acospi(args.inVDouble, t);
   2414     }
   2415 
   2416     static public void computeNativeAcospi(TestNativeAcospi.ArgumentsFloatFloat args, Target t) {
   2417         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2418         args.out = acospi(args.inV, t);
   2419     }
   2420 
   2421     static public void computeNativeAsin(TestNativeAsin.ArgumentsHalfHalf args, Target t) {
   2422         t.setPrecision(0, 0); // extraAllowedError set in fw/rs/rs_math.spec and generated test files
   2423         args.out = asin(args.inVDouble, t);
   2424     }
   2425 
   2426     static public void computeNativeAsin(TestNativeAsin.ArgumentsFloatFloat args, Target t) {
   2427         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2428         args.out = asin(args.inV, t);
   2429     }
   2430 
   2431     static public void computeNativeAsinh(TestNativeAsinh.ArgumentsHalfHalf args, Target t) {
   2432         t.setPrecision(4, 4);
   2433         args.out = asinh(args.inVDouble, t);
   2434     }
   2435 
   2436     static public void computeNativeAsinh(TestNativeAsinh.ArgumentsFloatFloat args, Target t) {
   2437         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2438         args.out = asinh(args.inV, t);
   2439     }
   2440 
   2441     static public void computeNativeAsinpi(TestNativeAsinpi.ArgumentsHalfHalf args, Target t) {
   2442         t.setPrecision(0, 0); // extraAllowedError set in fw/rs/rs_math.spec and generated test files
   2443         args.out = asinpi(args.inVDouble, t);
   2444     }
   2445 
   2446     static public void computeNativeAsinpi(TestNativeAsinpi.ArgumentsFloatFloat args, Target t) {
   2447         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2448         args.out = asinpi(args.inV, t);
   2449     }
   2450 
   2451     static public void computeNativeAtan(TestNativeAtan.ArgumentsHalfHalf args, Target t) {
   2452         t.setPrecision(5, 5);
   2453         args.out = atan(args.inVDouble, t);
   2454     }
   2455 
   2456     static public void computeNativeAtan(TestNativeAtan.ArgumentsFloatFloat args, Target t) {
   2457         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2458         args.out = atan(args.inV, t);
   2459     }
   2460 
   2461     static public void computeNativeAtanh(TestNativeAtanh.ArgumentsHalfHalf args, Target t) {
   2462         t.setPrecision(5, 5);
   2463         args.out = atanh(args.inVDouble, t);
   2464     }
   2465 
   2466     static public void computeNativeAtanh(TestNativeAtanh.ArgumentsFloatFloat args, Target t) {
   2467         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2468         args.out = atanh(args.inV, t);
   2469     }
   2470 
   2471     static public void computeNativeAtanpi(TestNativeAtanpi.ArgumentsHalfHalf args, Target t) {
   2472         t.setPrecision(5, 5);
   2473         args.out = atanpi(args.inVDouble, t);
   2474     }
   2475 
   2476     static public void computeNativeAtanpi(TestNativeAtanpi.ArgumentsFloatFloat args, Target t) {
   2477         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2478         args.out = atanpi(args.inV, t);
   2479     }
   2480 
   2481     static public void computeNativeAtan2(TestNativeAtan2.ArgumentsHalfHalfHalf args, Target t) {
   2482         t.setPrecision(5, 5);
   2483         args.out = atan2(args.inNumeratorDouble, args.inDenominatorDouble, t);
   2484     }
   2485 
   2486     static public void computeNativeAtan2(TestNativeAtan2.ArgumentsFloatFloatFloat args, Target t) {
   2487         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2488         args.out = atan2(args.inNumerator, args.inDenominator, t);
   2489     }
   2490 
   2491     static public void computeNativeAtan2pi(TestNativeAtan2pi.ArgumentsHalfHalfHalf args, Target t) {
   2492         t.setPrecision(5, 5);
   2493         args.out = atan2pi(args.inNumeratorDouble, args.inDenominatorDouble, t);
   2494     }
   2495 
   2496     static public void computeNativeAtan2pi(TestNativeAtan2pi.ArgumentsFloatFloatFloat args, Target t) {
   2497         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2498         args.out = atan2pi(args.inNumerator, args.inDenominator, t);
   2499     }
   2500 
   2501     static public void computeNativeCbrt(TestNativeCbrt.ArgumentsHalfHalf args, Target t) {
   2502         t.setPrecision(2, 2);
   2503         args.out = cbrt(args.inVDouble, t);
   2504     }
   2505 
   2506     static public void computeNativeCbrt(TestNativeCbrt.ArgumentsFloatFloat args, Target t) {
   2507         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2508         args.out = cbrt(args.inV, t);
   2509     }
   2510 
   2511     static public void computeNativeCos(TestNativeCos.ArgumentsHalfHalf args, Target t) {
   2512         t.setPrecision(0, 0); // extraAllowedError set in fw/rs/rs_math.spec and generated test files
   2513         args.out = cos(args.inVDouble, t);
   2514     }
   2515 
   2516     static public void computeNativeCos(TestNativeCos.ArgumentsFloatFloat args, Target t) {
   2517         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2518         args.out = cos(args.inV, t);
   2519     }
   2520 
   2521     static public void computeNativeCosh(TestNativeCosh.ArgumentsHalfHalf args, Target t) {
   2522         t.setPrecision(4, 4);
   2523         args.out = cosh(args.inVDouble, t);
   2524     }
   2525 
   2526     static public void computeNativeCosh(TestNativeCosh.ArgumentsFloatFloat args, Target t) {
   2527         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2528         args.out = cosh(args.inV, t);
   2529     }
   2530 
   2531     static public void computeNativeCospi(TestNativeCospi.ArgumentsHalfHalf args, Target t) {
   2532         t.setPrecision(0, 0); // extraAllowedError set in fw/rs/rs_math.spec and generated test files
   2533         args.out = cospi(args.inVDouble, t);
   2534     }
   2535 
   2536     static public void computeNativeCospi(TestNativeCospi.ArgumentsFloatFloat args, Target t) {
   2537         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2538         args.out = cospi(args.inV, t);
   2539     }
   2540 
   2541     static public void computeNativeDistance(TestNativeDistance.ArgumentsHalfHalfHalf args, Target t) {
   2542         t.setPrecision(1, 1);
   2543         args.out = distance(new double[] {args.inLeftVectorDouble},
   2544                             new double[] {args.inRightVectorDouble}, t);
   2545     }
   2546 
   2547     static public void computeNativeDistance(TestNativeDistance.ArgumentsHalfNHalfNHalf args, Target t) {
   2548         t.setPrecision(1, 1);
   2549         args.out = distance(args.inLeftVectorDouble, args.inRightVectorDouble, t);
   2550     }
   2551 
   2552     static public void computeNativeDistance(TestNativeDistance.ArgumentsFloatFloatFloat args, Target t) {
   2553         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2554         args.out = distance(new float[]{args.inLeftVector}, new float[]{args.inRightVector}, t);
   2555     }
   2556 
   2557     static public void computeNativeDistance(TestNativeDistance.ArgumentsFloatNFloatNFloat args, Target t) {
   2558         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2559         args.out = distance(args.inLeftVector, args.inRightVector, t);
   2560     }
   2561 
   2562     static public void computeNativeDivide(TestNativeDivide.ArgumentsHalfHalfHalf args, Target t) {
   2563         t.setPrecision(3, 3);
   2564         args.out = divide(args.inLeftVectorDouble, args.inRightVectorDouble, t);
   2565     }
   2566 
   2567     static public void computeNativeDivide(TestNativeDivide.ArgumentsFloatFloatFloat args, Target t) {
   2568         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2569         args.out = t.divide(t.new32(args.inLeftVector), t.new32(args.inRightVector));
   2570     }
   2571 
   2572     static public void computeNativeExp(TestNativeExp.ArgumentsHalfHalf args, Target t) {
   2573         t.setPrecision(3, 3);
   2574         args.out = exp(args.inVDouble, t);
   2575     }
   2576 
   2577     static public void computeNativeExp(TestNativeExp.ArgumentsFloatFloat args, Target t) {
   2578         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2579         args.out = exp(args.inV, t);
   2580     }
   2581 
   2582     static public void computeNativeExp10(TestNativeExp10.ArgumentsHalfHalf args, Target t) {
   2583         t.setPrecision(3, 3);
   2584         args.out = exp10(args.inVDouble, t);
   2585     }
   2586 
   2587     static public void computeNativeExp10(TestNativeExp10.ArgumentsFloatFloat args, Target t) {
   2588         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2589         args.out = exp10(args.inV, t);
   2590     }
   2591 
   2592     static public void computeNativeExp2(TestNativeExp2.ArgumentsHalfHalf args, Target t) {
   2593         t.setPrecision(3, 3);
   2594         args.out = exp2(args.inVDouble, t);
   2595     }
   2596 
   2597     static public void computeNativeExp2(TestNativeExp2.ArgumentsFloatFloat args, Target t) {
   2598         // TODO we would like to use NATIVE_PRECISION, NATIVE_PRECISION
   2599         t.setPrecision(13000, 13000);
   2600         args.out = exp2(args.inV, t);
   2601     }
   2602 
   2603     static public String verifyNativeExpm1(TestNativeExpm1.ArgumentsHalfHalf args, Target t) {
   2604         // Acceptable error for native_expm1 is:
   2605         //     < 2^-11 in [-Inf, 0.6]
   2606         //     3 ulp outside
   2607         double extraAllowedError = 0.;
   2608         int ulpFactor;
   2609         if (args.inVDouble < 0.6) {
   2610             ulpFactor = 0;
   2611             extraAllowedError = 0.00048828125; // 2^-11
   2612         } else {
   2613             ulpFactor = 3;
   2614         }
   2615         t.setPrecision(ulpFactor, ulpFactor);
   2616 
   2617         Target.Floaty expectedOut = expm1(args.inVDouble, t);
   2618         if (!expectedOut.couldBe(args.outDouble, extraAllowedError)) {
   2619             StringBuilder message = new StringBuilder();
   2620             message.append("Ulp Factor: " + Integer.toString(ulpFactor) + "\n");
   2621             message.append("Extra allowed error: " + Double.toString(extraAllowedError) + "\n");
   2622             message.append("Expected output out: " + expectedOut.toString() + "\n");
   2623             return message.toString();
   2624         }
   2625         return null;
   2626     }
   2627 
   2628     static public void computeNativeExpm1(TestNativeExpm1.ArgumentsFloatFloat args, Target t) {
   2629         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2630         args.out = expm1(args.inV, t);
   2631     }
   2632 
   2633     static public void computeNativeHypot(TestNativeHypot.ArgumentsHalfHalfHalf args, Target t) {
   2634         t.setPrecision(4, 4);
   2635         args.out = hypot(args.inADouble, args.inBDouble, t);
   2636     }
   2637 
   2638     static public void computeNativeHypot(TestNativeHypot.ArgumentsFloatFloatFloat args, Target t) {
   2639         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2640         args.out = hypot(args.inA, args.inB, t);
   2641     }
   2642 
   2643     static public void computeNativeLength(TestNativeLength.ArgumentsHalfHalf args, Target t) {
   2644         t.setPrecision(1, 1); // TODO double-check precision
   2645         args.out = length(new double[]{args.inVDouble}, t);
   2646     }
   2647 
   2648     static public void computeNativeLength(TestNativeLength.ArgumentsHalfNHalf args, Target t) {
   2649         t.setPrecision(1, 1); // TODO double-check precision
   2650         args.out = length(args.inVDouble, t);
   2651     }
   2652 
   2653     static public void computeNativeLength(TestNativeLength.ArgumentsFloatFloat args, Target t) {
   2654         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2655         args.out = length(new float[] {args.inV}, t);
   2656     }
   2657 
   2658     static public void computeNativeLength(TestNativeLength.ArgumentsFloatNFloat args, Target t) {
   2659         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2660         args.out = length(args.inV, t);
   2661     }
   2662 
   2663     static public void computeNativeLog(TestNativeLog.ArgumentsHalfHalf args, Target t) {
   2664         t.setPrecision(3, 3);
   2665         // http://b/27859722 Accept anything for zero.  Negative values don't get tested (see
   2666         // range() for this function in fw/rs/api/rs_math.spec.
   2667         if (Math.abs(args.inVDouble) < 1.e-20) {
   2668             args.out = any(t);
   2669         } else {
   2670             args.out = log(args.inVDouble, t);
   2671         }
   2672     }
   2673 
   2674     static public void computeNativeLog(TestNativeLog.ArgumentsFloatFloat args, Target t) {
   2675         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2676         // For very small values, allow anything.
   2677         if (Math.abs(args.inV) < 1.e-20) {
   2678             args.out = any32(t);
   2679         } else {
   2680             args.out = log(args.inV, t);
   2681         }
   2682     }
   2683 
   2684     static public void computeNativeLog10(TestNativeLog10.ArgumentsHalfHalf args, Target t) {
   2685         t.setPrecision(3, 3);
   2686         // http://b/27859722 Accept anything for zero.  Negative values don't get tested (see
   2687         // range() for this function in fw/rs/api/rs_math.spec.
   2688         if (Math.abs(args.inVDouble) < 1.e-20) {
   2689             args.out = any(t);
   2690         } else {
   2691             args.out = log10(args.inVDouble, t);
   2692         }
   2693     }
   2694 
   2695     static public void computeNativeLog10(TestNativeLog10.ArgumentsFloatFloat args, Target t) {
   2696         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2697         // For very small values, allow anything.
   2698         if (Math.abs(args.inV) < 1.e-20) {
   2699             args.out = any32(t);
   2700         } else {
   2701             args.out = log10(args.inV, t);
   2702         }
   2703     }
   2704 
   2705     static public void computeNativeLog1p(TestNativeLog1p.ArgumentsHalfHalf args, Target t) {
   2706         t.setPrecision(2, 2);
   2707         args.out = log1p(args.inVDouble, t);
   2708     }
   2709 
   2710     static public void computeNativeLog1p(TestNativeLog1p.ArgumentsFloatFloat args, Target t) {
   2711         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2712         args.out = log1p(args.inV, t);
   2713     }
   2714 
   2715     static public void computeNativeLog2(TestNativeLog2.ArgumentsHalfHalf args, Target t) {
   2716         t.setPrecision(3, 3);
   2717         // http://b/27859722 Accept anything for zero.  Negative values don't get tested (see
   2718         // range() for this function in fw/rs/api/rs_math.spec.
   2719         if (Math.abs(args.inVDouble) < 1.e-20) {
   2720             args.out = any(t);
   2721         } else {
   2722             args.out = log2(args.inVDouble, t);
   2723         }
   2724     }
   2725 
   2726     static public void computeNativeLog2(TestNativeLog2.ArgumentsFloatFloat args, Target t) {
   2727         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2728         // For very small values, allow anything.
   2729         if (Math.abs(args.inV) < 1.e-20) {
   2730             args.out = any32(t);
   2731         } else {
   2732             args.out = log2(args.inV, t);
   2733         }
   2734     }
   2735 
   2736     static public void computeNativeNormalize(TestNativeNormalize.ArgumentsHalfHalf args, Target t) {
   2737         t.setPrecision(1, 1); // TODO double-check precision
   2738         Target.Floaty[] out = new Target.Floaty[1];
   2739         normalize(new double[] {args.inVDouble}, out, t);
   2740         args.out = out[0];
   2741     }
   2742 
   2743     static public void computeNativeNormalize(TestNativeNormalize.ArgumentsHalfNHalfN args, Target t) {
   2744         t.setPrecision(1, 16); // TODO double-check precision.  Extra precision needed by libclcore.
   2745         normalize(args.inVDouble, args.out, t);
   2746     }
   2747 
   2748     static public void computeNativeNormalize(TestNativeNormalize.ArgumentsFloatFloat args, Target t) {
   2749         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2750         Target.Floaty[] out = new Target.Floaty[1];
   2751         normalize(new float[] {args.inV}, out, t);
   2752         args.out = out[0];
   2753     }
   2754 
   2755     static public void computeNativeNormalize(TestNativeNormalize.ArgumentsFloatNFloatN args, Target t) {
   2756         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2757         normalize(args.inV, args.out, t);
   2758     }
   2759 
   2760     static public void computeNativePowr(TestNativePowr.ArgumentsHalfHalfHalf args, Target t) {
   2761         t.setPrecision(16, 16);
   2762         // http://b/27859722 Accept anything for zero.  Negative values don't get tested (see
   2763         // range() for this function in fw/rs/api/rs_math.spec.
   2764         if (Math.abs(args.inBaseDouble) < 1.e-20) {
   2765             args.out = any(t);
   2766         } else {
   2767             args.out = pow(args.inBaseDouble, args.inExponentDouble, t);
   2768         }
   2769     }
   2770 
   2771     static public void computeNativePowr(TestNativePowr.ArgumentsFloatFloatFloat args, Target t) {
   2772         // TODO we would like to use NATIVE_PRECISION, NATIVE_PRECISION
   2773         t.setPrecision(32000, 32000);
   2774         // For very small values, allow anything.
   2775         if (Math.abs(args.inBase) < 1.e-20) {
   2776             args.out = any32(t);
   2777         } else {
   2778             args.out = powr(args.inBase, args.inExponent, t);
   2779         }
   2780     }
   2781 
   2782     static public void computeNativeRecip(TestNativeRecip.ArgumentsHalfHalf args, Target t) {
   2783         t.setPrecision(3, 3);
   2784         args.out = recip(args.inVDouble, t);
   2785     }
   2786 
   2787     static public void computeNativeRecip(TestNativeRecip.ArgumentsFloatFloat args, Target t) {
   2788         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2789         args.out = recip(args.inV, t);
   2790     }
   2791 
   2792     static public void computeNativeRootn(TestNativeRootn.ArgumentsFloatIntFloat args, Target t) {
   2793         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2794         // Allow anything for zero.
   2795         if (args.inN == 0) {
   2796             args.out = any32(t);
   2797         } else {
   2798             args.out = rootn(args.inV, args.inN, t);
   2799         }
   2800     }
   2801 
   2802     static public void computeNativeRsqrt(TestNativeRsqrt.ArgumentsHalfHalf args, Target t) {
   2803         t.setPrecision(2, 2);
   2804         args.out = rsqrt(args.inVDouble, t);
   2805     }
   2806 
   2807     static public void computeNativeRsqrt(TestNativeRsqrt.ArgumentsFloatFloat args, Target t) {
   2808         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2809         args.out = rsqrt(args.inV, t);
   2810     }
   2811 
   2812     static public void computeNativeSin(TestNativeSin.ArgumentsHalfHalf args, Target t) {
   2813         t.setPrecision(0, 0); // extraAllowedError set in fw/rs/rs_math.spec and generated test files
   2814         args.out = sin(args.inVDouble, t);
   2815     }
   2816 
   2817     static public void computeNativeSin(TestNativeSin.ArgumentsFloatFloat args, Target t) {
   2818         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2819         args.out = sin(args.inV, t);
   2820     }
   2821 
   2822     static public void computeNativeSincos(TestNativeSincos.ArgumentsHalfHalfHalf args, Target t) {
   2823         t.setPrecision(0, 0); // extraAllowedError set in fw/rs/rs_math.spec and generated test files
   2824         args.outCos = cos(args.inVDouble, t);
   2825         args.out = sin(args.inVDouble, t);
   2826     }
   2827 
   2828     static public void computeNativeSincos(TestNativeSincos.ArgumentsFloatFloatFloat args, Target t) {
   2829         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2830         args.outCos = cos(args.inV, t);
   2831         args.out = sin(args.inV, t);
   2832     }
   2833 
   2834     static public void computeNativeSinh(TestNativeSinh.ArgumentsHalfHalf args, Target t) {
   2835         t.setPrecision(4, 4);
   2836         args.out = sinh(args.inVDouble, t);
   2837     }
   2838 
   2839     static public void computeNativeSinh(TestNativeSinh.ArgumentsFloatFloat args, Target t) {
   2840         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2841         args.out = sinh(args.inV, t);
   2842     }
   2843 
   2844     static public void computeNativeSinpi(TestNativeSinpi.ArgumentsHalfHalf args, Target t) {
   2845         t.setPrecision(0, 0); // extraAllowedError set in fw/rs/rs_math.spec and generated test files
   2846         args.out = sinpi(args.inVDouble, t);
   2847     }
   2848 
   2849     static public void computeNativeSinpi(TestNativeSinpi.ArgumentsFloatFloat args, Target t) {
   2850         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2851         args.out = sinpi(args.inV, t);
   2852     }
   2853 
   2854     static public void computeNativeSqrt(TestNativeSqrt.ArgumentsHalfHalf args, Target t) {
   2855         t.setPrecision(3, 3);
   2856         args.out = sqrt(args.inVDouble, t);
   2857     }
   2858 
   2859     static public void computeNativeSqrt(TestNativeSqrt.ArgumentsFloatFloat args, Target t) {
   2860         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2861         args.out = sqrt(args.inV, t);
   2862     }
   2863 
   2864     static public String verifyNativeTan(TestNativeTan.ArgumentsHalfHalf args, Target t) {
   2865         // Precision for native_tan is as follows:
   2866         //     For integral n:
   2867         //         8 ulp in [(n-0.45) pi, (n+0.45) pi]
   2868         //         2048 ulp in [(n+0.45) pi, (n+0.55) pi]"
   2869 
   2870         // Compute the fractional part of args.inVDouble / pi
   2871         double absoluteValueOverPi = Math.abs(args.inVDouble) / Math.PI;
   2872         double fract = absoluteValueOverPi - Math.floor(absoluteValueOverPi);
   2873 
   2874         int ulpFactor;
   2875         if (0.45 <= fract && fract <= 0.55) {
   2876             ulpFactor = 2048;
   2877         } else {
   2878             ulpFactor = 8;
   2879         }
   2880         t.setPrecision(ulpFactor, ulpFactor);
   2881 
   2882         Target.Floaty expectedOut = tan(args.inVDouble, t);
   2883         if (!expectedOut.couldBe(args.outDouble)) {
   2884             StringBuilder message = new StringBuilder();
   2885             message.append("Ulp Factor: " + Integer.toString(ulpFactor) + "\n");
   2886             message.append("Expected output out: " + expectedOut.toString() + "\n");
   2887             return message.toString();
   2888         }
   2889 
   2890         return null;
   2891     }
   2892 
   2893     static public void computeNativeTan(TestNativeTan.ArgumentsFloatFloat args, Target t) {
   2894         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2895         args.out = tan(args.inV, t);
   2896     }
   2897 
   2898     static public void computeNativeTanh(TestNativeTanh.ArgumentsHalfHalf args, Target t) {
   2899         t.setPrecision(5, 5);
   2900         args.out = tanh(args.inVDouble, t);
   2901     }
   2902 
   2903     static public void computeNativeTanh(TestNativeTanh.ArgumentsFloatFloat args, Target t) {
   2904         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2905         args.out = tanh(args.inV, t);
   2906     }
   2907 
   2908     static public String verifyNativeTanpi(TestNativeTanpi.ArgumentsHalfHalf args, Target t) {
   2909         // Precision for native_tan is as follows:
   2910         //     For integral n:
   2911         //         8 ulp in [(n-0.45), (n+0.45)]
   2912         //         2048 ulp in [(n+0.45), (n+0.55)]"
   2913 
   2914         // Compute the fractional part of args.inVDouble
   2915         double absoluteValue = Math.abs(args.inVDouble);
   2916         double fract = absoluteValue - Math.floor(absoluteValue);
   2917 
   2918         int ulpFactor;
   2919         if (0.45 <= fract && fract <= 0.55) {
   2920             ulpFactor = 2048;
   2921         } else {
   2922             ulpFactor = 8;
   2923         }
   2924         t.setPrecision(ulpFactor, ulpFactor);
   2925 
   2926         Target.Floaty expectedOut = tanpi(args.inVDouble, t);
   2927         if (!expectedOut.couldBe(args.outDouble)) {
   2928             StringBuilder message = new StringBuilder();
   2929             message.append("Ulp Factor: " + Integer.toString(ulpFactor) + "\n");
   2930             message.append("Expected output out: " + expectedOut.toString() + "\n");
   2931             return message.toString();
   2932         }
   2933 
   2934         return null;
   2935     }
   2936 
   2937     static public void computeNativeTanpi(TestNativeTanpi.ArgumentsFloatFloat args, Target t) {
   2938         t.setPrecision(NATIVE_PRECISION, NATIVE_PRECISION);
   2939         args.out = tanpi(args.inV, t);
   2940     }
   2941 
   2942     static public void computeNextafter(TestNextafter.ArgumentsFloatFloatFloat args, Target t) {
   2943         t.setPrecision(0, 0);
   2944         args.out = t.new32(Math.nextAfter(args.inV, args.inTarget));
   2945     }
   2946 
   2947     static public void computeNormalize(TestNormalize.ArgumentsHalfHalf args, Target t) {
   2948         t.setPrecision(1, 1); // TODO double-check precision
   2949         Target.Floaty[] out = new Target.Floaty[1];
   2950         normalize(new double[] {args.inVDouble}, out, t);
   2951         args.out = out[0];
   2952     }
   2953 
   2954     static public void computeNormalize(TestNormalize.ArgumentsHalfNHalfN args, Target t) {
   2955         t.setPrecision(1, 1); // TODO double-check precision
   2956         normalize(args.inVDouble, args.out, t);
   2957     }
   2958 
   2959     static public void computeNormalize(TestNormalize.ArgumentsFloatFloat args, Target t) {
   2960         t.setPrecision(1, 1);
   2961         Target.Floaty[] out = new Target.Floaty[1];
   2962         normalize(new float[] {args.inV}, out, t);
   2963         args.out = out[0];
   2964     }
   2965 
   2966     static public void computeNormalize(TestNormalize.ArgumentsFloatNFloatN args, Target t) {
   2967         t.setPrecision(1, 1);
   2968         normalize(args.inV, args.out, t);
   2969     }
   2970 
   2971     static public void computePow(TestPow.ArgumentsHalfHalfHalf args, Target t) {
   2972         t.setPrecision(16, 16);
   2973         args.out = pow(args.inBaseDouble, args.inExponentDouble, t);
   2974     }
   2975 
   2976     static public void computePow(TestPow.ArgumentsFloatFloatFloat args, Target t) {
   2977         t.setPrecision(16, 128);
   2978         Target.Floaty base = t.new32(args.inBase);
   2979         Target.Floaty exponent = t.new32(args.inExponent);
   2980         args.out = t.new32(
   2981             pow(base.mid32(), exponent.mid32()),
   2982             pow(base.min32(), exponent.min32()),
   2983             pow(base.min32(), exponent.max32()),
   2984             pow(base.max32(), exponent.min32()),
   2985             pow(base.max32(), exponent.max32()));
   2986     }
   2987 
   2988     static public void computePown(TestPown.ArgumentsHalfIntHalf args, Target t) {
   2989         t.setPrecision(16, 16);
   2990         args.out = pow(args.inBaseDouble, (double) args.inExponent, t);
   2991     }
   2992 
   2993     static public void computePown(TestPown.ArgumentsFloatIntFloat args, Target t) {
   2994         t.setPrecision(16, 128);
   2995         Target.Floaty in = t.new32(args.inBase);
   2996         // We use double for the calculations because floats does not have enough
   2997         // mantissa bits.  Knowing if an int is odd or even will matter for negative
   2998         // numbers.  Using a float loses the lowest bit.
   2999         final double y = (double) args.inExponent;
   3000         args.out = t.new32(
   3001             (float) Math.pow(in.mid32(), y),
   3002             (float) Math.pow(in.min32(), y),
   3003             (float) Math.pow(in.max32(), y));
   3004     }
   3005 
   3006     static public void computePowr(TestPowr.ArgumentsHalfHalfHalf args, Target t) {
   3007         t.setPrecision(16, 16);
   3008         args.out = pow(args.inBaseDouble, args.inExponentDouble, t);
   3009     }
   3010 
   3011     static public void computePowr(TestPowr.ArgumentsFloatFloatFloat args, Target t) {
   3012         t.setPrecision(16, 128);
   3013         args.out = powr(args.inBase, args.inExponent, t);
   3014     }
   3015 
   3016     static public void computeRadians(TestRadians.ArgumentsHalfHalf args, Target t) {
   3017         t.setPrecision(3, 3);
   3018         args.out = radians(args.inVDouble, t);
   3019     }
   3020 
   3021     static public void computeRadians(TestRadians.ArgumentsFloatFloat args, Target t) {
   3022         t.setPrecision(3, 3);
   3023         Target.Floaty in = t.new32(args.inV);
   3024         Target.Floaty k = t.new32((float)(Math.PI / 180.0));
   3025         args.out = t.multiply(in, k);
   3026     }
   3027 
   3028     // NOTE: This function delegates to the floating-point version in libm.  Need to switch to the
   3029     // double-precision version later.
   3030     static public void computeRemainder(TestRemainder.ArgumentsHalfHalfHalf args, Target t) {
   3031         t.setPrecision(0, 0);
   3032         RemquoResult result = remquo((float) args.inNumeratorDouble,
   3033             (float) args.inDenominatorDouble);
   3034         args.out = t.newFloaty(result.remainder);
   3035     }
   3036 
   3037     static public void computeRemainder(TestRemainder.ArgumentsFloatFloatFloat args, Target t) {
   3038         t.setPrecision(0, 0);
   3039         RemquoResult result = remquo(args.inNumerator, args.inDenominator);
   3040         args.out = t.new32(result.remainder);
   3041     }
   3042 
   3043     static public String verifyRemquo(TestRemquo.ArgumentsFloatFloatIntFloat args, Target t) {
   3044         t.setPrecision(0, 0);
   3045         RemquoResult expected = remquo(args.inNumerator, args.inDenominator);
   3046         // If the expected remainder is NaN, we don't validate the quotient.  It's because of
   3047         // a division by zero.
   3048         if (Float.isNaN(expected.remainder)) {
   3049             // Check that the value we got is NaN too.
   3050             if (!Float.isNaN(args.out)) {
   3051                 return "Expected a remainder of NaN but got " +  Float.toString(args.out);
   3052             }
   3053         } else {
   3054             // The quotient should have the same lowest three bits.
   3055             if ((args.outQuotient & 0x07) != (expected.quotient & 0x07)) {
   3056                 return "Quotient returned " +  Integer.toString(args.outQuotient) +
   3057                     " does not have the same lower three bits as the expected " +
   3058                     Integer.toString(expected.quotient);
   3059             }
   3060             Target.Floaty remainder = t.new32(expected.remainder);
   3061             if (!remainder.couldBe(args.out)) {
   3062                 return "Remainder returned " + Float.toString(args.out) +
   3063                     " is not similar to the expected " +
   3064                     remainder.toString();
   3065             }
   3066         }
   3067         return null;
   3068     }
   3069 
   3070     static public void computeRint(TestRint.ArgumentsHalfHalf args, Target t) {
   3071         t.setPrecision(0, 0);
   3072         args.out = rint(args.inVDouble, t);
   3073     }
   3074 
   3075     static public void computeRint(TestRint.ArgumentsFloatFloat args, Target t) {
   3076         t.setPrecision(0, 0);
   3077         Target.Floaty in = t.new32(args.inV);
   3078         args.out = t.new32(
   3079             rint(in.mid32()),
   3080             rint(in.min32()),
   3081             rint(in.max32()));
   3082     }
   3083 
   3084     static public void computeRootn(TestRootn.ArgumentsFloatIntFloat args, Target t) {
   3085         t.setPrecision(16, 16);
   3086         args.out = rootn(args.inV, args.inN, t);
   3087     }
   3088 
   3089     static public void computeRound(TestRound.ArgumentsHalfHalf args, Target t) {
   3090         t.setPrecision(0, 0);
   3091         args.out = round(args.inVDouble, t);
   3092     }
   3093 
   3094     static public void computeRound(TestRound.ArgumentsFloatFloat args, Target t) {
   3095         t.setPrecision(0, 0);
   3096         Target.Floaty in = t.new32(args.inV);
   3097         args.out = t.new32(
   3098             round(in.mid32()),
   3099             round(in.min32()),
   3100             round(in.max32()));
   3101     }
   3102 
   3103     static public void computeRsqrt(TestRsqrt.ArgumentsHalfHalf args, Target t) {
   3104         t.setPrecision(2, 2);
   3105         args.out = rsqrt(args.inVDouble, t);
   3106     }
   3107 
   3108     static public void computeRsqrt(TestRsqrt.ArgumentsFloatFloat args, Target t) {
   3109         t.setPrecision(2, 2);
   3110         args.out = rsqrt(args.inV, t);
   3111     }
   3112 
   3113     static public void computeSign(TestSign.ArgumentsHalfHalf args, Target t) {
   3114         t.setPrecision(0, 0);
   3115         args.out = t.newFloaty(Math.signum(args.inVDouble));
   3116     }
   3117 
   3118     static public void computeSign(TestSign.ArgumentsFloatFloat args, Target t) {
   3119         t.setPrecision(0, 0);
   3120         args.out = t.new32(Math.signum(args.inV));
   3121     }
   3122 
   3123     static public void computeSin(TestSin.ArgumentsHalfHalf args, Target t) {
   3124         t.setPrecision(4, 4);
   3125         args.out = sin(args.inVDouble, t);
   3126     }
   3127 
   3128     static public void computeSin(TestSin.ArgumentsFloatFloat args, Target t) {
   3129         t.setPrecision(4, 128);
   3130         args.out = sin(args.inV, t);
   3131     }
   3132 
   3133     static public void computeSincos(TestSincos.ArgumentsHalfHalfHalf args, Target t) {
   3134         t.setPrecision(4, 128);
   3135         args.outCos = cos(args.inVDouble, t );
   3136         args.out = sin(args.inVDouble, t);
   3137     }
   3138 
   3139     static public void computeSincos(TestSincos.ArgumentsFloatFloatFloat args, Target t) {
   3140         t.setPrecision(4, 128);
   3141         args.outCos = cos(args.inV,t );
   3142         args.out = sin(args.inV, t);
   3143     }
   3144 
   3145     static public void computeSinh(TestSinh.ArgumentsHalfHalf args, Target t) {
   3146         t.setPrecision(4, 4);
   3147         args.out = sinh(args.inVDouble, t);
   3148     }
   3149 
   3150     static public void computeSinh(TestSinh.ArgumentsFloatFloat args, Target t) {
   3151         t.setPrecision(4, 128);
   3152         args.out = sinh(args.inV, t);
   3153     }
   3154 
   3155     static public void computeSinpi(TestSinpi.ArgumentsHalfHalf args, Target t) {
   3156         t.setPrecision(4, 4);
   3157         args.out = sinpi(args.inVDouble, t);
   3158     }
   3159 
   3160     static public void computeSinpi(TestSinpi.ArgumentsFloatFloat args, Target t) {
   3161         t.setPrecision(4, 128);
   3162         args.out = sinpi(args.inV, t);
   3163     }
   3164 
   3165     static public void computeSqrt(TestSqrt.ArgumentsHalfHalf args, Target t) {
   3166         t.setPrecision(3, 3);
   3167         args.out = sqrt(args.inVDouble, t);
   3168     }
   3169 
   3170     static public void computeSqrt(TestSqrt.ArgumentsFloatFloat args, Target t) {
   3171         t.setPrecision(3, 3);
   3172         args.out = sqrt(args.inV, t);
   3173     }
   3174 
   3175     static public void computeStep(TestStep.ArgumentsHalfHalfHalf args, Target t) {
   3176         t.setPrecision(0, 0);
   3177         args.out = step(args.inVDouble, args.inEdgeDouble, t);
   3178     }
   3179 
   3180     static public void computeStep(TestStep.ArgumentsFloatFloatFloat args, Target t) {
   3181         t.setPrecision(0, 0);
   3182         args.out = t.new32(args.inV < args.inEdge ? 0.f : 1.f);
   3183     }
   3184 
   3185     static public void computeTan(TestTan.ArgumentsHalfHalf args, Target t) {
   3186         t.setPrecision(5, 5);
   3187         args.out = tan(args.inVDouble, t);
   3188     }
   3189 
   3190     static public void computeTan(TestTan.ArgumentsFloatFloat args, Target t) {
   3191         t.setPrecision(5, 128);
   3192         args.out = tan(args.inV, t);
   3193     }
   3194 
   3195     static public void computeTanh(TestTanh.ArgumentsHalfHalf args, Target t) {
   3196         t.setPrecision(5, 5);
   3197         args.out = tanh(args.inVDouble, t);
   3198     }
   3199 
   3200     static public void computeTanh(TestTanh.ArgumentsFloatFloat args, Target t) {
   3201         t.setPrecision(5, 128);
   3202         args.out = tanh(args.inV, t);
   3203     }
   3204 
   3205     static public void computeTanpi(TestTanpi.ArgumentsHalfHalf args, Target t) {
   3206         t.setPrecision(4, 4);
   3207         args.out = tanpi(args.inVDouble, t);
   3208     }
   3209 
   3210     static public void computeTanpi(TestTanpi.ArgumentsFloatFloat args, Target t) {
   3211         t.setPrecision(4, 128);
   3212         args.out = tanpi(args.inV, t);
   3213     }
   3214 
   3215     static public void computeTgamma(TestTgamma.ArgumentsHalfHalf args, Target t) {
   3216         t.setPrecision(16, 16);
   3217         args.out = tgamma(args.inVDouble, t);
   3218     }
   3219 
   3220     static public void computeTgamma(TestTgamma.ArgumentsFloatFloat args, Target t) {
   3221         t.setPrecision(16, 128);
   3222         Target.Floaty in = t.new32(args.inV);
   3223         args.out = t.new32(
   3224             tgamma(in.mid32()),
   3225             tgamma(in.min32()),
   3226             tgamma(in.max32()));
   3227     }
   3228 
   3229     static public void computeTrunc(TestTrunc.ArgumentsHalfHalf args, Target t) {
   3230         t.setPrecision(0, 0);
   3231         args.out = trunc(args.inVDouble, t);
   3232     }
   3233 
   3234     static public void computeTrunc(TestTrunc.ArgumentsFloatFloat args, Target t) {
   3235         t.setPrecision(0, 0);
   3236         Target.Floaty in = t.new32(args.inV);
   3237         args.out = t.new32(
   3238             trunc(in.mid32()),
   3239             trunc(in.min32()),
   3240             trunc(in.max32()));
   3241     }
   3242 }
   3243