1 /*  Copyright (C) 2013-2014  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_CORE_BIT_NOT_H
9 #define LIBSIMDPP_SIMDPP_CORE_BIT_NOT_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 #include <simdpp/detail/insn/bit_not.h>
17 #include <simdpp/detail/expr/bit_not.h>
18 #include <simdpp/detail/get_expr.h>
19 
20 namespace simdpp {
21 namespace SIMDPP_ARCH_NAMESPACE {
22 
23 /** Computes bitwise NOT of an integer or floating-point vector
24 
25     @code
26     r = ~a
27     @endcode
28 
29     @todo icost
30 */
31 template<unsigned N, class V> SIMDPP_INL
32 typename detail::get_expr<V, expr_bit_not<V>>::empty
bit_not(const any_vec<N,V> & a)33     bit_not(const any_vec<N,V>& a)
34 {
35     typename detail::get_expr_nosign<V>::type ra;
36     ra = a.wrapped().eval();
37     return detail::insn::i_bit_not(ra);
38 }
39 
40 /* FIXME
41 template<unsigned N, class E> SIMDPP_INL
42 mask_int32<N, expr_bit_not<mask_int32<N,E>>> bit_not(mask_int32<N,E> a)
43 {
44     return { { a } };
45 }
46 template<unsigned N, class E> SIMDPP_INL
47 mask_int64<N, expr_bit_not<mask_int64<N,E>>> bit_not(mask_int64<N,E> a)
48 {
49     return { { a } };
50 }
51 
52 template<unsigned N, class E> SIMDPP_INL
53 mask_float32<N, expr_bit_not<mask_float32<N,E>>> bit_not(mask_float32<N,E> a)
54 {
55     return { { a } };
56 }
57 template<unsigned N, class E> SIMDPP_INL
58 mask_float64<N, expr_bit_not<mask_float64<N,E>>> bit_not(mask_float64<N,E> a)
59 {
60     return { { a } };
61 }
62 */
63 
64 } // namespace SIMDPP_ARCH_NAMESPACE
65 } // namespace simdpp
66 
67 #endif
68 
69