IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
AssignRegImpl.h
Go to the documentation of this file.
1 // AssignRegImpl.h:
3 // ------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_ASSIGNREGIMPL_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_ASSIGNREGIMPL_H__
17 
20 
21 namespace ipsdk {
22 namespace simd {
23 namespace detail {
24 
27 
28 template <typename T>
29 IPSDK_FORCEINLINE
30 typename Avx512Type<T>::Type
31 AssignReg<eInstructionSet::eIS_Avx512, T,
32  typename boost::enable_if_c<sizeof(T) == 1>::type>::act(const T& value)
33 {
34  return _mm512_set1_epi8(value);
35 }
36 
37 template <typename T>
38 IPSDK_FORCEINLINE
39 void
40 AssignReg<eInstructionSet::eIS_Avx512, T,
41  typename boost::enable_if_c<sizeof(T) == 1>::type>::act(typename Avx512Type<T>::Type& reg, const T& value)
42 {
43  reg = _mm512_set1_epi8(value);
44 }
45 
46 template <typename T>
47 IPSDK_FORCEINLINE
48 typename Avx512Type<T>::Type
49 AssignReg<eInstructionSet::eIS_Avx512, T,
50  typename boost::enable_if_c<sizeof(T) == 2>::type>::act(const T& value)
51 {
52  return _mm512_set1_epi16(value);
53 }
54 
55 template <typename T>
56 IPSDK_FORCEINLINE
57 void
58 AssignReg<eInstructionSet::eIS_Avx512, T,
59  typename boost::enable_if_c<sizeof(T) == 2>::type>::act(typename Avx512Type<T>::Type& reg, const T& value)
60 {
61  reg = _mm512_set1_epi16(value);
62 }
63 
64 template <typename T>
65 IPSDK_FORCEINLINE
66 typename Avx512Type<T>::Type
67 AssignReg<eInstructionSet::eIS_Avx512, T,
68  typename boost::enable_if_c<boost::is_integral<T>::value
69  && sizeof(T) == 4>::type>::act(const T& value)
70 {
71  return _mm512_set1_epi32(value);
72 }
73 
74 template <typename T>
75 IPSDK_FORCEINLINE
76 void
77 AssignReg<eInstructionSet::eIS_Avx512, T,
78  typename boost::enable_if_c<boost::is_integral<T>::value
79  && sizeof(T) == 4>::type>::act(typename Avx512Type<T>::Type& reg, const T& value)
80 {
81  reg = _mm512_set1_epi32(value);
82 }
83 
84 template <typename T>
85 IPSDK_FORCEINLINE
86 typename Avx512Type<T>::Type
87 AssignReg<eInstructionSet::eIS_Avx512, T,
88  typename boost::enable_if_c<boost::is_integral<T>::value
89  && sizeof(T) == 8>::type>::act(const T& value)
90 {
91  return _mm512_set1_epi64(value);
92 }
93 
94 template <typename T>
95 IPSDK_FORCEINLINE
96 void
97 AssignReg<eInstructionSet::eIS_Avx512, T,
98  typename boost::enable_if_c<boost::is_integral<T>::value
99  && sizeof(T) == 8>::type>::act(typename Avx512Type<T>::Type& reg, const T& value)
100 {
101  reg = _mm512_set1_epi64(value);
102 }
103 
104 // load implementation for AVX512 for real32 types
105 IPSDK_FORCEINLINE
106 Avx512Type<ipReal32>::Type
107 AssignReg<eInstructionSet::eIS_Avx512, ipReal32>::act(const ipReal32& value)
108 {
109  return _mm512_set1_ps(value);
110 }
111 
112 IPSDK_FORCEINLINE
113 void
114 AssignReg<eInstructionSet::eIS_Avx512, ipReal32>::act(Avx512Type<ipReal32>::Type& reg, const ipReal32& value)
115 {
116  reg = _mm512_set1_ps(value);
117 }
118 
119 // load implementation for AVX512 for real64 types
120 IPSDK_FORCEINLINE
121 Avx512Type<ipReal64>::Type
122 AssignReg<eInstructionSet::eIS_Avx512, ipReal64>::act(const ipReal64& value)
123 {
124  return _mm512_set1_pd(value);
125 }
126 
127 IPSDK_FORCEINLINE
128 void
129 AssignReg<eInstructionSet::eIS_Avx512, ipReal64>::act(Avx512Type<ipReal64>::Type& reg, const ipReal64& value)
130 {
131  reg = _mm512_set1_pd(value);
132 }
133 
136 
137 } // end of namespace detail
138 } // end of namespace simd
139 } // end of namespace ipsdk
140 
141 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_ASSIGNREGIMPL_H__
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
(including fundation and byte and word instructions)
Definition: InstructionSetTypes.h:51
float ipReal32
Base types definition.
Definition: BaseTypes.h:56