| OLD | NEW |
| 1 /* Copyright (C) 2007-2009 Xiph.Org Foundation | 1 /* Copyright (C) 2007-2009 Xiph.Org Foundation |
| 2 Copyright (C) 2003-2008 Jean-Marc Valin | 2 Copyright (C) 2003-2008 Jean-Marc Valin |
| 3 Copyright (C) 2007-2008 CSIRO */ | 3 Copyright (C) 2007-2008 CSIRO */ |
| 4 /** | 4 /** |
| 5 @file fixed_generic.h | 5 @file fixed_generic.h |
| 6 @brief Generic fixed-point operations | 6 @brief Generic fixed-point operations |
| 7 */ | 7 */ |
| 8 /* | 8 /* |
| 9 Redistribution and use in source and binary forms, with or without | 9 Redistribution and use in source and binary forms, with or without |
| 10 modification, are permitted provided that the following conditions | 10 modification, are permitted provided that the following conditions |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 /** "RAW" macros, should not be used outside of this header file */ | 97 /** "RAW" macros, should not be used outside of this header file */ |
| 98 #define SHR(a,shift) ((a) >> (shift)) | 98 #define SHR(a,shift) ((a) >> (shift)) |
| 99 #define SHL(a,shift) SHL32(a,shift) | 99 #define SHL(a,shift) SHL32(a,shift) |
| 100 #define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),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))) | 101 #define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) |
| 102 | 102 |
| 103 #define SATURATE16(x) (EXTRACT16((x)>32767 ? 32767 : (x)<-32768 ? -32768 : (x))) | 103 #define SATURATE16(x) (EXTRACT16((x)>32767 ? 32767 : (x)<-32768 ? -32768 : (x))) |
| 104 | 104 |
| 105 /** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */ | 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)))) | 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 |
| 107 /** Divide by two */ | 110 /** Divide by two */ |
| 108 #define HALF16(x) (SHR16(x,1)) | 111 #define HALF16(x) (SHR16(x,1)) |
| 109 #define HALF32(x) (SHR32(x,1)) | 112 #define HALF32(x) (SHR32(x,1)) |
| 110 | 113 |
| 111 /** Add two 16-bit values */ | 114 /** Add two 16-bit values */ |
| 112 #define ADD16(a,b) ((opus_val16)((opus_val16)(a)+(opus_val16)(b))) | 115 #define ADD16(a,b) ((opus_val16)((opus_val16)(a)+(opus_val16)(b))) |
| 113 /** Subtract two 16-bit values */ | 116 /** Subtract two 16-bit values */ |
| 114 #define SUB16(a,b) ((opus_val16)(a)-(opus_val16)(b)) | 117 #define SUB16(a,b) ((opus_val16)(a)-(opus_val16)(b)) |
| 115 /** Add two 32-bit values */ | 118 /** Add two 32-bit values */ |
| 116 #define ADD32(a,b) ((opus_val32)(a)+(opus_val32)(b)) | 119 #define ADD32(a,b) ((opus_val32)(a)+(opus_val32)(b)) |
| 117 /** Subtract two 32-bit values */ | 120 /** Subtract two 32-bit values */ |
| 118 #define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b)) | 121 #define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b)) |
| 119 | 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 |
| 120 /** 16x16 multiplication where the result fits in 16 bits */ | 131 /** 16x16 multiplication where the result fits in 16 bits */ |
| 121 #define MULT16_16_16(a,b) ((((opus_val16)(a))*((opus_val16)(b)))) | 132 #define MULT16_16_16(a,b) ((((opus_val16)(a))*((opus_val16)(b)))) |
| 122 | 133 |
| 123 /* (opus_val32)(opus_val16) gives TI compiler a hint that it's 16x16->32 multipl
y */ | 134 /* (opus_val32)(opus_val16) gives TI compiler a hint that it's 16x16->32 multipl
y */ |
| 124 /** 16x16 multiplication where the result fits in 32 bits */ | 135 /** 16x16 multiplication where the result fits in 32 bits */ |
| 125 #define MULT16_16(a,b) (((opus_val32)(opus_val16)(a))*((opus_val32)(opus_val
16)(b))) | 136 #define MULT16_16(a,b) (((opus_val32)(opus_val16)(a))*((opus_val32)(opus_val
16)(b))) |
| 126 | 137 |
| 127 /** 16x16 multiply-add where the result fits in 32 bits */ | 138 /** 16x16 multiply-add where the result fits in 32 bits */ |
| 128 #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) | 139 #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) |
| 129 /** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. | 140 /** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. |
| (...skipping 28 matching lines...) Expand all Loading... |
| 158 static OPUS_INLINE opus_val16 SIG2WORD16_generic(celt_sig x) | 169 static OPUS_INLINE opus_val16 SIG2WORD16_generic(celt_sig x) |
| 159 { | 170 { |
| 160 x = PSHR32(x, SIG_SHIFT); | 171 x = PSHR32(x, SIG_SHIFT); |
| 161 x = MAX32(x, -32768); | 172 x = MAX32(x, -32768); |
| 162 x = MIN32(x, 32767); | 173 x = MIN32(x, 32767); |
| 163 return EXTRACT16(x); | 174 return EXTRACT16(x); |
| 164 } | 175 } |
| 165 #define SIG2WORD16(x) (SIG2WORD16_generic(x)) | 176 #define SIG2WORD16(x) (SIG2WORD16_generic(x)) |
| 166 | 177 |
| 167 #endif | 178 #endif |
| OLD | NEW |