1 /* Copyright (C) 2011-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_SIMD_EXTRACT_H
9 #define LIBSIMDPP_SIMD_EXTRACT_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/extract.h>
17
18 namespace simdpp {
19 namespace SIMDPP_ARCH_NAMESPACE {
20
21 /** Extracts the @a id-th element from a vector.
22
23 @code
24 r = a[id]
25 @endcode
26
27 This function may have very high latency.
28 */
29 template<unsigned id, unsigned N> SIMDPP_INL
extract(const uint8<N> & a)30 uint8_t extract(const uint8<N>& a)
31 {
32 static_assert(id < N, "index out of bounds");
33 return detail::insn::i_extract<id>(a);
34 }
35
36 template<unsigned id, unsigned N> SIMDPP_INL
extract(const int8<N> & a)37 int8_t extract(const int8<N>& a)
38 {
39 static_assert(id < N, "index out of bounds");
40 return detail::insn::i_extract<id>(a);
41 }
42
43 template<unsigned id, unsigned N> SIMDPP_INL
extract(const uint16<N> & a)44 uint16_t extract(const uint16<N>& a)
45 {
46 static_assert(id < N, "index out of bounds");
47 return detail::insn::i_extract<id>(a);
48 }
49
50 template<unsigned id, unsigned N> SIMDPP_INL
extract(const int16<N> & a)51 int16_t extract(const int16<N>& a)
52 {
53 static_assert(id < N, "index out of bounds");
54 return detail::insn::i_extract<id>(a);
55 }
56
57 template<unsigned id, unsigned N> SIMDPP_INL
extract(const uint32<N> & a)58 uint32_t extract(const uint32<N>& a)
59 {
60 static_assert(id < N, "index out of bounds");
61 return detail::insn::i_extract<id>(a);
62 }
63
64 template<unsigned id, unsigned N> SIMDPP_INL
extract(const int32<N> & a)65 int32_t extract(const int32<N>& a)
66 {
67 static_assert(id < N, "index out of bounds");
68 return detail::insn::i_extract<id>(a);
69 }
70
71 template<unsigned id, unsigned N> SIMDPP_INL
extract(const uint64<N> & a)72 uint64_t extract(const uint64<N>& a)
73 {
74 static_assert(id < N, "index out of bounds");
75 return detail::insn::i_extract<id>(a);
76 }
77
78 template<unsigned id, unsigned N> SIMDPP_INL
extract(const int64<N> & a)79 int64_t extract(const int64<N>& a)
80 {
81 static_assert(id < N, "index out of bounds");
82 return detail::insn::i_extract<id>(a);
83 }
84
85 template<unsigned id, unsigned N> SIMDPP_INL
extract(const float32<N> & a)86 float extract(const float32<N>& a)
87 {
88 static_assert(id < N, "index out of bounds");
89 return detail::insn::i_extract<id>(a);
90 }
91
92 template<unsigned id, unsigned N> SIMDPP_INL
extract(const float64<N> & a)93 double extract(const float64<N>& a)
94 {
95 static_assert(id < N, "index out of bounds");
96 return detail::insn::i_extract<id>(a);
97 }
98
99 } // namespace SIMDPP_ARCH_NAMESPACE
100 } // namespace simdpp
101
102 #endif
103
104