Mercurial > hg > sv-dependency-builds
comparison src/opus-1.3/celt/fixed_generic.h @ 69:7aeed7906520
Add Opus sources and macOS builds
author | Chris Cannam |
---|---|
date | Wed, 23 Jan 2019 13:48:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
68:85d5306e114e | 69:7aeed7906520 |
---|---|
1 /* Copyright (C) 2007-2009 Xiph.Org Foundation | |
2 Copyright (C) 2003-2008 Jean-Marc Valin | |
3 Copyright (C) 2007-2008 CSIRO */ | |
4 /** | |
5 @file fixed_generic.h | |
6 @brief Generic fixed-point operations | |
7 */ | |
8 /* | |
9 Redistribution and use in source and binary forms, with or without | |
10 modification, are permitted provided that the following conditions | |
11 are met: | |
12 | |
13 - Redistributions of source code must retain the above copyright | |
14 notice, this list of conditions and the following disclaimer. | |
15 | |
16 - Redistributions in binary form must reproduce the above copyright | |
17 notice, this list of conditions and the following disclaimer in the | |
18 documentation and/or other materials provided with the distribution. | |
19 | |
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
21 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
22 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
23 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER | |
24 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
25 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
26 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
27 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
28 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
29 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
30 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
31 */ | |
32 | |
33 #ifndef FIXED_GENERIC_H | |
34 #define FIXED_GENERIC_H | |
35 | |
36 /** Multiply a 16-bit signed value by a 16-bit unsigned value. The result is a 32-bit signed value */ | |
37 #define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b)) | |
38 | |
39 /** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ | |
40 #if OPUS_FAST_INT64 | |
41 #define MULT16_32_Q16(a,b) ((opus_val32)SHR((opus_int64)((opus_val16)(a))*(b),16)) | |
42 #else | |
43 #define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16)) | |
44 #endif | |
45 | |
46 /** 16x32 multiplication, followed by a 16-bit shift right (round-to-nearest). Results fits in 32 bits */ | |
47 #if OPUS_FAST_INT64 | |
48 #define MULT16_32_P16(a,b) ((opus_val32)PSHR((opus_int64)((opus_val16)(a))*(b),16)) | |
49 #else | |
50 #define MULT16_32_P16(a,b) ADD32(MULT16_16((a),SHR((b),16)), PSHR(MULT16_16SU((a),((b)&0x0000ffff)),16)) | |
51 #endif | |
52 | |
53 /** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ | |
54 #if OPUS_FAST_INT64 | |
55 #define MULT16_32_Q15(a,b) ((opus_val32)SHR((opus_int64)((opus_val16)(a))*(b),15)) | |
56 #else | |
57 #define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15)) | |
58 #endif | |
59 | |
60 /** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */ | |
61 #if OPUS_FAST_INT64 | |
62 #define MULT32_32_Q31(a,b) ((opus_val32)SHR((opus_int64)(a)*(opus_int64)(b),31)) | |
63 #else | |
64 #define MULT32_32_Q31(a,b) ADD32(ADD32(SHL(MULT16_16(SHR((a),16),SHR((b),16)),1), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),15)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),15)) | |
65 #endif | |
66 | |
67 /** Compile-time conversion of float constant to 16-bit value */ | |
68 #define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits)))) | |
69 | |
70 /** Compile-time conversion of float constant to 32-bit value */ | |
71 #define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits)))) | |
72 | |
73 /** Negate a 16-bit value */ | |
74 #define NEG16(x) (-(x)) | |
75 /** Negate a 32-bit value */ | |
76 #define NEG32(x) (-(x)) | |
77 | |
78 /** Change a 32-bit value into a 16-bit value. The value is assumed to fit in 16-bit, otherwise the result is undefined */ | |
79 #define EXTRACT16(x) ((opus_val16)(x)) | |
80 /** Change a 16-bit value into a 32-bit value */ | |
81 #define EXTEND32(x) ((opus_val32)(x)) | |
82 | |
83 /** Arithmetic shift-right of a 16-bit value */ | |
84 #define SHR16(a,shift) ((a) >> (shift)) | |
85 /** Arithmetic shift-left of a 16-bit value */ | |
86 #define SHL16(a,shift) ((opus_int16)((opus_uint16)(a)<<(shift))) | |
87 /** Arithmetic shift-right of a 32-bit value */ | |
88 #define SHR32(a,shift) ((a) >> (shift)) | |
89 /** Arithmetic shift-left of a 32-bit value */ | |
90 #define SHL32(a,shift) ((opus_int32)((opus_uint32)(a)<<(shift))) | |
91 | |
92 /** 32-bit arithmetic shift right with rounding-to-nearest instead of rounding down */ | |
93 #define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) | |
94 /** 32-bit arithmetic shift right where the argument can be negative */ | |
95 #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) | |
96 | |
97 /** "RAW" macros, should not be used outside of this header file */ | |
98 #define SHR(a,shift) ((a) >> (shift)) | |
99 #define SHL(a,shift) SHL32(a,shift) | |
100 #define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) | |
101 #define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) | |
102 | |
103 #define SATURATE16(x) (EXTRACT16((x)>32767 ? 32767 : (x)<-32768 ? -32768 : (x))) | |
104 | |
105 /** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */ | |
106 #define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a)))) | |
107 /** Shift by a and round-to-neareast 32-bit value. Result is a saturated 16-bit value */ | |
108 #define SROUND16(x,a) EXTRACT16(SATURATE(PSHR32(x,a), 32767)); | |
109 | |
110 /** Divide by two */ | |
111 #define HALF16(x) (SHR16(x,1)) | |
112 #define HALF32(x) (SHR32(x,1)) | |
113 | |
114 /** Add two 16-bit values */ | |
115 #define ADD16(a,b) ((opus_val16)((opus_val16)(a)+(opus_val16)(b))) | |
116 /** Subtract two 16-bit values */ | |
117 #define SUB16(a,b) ((opus_val16)(a)-(opus_val16)(b)) | |
118 /** Add two 32-bit values */ | |
119 #define ADD32(a,b) ((opus_val32)(a)+(opus_val32)(b)) | |
120 /** Subtract two 32-bit values */ | |
121 #define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b)) | |
122 | |
123 /** Add two 32-bit values, ignore any overflows */ | |
124 #define ADD32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)+(opus_uint32)(b))) | |
125 /** Subtract two 32-bit values, ignore any overflows */ | |
126 #define SUB32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)-(opus_uint32)(b))) | |
127 /* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */ | |
128 /** Negate 32-bit value, ignore any overflows */ | |
129 #define NEG32_ovflw(a) ((opus_val32)(0-(opus_uint32)(a))) | |
130 | |
131 /** 16x16 multiplication where the result fits in 16 bits */ | |
132 #define MULT16_16_16(a,b) ((((opus_val16)(a))*((opus_val16)(b)))) | |
133 | |
134 /* (opus_val32)(opus_val16) gives TI compiler a hint that it's 16x16->32 multiply */ | |
135 /** 16x16 multiplication where the result fits in 32 bits */ | |
136 #define MULT16_16(a,b) (((opus_val32)(opus_val16)(a))*((opus_val32)(opus_val16)(b))) | |
137 | |
138 /** 16x16 multiply-add where the result fits in 32 bits */ | |
139 #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) | |
140 /** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. | |
141 b must fit in 31 bits. | |
142 Result fits in 32 bits. */ | |
143 #define MAC16_32_Q15(c,a,b) ADD32((c),ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) | |
144 | |
145 /** 16x32 multiplication, followed by a 16-bit shift right and 32-bit add. | |
146 Results fits in 32 bits */ | |
147 #define MAC16_32_Q16(c,a,b) ADD32((c),ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16))) | |
148 | |
149 #define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) | |
150 #define MULT16_16_Q11(a,b) (SHR(MULT16_16((a),(b)),11)) | |
151 #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) | |
152 #define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) | |
153 #define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15)) | |
154 | |
155 #define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) | |
156 #define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) | |
157 #define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15)) | |
158 | |
159 /** Divide a 32-bit value by a 16-bit value. Result fits in 16 bits */ | |
160 #define DIV32_16(a,b) ((opus_val16)(((opus_val32)(a))/((opus_val16)(b)))) | |
161 | |
162 /** Divide a 32-bit value by a 32-bit value. Result fits in 32 bits */ | |
163 #define DIV32(a,b) (((opus_val32)(a))/((opus_val32)(b))) | |
164 | |
165 #if defined(MIPSr1_ASM) | |
166 #include "mips/fixed_generic_mipsr1.h" | |
167 #endif | |
168 | |
169 static OPUS_INLINE opus_val16 SIG2WORD16_generic(celt_sig x) | |
170 { | |
171 x = PSHR32(x, SIG_SHIFT); | |
172 x = MAX32(x, -32768); | |
173 x = MIN32(x, 32767); | |
174 return EXTRACT16(x); | |
175 } | |
176 #define SIG2WORD16(x) (SIG2WORD16_generic(x)) | |
177 | |
178 #endif |