1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 //  By downloading, copying, installing or using the software you agree to this license.
6 //  If you do not agree to this license, do not download, install,
7 //  copy or use the software.
8 //
9 //
10 //                          License Agreement
11 //                For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15 // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
16 // Copyright (C) 2015, Itseez Inc., all rights reserved.
17 // Third party copyrights are property of their respective owners.
18 //
19 // Redistribution and use in source and binary forms, with or without modification,
20 // are permitted provided that the following conditions are met:
21 //
22 //   * Redistribution's of source code must retain the above copyright notice,
23 //     this list of conditions and the following disclaimer.
24 //
25 //   * Redistribution's in binary form must reproduce the above copyright notice,
26 //     this list of conditions and the following disclaimer in the documentation
27 //     and/or other materials provided with the distribution.
28 //
29 //   * The name of the copyright holders may not be used to endorse or promote products
30 //     derived from this software without specific prior written permission.
31 //
32 // This software is provided by the copyright holders and contributors "as is" and
33 // any express or implied warranties, including, but not limited to, the implied
34 // warranties of merchantability and fitness for a particular purpose are disclaimed.
35 // In no event shall the Intel Corporation or contributors be liable for any direct,
36 // indirect, incidental, special, exemplary, or consequential damages
37 // (including, but not limited to, procurement of substitute goods or services;
38 // loss of use, data, or profits; or business interruption) however caused
39 // and on any theory of liability, whether in contract, strict liability,
40 // or tort (including negligence or otherwise) arising in any way out of
41 // the use of this software, even if advised of the possibility of such damage.
42 //
43 //M*/
44 
45 #ifndef __OPENCV_HAL_INTRIN_HPP__
46 #define __OPENCV_HAL_INTRIN_HPP__
47 
48 #include <cmath>
49 #include <float.h>
50 #include <stdlib.h>
51 
52 #define OPENCV_HAL_ADD(a, b) ((a) + (b))
53 #define OPENCV_HAL_AND(a, b) ((a) & (b))
54 #define OPENCV_HAL_NOP(a) (a)
55 #define OPENCV_HAL_1ST(a, b) (a)
56 
57 // unlike HAL API, which is in cv::hal,
58 // we put intrinsics into cv namespace to make its
59 // access from within opencv code more accessible
60 namespace cv {
61 
62 template<typename _Tp> struct V_TypeTraits
63 {
64     typedef _Tp int_type;
65     typedef _Tp uint_type;
66     typedef _Tp abs_type;
67     typedef _Tp sum_type;
68 
69     enum { delta = 0, shift = 0 };
70 
reinterpret_intcv::V_TypeTraits71     static int_type reinterpret_int(_Tp x) { return x; }
reinterpet_uintcv::V_TypeTraits72     static uint_type reinterpet_uint(_Tp x) { return x; }
reinterpret_from_intcv::V_TypeTraits73     static _Tp reinterpret_from_int(int_type x) { return (_Tp)x; }
74 };
75 
76 template<> struct V_TypeTraits<uchar>
77 {
78     typedef uchar value_type;
79     typedef schar int_type;
80     typedef uchar uint_type;
81     typedef uchar abs_type;
82     typedef int sum_type;
83 
84     typedef ushort w_type;
85 
86     enum { delta = 128, shift = 8 };
87 
reinterpret_intcv::V_TypeTraits88     static int_type reinterpret_int(value_type x) { return (int_type)x; }
reinterpret_uintcv::V_TypeTraits89     static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
reinterpret_from_intcv::V_TypeTraits90     static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
91 };
92 
93 template<> struct V_TypeTraits<schar>
94 {
95     typedef schar value_type;
96     typedef schar int_type;
97     typedef uchar uint_type;
98     typedef uchar abs_type;
99     typedef int sum_type;
100 
101     typedef short w_type;
102 
103     enum { delta = 128, shift = 8 };
104 
reinterpret_intcv::V_TypeTraits105     static int_type reinterpret_int(value_type x) { return (int_type)x; }
reinterpret_uintcv::V_TypeTraits106     static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
reinterpret_from_intcv::V_TypeTraits107     static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
108 };
109 
110 template<> struct V_TypeTraits<ushort>
111 {
112     typedef ushort value_type;
113     typedef short int_type;
114     typedef ushort uint_type;
115     typedef ushort abs_type;
116     typedef int sum_type;
117 
118     typedef unsigned w_type;
119     typedef uchar nu_type;
120 
121     enum { delta = 32768, shift = 16 };
122 
reinterpret_intcv::V_TypeTraits123     static int_type reinterpret_int(value_type x) { return (int_type)x; }
reinterpret_uintcv::V_TypeTraits124     static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
reinterpret_from_intcv::V_TypeTraits125     static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
126 };
127 
128 template<> struct V_TypeTraits<short>
129 {
130     typedef short value_type;
131     typedef short int_type;
132     typedef ushort uint_type;
133     typedef ushort abs_type;
134     typedef int sum_type;
135 
136     typedef int w_type;
137     typedef uchar nu_type;
138     typedef schar n_type;
139 
140     enum { delta = 128, shift = 8 };
141 
reinterpret_intcv::V_TypeTraits142     static int_type reinterpret_int(value_type x) { return (int_type)x; }
reinterpret_uintcv::V_TypeTraits143     static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
reinterpret_from_intcv::V_TypeTraits144     static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
145 };
146 
147 template<> struct V_TypeTraits<unsigned>
148 {
149     typedef unsigned value_type;
150     typedef int int_type;
151     typedef unsigned uint_type;
152     typedef unsigned abs_type;
153     typedef unsigned sum_type;
154 
155     typedef uint64 w_type;
156     typedef ushort nu_type;
157 
reinterpret_intcv::V_TypeTraits158     static int_type reinterpret_int(value_type x) { return (int_type)x; }
reinterpret_uintcv::V_TypeTraits159     static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
reinterpret_from_intcv::V_TypeTraits160     static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
161 };
162 
163 template<> struct V_TypeTraits<int>
164 {
165     typedef int value_type;
166     typedef int int_type;
167     typedef unsigned uint_type;
168     typedef unsigned abs_type;
169     typedef int sum_type;
170 
171     typedef int64 w_type;
172     typedef short n_type;
173     typedef ushort nu_type;
174 
reinterpret_intcv::V_TypeTraits175     static int_type reinterpret_int(value_type x) { return (int_type)x; }
reinterpret_uintcv::V_TypeTraits176     static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
reinterpret_from_intcv::V_TypeTraits177     static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
178 };
179 
180 template<> struct V_TypeTraits<uint64>
181 {
182     typedef uint64 value_type;
183     typedef int64 int_type;
184     typedef uint64 uint_type;
185     typedef uint64 abs_type;
186     typedef uint64 sum_type;
187 
188     typedef unsigned nu_type;
189 
reinterpret_intcv::V_TypeTraits190     static int_type reinterpret_int(value_type x) { return (int_type)x; }
reinterpret_uintcv::V_TypeTraits191     static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
reinterpret_from_intcv::V_TypeTraits192     static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
193 };
194 
195 template<> struct V_TypeTraits<int64>
196 {
197     typedef int64 value_type;
198     typedef int64 int_type;
199     typedef uint64 uint_type;
200     typedef uint64 abs_type;
201     typedef int64 sum_type;
202 
203     typedef int nu_type;
204 
reinterpret_intcv::V_TypeTraits205     static int_type reinterpret_int(value_type x) { return (int_type)x; }
reinterpret_uintcv::V_TypeTraits206     static uint_type reinterpret_uint(value_type x) { return (uint_type)x; }
reinterpret_from_intcv::V_TypeTraits207     static value_type reinterpret_from_int(int_type x) { return (value_type)x; }
208 };
209 
210 
211 template<> struct V_TypeTraits<float>
212 {
213     typedef float value_type;
214     typedef int int_type;
215     typedef unsigned uint_type;
216     typedef float abs_type;
217     typedef float sum_type;
218 
219     typedef double w_type;
220 
reinterpret_intcv::V_TypeTraits221     static int_type reinterpret_int(value_type x)
222     {
223         Cv32suf u;
224         u.f = x;
225         return u.i;
226     }
reinterpet_uintcv::V_TypeTraits227     static uint_type reinterpet_uint(value_type x)
228     {
229         Cv32suf u;
230         u.f = x;
231         return u.u;
232     }
reinterpret_from_intcv::V_TypeTraits233     static value_type reinterpret_from_int(int_type x)
234     {
235         Cv32suf u;
236         u.i = x;
237         return u.f;
238     }
239 };
240 
241 template<> struct V_TypeTraits<double>
242 {
243     typedef double value_type;
244     typedef int64 int_type;
245     typedef uint64 uint_type;
246     typedef double abs_type;
247     typedef double sum_type;
reinterpret_intcv::V_TypeTraits248     static int_type reinterpret_int(value_type x)
249     {
250         Cv64suf u;
251         u.f = x;
252         return u.i;
253     }
reinterpet_uintcv::V_TypeTraits254     static uint_type reinterpet_uint(value_type x)
255     {
256         Cv64suf u;
257         u.f = x;
258         return u.u;
259     }
reinterpret_from_intcv::V_TypeTraits260     static value_type reinterpret_from_int(int_type x)
261     {
262         Cv64suf u;
263         u.i = x;
264         return u.f;
265     }
266 };
267 
268 }
269 
270 #if CV_SSE2
271 
272 #include "opencv2/hal/intrin_sse.hpp"
273 
274 #elif CV_NEON
275 
276 #include "opencv2/hal/intrin_neon.hpp"
277 
278 #else
279 
280 #include "opencv2/hal/intrin_cpp.hpp"
281 
282 #endif
283 
284 #ifndef CV_SIMD128
285 #define CV_SIMD128 0
286 #endif
287 
288 #ifndef CV_SIMD128_64F
289 #define CV_SIMD128_64F 0
290 #endif
291 
292 #endif
293