Mercurial > hg > sv-dependency-builds
comparison src/opus-1.3/celt/ecintrin.h @ 154:4664ac0c1032
Add Opus sources and macOS builds
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Wed, 23 Jan 2019 13:48:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
153:84bc3a5ec321 | 154:4664ac0c1032 |
---|---|
1 /* Copyright (c) 2003-2008 Timothy B. Terriberry | |
2 Copyright (c) 2008 Xiph.Org Foundation */ | |
3 /* | |
4 Redistribution and use in source and binary forms, with or without | |
5 modification, are permitted provided that the following conditions | |
6 are met: | |
7 | |
8 - Redistributions of source code must retain the above copyright | |
9 notice, this list of conditions and the following disclaimer. | |
10 | |
11 - Redistributions in binary form must reproduce the above copyright | |
12 notice, this list of conditions and the following disclaimer in the | |
13 documentation and/or other materials provided with the distribution. | |
14 | |
15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
16 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
17 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
18 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER | |
19 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
23 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
24 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
26 */ | |
27 | |
28 /*Some common macros for potential platform-specific optimization.*/ | |
29 #include "opus_types.h" | |
30 #include <math.h> | |
31 #include <limits.h> | |
32 #include "arch.h" | |
33 #if !defined(_ecintrin_H) | |
34 # define _ecintrin_H (1) | |
35 | |
36 /*Some specific platforms may have optimized intrinsic or OPUS_INLINE assembly | |
37 versions of these functions which can substantially improve performance. | |
38 We define macros for them to allow easy incorporation of these non-ANSI | |
39 features.*/ | |
40 | |
41 /*Modern gcc (4.x) can compile the naive versions of min and max with cmov if | |
42 given an appropriate architecture, but the branchless bit-twiddling versions | |
43 are just as fast, and do not require any special target architecture. | |
44 Earlier gcc versions (3.x) compiled both code to the same assembly | |
45 instructions, because of the way they represented ((_b)>(_a)) internally.*/ | |
46 # define EC_MINI(_a,_b) ((_a)+(((_b)-(_a))&-((_b)<(_a)))) | |
47 | |
48 /*Count leading zeros. | |
49 This macro should only be used for implementing ec_ilog(), if it is defined. | |
50 All other code should use EC_ILOG() instead.*/ | |
51 #if defined(_MSC_VER) && (_MSC_VER >= 1400) | |
52 # include <intrin.h> | |
53 /*In _DEBUG mode this is not an intrinsic by default.*/ | |
54 # pragma intrinsic(_BitScanReverse) | |
55 | |
56 static __inline int ec_bsr(unsigned long _x){ | |
57 unsigned long ret; | |
58 _BitScanReverse(&ret,_x); | |
59 return (int)ret; | |
60 } | |
61 # define EC_CLZ0 (1) | |
62 # define EC_CLZ(_x) (-ec_bsr(_x)) | |
63 #elif defined(ENABLE_TI_DSPLIB) | |
64 # include "dsplib.h" | |
65 # define EC_CLZ0 (31) | |
66 # define EC_CLZ(_x) (_lnorm(_x)) | |
67 #elif __GNUC_PREREQ(3,4) | |
68 # if INT_MAX>=2147483647 | |
69 # define EC_CLZ0 ((int)sizeof(unsigned)*CHAR_BIT) | |
70 # define EC_CLZ(_x) (__builtin_clz(_x)) | |
71 # elif LONG_MAX>=2147483647L | |
72 # define EC_CLZ0 ((int)sizeof(unsigned long)*CHAR_BIT) | |
73 # define EC_CLZ(_x) (__builtin_clzl(_x)) | |
74 # endif | |
75 #endif | |
76 | |
77 #if defined(EC_CLZ) | |
78 /*Note that __builtin_clz is not defined when _x==0, according to the gcc | |
79 documentation (and that of the BSR instruction that implements it on x86). | |
80 The majority of the time we can never pass it zero. | |
81 When we need to, it can be special cased.*/ | |
82 # define EC_ILOG(_x) (EC_CLZ0-EC_CLZ(_x)) | |
83 #else | |
84 int ec_ilog(opus_uint32 _v); | |
85 # define EC_ILOG(_x) (ec_ilog(_x)) | |
86 #endif | |
87 #endif |