summaryrefslogtreecommitdiff
path: root/audio_codec/libflac/mathops.h (plain)
blob: 6f4a5f4c607bf3a7e9d2b9923c4548d4e54860fa
1/*
2 * simple math operations
3 * Copyright (c) 2001, 2002 Fabrice Bellard
4 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22#ifndef AVCODEC_MATHOPS_H
23#define AVCODEC_MATHOPS_H
24
25#include "common.h"
26#include "internal.h"
27
28/* generic implementation */
29
30#ifndef MULL
31# define MULL(a,b,s) (((int64_t)(a) * (int64_t)(b)) >> (s))
32#endif
33
34#ifndef MULH
35//gcc 3.4 creates an incredibly bloated mess out of this
36//# define MULH(a,b) (((int64_t)(a) * (int64_t)(b))>>32)
37
38static av_always_inline int MULH(int a, int b)
39{
40 return ((int64_t)(a) * (int64_t)(b)) >> 32;
41}
42#endif
43
44#ifndef MUL64
45# define MUL64(a,b) ((int64_t)(a) * (int64_t)(b))
46#endif
47
48#ifndef MAC64
49# define MAC64(d, a, b) ((d) += MUL64(a, b))
50#endif
51
52#ifndef MLS64
53# define MLS64(d, a, b) ((d) -= MUL64(a, b))
54#endif
55
56/* signed 16x16 -> 32 multiply add accumulate */
57#ifndef MAC16
58# define MAC16(rt, ra, rb) rt += (ra) * (rb)
59#endif
60
61/* signed 16x16 -> 32 multiply */
62#ifndef MUL16
63# define MUL16(ra, rb) ((ra) * (rb))
64#endif
65
66#ifndef MLS16
67# define MLS16(rt, ra, rb) ((rt) -= (ra) * (rb))
68#endif
69
70#ifndef sign_extend
71static inline av_const int sign_extend(int val, unsigned bits)
72{
73 return (val << (INT_BIT - bits)) >> (INT_BIT - bits);
74}
75#endif
76
77#endif /* AVCODEC_MATHOPS_H */
78
79