IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
RoundToEvenReg.h
1 // RoundToEvenReg.h:
3 // -------------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_ARITHMETIC_DETAIL_COMMON_ROUNDTOEVENREG_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_ARITHMETIC_DETAIL_COMMON_ROUNDTOEVENREG_H__
17 
21 #include <IPSDKUtil/InstructionSet/Arithmetic/detail/AddReg.h>
22 #include <IPSDKUtil/InstructionSet/Arithmetic/detail/RoundToEvenReg.h>
27 
28 namespace ipsdk {
29 namespace simd {
30 namespace detail {
31 
34 
36 template <eInstructionSet::domain IS>
38 {
39  static IPSDK_FORCEINLINE
41  act(const typename RegType<IS, ipReal32>::Type& in)
42  {
43  typename RegType<IS, ipReal32>::Type out;
44  act(in, out);
45  return out;
46  }
47 
48  static IPSDK_FORCEINLINE
49  void
50  act(const typename RegType<IS, ipReal32>::Type& in,
51  typename RegType<IS, ipReal32>::Type& out)
52  {
53  typedef typename RegType<IS, ipReal32>::Type Reg;
54  /*Reg absIn;
55  AbsReg<IS, ipReal32>::act(in, absIn);
56  Reg twoExp23;
57  AssignReg<IS, ipReal32>::act(twoExp23, static_cast<ipReal32>(1 << 23));
58  Reg addRes, subRes;
59  AddReg<IS, ipReal32>::act(absIn, twoExp23, addRes);
60  SubReg<IS, ipReal32>::act(addRes, twoExp23, subRes);
61  Reg absInLTExp23;
62  IsLessReg<IS, ipReal32>::act(subRes, twoExp23, absInLTExp23);
63  Reg absInRounded;
64  BitwiseSelectReg<IS, ipReal32>::act(absInLTExp23, subRes, absIn, absInRounded);
65  Reg inNeg;
66  IsNotEqualReg<IS, ipReal32>::act(in, absIn, inNeg);
67  Reg minusAbsInRounded;
68  UnaryMinusReg<IS, ipReal32>::act(absInRounded, minusAbsInRounded);
69  BitwiseSelectReg<IS, ipReal32>::act(inNeg, minusAbsInRounded, absInRounded, out);*/
70 
71  Reg signMask, magic;
72  AssignReg<IS, ipReal32>::act(signMask, -.0f);
73  AssignReg<IS, ipReal32>::act(magic, static_cast<ipReal32>(1 << 23));
74  Reg sign;
75  BitwiseAndReg<IS, ipReal32>::act(in, signMask, sign);
76  Reg signedMagic;
77  BitwiseOrReg<IS, ipReal32>::act(magic, sign, signedMagic);
78  Reg inPlusSignedMagic;
79  AddReg<IS, ipReal32>::act(in, signedMagic, inPlusSignedMagic);
80  SubReg<IS, ipReal32>::act(inPlusSignedMagic, signedMagic, out);
81  }
82 };
83 
85 template <eInstructionSet::domain IS>
87 {
88  static IPSDK_FORCEINLINE
90  act(const typename RegType<IS, ipReal64>::Type& in)
91  {
92  typename RegType<IS, ipReal64>::Type out;
93  act(in, out);
94  return out;
95  }
96 
97  static IPSDK_FORCEINLINE
98  void
99  act(const typename RegType<IS, ipReal64>::Type& in,
100  typename RegType<IS, ipReal64>::Type& out)
101  {
102  typedef typename RegType<IS, ipReal64>::Type Reg;
103 
104  Reg signMask, magic;
105  AssignReg<IS, ipReal64>::act(signMask, -.0f);
106  AssignReg<IS, ipReal64>::act(magic, static_cast<ipReal64>(static_cast<ipUInt64>(1) << static_cast<ipUInt64>(52)));
107  Reg sign;
108  BitwiseAndReg<IS, ipReal64>::act(in, signMask, sign);
109  Reg signedMagic;
110  BitwiseOrReg<IS, ipReal64>::act(magic, sign, signedMagic);
111  Reg inPlusSignedMagic;
112  AddReg<IS, ipReal64>::act(in, signedMagic, inPlusSignedMagic);
113  SubReg<IS, ipReal64>::act(inPlusSignedMagic, signedMagic, out);
114  }
115 };
116 
119 
120 } // end of namespace detail
121 } // end of namespace simd
122 } // end of namespace ipsdk
123 
124 #endif // __IPSDKUTIL_INSTRUCTIONSET_ARITHMETIC_DETAIL_COMMON_ROUNDTOEVENREG_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
Definition: SubReg.h:39
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
RegType class.
Definition: BitwiseOrReg.h:30
Definition of import/export macro for library.
template structure which is specialized to implement the arithmetic addition on 2 scalars or 2 regist...
Definition: AddReg.h:37
template structure which is specialized to implement the computation of value rounded to closest even...
Definition: RoundToEvenReg.h:36
Definition: RegType.h:29
Definition: BitwiseAndReg.h:30
Definition: AssignRegDecl.h:31
float ipReal32
Base types definition.
Definition: BaseTypes.h:56