1// This file is generated by tools/gen_operators.pl. CHANGES WILL BE OVERWRITTEN
2/* Copyright (C) 2013-2014 Povilas Kanapickas <povilas@radix.lt>
3
4 Distributed under the Boost Software License, Version 1.0.
5 (See accompanying file LICENSE_1_0.txt or copy at
6 http://www.boost.org/LICENSE_1_0.txt)
7*/
8
9#ifndef LIBSIMDPP_SIMDPP_CORE_BIT_XOR_OPERATOR_H
10#define LIBSIMDPP_SIMDPP_CORE_BIT_XOR_OPERATOR_H
11
12#ifndef LIBSIMDPP_SIMD_H
13 #error "This file must be included through simd.h"
14#endif
15
16#include <simdpp/types.h>
17#include <simdpp/detail/get_expr.h>
18#include <simdpp/detail/insn/bit_xor.h>
19#include <simdpp/core/detail/scalar_arg_impl.h>
20
21namespace simdpp {
22namespace SIMDPP_ARCH_NAMESPACE {
23
24/** Computes bitwise XOR of integer or floating-point vectors.
25
26 @code
27 r0 = a0 ^ b0
28 ...
29 rN = aN ^ bN
30 @endcode
31
32 @par 256-bit version:
33 @icost{SSE2-AVX, NEON, ALTIVEC, 2}
34*/
35template<unsigned N, class V1, class V2> SIMDPP_INL
36typename detail::get_expr2<V1, V2>::empty
37 operator^(const any_vec<N,V1>& a, const any_vec<N,V2>& b)
38{
39 typename detail::get_expr2_nosign<V1, V2>::type ra, rb;
40 ra = a.wrapped().eval();
41 rb = b.wrapped().eval();
42 return detail::insn::i_bit_xor(ra, rb);
43}
44
45// support scalar arguments
46template<unsigned N, class V> SIMDPP_INL
47typename detail::get_expr2<typename detail::get_expr_nomask<V>::type, V>::empty
48 operator^(const unsigned& a, const any_vec<N,V>& b)
49{
50 return operator^(detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(a), b);
51}
52template<unsigned N, class V> SIMDPP_INL
53typename detail::get_expr2<typename detail::get_expr_nomask<V>::type, V>::empty
54 operator^(const unsigned long& a, const any_vec<N,V>& b)
55{
56 return operator^(detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(a), b);
57}
58template<unsigned N, class V> SIMDPP_INL
59typename detail::get_expr2<typename detail::get_expr_nomask<V>::type, V>::empty
60 operator^(const unsigned long long& a, const any_vec<N,V>& b)
61{
62 return operator^(detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(a), b);
63}
64template<unsigned N, class V> SIMDPP_INL
65typename detail::get_expr2<typename detail::get_expr_nomask<V>::type, V>::empty
66 operator^(const int& a, const any_vec<N,V>& b)
67{
68 return operator^(detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(a), b);
69}
70template<unsigned N, class V> SIMDPP_INL
71typename detail::get_expr2<typename detail::get_expr_nomask<V>::type, V>::empty
72 operator^(const long& a, const any_vec<N,V>& b)
73{
74 return operator^(detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(a), b);
75}
76template<unsigned N, class V> SIMDPP_INL
77typename detail::get_expr2<typename detail::get_expr_nomask<V>::type, V>::empty
78 operator^(const long long& a, const any_vec<N,V>& b)
79{
80 return operator^(detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(a), b);
81}
82
83
84template<unsigned N, class V> SIMDPP_INL
85typename detail::get_expr2<V, typename detail::get_expr_nomask<V>::type>::empty
86 operator^(const any_vec<N,V>& a, const unsigned& b)
87{
88 return operator^(a, detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(b));
89}
90template<unsigned N, class V> SIMDPP_INL
91typename detail::get_expr2<V, typename detail::get_expr_nomask<V>::type>::empty
92 operator^(const any_vec<N,V>& a, const unsigned long& b)
93{
94 return operator^(a, detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(b));
95}
96template<unsigned N, class V> SIMDPP_INL
97typename detail::get_expr2<V, typename detail::get_expr_nomask<V>::type>::empty
98 operator^(const any_vec<N,V>& a, const unsigned long long& b)
99{
100 return operator^(a, detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(b));
101}
102template<unsigned N, class V> SIMDPP_INL
103typename detail::get_expr2<V, typename detail::get_expr_nomask<V>::type>::empty
104 operator^(const any_vec<N,V>& a, const int& b)
105{
106 return operator^(a, detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(b));
107}
108template<unsigned N, class V> SIMDPP_INL
109typename detail::get_expr2<V, typename detail::get_expr_nomask<V>::type>::empty
110 operator^(const any_vec<N,V>& a, const long& b)
111{
112 return operator^(a, detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(b));
113}
114template<unsigned N, class V> SIMDPP_INL
115typename detail::get_expr2<V, typename detail::get_expr_nomask<V>::type>::empty
116 operator^(const any_vec<N,V>& a, const long long& b)
117{
118 return operator^(a, detail::make_const_bitwise<typename detail::get_expr_nomask<V>::type>(b));
119}
120
121
122} // namespace SIMDPP_ARCH_NAMESPACE
123} // namespace simdpp
124
125#endif
126
127
128