IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
MaskCastPack.h
1 // MaskCastPack.h:
3 // ------------
4 //
15 
16 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX_MASKCASTPACK_H__
17 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX_MASKCASTPACK_H__
18 
25 
26 #include <boost/type_traits/is_signed.hpp>
27 
28 namespace ipsdk {
29 namespace simd {
30 namespace detail {
31 
34 
37 template <typename TIn, typename TOut>
38 struct MaskCastPack<eInstructionSet::eIS_Avx, TIn, TOut,
39  typename boost::enable_if_c<boost::is_same<TIn, TOut>::value>::type>
40 {
41  static IPSDK_FORCEINLINE BaseMaskPack<ePackType::ePT_Avx, TOut>
42  act(const BaseMaskPack<ePackType::ePT_Avx, TIn>& in)
43  {
44  return in;
45  }
46 
47  static IPSDK_FORCEINLINE
48  void
49  act(const BaseMaskPack<ePackType::ePT_Avx, TIn>& in,
50  BaseMaskPack<ePackType::ePT_Avx, TOut> & out)
51  {
52  typedef typename ipsdk::AvxType<TIn>::Type RegType;
53  arrayop::copyArray<sizeof(TIn), RegType>(in._val, out._val);
54  }
55 
56 };
57 
60 template <>
61 struct MaskCastPack<eInstructionSet::eIS_Avx, ipReal32, ipReal64>
62 {
63  static IPSDK_FORCEINLINE BaseMaskPack<ePackType::ePT_Avx, ipReal64>
64  act(const BaseMaskPack<ePackType::ePT_Avx, ipReal32>& in)
65  {
66  BaseMaskPack<ePackType::ePT_Avx, ipReal64> out;
67  act(in, out);
68  return out;
69  }
70 
71  static IPSDK_FORCEINLINE
72  void
73  act(const BaseMaskPack<ePackType::ePT_Avx, ipReal32>& in,
74  BaseMaskPack<ePackType::ePT_Avx, ipReal64>& out)
75  {
76  MaskCastReg<eInstructionSet::eIS_Avx, ipReal32, ipReal64>::act(in._val[0], out._val[0], out._val[1]);
77  MaskCastReg<eInstructionSet::eIS_Avx, ipReal32, ipReal64>::act(in._val[1], out._val[2], out._val[3]);
78  MaskCastReg<eInstructionSet::eIS_Avx, ipReal32, ipReal64>::act(in._val[2], out._val[4], out._val[5]);
79  MaskCastReg<eInstructionSet::eIS_Avx, ipReal32, ipReal64>::act(in._val[3], out._val[6], out._val[7]);
80  }
81 };
82 
85 template <>
86 struct MaskCastPack<eInstructionSet::eIS_Avx, ipReal64, ipReal32>
87 {
88  static IPSDK_FORCEINLINE BaseMaskPack<ePackType::ePT_Avx, ipReal32>
89  act(const BaseMaskPack<ePackType::ePT_Avx, ipReal64>& in)
90  {
91  BaseMaskPack<ePackType::ePT_Avx, ipReal32> out;
92  act(in, out);
93  return out;
94  }
95 
96  static IPSDK_FORCEINLINE
97  void
98  act(const BaseMaskPack<ePackType::ePT_Avx, ipReal64>& in,
99  BaseMaskPack<ePackType::ePT_Avx, ipReal32>& out)
100  {
101  MaskCastReg<eInstructionSet::eIS_Avx, ipReal64, ipReal32>::act(in._val[0], in._val[1], out._val[0]);
102  MaskCastReg<eInstructionSet::eIS_Avx, ipReal64, ipReal32>::act(in._val[2], in._val[3], out._val[1]);
103  MaskCastReg<eInstructionSet::eIS_Avx, ipReal64, ipReal32>::act(in._val[4], in._val[5], out._val[2]);
104  MaskCastReg<eInstructionSet::eIS_Avx, ipReal64, ipReal32>::act(in._val[6], in._val[7], out._val[3]);
105  }
106 };
107 
110 
111 } // end of namespace detail
112 } // end of namespace simd
113 } // end of namespace ipsdk
114 
115 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX_MASKCASTPACK_H__
116 
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
BaseMaskPack class; defines a set of masks; the number of masks in this set depends on the type of th...
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
utility functions for array operations
BasePack class; defines a set of scalars (for instruction set "standard") or registers (for all other...
eInstructionSet
Enumerate for processor instruction set description.
Definition: InstructionSetTypes.h:31
Advanced Vector Extensions.
Definition: InstructionSetTypes.h:44
Definition of import/export macro for library.
structure used to retrieve AVX type associated to a base type
Definition: AvxTypes.h:33
float ipReal32
Base types definition.
Definition: BaseTypes.h:56