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