LCOV - code coverage report
Current view: top level - UTests - core-test-all-static.hpp (source / functions) Hit Total Coverage
Test: Coverage inastemp Lines: 547 547 100.0 %
Date: 2022-03-17 09:48:28 Functions: 4898 4954 98.9 %

          Line data    Source code
       1             : ///////////////////////////////////////////////////////////////////////////
       2             : // Inastemp - Berenger Bramas MPCDF - 2016
       3             : // Under MIT Licence, please you must read the LICENCE file.
       4             : ///////////////////////////////////////////////////////////////////////////
       5             : #ifndef CORETESTALLSTATIC_HPP
       6             : #define CORETESTALLSTATIC_HPP
       7             : 
       8             : #include "InastempStaticConfig.h"
       9             : #include "UTester.hpp"
      10             : 
      11             : #include <cmath>
      12             : #include <cstring>
      13             : #include <cassert>
      14             : 
      15             : #ifdef __NEC__
      16             : #define default_alignas
      17             : #else
      18             : #define default_alignas alignas(512)
      19             : #endif
      20             : 
      21             : inline constexpr size_t MaxTestValues(const size_t inSizeOfOneValue){
      22             :     return 2048/inSizeOfOneValue;
      23             : }
      24             : 
      25             : template <class VecType, int RemainingVec>
      26             : struct MultiHorizontalSumTester{
      27             :     template <class ... Params>
      28        4562 :     static void addToTest(typename VecType::RealType res[], typename VecType::RealType good_res[],
      29             :                           const int my_idx, Params... params){
      30             :         std::array<typename VecType::RealType, MaxTestValues(sizeof(typename VecType::RealType))> values;
      31       21628 :         for(size_t idx = 0 ; idx < size_t(VecType::GetVecLength()) ; ++idx){
      32       33600 :             values[idx] = typename VecType::RealType(size_t(VecType::GetVecLength()*my_idx)+idx);
      33             :         }
      34        9408 :         VecType v(&values[0]);
      35             : 
      36        5118 :         MultiHorizontalSumTester<VecType, RemainingVec-1>::addToTest(res, good_res, my_idx+1, params..., v);
      37             : 
      38        9072 :         good_res[my_idx] = v.horizontalSum();
      39        4562 :     }
      40             : };
      41             : 
      42             : template <class VecType>
      43             : struct MultiHorizontalSumTester<VecType,0>{
      44             :     template <class ... Params>
      45         112 :     static void addToTest(typename VecType::RealType res[], typename VecType::RealType /*good_res*/[],
      46             :                           const int /*my_idx*/, Params... params){
      47         448 :         VecType::MultiHorizontalSum(res, params...);
      48         112 :     }
      49             : };
      50             : 
      51             : 
      52             : template < class VecType >
      53         112 : class TestAll : public UTester< TestAll< VecType > > {
      54             :     using Parent = UTester< TestAll< VecType > >;
      55             : 
      56             :     using RealType = typename VecType::RealType;
      57             :     using MaskType = typename VecType::MaskType;
      58             : 
      59        1764 :     void equalToVecType(const VecType vec,
      60             :                        const VecType inReal) {
      61        8064 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()); ++idx) {
      62       50148 :             UASSERTEEQUAL(vec.at(int(idx)), inReal.at(int(idx)));
      63             :         }
      64             : 
      65             :         RealType reals[VecType::GetVecLength()];
      66        1512 :         vec.storeInArray( reals);
      67             : 
      68             :         RealType realsReals[VecType::GetVecLength()];
      69        1512 :         inReal.storeInArray( realsReals);
      70             : 
      71        8316 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
      72       37800 :             UASSERTEEQUAL(reals[idx], realsReals[idx]);
      73             :         }
      74             : 
      75             :         default_alignas RealType realsalign[VecType::GetVecLength()];
      76        1512 :         vec.storeInAlignedArray( realsalign);
      77             : 
      78             :         default_alignas RealType realsRealsalign[VecType::GetVecLength()];
      79        1512 :         inReal.storeInArray( realsRealsalign);
      80             : 
      81        8316 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
      82       37800 :             UASSERTEEQUAL(realsalign[idx], realsRealsalign[idx]);
      83             :         }
      84        1764 :     }
      85             : 
      86        3860 :     void equalToScalar(const VecType vec,
      87             :                        const RealType inReal) {
      88       18280 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
      89      100690 :             UASSERTEEQUAL(vec.at(int(idx)), inReal);
      90             :         }
      91             : 
      92             :         RealType reals[VecType::GetVecLength()];
      93        3360 :         vec.storeInArray( reals);
      94             : 
      95       18780 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
      96       86520 :             UASSERTEEQUAL(reals[idx], inReal);
      97             :         }
      98             : 
      99             :         default_alignas RealType realsalign[VecType::GetVecLength()];
     100        3360 :         vec.storeInAlignedArray( realsalign);
     101             : 
     102       18780 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     103       86520 :             UASSERTEEQUAL(realsalign[idx], inReal);
     104             :         }
     105        3860 :     }
     106             : 
     107             :     void equalToScalarMask(const MaskType vec,
     108             :                            const MaskType inReal) {
     109        3900 :         VecType vecval = VecType::IfTrue(vec, VecType(1));
     110        3900 :         VecType realval = VecType::IfTrue(inReal, VecType(1));
     111        1400 :         equalToVecType(vecval, realval);
     112             :     }
     113             : 
     114        1492 :     void equalToArray(const VecType vec,
     115             :                       const RealType inReals[]) {
     116        7648 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     117       43038 :             UASSERTEEQUAL(vec.at(int(idx)), inReals[idx]);
     118             :         }
     119             : 
     120             :         RealType reals[VecType::GetVecLength()];
     121        1384 :         vec.storeInArray( reals);
     122             : 
     123        7756 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     124       36936 :             UASSERTEEQUAL(reals[idx], inReals[idx]);
     125             :         }
     126             : 
     127             :         default_alignas RealType realsalign[VecType::GetVecLength()];
     128        1384 :         vec.storeInAlignedArray( realsalign);
     129             : 
     130        7756 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     131       24624 :             UASSERTEEQUAL(realsalign[idx], inReals[idx]);
     132             :         }
     133             : 
     134             :         default_alignas char reals_forcena_buffer[VecType::GetVecLength()*sizeof(RealType)+1];
     135        1492 :         RealType* reals_forcena = reinterpret_cast<RealType*>(&reals_forcena_buffer[1]);
     136        1492 :         vec.storeInArray( reals_forcena);
     137             : 
     138        7648 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     139       30780 :             UASSERTEEQUAL(reals_forcena[idx], inReals[idx]);
     140             :         }
     141        1492 :     }
     142             : 
     143             :     bool approxEqual(const float v1, const float v2) {
     144        2772 :         return (std::abs(v1 - v2) / v2) <= 9.9999999999E-6f;
     145             :     }
     146             : 
     147             :     bool approxEqual(const double v1, const double v2) {
     148        1428 :         return (std::abs(v1 - v2) / v2) <= 9.999999999999999E-12;
     149             :     }
     150             : 
     151             :     bool approxEqualLowAcc(const float v1, const float v2) {
     152         792 :         return (std::abs(v1 - v2) / v2) <= 9.9999999999E-2f;
     153             :     }
     154             : 
     155             :     bool approxEqualLowAcc(const double v1, const double v2) {
     156         408 :         return (std::abs(v1 - v2) / v2) <= 9.999999999999999E-5;
     157             :     }
     158             : 
     159          28 :     void approxEqualToScalar(const VecType vec,
     160             :                              const RealType inReal) {
     161         128 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     162         798 :             UASSERTETRUE(approxEqual(vec.at(int(idx)), inReal));
     163             :         }
     164             : 
     165             :         RealType reals[VecType::GetVecLength()];
     166          24 :         vec.storeInArray( reals);
     167             : 
     168         132 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     169         700 :             UASSERTETRUE(approxEqual(reals[idx], inReal));
     170             :         }
     171             : 
     172             :         default_alignas RealType realsalign[VecType::GetVecLength()];
     173          24 :         vec.storeInAlignedArray( realsalign);
     174             : 
     175         132 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     176         700 :             UASSERTETRUE(approxEqual(realsalign[idx], inReal));
     177             :         }
     178          28 :     }
     179             : 
     180         168 :     void approxEqualToArray(const VecType vec,
     181             :                             const RealType inReals[]) {
     182         768 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     183        4788 :             UASSERTETRUE(approxEqual(vec.at(int(idx)), inReals[idx]));
     184             :         }
     185             : 
     186             :         RealType reals[VecType::GetVecLength()];
     187         144 :         vec.storeInArray( reals);
     188             : 
     189         792 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     190        4200 :             UASSERTETRUE(approxEqual(reals[idx], inReals[idx]));
     191             :         }
     192             : 
     193             :         default_alignas RealType realsalign[VecType::GetVecLength()];
     194         144 :         vec.storeInAlignedArray( realsalign);
     195             : 
     196         792 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     197        4200 :             UASSERTETRUE(approxEqual(realsalign[idx], inReals[idx]));
     198             :         }
     199         168 :     }
     200             : 
     201          56 :     void approxLowAccEqualToArray(const VecType vec,
     202             :                             const RealType inReals[]) {
     203         256 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     204        1596 :             UASSERTETRUE(approxEqualLowAcc(vec.at(int(idx)), inReals[idx]));
     205             :         }
     206             : 
     207             :         RealType reals[VecType::GetVecLength()];
     208          48 :         vec.storeInArray( reals);
     209             : 
     210         264 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     211        1400 :             UASSERTETRUE(approxEqualLowAcc(reals[idx], inReals[idx]));
     212             :         }
     213             : 
     214             :         default_alignas RealType realsalign[VecType::GetVecLength()];
     215          48 :         vec.storeInAlignedArray( realsalign);
     216             : 
     217         264 :         for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     218        1400 :             UASSERTETRUE(approxEqualLowAcc(realsalign[idx], inReals[idx]));
     219             :         }
     220          56 :     }
     221             : 
     222          28 :     void TestBasic() {
     223          28 :         equalToScalar(VecType(1), 1);
     224          28 :         equalToScalar(VecType(RealType(0)), 0);
     225             : 
     226             :         {
     227             :             RealType reals[VecType::GetVecLength()];
     228         124 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     229          96 :                 reals[idx] = 1;
     230             :             }
     231          28 :             equalToScalar(VecType(reals), 1);
     232             :         }
     233             : 
     234             :         {
     235             :             assert(VecType::GetVecLength() <= 256);
     236          28 :             const RealType rv = 0;
     237          56 :             VecType vconstruct {{rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     238             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     239             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     240             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     241             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     242             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     243             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     244             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     245             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     246             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     247             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     248             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     249             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     250             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     251             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     252             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv}};
     253          56 :             VecType vcopyconstruct = {{rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     254             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     255             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     256             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     257             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     258             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     259             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     260             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     261             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     262             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     263             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     264             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     265             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     266             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     267             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     268             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv}};
     269          28 :             VecType vcopyop;
     270          56 :             vcopyop = VecType{{rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     271             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     272             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     273             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     274             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     275             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     276             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     277             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     278             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     279             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     280             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     281             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     282             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     283             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     284             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv,
     285             :                         rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv, rv}};
     286          56 :             vcopyop += vconstruct * vcopyconstruct; // unused
     287             :         }
     288             : 
     289             : 
     290             :         {
     291             :             default_alignas RealType reals[VecType::GetVecLength()];
     292             : #ifndef __NEC__
     293             :             default_alignas char buffer[VecType::GetVecLength()*sizeof(RealType)+8];
     294          28 :             RealType* realsna = reinterpret_cast<RealType*>(buffer+8);
     295             : #else
     296             :             default_alignas RealType buffer[VecType::GetVecLength()+1];
     297             :             RealType* realsna = reinterpret_cast<RealType*>(buffer+1);
     298             : #endif
     299             : 
     300         128 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     301         100 :                 reals[idx] = RealType(idx+1);
     302         100 :                 realsna[idx] = reals[idx];
     303             :             }
     304             : 
     305          28 :             VecType vec_no_fal(reals);
     306          28 :             equalToArray(vec_no_fal, reals);
     307          28 :             equalToArray(vec_no_fal, realsna);
     308             : 
     309          28 :             VecType vec_no_fna(realsna);
     310          28 :             equalToArray(vec_no_fna, reals);
     311          28 :             equalToArray(vec_no_fna, realsna);
     312             : 
     313          28 :             VecType vec_no_fal2;
     314          32 :             vec_no_fal2.setFromArray(reals);
     315          28 :             equalToArray(vec_no_fal2, reals);
     316          28 :             equalToArray(vec_no_fal2, realsna);
     317             : 
     318          28 :             VecType vec_no_fna2;
     319          32 :             vec_no_fna2.setFromArray(realsna);
     320          28 :             equalToArray(vec_no_fna2, reals);
     321          28 :             equalToArray(vec_no_fna2, realsna);
     322             : 
     323          28 :             VecType vec_al_fal;
     324          32 :             vec_al_fal.setFromAlignedArray(reals);
     325          28 :             equalToArray(vec_al_fal, reals);
     326          28 :             equalToArray(vec_al_fal, realsna);
     327             : 
     328         228 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     329         298 :                    equalToScalar(vec_no_fal.at(int(idx)), RealType(idx+1));
     330         298 :                    equalToScalar(vec_no_fna.at(int(idx)), RealType(idx+1));
     331         298 :                    equalToScalar(vec_no_fal2.at(int(idx)), RealType(idx+1));
     332         298 :                    equalToScalar(vec_no_fna2.at(int(idx)), RealType(idx+1));
     333         298 :                    equalToScalar(vec_al_fal.at(int(idx)), RealType(idx+1));
     334             :             }
     335             :         }
     336             : 
     337             :         {
     338          28 :             RealType real = 1;
     339             :             int indirect[VecType::GetVecLength()];
     340         124 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     341          96 :                 indirect[idx] = 0;
     342             :             }
     343          76 :             equalToScalar(VecType().setFromIndirectArray(&real, indirect), 1);
     344             :         }
     345             : 
     346             :         {
     347             :             RealType reals[VecType::GetVecLength()];
     348             :             int indirect[VecType::GetVecLength()];
     349         128 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     350         100 :                 indirect[idx] = int(idx);
     351         100 :                 reals[idx]    = RealType(idx);
     352             :             }
     353          76 :             equalToArray(VecType().setFromIndirectArray(reals, indirect), reals);
     354             :         }
     355             : 
     356             :         {
     357          28 :             const size_t limiteOffsetIn = std::min(32UL, sizeof(RealType)*size_t(VecType::GetVecLength()));
     358         564 :             for(size_t idxOffsetIn = 0 ; idxOffsetIn < limiteOffsetIn ; ++idxOffsetIn){
     359             :                 unsigned char* bufferIn[sizeof(RealType)*VecType::GetVecLength()*2];
     360         536 :                 RealType* realsIn = reinterpret_cast<RealType*>(&bufferIn[idxOffsetIn]);
     361        2864 :                 for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     362        2328 :                     realsIn[idx]    = RealType(idx);
     363             :                 }
     364             : 
     365         536 :                 VecType vec(realsIn);
     366         536 :                 equalToArray(vec, realsIn);
     367             : 
     368         560 :                 vec.setFromArray(realsIn);
     369         536 :                 equalToArray(vec, realsIn);
     370             : 
     371       25432 :                 for(size_t idxOffsetOut = 0 ; idxOffsetOut < sizeof(RealType)*size_t(VecType::GetVecLength()) ; ++idxOffsetOut){
     372             :                     unsigned char* bufferOut[sizeof(RealType)*VecType::GetVecLength()*2];
     373       12448 :                     RealType* realsOut = reinterpret_cast<RealType*>(&bufferOut[idxOffsetOut]);
     374             : 
     375       12448 :                     vec.storeInArray(realsOut);
     376       74048 :                     for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     377      369600 :                         UASSERTEEQUAL(realsOut[idx], realsIn[idx]);
     378             :                     }
     379             :                 }
     380             :             }
     381             :         }
     382             : 
     383             :         {
     384             :             RealType reals[VecType::GetVecLength()];
     385             :             int indirect[VecType::GetVecLength()];
     386         228 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     387         100 :                 indirect[idx] = int(idx);
     388         100 :                 reals[idx]    = RealType(idx);
     389             :             }
     390          76 :             equalToArray(VecType().setFromIndirectArray(reals, indirect), reals);
     391             :         }
     392             : 
     393             :         {
     394          28 :             RealType real                     = 1;
     395             :             int indirect[VecType::GetVecLength()];
     396         124 :             for (int idx = 0; idx < (VecType::GetVecLength()) ; ++idx) {
     397          96 :                 indirect[idx] = 0;
     398             :             }
     399          70 :             equalToScalar(VecType().setFromIndirect2DArray(&real, indirect, 0, indirect), 1);
     400             :         }
     401             : 
     402             :         {
     403             :             RealType reals[VecType::GetVecLength() * 2];
     404             :             int indirect1[VecType::GetVecLength()];
     405             :             int indirect2[VecType::GetVecLength()];
     406         128 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     407         100 :                 indirect1[idx]                   = int(idx);
     408         100 :                 indirect2[idx]                   = 1;
     409         100 :                 reals[idx]                       = RealType(idx);
     410         100 :                 reals[idx + size_t(VecType::GetVecLength())] = RealType(idx * 2);
     411             :             }
     412          70 :             equalToArray(VecType().setFromIndirect2DArray(reals, indirect1, 0, indirect1), reals);
     413          70 :             equalToArray(VecType().setFromIndirect2DArray(reals, indirect2, VecType::GetVecLength(), indirect1), &reals[VecType::GetVecLength()]);
     414             :         }
     415             : 
     416             :         {
     417         220 :             UASSERTEEQUAL(VecType(1).horizontalSum(), RealType(VecType::GetVecLength()));
     418         220 :             UASSERTEEQUAL(VecType(10).horizontalSum(), RealType(10 * VecType::GetVecLength()));
     419             : 
     420         220 :             UASSERTEEQUAL(VecType(1).horizontalMul(), RealType(1));
     421         248 :             UASSERTEEQUAL(VecType(10).horizontalMul(), RealType(pow(10, VecType::GetVecLength())));
     422             :         }
     423             : 
     424             :         {
     425         104 :             equalToScalar(VecType::Min(VecType(1),
     426             :                                          VecType(1)), RealType(1));
     427         104 :             equalToScalar(VecType::Min(VecType(RealType(0)),
     428             :                                          VecType(1)), RealType(0));
     429         104 :             equalToScalar(VecType::Min(VecType(1),
     430             :                                          VecType(RealType(0))), RealType(0));
     431             : 
     432         104 :             equalToScalar(VecType::Max(VecType(1),
     433             :                                          VecType(1)), RealType(1));
     434         104 :             equalToScalar(VecType::Max(VecType(RealType(0)),
     435             :                                          VecType(1)), RealType(1));
     436         104 :             equalToScalar(VecType::Max(VecType(1),
     437             :                                          VecType(RealType(0))), RealType(1));
     438             : 
     439          78 :             equalToScalar(VecType(1).abs(), RealType(1));
     440          78 :             equalToScalar(VecType(-1).abs(), RealType(1));
     441          78 :             equalToScalar(VecType(RealType(0)).abs(), RealType(0));
     442             :         }
     443             : 
     444             :         {
     445             :             RealType reals[VecType::GetVecLength()];
     446          22 :             RealType sum = 0;
     447          22 :             RealType mul = 1;
     448         148 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     449         100 :                 reals[idx] = RealType(idx);
     450         100 :                 sum += reals[idx];
     451         100 :                 mul *= reals[idx];
     452             :             }
     453         220 :             UASSERTEEQUAL(VecType(reals).horizontalSum(), sum);
     454         220 :             UASSERTEEQUAL(VecType(reals).horizontalMul(), mul);
     455             :         }
     456             : 
     457             :         {
     458          50 :             equalToScalar(VecType::GetZero(), 0);
     459          50 :             equalToScalar(VecType::GetOne(), 1);
     460             :         }
     461             : 
     462             :         {
     463             :             RealType reals[VecType::GetVecLength()];
     464             :             RealType expres[VecType::GetVecLength()];
     465             :             RealType expreslowacc[VecType::GetVecLength()];
     466             :             RealType sqrtres[VecType::GetVecLength()];
     467             :             RealType rsqrtres[VecType::GetVecLength()];
     468         128 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     469         100 :                 reals[idx]    = RealType((idx%10) + 1);
     470         100 :                 expres[idx]   = RealType(exp(reals[idx]));
     471         100 :                 expreslowacc[idx]   = RealType(exp(reals[idx]));
     472         100 :                 sqrtres[idx]  = RealType(sqrt(reals[idx]));
     473         100 :                 rsqrtres[idx] = RealType(1 / sqrt(reals[idx]));
     474             :             }
     475             : 
     476          50 :             approxEqualToArray(VecType(reals).exp(), expres);
     477          55 :             approxLowAccEqualToArray(VecType(reals).expLowAcc(), expreslowacc);
     478          78 :             approxEqualToArray(VecType(reals).sqrt(), sqrtres);
     479          78 :             approxEqualToArray(VecType(reals).rsqrt(), rsqrtres);
     480             : 
     481          50 :             approxEqualToScalar(VecType(RealType(0)).exp(), std::exp(RealType(0)));
     482             :         }
     483             : 
     484             : 
     485             : 
     486             :         {
     487             :             default_alignas RealType reals[VecType::GetVecLength()];
     488             :             default_alignas RealType expres[VecType::GetVecLength()];
     489             :             default_alignas RealType expreslowacc[VecType::GetVecLength()];
     490             :             default_alignas RealType sqrtres[VecType::GetVecLength()];
     491             :             default_alignas RealType rsqrtres[VecType::GetVecLength()];
     492         128 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
     493         100 :                 reals[idx]    = RealType((idx%10) + 1);
     494         100 :                 expres[idx]   = RealType(exp(reals[idx]));
     495         100 :                 expreslowacc[idx]   = RealType(exp(reals[idx]));
     496         100 :                 sqrtres[idx]  = RealType(sqrt(reals[idx]));
     497         100 :                 rsqrtres[idx] = RealType(1 / sqrt(reals[idx]));
     498             :             }
     499             : 
     500          80 :             approxEqualToArray(VecType().setFromAlignedArray(reals).exp(), expres);
     501          86 :             approxLowAccEqualToArray(VecType().setFromAlignedArray(reals).expLowAcc(), expreslowacc);
     502         104 :             approxEqualToArray(VecType().setFromAlignedArray(reals).sqrt(), sqrtres);
     503         104 :             approxEqualToArray(VecType().setFromAlignedArray(reals).rsqrt(), rsqrtres);
     504             :         }
     505             : 
     506             :         {
     507          78 :             equalToScalar(VecType(RealType(0)).signOf(), 0);
     508          78 :             equalToScalar(VecType(-1).signOf(), -1);
     509          78 :             equalToScalar(VecType(1).signOf(), 1);
     510          78 :             equalToScalar(VecType(-10).signOf(), -1);
     511          78 :             equalToScalar(VecType(10).signOf(), 1);
     512             : 
     513          78 :             equalToScalar(VecType(RealType(0)).isPositive(), 1);
     514          78 :             equalToScalar(VecType(-1).isPositive(), 0);
     515          78 :             equalToScalar(VecType(1).isPositive(), 1);
     516          78 :             equalToScalar(VecType(-10).isPositive(), 0);
     517          78 :             equalToScalar(VecType(10).isPositive(), 1);
     518             : 
     519          78 :             equalToScalar(VecType(RealType(0)).isNegative(), 1);
     520          78 :             equalToScalar(VecType(-1).isNegative(), 1);
     521          78 :             equalToScalar(VecType(1).isNegative(), 0);
     522          78 :             equalToScalar(VecType(-10).isNegative(), 1);
     523          78 :             equalToScalar(VecType(10).isNegative(), 0);
     524             : 
     525          78 :             equalToScalar(VecType(RealType(0)).isPositiveStrict(), 0);
     526          78 :             equalToScalar(VecType(-1).isPositiveStrict(), 0);
     527          78 :             equalToScalar(VecType(1).isPositiveStrict(), 1);
     528          78 :             equalToScalar(VecType(-10).isPositiveStrict(), 0);
     529          78 :             equalToScalar(VecType(10).isPositiveStrict(), 1);
     530             : 
     531          78 :             equalToScalar(VecType(RealType(0)).isNegativeStrict(), 0);
     532          78 :             equalToScalar(VecType(-1).isNegativeStrict(), 1);
     533          78 :             equalToScalar(VecType(1).isNegativeStrict(), 0);
     534          78 :             equalToScalar(VecType(-10).isNegativeStrict(), 1);
     535          78 :             equalToScalar(VecType(10).isNegativeStrict(), 0);
     536             : 
     537             : 
     538          78 :             equalToScalar(VecType(RealType(0)).isZero(), 1);
     539          78 :             equalToScalar(VecType(RealType(0)).isNotZero(), 0);
     540             : 
     541          78 :             equalToScalar(VecType(1).isZero(), 0);
     542          78 :             equalToScalar(VecType(1).isNotZero(), 1);
     543          78 :             equalToScalar(VecType(1).isZero(), 0);
     544          78 :             equalToScalar(VecType(1).isNotZero(), 1);
     545             :         }
     546             :         {
     547         104 :             equalToScalar(VecType::IsLowerOrEqual(VecType(RealType(0)),
     548             :                                                     VecType(RealType(0))),
     549             :                           1);
     550         104 :             equalToScalar(VecType::IsLowerOrEqual(VecType(-1),
     551             :                                                     VecType(-1)),
     552             :                           1);
     553         104 :             equalToScalar(VecType::IsLowerOrEqual(VecType(-1),
     554             :                                                     VecType(1)),
     555             :                           1);
     556         104 :             equalToScalar(VecType::IsLowerOrEqual(VecType(1),
     557             :                                                     VecType(-1)),
     558             :                           0);
     559             : 
     560         104 :             equalToScalar(VecType::IsLower(VecType(RealType(0)),
     561             :                                              VecType(RealType(0))),
     562             :                           0);
     563         104 :             equalToScalar(VecType::IsLower(VecType(-1),
     564             :                                              VecType(-1)),
     565             :                           0);
     566         104 :             equalToScalar(VecType::IsLower(VecType(-1),
     567             :                                              VecType(1)),
     568             :                           1);
     569         104 :             equalToScalar(VecType::IsLower(VecType(1),
     570             :                                              VecType(-1)),
     571             :                           0);
     572             : 
     573         104 :             equalToScalar(VecType::IsGreaterOrEqual(VecType(RealType(0)),
     574             :                                                       VecType(RealType(0))),
     575             :                           1);
     576         104 :             equalToScalar(VecType::IsGreaterOrEqual(VecType(-1),
     577             :                                                       VecType(-1)),
     578             :                           1);
     579         104 :             equalToScalar(VecType::IsGreaterOrEqual(VecType(-1),
     580             :                                                       VecType(1)),
     581             :                           0);
     582         104 :             equalToScalar(VecType::IsGreaterOrEqual(VecType(1),
     583             :                                                       VecType(-1)),
     584             :                           1);
     585             : 
     586         104 :             equalToScalar(VecType::IsGreater(VecType(RealType(0)),
     587             :                                                VecType(RealType(0))),
     588             :                           0);
     589         104 :             equalToScalar(VecType::IsGreater(VecType(-1),
     590             :                                                VecType(-1)),
     591             :                           0);
     592         104 :             equalToScalar(VecType::IsGreater(VecType(-1),
     593             :                                                VecType(1)),
     594             :                           0);
     595         104 :             equalToScalar(VecType::IsGreater(VecType(1),
     596             :                                                VecType(-1)),
     597             :                           1);
     598             : 
     599         104 :             equalToScalar(VecType::IsEqual(VecType(RealType(0)),
     600             :                                              VecType(RealType(0))),
     601             :                           1);
     602         104 :             equalToScalar(VecType::IsEqual(VecType(-1),
     603             :                                              VecType(-1)),
     604             :                           1);
     605         104 :             equalToScalar(VecType::IsEqual(VecType(-1),
     606             :                                              VecType(1)),
     607             :                           0);
     608         104 :             equalToScalar(VecType::IsEqual(VecType(1),
     609             :                                              VecType(-1)),
     610             :                           0);
     611             : 
     612         104 :             equalToScalar(VecType::IsNotEqual(VecType(RealType(0)),
     613             :                                                 VecType(RealType(0))),
     614             :                           0);
     615         104 :             equalToScalar(VecType::IsNotEqual(VecType(-1),
     616             :                                                 VecType(-1)),
     617             :                           0);
     618         104 :             equalToScalar(VecType::IsNotEqual(VecType(-1),
     619             :                                                 VecType(1)),
     620             :                           1);
     621         104 :             equalToScalar(VecType::IsNotEqual(VecType(1),
     622             :                                                 VecType(-1)),
     623             :                           1);
     624             :         }
     625             :         {
     626          28 :             const MaskType trueMask(true);
     627          28 :             const MaskType falseMask(false);
     628             : 
     629          84 :             equalToScalarMask(VecType(RealType(0)).isPositiveMask(), trueMask);
     630          84 :             equalToScalarMask(VecType(-1).isPositiveMask(), falseMask);
     631          84 :             equalToScalarMask(VecType(1).isPositiveMask(), trueMask);
     632          84 :             equalToScalarMask(VecType(-10).isPositiveMask(), falseMask);
     633          84 :             equalToScalarMask(VecType(10).isPositiveMask(), trueMask);
     634             : 
     635          84 :             equalToScalarMask(VecType(RealType(0)).isNegativeMask(), trueMask);
     636          84 :             equalToScalarMask(VecType(-1).isNegativeMask(), trueMask);
     637          84 :             equalToScalarMask(VecType(1).isNegativeMask(), falseMask);
     638          84 :             equalToScalarMask(VecType(-10).isNegativeMask(), trueMask);
     639          84 :             equalToScalarMask(VecType(10).isNegativeMask(), falseMask);
     640             : 
     641          84 :             equalToScalarMask(VecType(RealType(0)).isPositiveStrictMask(), falseMask);
     642          84 :             equalToScalarMask(VecType(-1).isPositiveStrictMask(), falseMask);
     643          84 :             equalToScalarMask(VecType(1).isPositiveStrictMask(), trueMask);
     644          84 :             equalToScalarMask(VecType(-10).isPositiveStrictMask(), falseMask);
     645          84 :             equalToScalarMask(VecType(10).isPositiveStrictMask(), trueMask);
     646             : 
     647          84 :             equalToScalarMask(VecType(RealType(0)).isNegativeStrictMask(), falseMask);
     648          84 :             equalToScalarMask(VecType(-1).isNegativeStrictMask(), trueMask);
     649          84 :             equalToScalarMask(VecType(1).isNegativeStrictMask(), falseMask);
     650          84 :             equalToScalarMask(VecType(-10).isNegativeStrictMask(), trueMask);
     651          84 :             equalToScalarMask(VecType(10).isNegativeStrictMask(), falseMask);
     652             : 
     653             : 
     654          84 :             equalToScalarMask(VecType(RealType(0)).isZeroMask(), trueMask);
     655          84 :             equalToScalarMask(VecType(RealType(0)).isNotZeroMask(), falseMask);
     656             : 
     657          84 :             equalToScalarMask(VecType(1).isZeroMask(), falseMask);
     658          84 :             equalToScalarMask(VecType(1).isNotZeroMask(), trueMask);
     659          84 :             equalToScalarMask(VecType(1).isZeroMask(), falseMask);
     660          84 :             equalToScalarMask(VecType(1).isNotZeroMask(), trueMask);
     661             :         }
     662             : 
     663             :         {
     664          28 :             const MaskType trueMask(true);
     665          28 :             const MaskType falseMask(false);
     666             : 
     667         110 :             equalToScalarMask(VecType::IsLowerOrEqualMask(VecType(RealType(0)),
     668             :                                                             VecType(RealType(0))),
     669             :                               trueMask);
     670         110 :             equalToScalarMask(VecType::IsLowerOrEqualMask(VecType(-1),
     671             :                                                             VecType(-1)),
     672             :                               trueMask);
     673         110 :             equalToScalarMask(VecType::IsLowerOrEqualMask(VecType(-1),
     674             :                                                             VecType(1)),
     675             :                               trueMask);
     676         110 :             equalToScalarMask(VecType::IsLowerOrEqualMask(VecType(1),
     677             :                                                             VecType(-1)),
     678             :                               falseMask);
     679             : 
     680         110 :             equalToScalarMask(VecType::IsLowerMask(VecType(RealType(0)),
     681             :                                                      VecType(RealType(0))),
     682             :                               falseMask);
     683         110 :             equalToScalarMask(VecType::IsLowerMask(VecType(-1),
     684             :                                                      VecType(-1)),
     685             :                               falseMask);
     686         110 :             equalToScalarMask(VecType::IsLowerMask(VecType(-1),
     687             :                                                      VecType(1)),
     688             :                               trueMask);
     689         110 :             equalToScalarMask(VecType::IsLowerMask(VecType(1),
     690             :                                                      VecType(-1)),
     691             :                               falseMask);
     692             : 
     693         110 :             equalToScalarMask(VecType::IsGreaterOrEqualMask(VecType(RealType(0)),
     694             :                                                               VecType(RealType(0))),
     695             :                               trueMask);
     696         110 :             equalToScalarMask(VecType::IsGreaterOrEqualMask(VecType(-1),
     697             :                                                               VecType(-1)),
     698             :                               trueMask);
     699         110 :             equalToScalarMask(VecType::IsGreaterOrEqualMask(VecType(-1),
     700             :                                                               VecType(1)),
     701             :                               falseMask);
     702         110 :             equalToScalarMask(VecType::IsGreaterOrEqualMask(VecType(1),
     703             :                                                               VecType(-1)),
     704             :                               trueMask);
     705             : 
     706         110 :             equalToScalarMask(VecType::IsGreaterMask(VecType(RealType(0)),
     707             :                                                        VecType(RealType(0))),
     708             :                               falseMask);
     709         110 :             equalToScalarMask(VecType::IsGreaterMask(VecType(-1),
     710             :                                                        VecType(-1)),
     711             :                               falseMask);
     712         110 :             equalToScalarMask(VecType::IsGreaterMask(VecType(-1),
     713             :                                                        VecType(1)),
     714             :                               falseMask);
     715         110 :             equalToScalarMask(VecType::IsGreaterMask(VecType(1),
     716             :                                                        VecType(-1)),
     717             :                               trueMask);
     718             : 
     719         110 :             equalToScalarMask(VecType::IsEqualMask(VecType(RealType(0)),
     720             :                                                      VecType(RealType(0))),
     721             :                               trueMask);
     722         110 :             equalToScalarMask(VecType::IsEqualMask(VecType(-1),
     723             :                                                      VecType(-1)),
     724             :                               trueMask);
     725         110 :             equalToScalarMask(VecType::IsEqualMask(VecType(-1),
     726             :                                                      VecType(1)),
     727             :                               falseMask);
     728         110 :             equalToScalarMask(VecType::IsEqualMask(VecType(1),
     729             :                                                      VecType(-1)),
     730             :                               falseMask);
     731             : 
     732         110 :             equalToScalarMask(VecType::IsNotEqualMask(VecType(RealType(0)),
     733             :                                                         VecType(RealType(0))),
     734             :                               falseMask);
     735         110 :             equalToScalarMask(VecType::IsNotEqualMask(VecType(-1),
     736             :                                                         VecType(-1)),
     737             :                               falseMask);
     738         110 :             equalToScalarMask(VecType::IsNotEqualMask(VecType(-1),
     739             :                                                         VecType(1)),
     740             :                               trueMask);
     741         110 :             equalToScalarMask(VecType::IsNotEqualMask(VecType(1),
     742             :                                                         VecType(-1)),
     743             :                               trueMask);
     744             :         }
     745             : 
     746             :         {
     747          72 :             equalToScalar(VecType(RealType(1)).floor(), std::floor(RealType(1)));
     748          72 :             equalToScalar(VecType(RealType(1.5)).floor(), std::floor(RealType(1.5)));
     749          72 :             equalToScalar(VecType(RealType(1.9)).floor(), std::floor(RealType(1.9)));
     750          72 :             equalToScalar(VecType(RealType(100000.9999)).floor(), std::floor(RealType(100000.9999)));
     751          72 :             equalToScalar(VecType(RealType(-1000.99)).floor(), std::floor(RealType(-1000.99)));
     752             :         }
     753             :         {
     754          28 :             const VecType trueMask(1);
     755          28 :             const VecType falseMask(RealType(0));
     756             : 
     757          50 :             equalToVecType(VecType::BitsOr(falseMask,
     758             :                                                 falseMask),
     759             :                               falseMask);
     760          50 :             equalToVecType(VecType::BitsOr(trueMask,
     761             :                                                 falseMask),
     762             :                               trueMask);
     763          50 :             equalToVecType(VecType::BitsOr(trueMask,
     764             :                                                 trueMask),
     765             :                               trueMask);
     766             : 
     767          50 :             equalToVecType(VecType::BitsAnd(falseMask,
     768             :                                                  falseMask),
     769             :                               falseMask);
     770          50 :             equalToVecType(VecType::BitsAnd(trueMask,
     771             :                                                  falseMask),
     772             :                               falseMask);
     773          50 :             equalToVecType(VecType::BitsAnd(trueMask,
     774             :                                                  trueMask),
     775             :                               trueMask);
     776             : 
     777             : 
     778          50 :             equalToVecType(VecType::BitsXor(falseMask,
     779             :                                                  falseMask),
     780             :                               falseMask);
     781          50 :             equalToVecType(VecType::BitsXor(trueMask,
     782             :                                                  falseMask),
     783             :                               trueMask);
     784          50 :             equalToVecType(VecType::BitsXor(trueMask,
     785             :                                                  trueMask),
     786             :                               falseMask);
     787             : 
     788             : 
     789          50 :             equalToVecType(VecType::BitsNotAnd(falseMask,
     790             :                                                     falseMask),
     791             :                               falseMask);
     792          50 :             equalToVecType(VecType::BitsNotAnd(trueMask,
     793             :                                                     falseMask),
     794             :                               falseMask);
     795          50 :             equalToVecType(VecType::BitsNotAnd(trueMask,
     796             :                                                     trueMask),
     797             :                               falseMask);
     798          50 :             equalToVecType(VecType::BitsNotAnd(falseMask,trueMask),
     799             :                               trueMask);
     800             :         }
     801             :         {
     802          90 :             equalToScalar(VecType(0.) + VecType(0.),0);
     803          90 :             equalToScalar(VecType(0.) + VecType(10.),10);
     804          90 :             equalToScalar(VecType(10.) + VecType(10.),20);
     805          90 :             equalToScalar(VecType(10.) + VecType(0.),10);
     806             : 
     807          90 :             equalToScalar(VecType(0.) - VecType(0.),0);
     808          90 :             equalToScalar(VecType(0.) - VecType(10.),-10);
     809          90 :             equalToScalar(VecType(10.) - VecType(10.),0);
     810          90 :             equalToScalar(VecType(10.) - VecType(0.),10);
     811             : 
     812          90 :             equalToScalar(VecType(0.) * VecType(0.),0);
     813          90 :             equalToScalar(VecType(0.) * VecType(10.),0);
     814          90 :             equalToScalar(VecType(10.) * VecType(10.),100);
     815          90 :             equalToScalar(VecType(10.) * VecType(0.),0);
     816             : 
     817          90 :             equalToScalar(VecType(0.) / VecType(10.),0);
     818          90 :             equalToScalar(VecType(10.) / VecType(10.),1);
     819             :         }
     820             :         {
     821         102 :             equalToScalar(VecType(0.) += VecType(0.),0);
     822         102 :             equalToScalar(VecType(0.) += VecType(10.),10);
     823         102 :             equalToScalar(VecType(10.) += VecType(10.),20);
     824         102 :             equalToScalar(VecType(10.) += VecType(0.),10);
     825             : 
     826         102 :             equalToScalar(VecType(0.) -= VecType(0.),0);
     827         102 :             equalToScalar(VecType(0.) -= VecType(10.),-10);
     828         102 :             equalToScalar(VecType(10.) -= VecType(10.),0);
     829         102 :             equalToScalar(VecType(10.) -= VecType(0.),10);
     830             : 
     831         102 :             equalToScalar(VecType(0.) *= VecType(0.),0);
     832         102 :             equalToScalar(VecType(0.) *= VecType(10.),0);
     833         102 :             equalToScalar(VecType(10.) *= VecType(10.),100);
     834         102 :             equalToScalar(VecType(10.) *= VecType(0.),0);
     835             : 
     836         102 :             equalToScalar(VecType(0.) /= VecType(10.),0);
     837         102 :             equalToScalar(VecType(10.) /= VecType(10.),1);
     838             :         }
     839             :         {
     840          78 :             equalToScalar(-VecType(-4.),4.);
     841          78 :             equalToScalar(-VecType(4.),-4.);
     842          28 :             VecType a = 1.;
     843          50 :             equalToScalar(-a,-1.);
     844          78 :             equalToScalar((-1.) * a,-1.);
     845          28 :             a = VecType(-1.);
     846          50 :             equalToScalar(-a,1.);
     847          78 :             equalToScalar((-1.) * a,1.);
     848             :         }
     849             : 
     850             :         {
     851          64 :             equalToScalar(VecType(1.).pow(0),1.);
     852          58 :             equalToScalar(VecType(1.).pow(1),1.);
     853          58 :             equalToScalar(VecType(1.).pow(2),1.);
     854             : 
     855          58 :             equalToScalar(VecType(2.).pow(2),4.);
     856             : 
     857          58 :             equalToScalar(VecType(5.).pow(10),RealType(std::pow(5., 10)));
     858          58 :             equalToScalar(VecType(2.).pow(12),RealType(std::pow(2., 12)));
     859             :         }
     860             : 
     861             :         {
     862          28 :             VecType::MultiHorizontalSum(nullptr); // Should compile
     863             : 
     864          28 :             RealType res = 0;
     865          56 :             VecType::MultiHorizontalSum(&res, VecType(1));
     866         220 :             UASSERTEEQUAL(VecType(1).horizontalSum(), res);
     867             : 
     868          28 :             res = 0;
     869          56 :             VecType::MultiHorizontalSum(&res, VecType(10));
     870         220 :             UASSERTEEQUAL(VecType(10).horizontalSum(), res);
     871             :         }
     872             :         {
     873          28 :             RealType res[2] = {0};
     874          28 :             VecType v1(1);
     875          28 :             VecType v2(10);
     876             : 
     877          28 :             VecType::MultiHorizontalSum(res, v1, v2);
     878             : 
     879         194 :             UASSERTEEQUAL(v1.horizontalSum(), res[0]);
     880         194 :             UASSERTEEQUAL(v2.horizontalSum(), res[1]);
     881             :         }
     882             :         {
     883          28 :             RealType res[3] = {0};
     884          28 :             VecType v1(1);
     885          28 :             VecType v2(10);
     886          28 :             VecType v3(100);
     887             : 
     888          28 :             VecType::MultiHorizontalSum(res, v1, v2, v3);
     889             : 
     890         194 :             UASSERTEEQUAL(v1.horizontalSum(), res[0]);
     891         194 :             UASSERTEEQUAL(v2.horizontalSum(), res[1]);
     892         194 :             UASSERTEEQUAL(v3.horizontalSum(), res[2]);
     893             :         }
     894             :         {
     895          28 :             RealType res[4] = {0};
     896          28 :             VecType v1(1);
     897          28 :             VecType v2(10);
     898          28 :             VecType v3(100);
     899          28 :             VecType v4(1000);
     900             : 
     901          28 :             VecType::MultiHorizontalSum(res, v1, v2, v3, v4);
     902             : 
     903         194 :             UASSERTEEQUAL(v1.horizontalSum(), res[0]);
     904         194 :             UASSERTEEQUAL(v2.horizontalSum(), res[1]);
     905         194 :             UASSERTEEQUAL(v3.horizontalSum(), res[2]);
     906         194 :             UASSERTEEQUAL(v4.horizontalSum(), res[3]);
     907             :         }
     908             :         {
     909          28 :             RealType res[5] = {0};
     910          28 :             VecType v1(1);
     911          28 :             VecType v2(10);
     912          28 :             VecType v3(100);
     913          28 :             VecType v4(1000);
     914          28 :             VecType v5(10000);
     915             : 
     916          28 :             VecType::MultiHorizontalSum(res, v1, v2, v3, v4, v5);
     917             : 
     918         194 :             UASSERTEEQUAL(v1.horizontalSum(), res[0]);
     919         194 :             UASSERTEEQUAL(v2.horizontalSum(), res[1]);
     920         194 :             UASSERTEEQUAL(v3.horizontalSum(), res[2]);
     921         194 :             UASSERTEEQUAL(v4.horizontalSum(), res[3]);
     922         194 :             UASSERTEEQUAL(v5.horizontalSum(), res[4]);
     923             :         }
     924             :         {
     925          28 :             const int nb_vec_test = 3;
     926          28 :             RealType res[nb_vec_test] = {0};
     927          28 :             RealType good_res[nb_vec_test] = {0};
     928          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
     929         184 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
     930         504 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
     931             :             }
     932             :         }
     933             :         {
     934          28 :             const int nb_vec_test = 4;
     935          28 :             RealType res[nb_vec_test] = {0};
     936          28 :             RealType good_res[nb_vec_test] = {0};
     937          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
     938         236 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
     939         672 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
     940             :             }
     941             :         }
     942             :         {
     943          28 :             const int nb_vec_test = 5;
     944          28 :             RealType res[nb_vec_test] = {0};
     945          28 :             RealType good_res[nb_vec_test] = {0};
     946          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
     947         288 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
     948         840 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
     949             :             }
     950             :         }
     951             :         {
     952          28 :             const int nb_vec_test = 6;
     953          28 :             RealType res[nb_vec_test] = {0};
     954          28 :             RealType good_res[nb_vec_test] = {0};
     955          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
     956         340 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
     957        1008 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
     958             :             }
     959             :         }
     960             :         {
     961          28 :             const int nb_vec_test = 7;
     962          28 :             RealType res[nb_vec_test] = {0};
     963          28 :             RealType good_res[nb_vec_test] = {0};
     964          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
     965         392 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
     966        1176 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
     967             :             }
     968             :         }
     969             :         {
     970          28 :             const int nb_vec_test = 8;
     971          28 :             RealType res[nb_vec_test] = {0};
     972          28 :             RealType good_res[nb_vec_test] = {0};
     973          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
     974         444 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
     975        1344 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
     976             :             }
     977             :         }
     978             :         {
     979          28 :             const int nb_vec_test = 9;
     980          28 :             RealType res[nb_vec_test] = {0};
     981          28 :             RealType good_res[nb_vec_test] = {0};
     982          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
     983         496 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
     984        1512 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
     985             :             }
     986             :         }
     987             :         {
     988          28 :             const int nb_vec_test = 10;
     989          28 :             RealType res[nb_vec_test] = {0};
     990          28 :             RealType good_res[nb_vec_test] = {0};
     991          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
     992         548 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
     993        1680 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
     994             :             }
     995             :         }
     996             :         {
     997          28 :             const int nb_vec_test = 11;
     998          28 :             RealType res[nb_vec_test] = {0};
     999          28 :             RealType good_res[nb_vec_test] = {0};
    1000          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
    1001         600 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
    1002        1848 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
    1003             :             }
    1004             :         }
    1005             :         {
    1006          28 :             const int nb_vec_test = 12;
    1007          28 :             RealType res[nb_vec_test] = {0};
    1008          28 :             RealType good_res[nb_vec_test] = {0};
    1009          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
    1010         652 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
    1011        2016 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
    1012             :             }
    1013             :         }
    1014             :         {
    1015          28 :             const int nb_vec_test = 13;
    1016          28 :             RealType res[nb_vec_test] = {0};
    1017          28 :             RealType good_res[nb_vec_test] = {0};
    1018          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
    1019         704 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
    1020        2184 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
    1021             :             }
    1022             :         }
    1023             :         {
    1024          28 :             const int nb_vec_test = 14;
    1025          28 :             RealType res[nb_vec_test] = {0};
    1026          28 :             RealType good_res[nb_vec_test] = {0};
    1027          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
    1028         756 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
    1029        2352 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
    1030             :             }
    1031             :         }
    1032             :         {
    1033          28 :             const int nb_vec_test = 15;
    1034          28 :             RealType res[nb_vec_test] = {0};
    1035          28 :             RealType good_res[nb_vec_test] = {0};
    1036          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
    1037         808 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
    1038        2520 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
    1039             :             }
    1040             :         }
    1041             :         {
    1042          28 :             const int nb_vec_test = 16;
    1043          28 :             RealType res[nb_vec_test] = {0};
    1044          28 :             RealType good_res[nb_vec_test] = {0};
    1045          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
    1046         860 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
    1047        2688 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
    1048             :             }
    1049             :         }
    1050             :         {
    1051          28 :             const int nb_vec_test = 17;
    1052          28 :             RealType res[nb_vec_test] = {0};
    1053          28 :             RealType good_res[nb_vec_test] = {0};
    1054          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
    1055         912 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
    1056        2856 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
    1057             :             }
    1058             :         }
    1059             :         {
    1060          28 :             const int nb_vec_test = 18;
    1061          28 :             RealType res[nb_vec_test] = {0};
    1062          28 :             RealType good_res[nb_vec_test] = {0};
    1063          28 :             MultiHorizontalSumTester<VecType,nb_vec_test>::addToTest(res, good_res, 0);
    1064         964 :             for(int idx = 0 ; idx < nb_vec_test ; ++idx){
    1065        3024 :                 UASSERTEEQUAL(good_res[idx], res[idx]);
    1066             :             }
    1067             :         }
    1068             : 
    1069             : 
    1070             :         {
    1071             :             RealType reals[VecType::GetVecLength()];
    1072         128 :             for (size_t idx1 = 0; idx1 < size_t(VecType::GetVecLength()) ; ++idx1) {
    1073             :                 {
    1074        1064 :                     for (size_t idx2 = 0; idx2 < size_t(VecType::GetVecLength()) ; ++idx2) {
    1075         480 :                         reals[idx2] = (idx1 == idx2 ? 10 : 0);
    1076             :                     }
    1077         100 :                     VecType vec(reals);
    1078             :                     if(VecType::GetVecLength() == 1){
    1079          26 :                         UASSERTEEQUAL(vec.minInVec(), RealType(10));
    1080          26 :                         UASSERTEEQUAL(vec.maxInVec(), RealType(10));
    1081             :                     }
    1082             :                     else{
    1083         672 :                         UASSERTEEQUAL(vec.minInVec(), RealType(0));
    1084         672 :                         UASSERTEEQUAL(vec.maxInVec(), RealType(10));
    1085             :                     }
    1086             :                 }
    1087             :                 {
    1088         580 :                     for (size_t idx2 = 0; idx2 < size_t(VecType::GetVecLength()) ; ++idx2) {
    1089         480 :                         reals[idx2] = (idx1 == idx2 ? -10 : 0);
    1090             :                     }
    1091         100 :                     VecType vec(reals);
    1092             :                     if(VecType::GetVecLength() == 1){
    1093          26 :                         UASSERTEEQUAL(vec.minInVec(), RealType(-10));
    1094          26 :                         UASSERTEEQUAL(vec.maxInVec(), RealType(-10));
    1095             :                     }
    1096             :                     else{
    1097         672 :                         UASSERTEEQUAL(vec.minInVec(), RealType(-10));
    1098         672 :                         UASSERTEEQUAL(vec.maxInVec(), RealType(0));
    1099             :                     }
    1100             :                 }
    1101             :             }
    1102             :         }
    1103             : 
    1104             :         {
    1105          28 :             const VecType zero(RealType(0));
    1106          28 :             const VecType one(RealType(1));
    1107          50 :             equalToScalar(VecType::Fma(zero, zero, zero), RealType(0));
    1108          50 :             equalToScalar(VecType::Fma(one, zero, zero), RealType(1));
    1109          50 :             equalToScalar(VecType::Fma(zero, one, one), RealType(1));
    1110          50 :             equalToScalar(VecType::Fma(one, one, one), RealType(2));
    1111             : 
    1112             :             RealType a[VecType::GetVecLength()];
    1113             :             RealType b[VecType::GetVecLength()];
    1114             :             RealType c[VecType::GetVecLength()];
    1115         148 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
    1116         100 :                 a[idx] = RealType(idx+1);
    1117         100 :                 b[idx] = RealType(idx*10);
    1118         100 :                 c[idx] = RealType(idx)+RealType(1.3);
    1119             :             }
    1120             : 
    1121             :             RealType res[VecType::GetVecLength()];
    1122         228 :             for (size_t idx = 0; idx < size_t(VecType::GetVecLength()) ; ++idx) {
    1123         100 :                 res[idx] = a[idx] + (b[idx] * c[idx]);
    1124             :             }
    1125         130 :             equalToArray(VecType::Fma(VecType(a), VecType(b), VecType(c)), res);
    1126             :         }
    1127          28 :     }
    1128             : 
    1129          28 :     void SetTests() {
    1130          84 :         Parent::AddTest(&TestAll::TestBasic, "Basic test for vec type");
    1131          28 :     }
    1132             : };
    1133             : 
    1134             : #endif

Generated by: LCOV version 1.13