xref: /aosp_15_r20/external/libaom/aom_dsp/odintrin.h (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker  * Copyright (c) 2001-2016, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker  *
4*77c1e3ccSAndroid Build Coastguard Worker  * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker  * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker  * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker  */
11*77c1e3ccSAndroid Build Coastguard Worker 
12*77c1e3ccSAndroid Build Coastguard Worker /* clang-format off */
13*77c1e3ccSAndroid Build Coastguard Worker 
14*77c1e3ccSAndroid Build Coastguard Worker #ifndef AOM_AOM_DSP_ODINTRIN_H_
15*77c1e3ccSAndroid Build Coastguard Worker #define AOM_AOM_DSP_ODINTRIN_H_
16*77c1e3ccSAndroid Build Coastguard Worker 
17*77c1e3ccSAndroid Build Coastguard Worker #include <stdlib.h>
18*77c1e3ccSAndroid Build Coastguard Worker #include <string.h>
19*77c1e3ccSAndroid Build Coastguard Worker 
20*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_integer.h"
21*77c1e3ccSAndroid Build Coastguard Worker #include "aom_dsp/aom_dsp_common.h"
22*77c1e3ccSAndroid Build Coastguard Worker #include "aom_ports/bitops.h"
23*77c1e3ccSAndroid Build Coastguard Worker 
24*77c1e3ccSAndroid Build Coastguard Worker #ifdef __cplusplus
25*77c1e3ccSAndroid Build Coastguard Worker extern "C" {
26*77c1e3ccSAndroid Build Coastguard Worker #endif
27*77c1e3ccSAndroid Build Coastguard Worker 
28*77c1e3ccSAndroid Build Coastguard Worker typedef int od_coeff;
29*77c1e3ccSAndroid Build Coastguard Worker 
30*77c1e3ccSAndroid Build Coastguard Worker #define OD_DIVU_DMAX (1024)
31*77c1e3ccSAndroid Build Coastguard Worker 
32*77c1e3ccSAndroid Build Coastguard Worker extern uint32_t OD_DIVU_SMALL_CONSTS[OD_DIVU_DMAX][2];
33*77c1e3ccSAndroid Build Coastguard Worker 
34*77c1e3ccSAndroid Build Coastguard Worker /*Translate unsigned division by small divisors into multiplications.*/
35*77c1e3ccSAndroid Build Coastguard Worker #define OD_DIVU_SMALL(_x, _d)                                     \
36*77c1e3ccSAndroid Build Coastguard Worker   ((uint32_t)((OD_DIVU_SMALL_CONSTS[(_d)-1][0] * (uint64_t)(_x) + \
37*77c1e3ccSAndroid Build Coastguard Worker                OD_DIVU_SMALL_CONSTS[(_d)-1][1]) >>                \
38*77c1e3ccSAndroid Build Coastguard Worker               32) >>                                              \
39*77c1e3ccSAndroid Build Coastguard Worker    (OD_ILOG_NZ(_d) - 1))
40*77c1e3ccSAndroid Build Coastguard Worker 
41*77c1e3ccSAndroid Build Coastguard Worker #define OD_DIVU(_x, _d) \
42*77c1e3ccSAndroid Build Coastguard Worker   (((_d) < OD_DIVU_DMAX) ? (OD_DIVU_SMALL((_x), (_d))) : ((_x) / (_d)))
43*77c1e3ccSAndroid Build Coastguard Worker 
44*77c1e3ccSAndroid Build Coastguard Worker #define OD_MINI AOMMIN
45*77c1e3ccSAndroid Build Coastguard Worker #define OD_MAXI AOMMAX
46*77c1e3ccSAndroid Build Coastguard Worker #define OD_CLAMPI(min, val, max) (OD_MAXI(min, OD_MINI(val, max)))
47*77c1e3ccSAndroid Build Coastguard Worker 
48*77c1e3ccSAndroid Build Coastguard Worker /*Integer logarithm (base 2) of a nonzero unsigned 32-bit integer.
49*77c1e3ccSAndroid Build Coastguard Worker   OD_ILOG_NZ(x) = (int)floor(log2(x)) + 1.*/
50*77c1e3ccSAndroid Build Coastguard Worker #define OD_ILOG_NZ(x) (1 + get_msb(x))
51*77c1e3ccSAndroid Build Coastguard Worker 
52*77c1e3ccSAndroid Build Coastguard Worker /*Enable special features for gcc and compatible compilers.*/
53*77c1e3ccSAndroid Build Coastguard Worker #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
54*77c1e3ccSAndroid Build Coastguard Worker #define OD_GNUC_PREREQ(maj, min, pat)                                \
55*77c1e3ccSAndroid Build Coastguard Worker   ((__GNUC__ << 16) + (__GNUC_MINOR__ << 8) + __GNUC_PATCHLEVEL__ >= \
56*77c1e3ccSAndroid Build Coastguard Worker    ((maj) << 16) + ((min) << 8) + pat)  // NOLINT
57*77c1e3ccSAndroid Build Coastguard Worker #else
58*77c1e3ccSAndroid Build Coastguard Worker #define OD_GNUC_PREREQ(maj, min, pat) (0)
59*77c1e3ccSAndroid Build Coastguard Worker #endif
60*77c1e3ccSAndroid Build Coastguard Worker 
61*77c1e3ccSAndroid Build Coastguard Worker #if OD_GNUC_PREREQ(3, 4, 0)
62*77c1e3ccSAndroid Build Coastguard Worker #define OD_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))
63*77c1e3ccSAndroid Build Coastguard Worker #else
64*77c1e3ccSAndroid Build Coastguard Worker #define OD_WARN_UNUSED_RESULT
65*77c1e3ccSAndroid Build Coastguard Worker #endif
66*77c1e3ccSAndroid Build Coastguard Worker 
67*77c1e3ccSAndroid Build Coastguard Worker #if OD_GNUC_PREREQ(3, 4, 0)
68*77c1e3ccSAndroid Build Coastguard Worker #define OD_ARG_NONNULL(x) __attribute__((__nonnull__(x)))
69*77c1e3ccSAndroid Build Coastguard Worker #else
70*77c1e3ccSAndroid Build Coastguard Worker #define OD_ARG_NONNULL(x)
71*77c1e3ccSAndroid Build Coastguard Worker #endif
72*77c1e3ccSAndroid Build Coastguard Worker 
73*77c1e3ccSAndroid Build Coastguard Worker /*All of these macros should expect floats as arguments.*/
74*77c1e3ccSAndroid Build Coastguard Worker # define OD_SIGNMASK(a) (-((a) < 0))
75*77c1e3ccSAndroid Build Coastguard Worker # define OD_FLIPSIGNI(a, b) (((a) + OD_SIGNMASK(b)) ^ OD_SIGNMASK(b))
76*77c1e3ccSAndroid Build Coastguard Worker 
77*77c1e3ccSAndroid Build Coastguard Worker #ifdef __cplusplus
78*77c1e3ccSAndroid Build Coastguard Worker }  // extern "C"
79*77c1e3ccSAndroid Build Coastguard Worker #endif
80*77c1e3ccSAndroid Build Coastguard Worker 
81*77c1e3ccSAndroid Build Coastguard Worker #endif  // AOM_AOM_DSP_ODINTRIN_H_
82