@@ -47,5 +47,164 @@ struct BitwiseNotFunctor<bool> {
4747  HOSTDEVICE bool  operator ()(const  bool  a) const  { return  !a; }
4848};
4949
50+ template  <typename  T>
51+ struct  BitwiseLeftShiftArithmeticFunctor  {
52+   HOSTDEVICE T operator ()(const  T a, const  T b) const  {
53+     if  (b >= static_cast <T>(sizeof (T) * 8 )) return  static_cast <T>(0 );
54+     if  (b < static_cast <T>(0 )) return  static_cast <T>(0 );
55+     return  a << b;
56+   }
57+ };
58+ 
59+ template  <typename  T>
60+ struct  InverseBitwiseLeftShiftArithmeticFunctor  {
61+   inline  HOSTDEVICE T operator ()(const  T a, const  T b) const  {
62+     if  (a >= static_cast <T>(sizeof (T) * 8 )) return  static_cast <T>(0 );
63+     if  (a < static_cast <T>(0 )) return  static_cast <T>(0 );
64+     return  b << a;
65+   }
66+ };
67+ 
68+ template  <typename  T>
69+ struct  BitwiseLeftShiftLogicFunctor  {
70+   HOSTDEVICE T operator ()(const  T a, const  T b) const  {
71+     if  (b < static_cast <T>(0 ) || b >= static_cast <T>(sizeof (T) * 8 ))
72+       return  static_cast <T>(0 );
73+     return  a << b;
74+   }
75+ };
76+ 
77+ template  <typename  T>
78+ struct  InverseBitwiseLeftShiftLogicFunctor  {
79+   inline  HOSTDEVICE T operator ()(const  T a, const  T b) const  {
80+     if  (a < static_cast <T>(0 ) || a >= static_cast <T>(sizeof (T) * 8 ))
81+       return  static_cast <T>(0 );
82+     return  b << a;
83+   }
84+ };
85+ 
86+ template  <typename  T>
87+ struct  BitwiseRightShiftArithmeticFunctor  {
88+   HOSTDEVICE T operator ()(const  T a, const  T b) const  {
89+     if  (b < static_cast <T>(0 ) || b >= static_cast <T>(sizeof (T) * 8 ))
90+       return  static_cast <T>(-(a >> (sizeof (T) * 8  - 1 ) & 1 ));
91+     return  a >> b;
92+   }
93+ };
94+ 
95+ template  <typename  T>
96+ struct  InverseBitwiseRightShiftArithmeticFunctor  {
97+   inline  HOSTDEVICE T operator ()(const  T a, const  T b) const  {
98+     if  (a < static_cast <T>(0 ) || a >= static_cast <T>(sizeof (T) * 8 ))
99+       return  static_cast <T>(-(b >> (sizeof (T) * 8  - 1 ) & 1 ));
100+     return  b >> a;
101+   }
102+ };
103+ 
104+ template  <>
105+ struct  BitwiseRightShiftArithmeticFunctor <uint8_t > {
106+   HOSTDEVICE uint8_t  operator ()(const  uint8_t  a, const  uint8_t  b) const  {
107+     if  (b >= static_cast <uint8_t >(sizeof (uint8_t ) * 8 ))
108+       return  static_cast <uint8_t >(0 );
109+     return  a >> b;
110+   }
111+ };
112+ 
113+ template  <>
114+ struct  InverseBitwiseRightShiftArithmeticFunctor <uint8_t > {
115+   inline  HOSTDEVICE uint8_t  operator ()(const  uint8_t  a, const  uint8_t  b) const  {
116+     if  (a >= static_cast <uint8_t >(sizeof (uint8_t ) * 8 ))
117+       return  static_cast <uint8_t >(0 );
118+     return  b >> a;
119+   }
120+ };
121+ 
122+ template  <typename  T>
123+ struct  BitwiseRightShiftLogicFunctor  {
124+   HOSTDEVICE T operator ()(const  T a, const  T b) const  {
125+     if  (b >= static_cast <T>(sizeof (T) * 8 ) || b < static_cast <T>(0 ))
126+       return  static_cast <T>(0 );
127+     return  a >> b;
128+   }
129+ };
130+ 
131+ template  <typename  T>
132+ struct  InverseBitwiseRightShiftLogicFunctor  {
133+   inline  HOSTDEVICE T operator ()(const  T a, const  T b) const  {
134+     if  (a >= static_cast <T>(sizeof (T) * 8 ) || a < static_cast <T>(0 ))
135+       return  static_cast <T>(0 );
136+     return  b >> a;
137+   }
138+ };
139+ 
140+ template  <typename  T>
141+ HOSTDEVICE T logic_shift_func (const  T a, const  T b) {
142+   if  (b < static_cast <T>(0 ) || b >= static_cast <T>(sizeof (T) * 8 ))
143+     return  static_cast <T>(0 );
144+   T t = static_cast <T>(sizeof (T) * 8  - 1 );
145+   T mask = (((a >> t) << t) >> b) << 1 ;
146+   return  (a >> b) ^ mask;
147+ }
148+ 
149+ //  signed int8
150+ template  <>
151+ struct  BitwiseRightShiftLogicFunctor <int8_t > {
152+   HOSTDEVICE int8_t  operator ()(const  int8_t  a, const  int8_t  b) const  {
153+     return  logic_shift_func<int8_t >(a, b);
154+   }
155+ };
156+ 
157+ template  <>
158+ struct  InverseBitwiseRightShiftLogicFunctor <int8_t > {
159+   inline  HOSTDEVICE int8_t  operator ()(const  int8_t  a, const  int8_t  b) const  {
160+     return  logic_shift_func<int8_t >(b, a);
161+   }
162+ };
163+ 
164+ //  signed int16
165+ template  <>
166+ struct  BitwiseRightShiftLogicFunctor <int16_t > {
167+   HOSTDEVICE int16_t  operator ()(const  int16_t  a, const  int16_t  b) const  {
168+     return  logic_shift_func<int16_t >(a, b);
169+   }
170+ };
171+ 
172+ template  <>
173+ struct  InverseBitwiseRightShiftLogicFunctor <int16_t > {
174+   inline  HOSTDEVICE int16_t  operator ()(const  int16_t  a, const  int16_t  b) const  {
175+     return  logic_shift_func<int16_t >(b, a);
176+   }
177+ };
178+ 
179+ //  signed int32
180+ template  <>
181+ struct  BitwiseRightShiftLogicFunctor <int > {
182+   HOSTDEVICE int  operator ()(const  int  a, const  int  b) const  {
183+     return  logic_shift_func<int32_t >(a, b);
184+   }
185+ };
186+ 
187+ template  <>
188+ struct  InverseBitwiseRightShiftLogicFunctor <int > {
189+   inline  HOSTDEVICE int  operator ()(const  int  a, const  int  b) const  {
190+     return  logic_shift_func<int32_t >(b, a);
191+   }
192+ };
193+ 
194+ //  signed int64
195+ template  <>
196+ struct  BitwiseRightShiftLogicFunctor <int64_t > {
197+   HOSTDEVICE int64_t  operator ()(const  int64_t  a, const  int64_t  b) const  {
198+     return  logic_shift_func<int64_t >(a, b);
199+   }
200+ };
201+ 
202+ template  <>
203+ struct  InverseBitwiseRightShiftLogicFunctor <int64_t > {
204+   inline  HOSTDEVICE int64_t  operator ()(const  int64_t  a, const  int64_t  b) const  {
205+     return  logic_shift_func<int64_t >(b, a);
206+   }
207+ };
208+ 
50209}  //  namespace funcs
51210}  //  namespace phi
0 commit comments