1*c0909341SAndroid Build Coastguard Worker /*
2*c0909341SAndroid Build Coastguard Worker * Copyright © 2019, VideoLAN and dav1d authors
3*c0909341SAndroid Build Coastguard Worker * Copyright © 2019, Two Orioles, LLC
4*c0909341SAndroid Build Coastguard Worker * All rights reserved.
5*c0909341SAndroid Build Coastguard Worker *
6*c0909341SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
7*c0909341SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
8*c0909341SAndroid Build Coastguard Worker *
9*c0909341SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright notice, this
10*c0909341SAndroid Build Coastguard Worker * list of conditions and the following disclaimer.
11*c0909341SAndroid Build Coastguard Worker *
12*c0909341SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright notice,
13*c0909341SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation
14*c0909341SAndroid Build Coastguard Worker * and/or other materials provided with the distribution.
15*c0909341SAndroid Build Coastguard Worker *
16*c0909341SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17*c0909341SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18*c0909341SAndroid Build Coastguard Worker * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19*c0909341SAndroid Build Coastguard Worker * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20*c0909341SAndroid Build Coastguard Worker * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21*c0909341SAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22*c0909341SAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23*c0909341SAndroid Build Coastguard Worker * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*c0909341SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*c0909341SAndroid Build Coastguard Worker * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*c0909341SAndroid Build Coastguard Worker */
27*c0909341SAndroid Build Coastguard Worker
28*c0909341SAndroid Build Coastguard Worker #include "tests/checkasm/checkasm.h"
29*c0909341SAndroid Build Coastguard Worker
30*c0909341SAndroid Build Coastguard Worker #include "src/cpu.h"
31*c0909341SAndroid Build Coastguard Worker #include "src/msac.h"
32*c0909341SAndroid Build Coastguard Worker
33*c0909341SAndroid Build Coastguard Worker #include <stdio.h>
34*c0909341SAndroid Build Coastguard Worker #include <string.h>
35*c0909341SAndroid Build Coastguard Worker
36*c0909341SAndroid Build Coastguard Worker #define BUF_SIZE 128
37*c0909341SAndroid Build Coastguard Worker
38*c0909341SAndroid Build Coastguard Worker /* The normal code doesn't use function pointers */
39*c0909341SAndroid Build Coastguard Worker typedef unsigned (*decode_symbol_adapt_fn)(MsacContext *s, uint16_t *cdf,
40*c0909341SAndroid Build Coastguard Worker size_t n_symbols);
41*c0909341SAndroid Build Coastguard Worker typedef unsigned (*decode_adapt_fn)(MsacContext *s, uint16_t *cdf);
42*c0909341SAndroid Build Coastguard Worker typedef unsigned (*decode_bool_equi_fn)(MsacContext *s);
43*c0909341SAndroid Build Coastguard Worker typedef unsigned (*decode_bool_fn)(MsacContext *s, unsigned f);
44*c0909341SAndroid Build Coastguard Worker
45*c0909341SAndroid Build Coastguard Worker typedef struct {
46*c0909341SAndroid Build Coastguard Worker decode_symbol_adapt_fn decode_symbol_adapt4;
47*c0909341SAndroid Build Coastguard Worker decode_symbol_adapt_fn decode_symbol_adapt8;
48*c0909341SAndroid Build Coastguard Worker decode_symbol_adapt_fn decode_symbol_adapt16;
49*c0909341SAndroid Build Coastguard Worker decode_adapt_fn decode_bool_adapt;
50*c0909341SAndroid Build Coastguard Worker decode_bool_equi_fn decode_bool_equi;
51*c0909341SAndroid Build Coastguard Worker decode_bool_fn decode_bool;
52*c0909341SAndroid Build Coastguard Worker decode_adapt_fn decode_hi_tok;
53*c0909341SAndroid Build Coastguard Worker } MsacDSPContext;
54*c0909341SAndroid Build Coastguard Worker
randomize_cdf(uint16_t * const cdf,const int n)55*c0909341SAndroid Build Coastguard Worker static void randomize_cdf(uint16_t *const cdf, const int n) {
56*c0909341SAndroid Build Coastguard Worker int i;
57*c0909341SAndroid Build Coastguard Worker for (i = 15; i > n; i--)
58*c0909341SAndroid Build Coastguard Worker cdf[i] = 0; // padding
59*c0909341SAndroid Build Coastguard Worker cdf[i] = 0; // count
60*c0909341SAndroid Build Coastguard Worker do {
61*c0909341SAndroid Build Coastguard Worker cdf[i - 1] = cdf[i] + rnd() % (32768 - cdf[i] - i) + 1;
62*c0909341SAndroid Build Coastguard Worker } while (--i > 0);
63*c0909341SAndroid Build Coastguard Worker }
64*c0909341SAndroid Build Coastguard Worker
65*c0909341SAndroid Build Coastguard Worker /* memcmp() on structs can have weird behavior due to padding etc. */
msac_cmp(const MsacContext * const a,const MsacContext * const b)66*c0909341SAndroid Build Coastguard Worker static int msac_cmp(const MsacContext *const a, const MsacContext *const b) {
67*c0909341SAndroid Build Coastguard Worker if (a->buf_pos != b->buf_pos || a->buf_end != b->buf_end ||
68*c0909341SAndroid Build Coastguard Worker a->rng != b->rng || a->cnt != b->cnt ||
69*c0909341SAndroid Build Coastguard Worker a->allow_update_cdf != b->allow_update_cdf)
70*c0909341SAndroid Build Coastguard Worker {
71*c0909341SAndroid Build Coastguard Worker return 1;
72*c0909341SAndroid Build Coastguard Worker }
73*c0909341SAndroid Build Coastguard Worker
74*c0909341SAndroid Build Coastguard Worker /* Only check valid dif bits, ignoring partial bytes at the end */
75*c0909341SAndroid Build Coastguard Worker const ec_win dif_mask = ~((~(ec_win)0) >> (imax(a->cnt, 0) + 16));
76*c0909341SAndroid Build Coastguard Worker return !!((a->dif ^ b->dif) & dif_mask);
77*c0909341SAndroid Build Coastguard Worker }
78*c0909341SAndroid Build Coastguard Worker
msac_dump(unsigned c_res,unsigned a_res,const MsacContext * const a,const MsacContext * const b,const uint16_t * const cdf_a,const uint16_t * const cdf_b,const int num_cdf)79*c0909341SAndroid Build Coastguard Worker static void msac_dump(unsigned c_res, unsigned a_res,
80*c0909341SAndroid Build Coastguard Worker const MsacContext *const a, const MsacContext *const b,
81*c0909341SAndroid Build Coastguard Worker const uint16_t *const cdf_a, const uint16_t *const cdf_b,
82*c0909341SAndroid Build Coastguard Worker const int num_cdf)
83*c0909341SAndroid Build Coastguard Worker {
84*c0909341SAndroid Build Coastguard Worker if (c_res != a_res)
85*c0909341SAndroid Build Coastguard Worker fprintf(stderr, "c_res %u a_res %u\n", c_res, a_res);
86*c0909341SAndroid Build Coastguard Worker if (a->buf_pos != b->buf_pos)
87*c0909341SAndroid Build Coastguard Worker fprintf(stderr, "buf_pos %p vs %p\n", a->buf_pos, b->buf_pos);
88*c0909341SAndroid Build Coastguard Worker if (a->buf_end != b->buf_end)
89*c0909341SAndroid Build Coastguard Worker fprintf(stderr, "buf_end %p vs %p\n", a->buf_end, b->buf_end);
90*c0909341SAndroid Build Coastguard Worker if (a->dif != b->dif)
91*c0909341SAndroid Build Coastguard Worker fprintf(stderr, "dif %zx vs %zx\n", a->dif, b->dif);
92*c0909341SAndroid Build Coastguard Worker if (a->rng != b->rng)
93*c0909341SAndroid Build Coastguard Worker fprintf(stderr, "rng %u vs %u\n", a->rng, b->rng);
94*c0909341SAndroid Build Coastguard Worker if (a->cnt != b->cnt)
95*c0909341SAndroid Build Coastguard Worker fprintf(stderr, "cnt %d vs %d\n", a->cnt, b->cnt);
96*c0909341SAndroid Build Coastguard Worker if (a->allow_update_cdf != b->allow_update_cdf)
97*c0909341SAndroid Build Coastguard Worker fprintf(stderr, "allow_update_cdf %d vs %d\n",
98*c0909341SAndroid Build Coastguard Worker a->allow_update_cdf, b->allow_update_cdf);
99*c0909341SAndroid Build Coastguard Worker if (num_cdf && memcmp(cdf_a, cdf_b, sizeof(*cdf_a) * (num_cdf + 1))) {
100*c0909341SAndroid Build Coastguard Worker fprintf(stderr, "cdf:\n");
101*c0909341SAndroid Build Coastguard Worker for (int i = 0; i <= num_cdf; i++)
102*c0909341SAndroid Build Coastguard Worker fprintf(stderr, " %5u", cdf_a[i]);
103*c0909341SAndroid Build Coastguard Worker fprintf(stderr, "\n");
104*c0909341SAndroid Build Coastguard Worker for (int i = 0; i <= num_cdf; i++)
105*c0909341SAndroid Build Coastguard Worker fprintf(stderr, " %5u", cdf_b[i]);
106*c0909341SAndroid Build Coastguard Worker fprintf(stderr, "\n");
107*c0909341SAndroid Build Coastguard Worker for (int i = 0; i <= num_cdf; i++)
108*c0909341SAndroid Build Coastguard Worker fprintf(stderr, " %c", cdf_a[i] != cdf_b[i] ? 'x' : '.');
109*c0909341SAndroid Build Coastguard Worker fprintf(stderr, "\n");
110*c0909341SAndroid Build Coastguard Worker }
111*c0909341SAndroid Build Coastguard Worker }
112*c0909341SAndroid Build Coastguard Worker
113*c0909341SAndroid Build Coastguard Worker #define CHECK_SYMBOL_ADAPT(n, n_min, n_max) do { \
114*c0909341SAndroid Build Coastguard Worker if (check_func(c->decode_symbol_adapt##n, \
115*c0909341SAndroid Build Coastguard Worker "msac_decode_symbol_adapt%d", n)) \
116*c0909341SAndroid Build Coastguard Worker { \
117*c0909341SAndroid Build Coastguard Worker for (int cdf_update = 0; cdf_update <= 1; cdf_update++) { \
118*c0909341SAndroid Build Coastguard Worker for (int ns = n_min; ns <= n_max; ns++) { \
119*c0909341SAndroid Build Coastguard Worker dav1d_msac_init(&s_c, buf, BUF_SIZE, !cdf_update); \
120*c0909341SAndroid Build Coastguard Worker s_a = s_c; \
121*c0909341SAndroid Build Coastguard Worker randomize_cdf(cdf[0], ns); \
122*c0909341SAndroid Build Coastguard Worker memcpy(cdf[1], cdf[0], sizeof(*cdf)); \
123*c0909341SAndroid Build Coastguard Worker while (s_c.cnt >= 0) { \
124*c0909341SAndroid Build Coastguard Worker unsigned c_res = call_ref(&s_c, cdf[0], ns); \
125*c0909341SAndroid Build Coastguard Worker unsigned a_res = call_new(&s_a, cdf[1], ns); \
126*c0909341SAndroid Build Coastguard Worker if (c_res != a_res || msac_cmp(&s_c, &s_a) || \
127*c0909341SAndroid Build Coastguard Worker memcmp(cdf[0], cdf[1], sizeof(**cdf) * (ns + 1))) \
128*c0909341SAndroid Build Coastguard Worker { \
129*c0909341SAndroid Build Coastguard Worker if (fail()) \
130*c0909341SAndroid Build Coastguard Worker msac_dump(c_res, a_res, &s_c, &s_a, \
131*c0909341SAndroid Build Coastguard Worker cdf[0], cdf[1], ns); \
132*c0909341SAndroid Build Coastguard Worker } \
133*c0909341SAndroid Build Coastguard Worker } \
134*c0909341SAndroid Build Coastguard Worker if (cdf_update && ns == n - 1) \
135*c0909341SAndroid Build Coastguard Worker bench_new(alternate(&s_c, &s_a), \
136*c0909341SAndroid Build Coastguard Worker alternate(cdf[0], cdf[1]), ns); \
137*c0909341SAndroid Build Coastguard Worker } \
138*c0909341SAndroid Build Coastguard Worker } \
139*c0909341SAndroid Build Coastguard Worker } \
140*c0909341SAndroid Build Coastguard Worker } while (0)
141*c0909341SAndroid Build Coastguard Worker
check_decode_symbol(MsacDSPContext * const c,uint8_t * const buf)142*c0909341SAndroid Build Coastguard Worker static void check_decode_symbol(MsacDSPContext *const c, uint8_t *const buf) {
143*c0909341SAndroid Build Coastguard Worker ALIGN_STK_32(uint16_t, cdf, 2, [16]);
144*c0909341SAndroid Build Coastguard Worker MsacContext s_c, s_a;
145*c0909341SAndroid Build Coastguard Worker
146*c0909341SAndroid Build Coastguard Worker declare_func(unsigned, MsacContext *s, uint16_t *cdf, size_t n_symbols);
147*c0909341SAndroid Build Coastguard Worker CHECK_SYMBOL_ADAPT( 4, 1, 3);
148*c0909341SAndroid Build Coastguard Worker CHECK_SYMBOL_ADAPT( 8, 1, 7);
149*c0909341SAndroid Build Coastguard Worker CHECK_SYMBOL_ADAPT(16, 3, 15);
150*c0909341SAndroid Build Coastguard Worker report("decode_symbol");
151*c0909341SAndroid Build Coastguard Worker }
152*c0909341SAndroid Build Coastguard Worker
check_decode_bool_adapt(MsacDSPContext * const c,uint8_t * const buf)153*c0909341SAndroid Build Coastguard Worker static void check_decode_bool_adapt(MsacDSPContext *const c, uint8_t *const buf) {
154*c0909341SAndroid Build Coastguard Worker MsacContext s_c, s_a;
155*c0909341SAndroid Build Coastguard Worker
156*c0909341SAndroid Build Coastguard Worker declare_func(unsigned, MsacContext *s, uint16_t *cdf);
157*c0909341SAndroid Build Coastguard Worker if (check_func(c->decode_bool_adapt, "msac_decode_bool_adapt")) {
158*c0909341SAndroid Build Coastguard Worker uint16_t cdf[2][2];
159*c0909341SAndroid Build Coastguard Worker for (int cdf_update = 0; cdf_update <= 1; cdf_update++) {
160*c0909341SAndroid Build Coastguard Worker dav1d_msac_init(&s_c, buf, BUF_SIZE, !cdf_update);
161*c0909341SAndroid Build Coastguard Worker s_a = s_c;
162*c0909341SAndroid Build Coastguard Worker cdf[0][0] = cdf[1][0] = rnd() % 32767 + 1;
163*c0909341SAndroid Build Coastguard Worker cdf[0][1] = cdf[1][1] = 0;
164*c0909341SAndroid Build Coastguard Worker while (s_c.cnt >= 0) {
165*c0909341SAndroid Build Coastguard Worker unsigned c_res = call_ref(&s_c, cdf[0]);
166*c0909341SAndroid Build Coastguard Worker unsigned a_res = call_new(&s_a, cdf[1]);
167*c0909341SAndroid Build Coastguard Worker if (c_res != a_res || msac_cmp(&s_c, &s_a) ||
168*c0909341SAndroid Build Coastguard Worker memcmp(cdf[0], cdf[1], sizeof(*cdf)))
169*c0909341SAndroid Build Coastguard Worker {
170*c0909341SAndroid Build Coastguard Worker if (fail())
171*c0909341SAndroid Build Coastguard Worker msac_dump(c_res, a_res, &s_c, &s_a, cdf[0], cdf[1], 1);
172*c0909341SAndroid Build Coastguard Worker }
173*c0909341SAndroid Build Coastguard Worker }
174*c0909341SAndroid Build Coastguard Worker if (cdf_update)
175*c0909341SAndroid Build Coastguard Worker bench_new(alternate(&s_c, &s_a), alternate(cdf[0], cdf[1]));
176*c0909341SAndroid Build Coastguard Worker }
177*c0909341SAndroid Build Coastguard Worker }
178*c0909341SAndroid Build Coastguard Worker }
179*c0909341SAndroid Build Coastguard Worker
check_decode_bool_equi(MsacDSPContext * const c,uint8_t * const buf)180*c0909341SAndroid Build Coastguard Worker static void check_decode_bool_equi(MsacDSPContext *const c, uint8_t *const buf) {
181*c0909341SAndroid Build Coastguard Worker MsacContext s_c, s_a;
182*c0909341SAndroid Build Coastguard Worker
183*c0909341SAndroid Build Coastguard Worker declare_func(unsigned, MsacContext *s);
184*c0909341SAndroid Build Coastguard Worker if (check_func(c->decode_bool_equi, "msac_decode_bool_equi")) {
185*c0909341SAndroid Build Coastguard Worker dav1d_msac_init(&s_c, buf, BUF_SIZE, 1);
186*c0909341SAndroid Build Coastguard Worker s_a = s_c;
187*c0909341SAndroid Build Coastguard Worker while (s_c.cnt >= 0) {
188*c0909341SAndroid Build Coastguard Worker unsigned c_res = call_ref(&s_c);
189*c0909341SAndroid Build Coastguard Worker unsigned a_res = call_new(&s_a);
190*c0909341SAndroid Build Coastguard Worker if (c_res != a_res || msac_cmp(&s_c, &s_a)) {
191*c0909341SAndroid Build Coastguard Worker if (fail())
192*c0909341SAndroid Build Coastguard Worker msac_dump(c_res, a_res, &s_c, &s_a, NULL, NULL, 0);
193*c0909341SAndroid Build Coastguard Worker }
194*c0909341SAndroid Build Coastguard Worker }
195*c0909341SAndroid Build Coastguard Worker bench_new(alternate(&s_c, &s_a));
196*c0909341SAndroid Build Coastguard Worker }
197*c0909341SAndroid Build Coastguard Worker }
198*c0909341SAndroid Build Coastguard Worker
check_decode_bool(MsacDSPContext * const c,uint8_t * const buf)199*c0909341SAndroid Build Coastguard Worker static void check_decode_bool(MsacDSPContext *const c, uint8_t *const buf) {
200*c0909341SAndroid Build Coastguard Worker MsacContext s_c, s_a;
201*c0909341SAndroid Build Coastguard Worker
202*c0909341SAndroid Build Coastguard Worker declare_func(unsigned, MsacContext *s, unsigned f);
203*c0909341SAndroid Build Coastguard Worker if (check_func(c->decode_bool, "msac_decode_bool")) {
204*c0909341SAndroid Build Coastguard Worker dav1d_msac_init(&s_c, buf, BUF_SIZE, 1);
205*c0909341SAndroid Build Coastguard Worker s_a = s_c;
206*c0909341SAndroid Build Coastguard Worker while (s_c.cnt >= 0) {
207*c0909341SAndroid Build Coastguard Worker const unsigned f = rnd() & 0x7fff;
208*c0909341SAndroid Build Coastguard Worker unsigned c_res = call_ref(&s_c, f);
209*c0909341SAndroid Build Coastguard Worker unsigned a_res = call_new(&s_a, f);
210*c0909341SAndroid Build Coastguard Worker if (c_res != a_res || msac_cmp(&s_c, &s_a)) {
211*c0909341SAndroid Build Coastguard Worker if (fail())
212*c0909341SAndroid Build Coastguard Worker msac_dump(c_res, a_res, &s_c, &s_a, NULL, NULL, 0);
213*c0909341SAndroid Build Coastguard Worker }
214*c0909341SAndroid Build Coastguard Worker }
215*c0909341SAndroid Build Coastguard Worker bench_new(alternate(&s_c, &s_a), 16384);
216*c0909341SAndroid Build Coastguard Worker }
217*c0909341SAndroid Build Coastguard Worker
218*c0909341SAndroid Build Coastguard Worker }
219*c0909341SAndroid Build Coastguard Worker
check_decode_bool_funcs(MsacDSPContext * const c,uint8_t * const buf)220*c0909341SAndroid Build Coastguard Worker static void check_decode_bool_funcs(MsacDSPContext *const c, uint8_t *const buf) {
221*c0909341SAndroid Build Coastguard Worker check_decode_bool_adapt(c, buf);
222*c0909341SAndroid Build Coastguard Worker check_decode_bool_equi(c, buf);
223*c0909341SAndroid Build Coastguard Worker check_decode_bool(c, buf);
224*c0909341SAndroid Build Coastguard Worker report("decode_bool");
225*c0909341SAndroid Build Coastguard Worker }
226*c0909341SAndroid Build Coastguard Worker
check_decode_hi_tok(MsacDSPContext * const c,uint8_t * const buf)227*c0909341SAndroid Build Coastguard Worker static void check_decode_hi_tok(MsacDSPContext *const c, uint8_t *const buf) {
228*c0909341SAndroid Build Coastguard Worker ALIGN_STK_16(uint16_t, cdf, 2, [16]);
229*c0909341SAndroid Build Coastguard Worker MsacContext s_c, s_a;
230*c0909341SAndroid Build Coastguard Worker
231*c0909341SAndroid Build Coastguard Worker declare_func(unsigned, MsacContext *s, uint16_t *cdf);
232*c0909341SAndroid Build Coastguard Worker if (check_func(c->decode_hi_tok, "msac_decode_hi_tok")) {
233*c0909341SAndroid Build Coastguard Worker for (int cdf_update = 0; cdf_update <= 1; cdf_update++) {
234*c0909341SAndroid Build Coastguard Worker dav1d_msac_init(&s_c, buf, BUF_SIZE, !cdf_update);
235*c0909341SAndroid Build Coastguard Worker s_a = s_c;
236*c0909341SAndroid Build Coastguard Worker randomize_cdf(cdf[0], 3);
237*c0909341SAndroid Build Coastguard Worker memcpy(cdf[1], cdf[0], sizeof(*cdf));
238*c0909341SAndroid Build Coastguard Worker while (s_c.cnt >= 0) {
239*c0909341SAndroid Build Coastguard Worker unsigned c_res = call_ref(&s_c, cdf[0]);
240*c0909341SAndroid Build Coastguard Worker unsigned a_res = call_new(&s_a, cdf[1]);
241*c0909341SAndroid Build Coastguard Worker if (c_res != a_res || msac_cmp(&s_c, &s_a) ||
242*c0909341SAndroid Build Coastguard Worker memcmp(cdf[0], cdf[1], sizeof(*cdf)))
243*c0909341SAndroid Build Coastguard Worker {
244*c0909341SAndroid Build Coastguard Worker if (fail())
245*c0909341SAndroid Build Coastguard Worker msac_dump(c_res, a_res, &s_c, &s_a, cdf[0], cdf[1], 3);
246*c0909341SAndroid Build Coastguard Worker break;
247*c0909341SAndroid Build Coastguard Worker }
248*c0909341SAndroid Build Coastguard Worker }
249*c0909341SAndroid Build Coastguard Worker if (cdf_update)
250*c0909341SAndroid Build Coastguard Worker bench_new(alternate(&s_c, &s_a), alternate(cdf[0], cdf[1]));
251*c0909341SAndroid Build Coastguard Worker }
252*c0909341SAndroid Build Coastguard Worker }
253*c0909341SAndroid Build Coastguard Worker report("decode_hi_tok");
254*c0909341SAndroid Build Coastguard Worker }
255*c0909341SAndroid Build Coastguard Worker
checkasm_check_msac(void)256*c0909341SAndroid Build Coastguard Worker void checkasm_check_msac(void) {
257*c0909341SAndroid Build Coastguard Worker MsacDSPContext c;
258*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt4 = dav1d_msac_decode_symbol_adapt_c;
259*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt8 = dav1d_msac_decode_symbol_adapt_c;
260*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt16 = dav1d_msac_decode_symbol_adapt_c;
261*c0909341SAndroid Build Coastguard Worker c.decode_bool_adapt = dav1d_msac_decode_bool_adapt_c;
262*c0909341SAndroid Build Coastguard Worker c.decode_bool_equi = dav1d_msac_decode_bool_equi_c;
263*c0909341SAndroid Build Coastguard Worker c.decode_bool = dav1d_msac_decode_bool_c;
264*c0909341SAndroid Build Coastguard Worker c.decode_hi_tok = dav1d_msac_decode_hi_tok_c;
265*c0909341SAndroid Build Coastguard Worker
266*c0909341SAndroid Build Coastguard Worker #if (ARCH_AARCH64 || ARCH_ARM) && HAVE_ASM
267*c0909341SAndroid Build Coastguard Worker if (dav1d_get_cpu_flags() & DAV1D_ARM_CPU_FLAG_NEON) {
268*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt4 = dav1d_msac_decode_symbol_adapt4_neon;
269*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt8 = dav1d_msac_decode_symbol_adapt8_neon;
270*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt16 = dav1d_msac_decode_symbol_adapt16_neon;
271*c0909341SAndroid Build Coastguard Worker c.decode_bool_adapt = dav1d_msac_decode_bool_adapt_neon;
272*c0909341SAndroid Build Coastguard Worker c.decode_bool_equi = dav1d_msac_decode_bool_equi_neon;
273*c0909341SAndroid Build Coastguard Worker c.decode_bool = dav1d_msac_decode_bool_neon;
274*c0909341SAndroid Build Coastguard Worker c.decode_hi_tok = dav1d_msac_decode_hi_tok_neon;
275*c0909341SAndroid Build Coastguard Worker }
276*c0909341SAndroid Build Coastguard Worker #elif ARCH_LOONGARCH64 && HAVE_ASM
277*c0909341SAndroid Build Coastguard Worker if (dav1d_get_cpu_flags() & DAV1D_LOONGARCH_CPU_FLAG_LSX) {
278*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt4 = dav1d_msac_decode_symbol_adapt4_lsx;
279*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt8 = dav1d_msac_decode_symbol_adapt8_lsx;
280*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt16 = dav1d_msac_decode_symbol_adapt16_lsx;
281*c0909341SAndroid Build Coastguard Worker c.decode_bool_adapt = dav1d_msac_decode_bool_adapt_lsx;
282*c0909341SAndroid Build Coastguard Worker c.decode_bool = dav1d_msac_decode_bool_lsx;
283*c0909341SAndroid Build Coastguard Worker c.decode_bool_equi = dav1d_msac_decode_bool_equi_lsx;
284*c0909341SAndroid Build Coastguard Worker c.decode_hi_tok = dav1d_msac_decode_hi_tok_lsx;
285*c0909341SAndroid Build Coastguard Worker }
286*c0909341SAndroid Build Coastguard Worker #elif ARCH_X86 && HAVE_ASM
287*c0909341SAndroid Build Coastguard Worker if (dav1d_get_cpu_flags() & DAV1D_X86_CPU_FLAG_SSE2) {
288*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt4 = dav1d_msac_decode_symbol_adapt4_sse2;
289*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt8 = dav1d_msac_decode_symbol_adapt8_sse2;
290*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt16 = dav1d_msac_decode_symbol_adapt16_sse2;
291*c0909341SAndroid Build Coastguard Worker c.decode_bool_adapt = dav1d_msac_decode_bool_adapt_sse2;
292*c0909341SAndroid Build Coastguard Worker c.decode_bool_equi = dav1d_msac_decode_bool_equi_sse2;
293*c0909341SAndroid Build Coastguard Worker c.decode_bool = dav1d_msac_decode_bool_sse2;
294*c0909341SAndroid Build Coastguard Worker c.decode_hi_tok = dav1d_msac_decode_hi_tok_sse2;
295*c0909341SAndroid Build Coastguard Worker }
296*c0909341SAndroid Build Coastguard Worker
297*c0909341SAndroid Build Coastguard Worker #if ARCH_X86_64
298*c0909341SAndroid Build Coastguard Worker if (dav1d_get_cpu_flags() & DAV1D_X86_CPU_FLAG_AVX2) {
299*c0909341SAndroid Build Coastguard Worker c.decode_symbol_adapt16 = dav1d_msac_decode_symbol_adapt16_avx2;
300*c0909341SAndroid Build Coastguard Worker }
301*c0909341SAndroid Build Coastguard Worker #endif
302*c0909341SAndroid Build Coastguard Worker #endif
303*c0909341SAndroid Build Coastguard Worker
304*c0909341SAndroid Build Coastguard Worker uint8_t buf[BUF_SIZE];
305*c0909341SAndroid Build Coastguard Worker for (int i = 0; i < BUF_SIZE; i++)
306*c0909341SAndroid Build Coastguard Worker buf[i] = rnd();
307*c0909341SAndroid Build Coastguard Worker
308*c0909341SAndroid Build Coastguard Worker check_decode_symbol(&c, buf);
309*c0909341SAndroid Build Coastguard Worker check_decode_bool_funcs(&c, buf);
310*c0909341SAndroid Build Coastguard Worker check_decode_hi_tok(&c, buf);
311*c0909341SAndroid Build Coastguard Worker }
312