Home | History | Annotate | Download | only in gglmul
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *  * Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  *  * Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in
     12  *    the documentation and/or other materials provided with the
     13  *    distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 
     29 #include <stdio.h>
     30 #include <stdint.h>
     31 #include <inttypes.h>
     32 
     33 #include "private/pixelflinger/ggl_fixed.h"
     34 
     35 // gglClampx() tests
     36 struct gglClampx_test_t
     37 {
     38     GGLfixed input;
     39     GGLfixed output;
     40 };
     41 
     42 gglClampx_test_t gglClampx_tests[] =
     43 {
     44     {FIXED_ONE + 1, FIXED_ONE},
     45     {FIXED_ONE, FIXED_ONE},
     46     {FIXED_ONE - 1, FIXED_ONE - 1},
     47     {1, 1},
     48     {0, 0},
     49     {FIXED_MIN,0}
     50 };
     51 
     52 void gglClampx_test()
     53 {
     54     uint32_t i;
     55 
     56     printf("Testing gglClampx\n");
     57     for(i = 0; i < sizeof(gglClampx_tests)/sizeof(gglClampx_test_t); ++i)
     58     {
     59         gglClampx_test_t *test = &gglClampx_tests[i];
     60         printf("Test input=0x%08x output=0x%08x :",
     61                 test->input, test->output);
     62         if(gglClampx(test->input) == test->output)
     63             printf("Passed\n");
     64         else
     65             printf("Failed\n");
     66     }
     67 }
     68 
     69 // gglClz() tests
     70 struct gglClz_test_t
     71 {
     72     GGLfixed input;
     73     GGLfixed output;
     74 };
     75 
     76 gglClz_test_t gglClz_tests[] =
     77 {
     78     {0, 32},
     79     {1, 31},
     80     {-1,0}
     81 };
     82 
     83 void gglClz_test()
     84 {
     85     uint32_t i;
     86 
     87     printf("Testing gglClz\n");
     88     for(i = 0; i < sizeof(gglClz_tests)/sizeof(gglClz_test_t); ++i)
     89     {
     90         gglClz_test_t *test = &gglClz_tests[i];
     91         printf("Test input=0x%08x output=%2d :", test->input, test->output);
     92         if(gglClz(test->input) == test->output)
     93             printf("Passed\n");
     94         else
     95             printf("Failed\n");
     96     }
     97 }
     98 
     99 // gglMulx() tests
    100 struct gglMulx_test_t
    101 {
    102     GGLfixed x;
    103     GGLfixed y;
    104     int      shift;
    105 };
    106 
    107 gglMulx_test_t gglMulx_tests[] =
    108 {
    109     {1,1,1},
    110     {0,1,1},
    111     {FIXED_ONE,FIXED_ONE,16},
    112     {FIXED_MIN,FIXED_MAX,16},
    113     {FIXED_MAX,FIXED_MAX,16},
    114     {FIXED_MIN,FIXED_MIN,16},
    115     {FIXED_HALF,FIXED_ONE,16},
    116     {FIXED_MAX,FIXED_MAX,31},
    117     {FIXED_ONE,FIXED_MAX,31}
    118 };
    119 
    120 void gglMulx_test()
    121 {
    122     uint32_t i;
    123     GGLfixed actual, expected;
    124 
    125     printf("Testing gglMulx\n");
    126     for(i = 0; i < sizeof(gglMulx_tests)/sizeof(gglMulx_test_t); ++i)
    127     {
    128         gglMulx_test_t *test = &gglMulx_tests[i];
    129         printf("Test x=0x%08x y=0x%08x shift=%2d :",
    130                 test->x, test->y, test->shift);
    131         actual = gglMulx(test->x, test->y, test->shift);
    132         expected =
    133           ((int64_t)test->x * test->y + (1 << (test->shift-1))) >> test->shift;
    134     if(actual == expected)
    135         printf(" Passed\n");
    136     else
    137         printf(" Failed Actual(0x%08x) Expected(0x%08x)\n",
    138                actual, expected);
    139     }
    140 }
    141 // gglMulAddx() tests
    142 struct gglMulAddx_test_t
    143 {
    144     GGLfixed x;
    145     GGLfixed y;
    146     int      shift;
    147     GGLfixed a;
    148 };
    149 
    150 gglMulAddx_test_t gglMulAddx_tests[] =
    151 {
    152     {1,2,1,1},
    153     {0,1,1,1},
    154     {FIXED_ONE,FIXED_ONE,16, 0},
    155     {FIXED_MIN,FIXED_MAX,16, FIXED_HALF},
    156     {FIXED_MAX,FIXED_MAX,16, FIXED_MIN},
    157     {FIXED_MIN,FIXED_MIN,16, FIXED_MAX},
    158     {FIXED_HALF,FIXED_ONE,16,FIXED_ONE},
    159     {FIXED_MAX,FIXED_MAX,31, FIXED_HALF},
    160     {FIXED_ONE,FIXED_MAX,31, FIXED_HALF}
    161 };
    162 
    163 void gglMulAddx_test()
    164 {
    165     uint32_t i;
    166     GGLfixed actual, expected;
    167 
    168     printf("Testing gglMulAddx\n");
    169     for(i = 0; i < sizeof(gglMulAddx_tests)/sizeof(gglMulAddx_test_t); ++i)
    170     {
    171         gglMulAddx_test_t *test = &gglMulAddx_tests[i];
    172         printf("Test x=0x%08x y=0x%08x shift=%2d a=0x%08x :",
    173                 test->x, test->y, test->shift, test->a);
    174         actual = gglMulAddx(test->x, test->y,test->a, test->shift);
    175         expected = (((int64_t)test->x * test->y) >> test->shift) + test->a;
    176 
    177         if(actual == expected)
    178             printf(" Passed\n");
    179         else
    180             printf(" Failed Actual(0x%08x) Expected(0x%08x)\n",
    181                     actual, expected);
    182     }
    183 }
    184 // gglMulSubx() tests
    185 struct gglMulSubx_test_t
    186 {
    187     GGLfixed x;
    188     GGLfixed y;
    189     int      shift;
    190     GGLfixed a;
    191 };
    192 
    193 gglMulSubx_test_t gglMulSubx_tests[] =
    194 {
    195     {1,2,1,1},
    196     {0,1,1,1},
    197     {FIXED_ONE,FIXED_ONE,16, 0},
    198     {FIXED_MIN,FIXED_MAX,16, FIXED_HALF},
    199     {FIXED_MAX,FIXED_MAX,16, FIXED_MIN},
    200     {FIXED_MIN,FIXED_MIN,16, FIXED_MAX},
    201     {FIXED_HALF,FIXED_ONE,16,FIXED_ONE},
    202     {FIXED_MAX,FIXED_MAX,31, FIXED_HALF},
    203     {FIXED_ONE,FIXED_MAX,31, FIXED_HALF}
    204 };
    205 
    206 void gglMulSubx_test()
    207 {
    208     uint32_t i;
    209     GGLfixed actual, expected;
    210 
    211     printf("Testing gglMulSubx\n");
    212     for(i = 0; i < sizeof(gglMulSubx_tests)/sizeof(gglMulSubx_test_t); ++i)
    213     {
    214         gglMulSubx_test_t *test = &gglMulSubx_tests[i];
    215         printf("Test x=0x%08x y=0x%08x shift=%2d a=0x%08x :",
    216                 test->x, test->y, test->shift, test->a);
    217         actual = gglMulSubx(test->x, test->y, test->a, test->shift);
    218         expected = (((int64_t)test->x * test->y) >> test->shift) - test->a;
    219 
    220         if(actual == expected)
    221             printf(" Passed\n");
    222         else
    223             printf(" Failed Actual(0x%08x) Expected(0x%08x)\n",
    224                 actual, expected);
    225     }
    226 }
    227 
    228 // gglMulii() tests
    229 
    230 struct gglMulii_test_t
    231 {
    232     int32_t x;
    233     int32_t y;
    234 };
    235 
    236 gglMulii_test_t gglMulii_tests[] =
    237 {
    238     {1,INT32_MIN},
    239     {1,INT32_MAX},
    240     {0,INT32_MIN},
    241     {0,INT32_MAX},
    242     {INT32_MIN, INT32_MAX},
    243     {INT32_MAX, INT32_MIN},
    244     {INT32_MIN, INT32_MIN},
    245     {INT32_MAX, INT32_MAX}
    246 };
    247 
    248 void gglMulii_test()
    249 {
    250     uint32_t i;
    251     int64_t actual, expected;
    252 
    253     printf("Testing gglMulii\n");
    254     for(i = 0; i < sizeof(gglMulii_tests)/sizeof(gglMulii_test_t); ++i)
    255     {
    256         gglMulii_test_t *test = &gglMulii_tests[i];
    257         printf("Test x=0x%08x y=0x%08x :", test->x, test->y);
    258         actual = gglMulii(test->x, test->y);
    259         expected = ((int64_t)test->x * test->y);
    260 
    261         if(actual == expected)
    262             printf(" Passed\n");
    263         else
    264             printf(" Failed Actual(%" PRId64 ") Expected(%" PRId64 ")\n",
    265                     actual, expected);
    266     }
    267 }
    268 
    269 int main(int /*argc*/, char** /*argv*/)
    270 {
    271     gglClampx_test();
    272     gglClz_test();
    273     gglMulx_test();
    274     gglMulAddx_test();
    275     gglMulSubx_test();
    276     gglMulii_test();
    277     return 0;
    278 }
    279