rsimd

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

test_aosf33.c (6698B)


      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 "aosf33.h"
     17 #include <rsys/float33.h>
     18 
     19 #define AOSF33_EQ_EPS(M, A, B, C, D, E, F, G, H, I, Eps)                       \
     20   {                                                                            \
     21     float a[9], b[9];                                                          \
     22     b[0] = (A); b[1] = (B); b[2] = (C);                                        \
     23     b[3] = (D); b[4] = (E); b[5] = (F);                                        \
     24     b[6] = (G); b[7] = (H); b[8] = (I);                                        \
     25     CHK(f33_eq_eps(aosf33_store(a, (M)), b, Eps) == 1);                        \
     26   } (void)0
     27 #define AOSF33_EQ(M, A, B, C, D, E, F, G, H, I)                                \
     28   AOSF33_EQ_EPS(M, A, B, C, D, E, F, G, H, I, 0.f)
     29 
     30 int
     31 main(int argc, char** argv)
     32 {
     33   float tmp[9];
     34   v4f_T m[3], n[3], o[3], v;
     35   (void)argc, (void)argv;
     36 
     37   CHK(aosf33_set(m,
     38     v4f_set(0.f, 1.f, 2.f, 0.f),
     39     v4f_set(3.f, 4.f, 5.f, 0.f),
     40     v4f_set(6.f, 7.f, 8.f, 0.f)) == m);
     41   CHK(aosf33_store(tmp, m) == tmp);
     42   CHK(tmp[0] == 0.f);
     43   CHK(tmp[1] == 1.f);
     44   CHK(tmp[2] == 2.f);
     45   CHK(tmp[3] == 3.f);
     46   CHK(tmp[4] == 4.f);
     47   CHK(tmp[5] == 5.f);
     48   CHK(tmp[6] == 6.f);
     49   CHK(tmp[7] == 7.f);
     50   CHK(tmp[8] == 8.f);
     51   AOSF33_EQ(m, 0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f);
     52   CHK(aosf33_identity(m) == m);
     53   AOSF33_EQ(m, 1.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 1.f);
     54   CHK(aosf33_zero(m) == m);
     55   AOSF33_EQ(m, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f);
     56 
     57   f3(tmp+0, -1.f, -2.f, -3.f);
     58   f3(tmp+3, -4.f, -5.f, -6.f);
     59   f3(tmp+6, -7.f, -8.f, -9.f);
     60   CHK(aosf33_load(m, tmp) == m);
     61   AOSF33_EQ(m, -1.f, -2.f, -3.f, -4.f, -5.f, -6.f, -7.f, -8.f, -9.f);
     62 
     63   CHK(aosf33_zero(m) == m);
     64   CHK(aosf33_set_row0(m, v4f_set(0.f, 1.f, 2.f, 9.f)) == m);
     65   AOSF33_EQ(m, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 2.f, 0.f, 0.f);
     66   CHK(aosf33_set_row1(m, v4f_set(3.f, 4.f, 5.f, 10.f)) == m);
     67   AOSF33_EQ(m, 0.f, 3.f, 0.f, 1.f, 4.f, 0.f, 2.f, 5.f, 0.f);
     68   CHK(aosf33_set_row2(m, v4f_set(6.f, 7.f, 8.f, 11.f)) == m);
     69   AOSF33_EQ(m, 0.f, 3.f, 6.f, 1.f, 4.f, 7.f, 2.f, 5.f, 8.f);
     70 
     71   CHK(aosf33_zero(m) == m);
     72   CHK(aosf33_set_row(m, v4f_set(0.f, 1.f, 2.f, 9.f), 0) == m);
     73   AOSF33_EQ(m, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 2.f, 0.f, 0.f);
     74   CHK(aosf33_set_row(m, v4f_set(3.f, 4.f, 5.f, 10.f), 1) == m);
     75   AOSF33_EQ(m, 0.f, 3.f, 0.f, 1.f, 4.f, 0.f, 2.f, 5.f, 0.f);
     76   CHK(aosf33_set_row(m, v4f_set(6.f, 7.f, 8.f, 11.f), 2) == m);
     77   AOSF33_EQ(m, 0.f, 3.f, 6.f, 1.f, 4.f, 7.f, 2.f, 5.f, 8.f);
     78 
     79   CHK(aosf33_zero(m) == m);
     80   CHK(aosf33_set_col(m, v4f_set(0.f, 1.f, 2.f, 9.f), 0) == m);
     81   AOSF33_EQ(m, 0.f, 1.f, 2.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f);
     82   CHK(aosf33_set_col(m, v4f_set(3.f, 4.f, 5.f, 10.f), 1) == m);
     83   AOSF33_EQ(m, 0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 0.f, 0.f, 0.f);
     84   CHK(aosf33_set_col(m, v4f_set(6.f, 7.f, 8.f, 11.f), 2) == m);
     85   AOSF33_EQ(m, 0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f);
     86 
     87   v = aosf33_row0(m);
     88   CHK(v4f_x(v) == 0.f);
     89   CHK(v4f_y(v) == 3.f);
     90   CHK(v4f_z(v) == 6.f);
     91 
     92   v = aosf33_row1(m);
     93   CHK(v4f_x(v) == 1.f);
     94   CHK(v4f_y(v) == 4.f);
     95   CHK(v4f_z(v) == 7.f);
     96 
     97   v = aosf33_row2(m);
     98   CHK(v4f_x(v) == 2.f);
     99   CHK(v4f_y(v) == 5.f);
    100   CHK(v4f_z(v) == 8.f);
    101 
    102   v = aosf33_row(m, 0);
    103   CHK(v4f_x(v) == 0.f);
    104   CHK(v4f_y(v) == 3.f);
    105   CHK(v4f_z(v) == 6.f);
    106 
    107   v = aosf33_row(m, 1);
    108   CHK(v4f_x(v) == 1.f);
    109   CHK(v4f_y(v) == 4.f);
    110   CHK(v4f_z(v) == 7.f);
    111 
    112   v = aosf33_row(m, 2);
    113   CHK(v4f_x(v) == 2.f);
    114   CHK(v4f_y(v) == 5.f);
    115   CHK(v4f_z(v) == 8.f);
    116 
    117   v = aosf33_col(m, 0);
    118   CHK(v4f_x(v) == 0.f);
    119   CHK(v4f_y(v) == 1.f);
    120   CHK(v4f_z(v) == 2.f);
    121 
    122   v = aosf33_col(m, 1);
    123   CHK(v4f_x(v) == 3.f);
    124   CHK(v4f_y(v) == 4.f);
    125   CHK(v4f_z(v) == 5.f);
    126 
    127   v = aosf33_col(m, 2);
    128   CHK(v4f_x(v) == 6.f);
    129   CHK(v4f_y(v) == 7.f);
    130   CHK(v4f_z(v) == 8.f);
    131 
    132   aosf33_set(m,
    133     v4f_set(0.f, 1.f, 2.f, 0.f),
    134     v4f_set(3.f, 4.f, 5.f, 0.f),
    135     v4f_set(6.f, 7.f, 8.f, 0.f));
    136   aosf33_set(n,
    137     v4f_set(1.f, 2.f, 3.f, 0.f),
    138     v4f_set(4.f, 5.f, 6.f, 0.f),
    139     v4f_set(7.f, 8.f, 9.f, 0.f));
    140   CHK(aosf33_add(o, m, n) == o);
    141   AOSF33_EQ(o, 1.f, 3.f, 5.f, 7.f, 9.f, 11.f, 13.f, 15.f, 17.f);
    142   CHK(aosf33_sub(o, o, n) == o);
    143 	AOSF33_EQ(o, 0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f);
    144 
    145   aosf33_set(m,
    146     v4f_set(1.f, 2.f, -3.f, 0.f),
    147     v4f_set(-4.f, -5.f, 6.f, 0.f),
    148     v4f_set(7.f, -8.f, 9.f, 0.f));
    149   CHK(aosf33_minus(m, m) == m);
    150 	AOSF33_EQ(m, -1.f, -2.f, 3.f, 4.f, 5.f, -6.f, -7.f, 8.f, -9.f);
    151 
    152   CHK(aosf33_mul(o, m, v4f_set1(2.f)) == o);
    153 	AOSF33_EQ(o, -2.f, -4.f, 6.f, 8.f, 10.f, -12.f, -14.f, 16.f, -18.f);
    154 
    155   aosf33_set(m,
    156     v4f_set(1.f, 2.f, 3.f, 0.f),
    157     v4f_set(4.f, 5.f, 6.f, 0.f),
    158     v4f_set(7.f, 8.f, 9.f, 0.f));
    159   v = aosf33_mulf3(m, v4f_set(1.f, 2.f, 3.f, 0.f));
    160   CHK(v4f_x(v) == 30.f);
    161   CHK(v4f_y(v) == 36.f);
    162   CHK(v4f_z(v) == 42.f);
    163   v = aosf3_mulf33(v4f_set(1.f, 2.f, 3.f, 0.f), m);
    164   CHK(v4f_x(v) == 14.f);
    165   CHK(v4f_y(v) == 32.f);
    166   CHK(v4f_z(v) == 50.f);
    167   aosf33_set(n,
    168     v4f_set(2.f, 9.f, 8.f, 0.f),
    169     v4f_set(1.f, -2.f, 2.f, 0.f),
    170     v4f_set(1.f, -8.f, -4.f, 0.f));
    171   CHK(aosf33_mulf33(o, m, n) == o);
    172 	AOSF33_EQ(o, 94.f, 113.f, 132.f, 7.f, 8.f, 9.f, -59.f, -70.f, -81.f);
    173 
    174   CHK(aosf33_transpose(o, m) == o);
    175 	AOSF33_EQ(o, 1.f, 4.f, 7.f, 2.f, 5.f, 8.f, 3.f, 6.f, 9.f);
    176 
    177   aosf33_set(m,
    178     v4f_set(1.f, 2.f, 3.f, 0.f),
    179     v4f_set(4.f, 5.f, 6.f, 0.f),
    180     v4f_set(3.f, -4.f, 9.f, 0.f));
    181   v = aosf33_det(m);
    182   CHK(v4f_x(v) == -60.f);
    183   CHK(v4f_y(v) == -60.f);
    184   CHK(v4f_z(v) == -60.f);
    185   CHK(v4f_w(v) == -60.f);
    186 
    187   v = aosf33_inverse(n, m);
    188   CHK(v4f_x(v) == -60.f);
    189   CHK(v4f_y(v) == -60.f);
    190   CHK(v4f_z(v) == -60.f);
    191   CHK(v4f_w(v) == -60.f);
    192   aosf33_mulf33(o, m, n);
    193   AOSF33_EQ_EPS(o, 1.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.e-6f);
    194 
    195   v = aosf33_invtrans(o, m);
    196   CHK(v4f_x(v) == -60.f);
    197   CHK(v4f_y(v) == -60.f);
    198   CHK(v4f_z(v) == -60.f);
    199   CHK(v4f_w(v) == -60.f);
    200   AOSF33_EQ(o,
    201     v4f_x(n[0]), v4f_x(n[1]), v4f_x(n[2]),
    202     v4f_y(n[0]), v4f_y(n[1]), v4f_y(n[2]),
    203     v4f_z(n[0]), v4f_z(n[1]), v4f_z(n[2]));
    204   return 0;
    205 }
    206