1 /* Copyright (C) 2017 Povilas Kanapickas <povilas@radix.lt> 2 3 Distributed under the Boost Software License, Version 1.0. 4 (See accompanying file LICENSE_1_0.txt or copy at 5 http://www.boost.org/LICENSE_1_0.txt) 6 */ 7 8 #ifndef LIBSIMDPP_SIMDPP_DETAIL_VECTOR_ARRAY_MACROS_H 9 #define LIBSIMDPP_SIMDPP_DETAIL_VECTOR_ARRAY_MACROS_H 10 11 #ifndef LIBSIMDPP_SIMD_H 12 #error "This file must be included through simd.h" 13 #endif 14 15 #include <simdpp/types.h> 16 17 #define SIMDPP_VEC_ARRAY_IMPL1(RTYPE, OP, V1) \ 18 RTYPE r; for (unsigned i = 0; i < r.vec_length; ++i) { \ 19 r.vec(i) = OP((V1).vec(i)); } \ 20 return r; 21 22 #define SIMDPP_VEC_ARRAY_IMPL2(RTYPE, OP, V1, V2) \ 23 RTYPE r; for (unsigned i = 0; i < r.vec_length; ++i) { \ 24 r.vec(i) = OP((V1).vec(i), (V2).vec(i)); } \ 25 return r; 26 27 #define SIMDPP_VEC_ARRAY_IMPL2S(RTYPE, OP, V1, A2) \ 28 RTYPE r; for (unsigned i = 0; i < r.vec_length; ++i) { \ 29 r.vec(i) = OP((V1).vec(i), (A2)); } \ 30 return r; 31 32 #define SIMDPP_VEC_ARRAY_IMPL3(RTYPE, OP, V1, V2, V3) \ 33 RTYPE r; for (unsigned i = 0; i < r.vec_length; ++i) { \ 34 r.vec(i) = OP((V1).vec(i), (V2).vec(i), (V3).vec(i)); \ 35 } \ 36 return r; 37 38 #define SIMDPP_VEC_ARRAY_IMPL_REF1(RTYPE, OP, V1) \ 39 for (unsigned i = 0; i < RTYPE::vec_length; ++i) { \ 40 OP((V1).vec(i)); } 41 42 #define SIMDPP_VEC_ARRAY_IMPL_REF2(RTYPE, OP, V1, V2) \ 43 for (unsigned i = 0; i < RTYPE::vec_length; ++i) { \ 44 OP((V1).vec(i), (V2).vec(i)); } 45 46 #define SIMDPP_VEC_ARRAY_IMPL_REF3(RTYPE, OP, V1, V2, V3) \ 47 for (unsigned i = 0; i < RTYPE::vec_length; ++i) { \ 48 OP((V1).vec(i), (V2).vec(i), (V3).vec(i)); } 49 50 #define SIMDPP_VEC_ARRAY_IMPL_REF4(RTYPE, OP, V1, V2, V3, V4) \ 51 for (unsigned i = 0; i < RTYPE::vec_length; ++i) { \ 52 OP((V1).vec(i), (V2).vec(i), (V3).vec(i), (V4).vec(i)); } 53 54 #endif 55