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_SSE2_ASSIGNPACKIMPL_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_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_Sse, T>
38 AssignPack<eInstructionSet::eIS_Sse2, T,
39  typename boost::enable_if_c<sizeof(T) == 1 >::type>::act(const T& value)
40 {
41  BasePack<ePackType::ePT_Sse, T> out;
42  out._val[0] = AssignReg<eInstructionSet::eIS_Sse2, T>::act(value);
43  return out;
44 }
45 
46 template <typename T>
47 IPSDK_FORCEINLINE
48 void
49 AssignPack<eInstructionSet::eIS_Sse2, T,
50  typename boost::enable_if_c<sizeof(T) == 1 >::type>::act(
51  BasePack<ePackType::ePT_Sse, T>& pack, const T& value)
52 {
53  AssignReg<eInstructionSet::eIS_Sse2, T>::act(pack._val[0], value);
54 }
55 
56 template <typename T>
57 IPSDK_FORCEINLINE
58 BasePack<ePackType::ePT_Sse, T>
59 AssignPack<eInstructionSet::eIS_Sse2, T,
60  typename boost::enable_if_c<sizeof(T) == 2>::type>::act(const T& value)
61 {
62  const typename Sse2Type<T>::Type value128 =
63  AssignReg<eInstructionSet::eIS_Sse2, T>::act(value);
64  BasePack<ePackType::ePT_Sse, T> out;
65  out._val[0] = value128;
66  out._val[1] = value128;
67  return out;
68 }
69 
70 template <typename T>
71 IPSDK_FORCEINLINE
72 void
73 AssignPack<eInstructionSet::eIS_Sse2, T,
74  typename boost::enable_if_c<sizeof(T) == 2>::type>::act(
75  BasePack<ePackType::ePT_Sse, T>& pack, const T& value)
76 {
77  typename Sse2Type<T>::Type value128;
78  AssignReg<eInstructionSet::eIS_Sse2, T>::act(value128, value);
79  pack._val[0] = value128;
80  pack._val[1] = value128;
81 }
82 
83 template <typename T>
84 IPSDK_FORCEINLINE
85 BasePack<ePackType::ePT_Sse, T>
86 AssignPack<eInstructionSet::eIS_Sse2, T,
87  typename boost::enable_if_c<sizeof(T) == 4>::type>::act(const T& value)
88 {
89  const typename Sse2Type<T>::Type value128 =
90  AssignReg<eInstructionSet::eIS_Sse2, T>::act(value);
91 
92  BasePack<ePackType::ePT_Sse, T> out;
93  out._val[0] = value128;
94  out._val[1] = value128;
95  out._val[2] = value128;
96  out._val[3] = value128;
97  return out;
98 }
99 
100 template <typename T>
101 IPSDK_FORCEINLINE
102 void
103 AssignPack<eInstructionSet::eIS_Sse2, T,
104  typename boost::enable_if_c<sizeof(T) == 4>::type>::act(
105  BasePack<ePackType::ePT_Sse, T>& pack, const T& value)
106 {
107  typename Sse2Type<T>::Type value128;
108  AssignReg<eInstructionSet::eIS_Sse2, T>::act(value128, value);
109  pack._val[0] = value128;
110  pack._val[1] = value128;
111  pack._val[2] = value128;
112  pack._val[3] = value128;
113 }
114 
115 template <typename T>
116 IPSDK_FORCEINLINE
117 BasePack<ePackType::ePT_Sse, T>
118 AssignPack<eInstructionSet::eIS_Sse2, T,
119  typename boost::enable_if_c<sizeof(T) == 8>::type>::act(const T& value)
120 {
121  const typename Sse2Type<T>::Type value128 =
122  AssignReg<eInstructionSet::eIS_Sse2, T>::act(value);
123  BasePack<ePackType::ePT_Sse, T> out;
124  out._val[0] = value128;
125  out._val[1] = value128;
126  out._val[2] = value128;
127  out._val[3] = value128;
128  out._val[4] = value128;
129  out._val[5] = value128;
130  out._val[6] = value128;
131  out._val[7] = value128;
132  return out;
133 }
134 
135 template <typename T>
136 IPSDK_FORCEINLINE
137 void
138 AssignPack<eInstructionSet::eIS_Sse2, T,
139  typename boost::enable_if_c<sizeof(T) == 8>::type>::act(
140  BasePack<ePackType::ePT_Sse, T>& pack, const T& value)
141 {
142  typename Sse2Type<T>::Type value128;
143  AssignReg<eInstructionSet::eIS_Sse2, T>::act(value128, value);
144  pack._val[0] = value128;
145  pack._val[1] = value128;
146  pack._val[2] = value128;
147  pack._val[3] = value128;
148  pack._val[4] = value128;
149  pack._val[5] = value128;
150  pack._val[6] = value128;
151  pack._val[7] = value128;
152 }
153 
156 
157 } // end of namespace detail
158 } // end of namespace simd
159 } // end of namespace ipsdk
160 
162 
163 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_ASSIGNPACKIMPL_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
Definition of import/export macro for library.
Streaming SIMD Extensions 2.
Definition: InstructionSetTypes.h:36