IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
moduloCentered.h
Go to the documentation of this file.
1 // moduloCentered.h:
3 // -----------------
4 //
13 
14 #ifndef __IPSDKUTIL_INSTRUCTIONSET_ARITHMETIC_MODULOCENTERED_H__
15 #define __IPSDKUTIL_INSTRUCTIONSET_ARITHMETIC_MODULOCENTERED_H__
16 
18 
27 
28 namespace ipsdk {
29 namespace simd {
30 
33 
34 template <eInstructionSet::domain IS, typename T>
35 IPSDK_FORCEINLINE
36 void moduloCentered(const simd::Pack<IS, T>& packVal,
37  const simd::Pack<IS, T>& packModuloVal,
38  simd::Pack<IS, T>& packResult)
39 {
40  simd::Pack<IS, T> packTmp, packHalfModuloVal, packMHalfModuloVal, packCst0, packCst2;
41  simd::MaskPack<IS, T> maskPack;
42 
43  simd::assign<IS>(packCst0, 0.f);
44  simd::assign<IS>(packCst2, 2.f);
45 
46  simd::div<IS>(packModuloVal, packCst2, packHalfModuloVal);
47  simd::sub<IS>(packCst0, packHalfModuloVal, packMHalfModuloVal);
48 
49  simd::modulo<IS>(packVal, packModuloVal, packResult);
50 
51  simd::sub<IS>(packResult, packModuloVal, packTmp);
52  simd::isGreaterEqual<IS>(packResult, packHalfModuloVal, maskPack);
53  simd::ifElse<IS>(maskPack, packTmp, packResult, packResult);
54 
55  simd::add<IS>(packResult, packModuloVal, packTmp);
56  simd::isLess<IS>(packResult, packMHalfModuloVal, maskPack);
57  simd::ifElse<IS>(maskPack, packTmp, packResult, packResult);
58 }
59 
60 // This version can be used if moduloVal/2 and moduloVal/2 can be calculated only once in the calculation
61 template <eInstructionSet::domain IS, typename T>
62 IPSDK_FORCEINLINE
63 void moduloCentered(const simd::Pack<IS, T>& packVal,
64  const simd::Pack<IS, T>& packModuloVal,
65  const simd::Pack<IS, T>& packHalfModuloVal,
66  const simd::Pack<IS, T>& packMHalfModuloVal,
67  simd::Pack<IS, T>& packResult)
68 {
69  simd::Pack<IS, T> packTmp;
70  simd::MaskPack<IS, T> maskPack;
71 
72  simd::modulo<IS>(packVal, packModuloVal, packResult);
73 
74  simd::sub<IS>(packResult, packModuloVal, packTmp);
75  simd::isGreaterEqual<IS>(packResult, packHalfModuloVal, maskPack);
76  simd::ifElse<IS>(maskPack, packTmp, packResult, packResult);
77 
78  simd::add<IS>(packResult, packModuloVal, packTmp);
79  simd::isLess<IS>(packResult, packMHalfModuloVal, maskPack);
80  simd::ifElse<IS>(maskPack, packTmp, packResult, packResult);
81 }
82 
85 
86 } // end of namespace simd
87 } // end of namespace ipsdk
88 
89 #endif // __IPSDKUTIL_INSTRUCTIONSET_ARITHMETIC_MODULOCENTERED_H__
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
modulo function; returns the remainder of the integral division of pack A with pack B; result is in r...
function assigning a given value of type T to a given Pack<instructionSet, T>
div function; returns the quotient of 2 input pack operandes
Definition of import/export macro for library.
sub function; returns the result of an arithmetic substraction on all the elements of 2 input pack op...
add function; returns the result of an arithmetic add operation on all the elements of 2 input pack o...