IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
AssignPackImpl.h
Go to the documentation of this file.
1 // AssignPackImpl.h:
3 // ------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_ASSIGNPACKIMPL_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_ASSIGNPACKIMPL_H__
17 
24 
25 #include <boost/type_traits/is_same.hpp>
26 #include <boost/type_traits/is_signed.hpp>
27 
28 namespace ipsdk {
29 namespace simd {
30 namespace detail {
31 
34 
35 template <typename T>
36 IPSDK_FORCEINLINE
37 BasePack<ePackType::ePT_Avx512, T>
38 AssignPack<eInstructionSet::eIS_Avx512, T,
39  typename boost::enable_if_c<sizeof(T)==1>::type>::act(const T& value)
40 {
41  BasePack<ePackType::ePT_Avx512, T> out;
42  out._val[0] = AssignReg<eInstructionSet::eIS_Avx512, T>::act(value);
43  return out;
44 }
45 
46 template <typename T>
47 IPSDK_FORCEINLINE
48 void
49 AssignPack<eInstructionSet::eIS_Avx512, T,
50  typename boost::enable_if_c<sizeof(T)==1>::type>::act(
51  BasePack<ePackType::ePT_Avx512, T>& pack, const T& value)
52 {
53  AssignReg<eInstructionSet::eIS_Avx512, T>::act(pack._val[0], value);
54 }
55 
56 template <typename T>
57 IPSDK_FORCEINLINE
58 BasePack<ePackType::ePT_Avx512, T>
59 AssignPack<eInstructionSet::eIS_Avx512, T,
60  typename boost::enable_if_c<sizeof(T)==2>::type>::act(const T& value)
61 {
62  const typename Avx512Type<T>::Type value512 = AssignReg<eInstructionSet::eIS_Avx512, T>::act(value);
63  BasePack<ePackType::ePT_Avx512, T> out;
64  out._val[0] = value512;
65  out._val[1] = value512;
66  return out;
67 }
68 
69 template <typename T>
70 IPSDK_FORCEINLINE
71 void
72 AssignPack<eInstructionSet::eIS_Avx512, T,
73  typename boost::enable_if_c<sizeof(T)==2>::type>::act(
74  BasePack<ePackType::ePT_Avx512, T>& pack, const T& value)
75 {
76  typename Avx512Type<T>::Type value512;
77  AssignReg<eInstructionSet::eIS_Avx512, T>::act(value512, value);
78  pack._val[0] = value512;
79  pack._val[1] = value512;
80 }
81 
82 template <typename T>
83 IPSDK_FORCEINLINE
84 BasePack<ePackType::ePT_Avx512, T>
85 AssignPack<eInstructionSet::eIS_Avx512, T,
86  typename boost::enable_if_c<sizeof(T)==4>::type>::act(const T& value)
87 {
88  const typename Avx512Type<T>::Type value512 = AssignReg<eInstructionSet::eIS_Avx512, T>::act(value);
89  BasePack<ePackType::ePT_Avx512, T> out;
90  out._val[0] = value512;
91  out._val[1] = value512;
92  out._val[2] = value512;
93  out._val[3] = value512;
94  return out;
95 }
96 
97 template <typename T>
98 IPSDK_FORCEINLINE
99 void
100 AssignPack<eInstructionSet::eIS_Avx512, T,
101  typename boost::enable_if_c<sizeof(T)==4>::type>::act(
102  BasePack<ePackType::ePT_Avx512, T>& pack, const T& value)
103 {
104  typename Avx512Type<T>::Type value512;
105  AssignReg<eInstructionSet::eIS_Avx512, T>::act(value512, value);
106  pack._val[0] = value512;
107  pack._val[1] = value512;
108  pack._val[2] = value512;
109  pack._val[3] = value512;
110 }
111 
112 template <typename T>
113 IPSDK_FORCEINLINE
114 BasePack<ePackType::ePT_Avx512, T>
115 AssignPack<eInstructionSet::eIS_Avx512, T,
116  typename boost::enable_if_c<sizeof(T)==8>::type>::act(const T& value)
117 {
118  const typename Avx512Type<T>::Type value512 =
119  AssignReg<eInstructionSet::eIS_Avx512, T>::act(value);
120 
121  BasePack<ePackType::ePT_Avx512, T> out;
122  out._val[0] = value512;
123  out._val[1] = value512;
124  out._val[2] = value512;
125  out._val[3] = value512;
126  out._val[4] = value512;
127  out._val[5] = value512;
128  out._val[6] = value512;
129  out._val[7] = value512;
130  return out;
131 }
132 
133 template <typename T>
134 IPSDK_FORCEINLINE
135 void
136 AssignPack<eInstructionSet::eIS_Avx512, T,
137  typename boost::enable_if_c<sizeof(T)==8>::type>::act(
138  BasePack<ePackType::ePT_Avx512, T>& pack, const T& value)
139 {
140  typename Avx512Type<T>::Type value512;
141  AssignReg<eInstructionSet::eIS_Avx512, T>::act(value512, value);
142  pack._val[0] = value512;
143  pack._val[1] = value512;
144  pack._val[2] = value512;
145  pack._val[3] = value512;
146  pack._val[4] = value512;
147  pack._val[5] = value512;
148  pack._val[6] = value512;
149  pack._val[7] = value512;
150 }
151 
154 
155 } // end of namespace detail
156 } // end of namespace simd
157 } // end of namespace ipsdk
158 
160 
161 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_ASSIGNPACKIMPL_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
(including fundation and byte and word instructions)
Definition: InstructionSetTypes.h:51
Definition of import/export macro for library.