rsimd

Make SIMD instruction sets easier to use
git clone git://git.meso-star.fr/rsimd.git
Log | Files | Refs | README | LICENSE

test_v4f.c (18963B)


      1 /* Copyright (C) 2014-2019, 2021, 2023, 2025 Vincent Forest (vaplv@free.fr)
      2  *
      3  * The RSIMD library is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published
      5  * by the Free Software Foundation, either version 3 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * The RSIMD library is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with the RSIMD library. If not, see <http://www.gnu.org/licenses/>. */
     15 
     16 #include "rsimd.h"
     17 #include "math.h"
     18 
     19 int
     20 main(int argc, char** argv)
     21 {
     22   union { int32_t i[4]; float f[4]; } cast;
     23   v4f_T i, j, k;
     24   v4i_T l;
     25   ALIGN(16) float tmp[5] = { 0.f, 1.f, 2.f, 3.f, 4.f };
     26   (void)argc, (void)argv;
     27 
     28   i = v4f_loadu(tmp+1);
     29   CHK(v4f_x(i) == 1.f);
     30   CHK(v4f_y(i) == 2.f);
     31   CHK(v4f_z(i) == 3.f);
     32   CHK(v4f_w(i) == 4.f);
     33 
     34   i = v4f_loadu3(tmp);
     35   CHK(v4f_x(i) == 0.f);
     36   CHK(v4f_y(i) == 1.f);
     37   CHK(v4f_z(i) == 2.f);
     38 
     39   i = v4f_load(tmp);
     40   CHK(v4f_x(i) == 0.f);
     41   CHK(v4f_y(i) == 1.f);
     42   CHK(v4f_z(i) == 2.f);
     43   CHK(v4f_w(i) == 3.f);
     44 
     45   tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0.f;
     46   CHK(v4f_store(tmp, i) == tmp);
     47   CHK(tmp[0] == 0.f);
     48   CHK(tmp[1] == 1.f);
     49   CHK(tmp[2] == 2.f);
     50   CHK(tmp[3] == 3.f);
     51 
     52   i = v4f_set(1.f, 2.f, 3.f, 4.f);
     53   CHK(v4f_x(i) == 1.f);
     54   CHK(v4f_y(i) == 2.f);
     55   CHK(v4f_z(i) == 3.f);
     56   CHK(v4f_w(i) == 4.f);
     57 
     58   i = v4f_set1(-2.f);
     59   CHK(v4f_x(i) == -2.f);
     60   CHK(v4f_y(i) == -2.f);
     61   CHK(v4f_z(i) == -2.f);
     62   CHK(v4f_w(i) == -2.f);
     63 
     64   i = v4f_zero();
     65   CHK(v4f_x(i) == 0.f);
     66   CHK(v4f_y(i) == 0.f);
     67   CHK(v4f_z(i) == 0.f);
     68   CHK(v4f_w(i) == 0.f);
     69 
     70   i = v4f_mask(~0, 0, ~0, ~0);
     71   cast.f[0] = v4f_x(i); CHK(cast.i[0] == (int32_t)0xFFFFFFFF);
     72   cast.f[1] = v4f_y(i); CHK(cast.i[1] == (int32_t)0x00000000);
     73   cast.f[2] = v4f_z(i); CHK(cast.i[2] == (int32_t)0xFFFFFFFF);
     74   cast.f[3] = v4f_w(i); CHK(cast.i[3] == (int32_t)0xFFFFFFFF);
     75 
     76   i = v4f_mask1(8);
     77   cast.f[0] = v4f_x(i); CHK(cast.i[0] == 8);
     78   cast.f[1] = v4f_y(i); CHK(cast.i[1] == 8);
     79   cast.f[2] = v4f_z(i); CHK(cast.i[2] == 8);
     80   cast.f[3] = v4f_w(i); CHK(cast.i[3] == 8);
     81 
     82   i = v4f_true();
     83   cast.f[0] = v4f_x(i); CHK(cast.i[0] == (int32_t)0xFFFFFFFF);
     84   cast.f[1] = v4f_y(i); CHK(cast.i[1] == (int32_t)0xFFFFFFFF);
     85   cast.f[2] = v4f_z(i); CHK(cast.i[2] == (int32_t)0xFFFFFFFF);
     86   cast.f[3] = v4f_w(i); CHK(cast.i[3] == (int32_t)0xFFFFFFFF);
     87 
     88   i = v4f_false();
     89   cast.f[0] = v4f_x(i); CHK(cast.i[0] == (int32_t)0x00000000);
     90   cast.f[1] = v4f_y(i); CHK(cast.i[1] == (int32_t)0x00000000);
     91   cast.f[2] = v4f_z(i); CHK(cast.i[2] == (int32_t)0x00000000);
     92   cast.f[3] = v4f_w(i); CHK(cast.i[3] == (int32_t)0x00000000);
     93 
     94   i = v4f_mask(~0, 0, ~0, ~0);
     95   j = v4f_mask(0, 0, 0, ~0);
     96   k = v4f_or(i, j);
     97   cast.f[0] = v4f_x(k); CHK(cast.i[0] == (int32_t)0xFFFFFFFF);
     98   cast.f[1] = v4f_y(k); CHK(cast.i[1] == (int32_t)0x00000000);
     99   cast.f[2] = v4f_z(k); CHK(cast.i[2] == (int32_t)0xFFFFFFFF);
    100   cast.f[3] = v4f_w(k); CHK(cast.i[3] == (int32_t)0xFFFFFFFF);
    101   CHK(v4f_mask_x(i) == ~0);
    102   CHK(v4f_mask_y(i) == 0);
    103   CHK(v4f_mask_z(i) == ~0);
    104   CHK(v4f_mask_w(i) == ~0);
    105 
    106   k = v4f_and(i, j);
    107   cast.f[0] = v4f_x(k); CHK(cast.i[0] == (int32_t)0x00000000);
    108   cast.f[1] = v4f_y(k); CHK(cast.i[1] == (int32_t)0x00000000);
    109   cast.f[2] = v4f_z(k); CHK(cast.i[2] == (int32_t)0x00000000);
    110   cast.f[3] = v4f_w(k); CHK(cast.i[3] == (int32_t)0xFFFFFFFF);
    111 
    112   k = v4f_xor(i, j);
    113   cast.f[0] = v4f_x(k); CHK(cast.i[0] == (int32_t)0xFFFFFFFF);
    114   cast.f[1] = v4f_y(k); CHK(cast.i[1] == (int32_t)0x00000000);
    115   cast.f[2] = v4f_z(k); CHK(cast.i[2] == (int32_t)0xFFFFFFFF);
    116   cast.f[3] = v4f_w(k); CHK(cast.i[3] == (int32_t)0x00000000);
    117 
    118   i = v4f_mask(0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F);
    119   j = v4f_mask(0x01020401, 0x70605040, 0x0F1F2F3F, 0x00000000);
    120   k = v4f_andnot(i, j);
    121   cast.f[0] = v4f_x(k); CHK(cast.i[0] == 0x01020400);
    122   cast.f[1] = v4f_y(k); CHK(cast.i[1] == 0x70605040);
    123   cast.f[2] = v4f_z(k); CHK(cast.i[2] == 0x07162534);
    124   cast.f[3] = v4f_w(k); CHK(cast.i[3] == 0x00000000);
    125 
    126   CHK(v4f_movemask(i) == 0);
    127   i = v4f_mask(0x01020401, (int32_t)0x80605040, 0x7F1F2F3F, 0x00000000);
    128   CHK(v4f_movemask(i) == 2);
    129 
    130   i = v4f_set(1.f, 2.f, 3.f, 4.f);
    131   j = v4f_set(5.f, 6.f, 7.f, 8.f);
    132   k = v4f_sel(i, j, v4f_mask(~0, 0, 0, ~0));
    133   CHK(v4f_x(k) == 5.f);
    134   CHK(v4f_y(k) == 2.f);
    135   CHK(v4f_z(k) == 3.f);
    136   CHK(v4f_w(k) == 8.f);
    137 
    138   k = v4f_xayb(i, j);
    139   CHK(v4f_x(k) == 1.f);
    140   CHK(v4f_y(k) == 5.f);
    141   CHK(v4f_z(k) == 2.f);
    142   CHK(v4f_w(k) == 6.f);
    143 
    144   k = v4f_xyab(i, j);
    145   CHK(v4f_x(k) == 1.f);
    146   CHK(v4f_y(k) == 2.f);
    147   CHK(v4f_z(k) == 5.f);
    148   CHK(v4f_w(k) == 6.f);
    149 
    150   k = v4f_zcwd(i, j);
    151   CHK(v4f_x(k) == 3.f);
    152   CHK(v4f_y(k) == 7.f);
    153   CHK(v4f_z(k) == 4.f);
    154   CHK(v4f_w(k) == 8.f);
    155 
    156   k = v4f_zwcd(i, j);
    157   CHK(v4f_x(k) == 3.f);
    158   CHK(v4f_y(k) == 4.f);
    159   CHK(v4f_z(k) == 7.f);
    160   CHK(v4f_w(k) == 8.f);
    161 
    162   k = v4f_ayzw(i, j);
    163   CHK(v4f_x(k) == 5.f);
    164   CHK(v4f_y(k) == 2.f);
    165   CHK(v4f_z(k) == 3.f);
    166   CHK(v4f_w(k) == 4.f);
    167 
    168   k = v4f_xycd(i, j);
    169   CHK(v4f_x(k) == 1.f);
    170   CHK(v4f_y(k) == 2.f);
    171   CHK(v4f_z(k) == 7.f);
    172   CHK(v4f_w(k) == 8.f);
    173 
    174   k = v4f_ywbd(i, j);
    175   CHK(v4f_x(k) == 2.f);
    176   CHK(v4f_y(k) == 4.f);
    177   CHK(v4f_z(k) == 6.f);
    178   CHK(v4f_w(k) == 8.f);
    179 
    180   k = v4f_xbzw(i, j);
    181   CHK(v4f_x(k) == 1.f);
    182   CHK(v4f_y(k) == 6.f);
    183   CHK(v4f_z(k) == 3.f);
    184   CHK(v4f_w(k) == 4.f);
    185 
    186   k = v4f_xycw(i, j);
    187   CHK(v4f_x(k) == 1.f);
    188   CHK(v4f_y(k) == 2.f);
    189   CHK(v4f_z(k) == 7.f);
    190   CHK(v4f_w(k) == 4.f);
    191 
    192   k = v4f_xyzd(i, j);
    193   CHK(v4f_x(k) == 1.f);
    194   CHK(v4f_y(k) == 2.f);
    195   CHK(v4f_z(k) == 3.f);
    196   CHK(v4f_w(k) == 8.f);
    197 
    198   k = v4f_048C(v4f_set1(1.f), v4f_set1(2.f), v4f_set1(3.f), v4f_set1(4.f));
    199   CHK(v4f_x(k) == 1.f);
    200   CHK(v4f_y(k) == 2.f);
    201   CHK(v4f_z(k) == 3.f);
    202   CHK(v4f_w(k) == 4.f);
    203 
    204   i = v4f_set(-1.f, 2.f, -3.f, 4.f);
    205   j = v4f_minus(i);
    206   CHK(v4f_x(j) == 1.f);
    207   CHK(v4f_y(j) == -2.f);
    208   CHK(v4f_z(j) == 3.f);
    209   CHK(v4f_w(j) == -4.f);
    210 
    211   k = v4f_add(i, j);
    212   CHK(v4f_x(k) == 0.f);
    213   CHK(v4f_y(k) == 0.f);
    214   CHK(v4f_z(k) == 0.f);
    215   CHK(v4f_w(k) == 0.f);
    216 
    217   k = v4f_sub(i, j);
    218   CHK(v4f_x(k) == -2.f);
    219   CHK(v4f_y(k) == 4.f);
    220   CHK(v4f_z(k) == -6.f);
    221   CHK(v4f_w(k) == 8.f);
    222 
    223   k = v4f_mul(i, j);
    224   CHK(v4f_x(k) == -1.f);
    225   CHK(v4f_y(k) == -4.f);
    226   CHK(v4f_z(k) == -9.f);
    227   CHK(v4f_w(k) == -16.f);
    228 
    229   k = v4f_div(k, i);
    230   CHK(v4f_x(k) == 1.f);
    231   CHK(v4f_y(k) == -2.f);
    232   CHK(v4f_z(k) == 3.f);
    233   CHK(v4f_w(k) == -4.f);
    234 
    235   k = v4f_madd(i, j, k);
    236   CHK(v4f_x(k) == 0.f);
    237   CHK(v4f_y(k) == -6.f);
    238   CHK(v4f_z(k) == -6.f);
    239   CHK(v4f_w(k) == -20.f);
    240 
    241   k = v4f_abs(i);
    242   CHK(v4f_x(k) == 1.f);
    243   CHK(v4f_y(k) == 2.f);
    244   CHK(v4f_z(k) == 3.f);
    245   CHK(v4f_w(k) == 4.f);
    246 
    247   i = v4f_set(4.f, 9.f, 16.f, 25.f);
    248   k = v4f_sqrt(i);
    249   CHK(v4f_x(k) == 2.f);
    250   CHK(v4f_y(k) == 3.f);
    251   CHK(v4f_z(k) == 4.f);
    252   CHK(v4f_w(k) == 5.f);
    253 
    254   k = v4f_rsqrte(i);
    255   CHK(eq_eps(v4f_x(k), 1.f/2.f, 1.e-3f) == 1);
    256   CHK(eq_eps(v4f_y(k), 1.f/3.f, 1.e-3f) == 1);
    257   CHK(eq_eps(v4f_z(k), 1.f/4.f, 1.e-3f) == 1);
    258   CHK(eq_eps(v4f_w(k), 1.f/5.f, 1.e-3f) == 1);
    259 
    260   k = v4f_rsqrt(i);
    261   CHK(eq_eps(v4f_x(k), 1.f/2.f, 1.e-6f) == 1);
    262   CHK(eq_eps(v4f_y(k), 1.f/3.f, 1.e-6f) == 1);
    263   CHK(eq_eps(v4f_z(k), 1.f/4.f, 1.e-6f) == 1);
    264   CHK(eq_eps(v4f_w(k), 1.f/5.f, 1.e-6f) == 1);
    265 
    266   k = v4f_rcpe(i);
    267   CHK(eq_eps(v4f_x(k), 1.f/4.f, 1.e-3f) == 1);
    268   CHK(eq_eps(v4f_y(k), 1.f/9.f, 1.e-3f) == 1);
    269   CHK(eq_eps(v4f_z(k), 1.f/16.f, 1.e-3f) == 1);
    270   CHK(eq_eps(v4f_w(k), 1.f/25.f, 1.e-3f) == 1);
    271 
    272   k = v4f_rcp(i);
    273   CHK(eq_eps(v4f_x(k), 1.f/4.f, 1.e-6f) == 1);
    274   CHK(eq_eps(v4f_y(k), 1.f/9.f, 1.e-6f) == 1);
    275   CHK(eq_eps(v4f_z(k), 1.f/16.f, 1.e-6f) == 1);
    276   CHK(eq_eps(v4f_w(k), 1.f/25.f, 1.e-6f) == 1);
    277 
    278 	i = v4f_set(0.f, 1.f, 2.f, 4.f);
    279 	j = v4f_set(1.f, 2.f, -1.f, 1.f);
    280 	k = v4f_lerp(i, j, v4f_set1(0.5f));
    281   CHK(v4f_x(k) == 0.5f);
    282   CHK(v4f_y(k) == 1.5f);
    283   CHK(v4f_z(k) == 0.5f);
    284   CHK(v4f_w(k) == 2.5f);
    285 
    286   k = v4f_sum(j);
    287   CHK(v4f_x(k) == 3.f);
    288   CHK(v4f_y(k) == 3.f);
    289   CHK(v4f_z(k) == 3.f);
    290   CHK(v4f_w(k) == 3.f);
    291 
    292   k = v4f_dot(i, j);
    293   CHK(v4f_x(k) == 4.f);
    294   CHK(v4f_y(k) == 4.f);
    295   CHK(v4f_z(k) == 4.f);
    296   CHK(v4f_w(k) == 4.f);
    297 
    298   k = v4f_len(i);
    299   CHK(eq_eps(v4f_x(k), (float)sqrt(21.0), 1.e-6f) == 1);
    300   CHK(eq_eps(v4f_y(k), (float)sqrt(21.0), 1.e-6f) == 1);
    301   CHK(eq_eps(v4f_z(k), (float)sqrt(21.0), 1.e-6f) == 1);
    302   CHK(eq_eps(v4f_w(k), (float)sqrt(21.0), 1.e-6f) == 1);
    303 
    304   i = v4f_set(0.f, 4.f, 2.f, 3.f);
    305   k = v4f_normalize(i);
    306   CHK(eq_eps(v4f_x(k), 0.f, 1.e-6f) == 1);
    307   CHK(eq_eps(v4f_y(k), 0.742781353f, 1.e-6f) == 1);
    308   CHK(eq_eps(v4f_z(k), 0.371390676f, 1.e-6f) == 1);
    309   CHK(eq_eps(v4f_w(k), 0.557086014f, 1.e-6f) == 1);
    310 
    311   i = v4f_set(1.f, 4.f, 2.f, 3.f);
    312   k = v4f_sum2(i);
    313   CHK(v4f_x(k) == 5.f);
    314   CHK(v4f_y(k) == 5.f);
    315   CHK(v4f_z(k) == 5.f);
    316   CHK(v4f_w(k) == 5.f);
    317 
    318   j = v4f_set(2.f, 3.f, 5.f, 1.f);
    319   k = v4f_dot2(i, j);
    320   CHK(v4f_x(k) == 14.f);
    321   CHK(v4f_y(k) == 14.f);
    322   CHK(v4f_z(k) == 14.f);
    323   CHK(v4f_w(k) == 14.f);
    324 
    325   k = v4f_len2(i);
    326   CHK(eq_eps(v4f_x(k), (float)sqrt(17.0), 1.e-6f) == 1);
    327   CHK(eq_eps(v4f_y(k), (float)sqrt(17.0), 1.e-6f) == 1);
    328   CHK(eq_eps(v4f_z(k), (float)sqrt(17.0), 1.e-6f) == 1);
    329   CHK(eq_eps(v4f_w(k), (float)sqrt(17.0), 1.e-6f) == 1);
    330 
    331   i = v4f_set(1.f, -2.f, 2.f, 5.f);
    332   j = v4f_set(3.f, 1.f, 1.f, 5.f);
    333   k = v4f_cross2(i, j);
    334   CHK(v4f_x(k) == 7.f);
    335   CHK(v4f_y(k) == 7.f);
    336   CHK(v4f_z(k) == 7.f);
    337   CHK(v4f_w(k) == 7.f);
    338 
    339   k = v4f_cross2(j, i);
    340   CHK(v4f_x(k) == -7.f);
    341   CHK(v4f_y(k) == -7.f);
    342   CHK(v4f_z(k) == -7.f);
    343   CHK(v4f_w(k) == -7.f);
    344 
    345   i = v4f_set(0.f, 4.f, 5.f, 7.f);
    346   k = v4f_normalize2(i);
    347   CHK(eq_eps(v4f_x(k), 0.f, 1.e-6f) == 1);
    348   CHK(eq_eps(v4f_y(k), 1.f, 1.e-6f) == 1);
    349 
    350   k = v4f_sum3(i);
    351   CHK(v4f_x(k) == 9.f);
    352   CHK(v4f_y(k) == 9.f);
    353   CHK(v4f_z(k) == 9.f);
    354   CHK(v4f_w(k) == 9.f);
    355 
    356   i = v4f_set(2.f, 3.f, 2.f, 4.f);
    357   j = v4f_set(0.f, 4.f, 2.f, 19.f);
    358   k = v4f_dot3(i, j);
    359   CHK(v4f_x(k) == 16.f);
    360   CHK(v4f_y(k) == 16.f);
    361   CHK(v4f_z(k) == 16.f);
    362   CHK(v4f_w(k) == 16.f);
    363 
    364   k = v4f_len3(j);
    365   CHK(eq_eps(v4f_x(k), (float)sqrt(20.0), 1.e-6f) == 1);
    366   CHK(eq_eps(v4f_y(k), (float)sqrt(20.0), 1.e-6f) == 1);
    367   CHK(eq_eps(v4f_z(k), (float)sqrt(20.0), 1.e-6f) == 1);
    368   CHK(eq_eps(v4f_w(k), (float)sqrt(20.0), 1.e-6f) == 1);
    369 
    370   k = v4f_normalize3(j);
    371   CHK(eq_eps(v4f_x(k), 0.f, 1.e-6f) == 1);
    372   CHK(eq_eps(v4f_y(k), 0.8944271910f, 1.e-6f) == 1);
    373   CHK(eq_eps(v4f_z(k), 0.4472135995f, 1.e-6f) == 1);
    374 
    375   i = v4f_set(1.f, -2.f, 2.f, 4.f);
    376   j = v4f_set(3.f, 1.f, -1.5f, 2.f);
    377   k = v4f_cross3(i, j);
    378   CHK(v4f_x(k) == 1.f);
    379   CHK(v4f_y(k) == 7.5f);
    380   CHK(v4f_z(k) == 7.f);
    381 
    382   i = v4f_set(1.f, 2.f, 3.f, 4.f);
    383   j = v4f_set(-2.f, -4.f, 3.f, 6.f);
    384   k = v4f_eq(i, j);
    385   cast.f[0] = v4f_x(k); CHK(cast.i[0] == (int32_t)0x00000000);
    386   cast.f[1] = v4f_y(k); CHK(cast.i[1] == (int32_t)0x00000000);
    387   cast.f[2] = v4f_z(k); CHK(cast.i[2] == (int32_t)0xFFFFFFFF);
    388   cast.f[3] = v4f_w(k); CHK(cast.i[3] == (int32_t)0x00000000);
    389 
    390   k = v4f_neq(i, j);
    391   cast.f[0] = v4f_x(k); CHK(cast.i[0] == (int32_t)0xFFFFFFFF);
    392   cast.f[1] = v4f_y(k); CHK(cast.i[1] == (int32_t)0xFFFFFFFF);
    393   cast.f[2] = v4f_z(k); CHK(cast.i[2] == (int32_t)0x00000000);
    394   cast.f[3] = v4f_w(k); CHK(cast.i[3] == (int32_t)0xFFFFFFFF);
    395 
    396   k = v4f_gt(i, j);
    397   cast.f[0] = v4f_x(k); CHK(cast.i[0] == (int32_t)0xFFFFFFFF);
    398   cast.f[1] = v4f_y(k); CHK(cast.i[1] == (int32_t)0xFFFFFFFF);
    399   cast.f[2] = v4f_z(k); CHK(cast.i[2] == (int32_t)0x00000000);
    400   cast.f[3] = v4f_w(k); CHK(cast.i[3] == (int32_t)0x00000000);
    401 
    402   k = v4f_lt(i, j);
    403   cast.f[0] = v4f_x(k); CHK(cast.i[0] == (int32_t)0x00000000);
    404   cast.f[1] = v4f_y(k); CHK(cast.i[1] == (int32_t)0x00000000);
    405   cast.f[2] = v4f_z(k); CHK(cast.i[2] == (int32_t)0x00000000);
    406   cast.f[3] = v4f_w(k); CHK(cast.i[3] == (int32_t)0xFFFFFFFF);
    407 
    408   k = v4f_ge(i, j);
    409   cast.f[0] = v4f_x(k); CHK(cast.i[0] == (int32_t)0xFFFFFFFF);
    410   cast.f[1] = v4f_y(k); CHK(cast.i[1] == (int32_t)0xFFFFFFFF);
    411   cast.f[2] = v4f_z(k); CHK(cast.i[2] == (int32_t)0xFFFFFFFF);
    412   cast.f[3] = v4f_w(k); CHK(cast.i[3] == (int32_t)0x00000000);
    413 
    414   k = v4f_le(i, j);
    415   cast.f[0] = v4f_x(k); CHK(cast.i[0] == (int32_t)0x00000000);
    416   cast.f[1] = v4f_y(k); CHK(cast.i[1] == (int32_t)0x00000000);
    417   cast.f[2] = v4f_z(k); CHK(cast.i[2] == (int32_t)0xFFFFFFFF);
    418   cast.f[3] = v4f_w(k); CHK(cast.i[3] == (int32_t)0xFFFFFFFF);
    419 
    420   i = v4f_set(1.01f, 2.01f, 3.02f, 0.02f);
    421   j = v4f_set(1.f, 2.f, 3.f, 0.f);
    422   k = v4f_set(0.f, 0.01f, 0.02f, 0.f);
    423   k = v4f_eq_eps(i, j, k);
    424   cast.f[0] = v4f_x(k); CHK(cast.i[0] == (int32_t)0x00000000);
    425   cast.f[1] = v4f_y(k); CHK(cast.i[1] == (int32_t)0xFFFFFFFF);
    426   cast.f[2] = v4f_z(k); CHK(cast.i[2] == (int32_t)0xFFFFFFFF);
    427   cast.f[3] = v4f_w(k); CHK(cast.i[3] == (int32_t)0x00000000);
    428 
    429   i = v4f_set(1.f, 2.f, 3.f, 4.f);
    430   j = v4f_set(-2.f, -4.f, 3.f, 6.f);
    431   k = v4f_min(i, j);
    432   CHK(v4f_x(k) == -2.f);
    433   CHK(v4f_y(k) == -4.f);
    434   CHK(v4f_z(k) == 3.f);
    435   CHK(v4f_w(k) == 4.f);
    436 
    437   k = v4f_max(i, j);
    438   CHK(v4f_x(k) == 1.f);
    439   CHK(v4f_y(k) == 2.f);
    440   CHK(v4f_z(k) == 3.f);
    441   CHK(v4f_w(k) == 6.f);
    442 
    443   k = v4f_reduce_min(i);
    444   CHK(v4f_x(k) == 1.f);
    445   CHK(v4f_y(k) == 1.f);
    446   CHK(v4f_z(k) == 1.f);
    447   CHK(v4f_w(k) == 1.f);
    448 
    449   k = v4f_reduce_min(j);
    450   CHK(v4f_x(k) == -4.f);
    451   CHK(v4f_y(k) == -4.f);
    452   CHK(v4f_z(k) == -4.f);
    453   CHK(v4f_w(k) == -4.f);
    454 
    455   k = v4f_reduce_max(i);
    456   CHK(v4f_x(k) == 4.f);
    457   CHK(v4f_y(k) == 4.f);
    458   CHK(v4f_z(k) == 4.f);
    459   CHK(v4f_w(k) == 4.f);
    460 
    461   k = v4f_reduce_max(j);
    462   CHK(v4f_x(k) == 6.f);
    463   CHK(v4f_y(k) == 6.f);
    464   CHK(v4f_z(k) == 6.f);
    465   CHK(v4f_w(k) == 6.f);
    466 
    467   k = v4f_clamp(i, v4f_set(0.f, 0.f, -1.f, 3.f), v4f_set(1.f, 3.f, 2.f, 3.1f));
    468   CHK(v4f_x(k) == 1.f);
    469   CHK(v4f_y(k) == 2.f);
    470   CHK(v4f_z(k) == 2.f);
    471   CHK(v4f_w(k) == 3.1f);
    472 
    473   l = v4f_to_v4i(j);
    474   CHK(v4i_x(l) == -2);
    475   CHK(v4i_y(l) == -4);
    476   CHK(v4i_z(l) == 3);
    477   CHK(v4i_w(l) == 6);
    478 
    479   k = v4i_to_v4f(l);
    480   CHK(v4f_x(k) == -2.f);
    481   CHK(v4f_y(k) == -4.f);
    482   CHK(v4f_z(k) == 3.f);
    483   CHK(v4f_w(k) == 6.f);
    484 
    485   i = v4f_set(1.5f, 2.51f, 3.2f, 4.35f);
    486   l = v4f_to_v4i(i);
    487   CHK(v4i_x(l) == 2);
    488   CHK(v4i_y(l) == 3);
    489   CHK(v4i_z(l) == 3);
    490   CHK(v4i_w(l) == 4);
    491 
    492   l = v4f_trunk_v4i(i);
    493   CHK(v4i_x(l) == 1);
    494   CHK(v4i_y(l) == 2);
    495   CHK(v4i_z(l) == 3);
    496   CHK(v4i_w(l) == 4);
    497 
    498   cast.f[0] = 1.f;
    499   cast.f[1] = 2.f;
    500   cast.f[2] = 3.14f;
    501   cast.f[3] = -9.2f;
    502 
    503   i = v4f_set(cast.f[0], cast.f[1], cast.f[2], cast.f[3]);
    504   l = v4f_rcast_v4i(i);
    505   CHK(v4i_x(l) == cast.i[0]);
    506   CHK(v4i_y(l) == cast.i[1]);
    507   CHK(v4i_z(l) == cast.i[2]);
    508   CHK(v4i_w(l) == cast.i[3]);
    509 
    510   i = v4i_rcast_v4f(l);
    511   CHK(v4f_x(i) == cast.f[0]);
    512   CHK(v4f_y(i) == cast.f[1]);
    513   CHK(v4f_z(i) == cast.f[2]);
    514   CHK(v4f_w(i) == cast.f[3]);
    515 
    516   k = v4f_xxxx(j);
    517   CHK(v4f_x(k) == -2.f);
    518   CHK(v4f_y(k) == -2.f);
    519   CHK(v4f_z(k) == -2.f);
    520   CHK(v4f_w(k) == -2.f);
    521 
    522   k = v4f_yyxx(j);
    523   CHK(v4f_x(k) == -4.f);
    524   CHK(v4f_y(k) == -4.f);
    525   CHK(v4f_z(k) == -2.f);
    526   CHK(v4f_w(k) == -2.f);
    527 
    528   k = v4f_wwxy(j);
    529   CHK(v4f_x(k) == 6.f);
    530   CHK(v4f_y(k) == 6.f);
    531   CHK(v4f_z(k) == -2.f);
    532   CHK(v4f_w(k) == -4.f);
    533 
    534   k = v4f_zyzy(j);
    535   CHK(v4f_x(k) == 3.f);
    536   CHK(v4f_y(k) == -4.f);
    537   CHK(v4f_z(k) == 3.f);
    538   CHK(v4f_w(k) == -4.f);
    539 
    540   k = v4f_wyyz(j);
    541   CHK(v4f_x(k) == 6.f);
    542   CHK(v4f_y(k) == -4.f);
    543   CHK(v4f_z(k) == -4.f);
    544   CHK(v4f_w(k) == 3.f);
    545 
    546   i = v4f_xyz_to_rthetaphi(v4f_set(10.f, 5.f, 3.f, 0.f));
    547   CHK(eq_eps(v4f_x(i), 11.575836f, 1.e-5f) == 1);
    548   CHK(eq_eps(v4f_y(i), 1.308643f, 1.e-5f) == 1);
    549   CHK(eq_eps(v4f_z(i), 0.463647f, 1.e-5f) == 1);
    550   i = v4f_xyz_to_rthetaphi(v4f_set(8.56f, 7.234f, 33.587f, 0.f));
    551   CHK(eq_eps(v4f_x(i), 35.407498f, 1.e-5f) == 1);
    552   CHK(eq_eps(v4f_y(i), 0.322063f, 1.e-5f) == 1);
    553   CHK(eq_eps(v4f_z(i), 0.701638f, 1.e-5f) == 1);
    554 
    555   i = v4f_xyz_to_rthetaphi(v4f_set(0.f, 0.f, 0.f, 0.f));
    556   CHK(eq_eps(v4f_x(i), 0.f, 1.e-5f) == 1);
    557   CHK(eq_eps(v4f_y(i), 0.f, 1.e-5f) == 1);
    558   CHK(eq_eps(v4f_z(i), 0.f, 1.e-5f) == 1);
    559   i = v4f_xyz_to_rthetaphi(v4f_set(4.53f, 0.f, 0.f, 0.f));
    560   CHK(eq_eps(v4f_x(i), 4.53f, 1.e-5f) == 1);
    561   CHK(eq_eps(v4f_y(i), 1.570796f, 1.e-5f) == 1);
    562   CHK(eq_eps(v4f_z(i), 0.f, 1.e-5f) == 1);
    563   i = v4f_xyz_to_rthetaphi(v4f_set(0.f, 7.2f, 0.f, 0.f));
    564   CHK(eq_eps(v4f_x(i), 7.2f, 1.e-5f) == 1);
    565   CHK(eq_eps(v4f_y(i), 1.570796f, 1.e-5f) == 1);
    566   CHK(eq_eps(v4f_z(i), 1.570796f, 1.e-5f) == 1);
    567   i = v4f_xyz_to_rthetaphi(v4f_set(4.53f, 7.2f, 0.f, 0.f));
    568   CHK(eq_eps(v4f_x(i), 8.506521f, 1.e-5f) == 1);
    569   CHK(eq_eps(v4f_y(i), 1.570796f, 1.e-5f) == 1);
    570   CHK(eq_eps(v4f_z(i), 1.009206f, 1.e-5f) == 1);
    571   i = v4f_xyz_to_rthetaphi(v4f_set(0.f, 0.f, 3.1f, 0.f));
    572   CHK(eq_eps(v4f_x(i), 3.1f, 1.e-5f) == 1);
    573   CHK(eq_eps(v4f_y(i), 0.f, 1.e-5f) == 1);
    574   CHK(eq_eps(v4f_z(i), 0.f, 1.e-5f) == 1);
    575   i = v4f_xyz_to_rthetaphi(v4f_set(4.53f, 0.f, 3.1f, 0.f));
    576   CHK(eq_eps(v4f_x(i), 5.489162f, 1.e-5f) == 1);
    577   CHK(eq_eps(v4f_y(i), 0.970666f, 1.e-5f) == 1);
    578   CHK(eq_eps(v4f_z(i), 0.f, 1.e-5f) == 1);
    579   i = v4f_xyz_to_rthetaphi(v4f_set(0.f, 7.2f, 3.1f, 0.f));
    580   CHK(eq_eps(v4f_x(i), 7.839005f, 1.e-5f) == 1);
    581   CHK(eq_eps(v4f_y(i), 1.164229f, 1.e-5f) == 1);
    582   CHK(eq_eps(v4f_z(i), 1.570796f, 1.e-5f) == 1);
    583   i = v4f_xyz_to_rthetaphi(v4f_set(4.53f, 7.2f, 3.1f, 0.f));
    584   CHK(eq_eps(v4f_x(i), 9.053778f, 1.e-5f) == 1);
    585   CHK(eq_eps(v4f_y(i), 1.221327f, 1.e-5f) == 1);
    586   CHK(eq_eps(v4f_z(i), 1.009206f, 1.e-5f) == 1);
    587 
    588   i = v4f_xyz_to_rthetaphi(v4f_set(-4.53f, 7.2f, 3.1f, 0.f));
    589   CHK(eq_eps(v4f_x(i), 9.053778f, 1.e-5f) == 1);
    590   CHK(eq_eps(v4f_y(i), 1.221327f, 1.e-5f) == 1);
    591   CHK(eq_eps(v4f_z(i), 2.132386f, 1.e-5f) == 1);
    592   i = v4f_xyz_to_rthetaphi(v4f_set(-4.53f, -7.2f, 3.1f, 0.f));
    593   CHK(eq_eps(v4f_x(i), 9.053778f, 1.e-5f) == 1);
    594   CHK(eq_eps(v4f_y(i), 1.221327f, 1.e-5f) == 1);
    595   CHK(eq_eps(v4f_z(i), -2.132386f, 1.e-5f) 
    596    || eq_eps(v4f_z(i), 2*PI - 2.132386f, 1.e-5f));
    597   i = v4f_xyz_to_rthetaphi(v4f_set(4.53f, -7.2f, 3.1f, 0.f));
    598   CHK(eq_eps(v4f_x(i), 9.053778f, 1.e-5f) == 1);
    599   CHK(eq_eps(v4f_y(i), 1.221327f, 1.e-5f) == 1);
    600   CHK(eq_eps(v4f_z(i), -1.009206f, 1.e-5f) 
    601    || eq_eps(v4f_z(i), 2*PI - 1.009206f, 1.e-5f));
    602   i = v4f_xyz_to_rthetaphi(v4f_set(4.53f, 7.2f, -3.1f, 0.f));
    603   CHK(eq_eps(v4f_x(i), 9.053778f, 1.e-5f) == 1);
    604   CHK(eq_eps(v4f_y(i), 1.920264f, 1.e-5f) == 1);
    605   CHK(eq_eps(v4f_z(i), 1.009206f, 1.e-5f) == 1);
    606   i = v4f_xyz_to_rthetaphi(v4f_set(-4.53f, 7.2f, -3.1f, 0.f));
    607   CHK(eq_eps(v4f_x(i), 9.053778f, 1.e-5f) == 1);
    608   CHK(eq_eps(v4f_y(i), 1.920264f, 1.e-5f) == 1);
    609   CHK(eq_eps(v4f_z(i), 2.132386f, 1.e-5f) == 1);
    610   i = v4f_xyz_to_rthetaphi(v4f_set(4.53f, -7.2f, -3.1f, 0.f));
    611   CHK(eq_eps(v4f_x(i), 9.053778f, 1.e-5f) == 1);
    612   CHK(eq_eps(v4f_y(i), 1.920264f, 1.e-5f) == 1);
    613   CHK(eq_eps(v4f_z(i), -1.009206f, 1.e-5f) 
    614    || eq_eps(v4f_z(i), 2*PI - 1.009206f, 1.e-5f));
    615   i = v4f_xyz_to_rthetaphi(v4f_set(-4.53f, -7.2f, -3.1f, 0.f));
    616   CHK(eq_eps(v4f_x(i), 9.053778f, 1.e-5f) == 1);
    617   CHK(eq_eps(v4f_y(i), 1.920264f, 1.e-5f) == 1);
    618   CHK(eq_eps(v4f_z(i), -2.132386f, 1.e-5f)
    619    || eq_eps(v4f_z(i), 2*PI - 2.132386f, 1.e-5f));
    620   return 0;
    621 }
    622