FFmpeg
checkasm.h
Go to the documentation of this file.
1 /*
2  * Assembly testing and benchmarking tool
3  * Copyright (c) 2015 Henrik Gramner
4  * Copyright (c) 2008 Loren Merritt
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (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
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22 
23 #ifndef TESTS_CHECKASM_CHECKASM_H
24 #define TESTS_CHECKASM_CHECKASM_H
25 
26 #include <stdint.h>
27 #include "config.h"
28 
29 #if CONFIG_LINUX_PERF
30 #include <unistd.h> // read(3)
31 #include <sys/ioctl.h>
32 #include <asm/unistd.h>
33 #include <linux/perf_event.h>
34 #elif CONFIG_MACOS_KPERF
35 #include "libavutil/macos_kperf.h"
36 #endif
37 
38 #include "libavutil/avstring.h"
39 #include "libavutil/cpu.h"
40 #include "libavutil/emms.h"
41 #include "libavutil/internal.h"
42 #include "libavutil/lfg.h"
43 #include "libavutil/timer.h"
44 
45 #ifdef _WIN32
46 #include <windows.h>
47 #if ARCH_X86_32
48 #include <setjmp.h>
49 typedef jmp_buf checkasm_context;
50 #define checkasm_save_context() checkasm_handle_signal(setjmp(checkasm_context_buf))
51 #define checkasm_load_context(s) longjmp(checkasm_context_buf, s)
52 #elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
53 /* setjmp/longjmp on Windows on architectures using SEH (all except x86_32)
54  * will try to use SEH to unwind the stack, which doesn't work for assembly
55  * functions without unwind information. */
56 typedef struct { CONTEXT c; int status; } checkasm_context;
57 #define checkasm_save_context() \
58  (checkasm_context_buf.status = 0, \
59  RtlCaptureContext(&checkasm_context_buf.c), \
60  checkasm_handle_signal(checkasm_context_buf.status))
61 #define checkasm_load_context(s) \
62  (checkasm_context_buf.status = s, \
63  RtlRestoreContext(&checkasm_context_buf.c, NULL))
64 #else
65 #define checkasm_context void*
66 #define checkasm_save_context() 0
67 #define checkasm_load_context() do {} while (0)
68 #endif
69 #else
70 #include <setjmp.h>
71 typedef sigjmp_buf checkasm_context;
72 #define checkasm_save_context() checkasm_handle_signal(sigsetjmp(checkasm_context_buf, 1))
73 #define checkasm_load_context(s) siglongjmp(checkasm_context_buf, s)
74 #endif
75 
76 void checkasm_check_aacencdsp(void);
77 void checkasm_check_aacpsdsp(void);
78 void checkasm_check_ac3dsp(void);
79 void checkasm_check_afir(void);
80 void checkasm_check_alacdsp(void);
81 void checkasm_check_audiodsp(void);
82 void checkasm_check_av_tx(void);
83 void checkasm_check_blend(void);
84 void checkasm_check_blockdsp(void);
85 void checkasm_check_bswapdsp(void);
86 void checkasm_check_colorspace(void);
87 void checkasm_check_exrdsp(void);
88 void checkasm_check_fixed_dsp(void);
89 void checkasm_check_flacdsp(void);
90 void checkasm_check_float_dsp(void);
91 void checkasm_check_fmtconvert(void);
92 void checkasm_check_g722dsp(void);
93 void checkasm_check_h264chroma(void);
94 void checkasm_check_h264dsp(void);
95 void checkasm_check_h264pred(void);
96 void checkasm_check_h264qpel(void);
99 void checkasm_check_hevc_idct(void);
100 void checkasm_check_hevc_pel(void);
101 void checkasm_check_hevc_sao(void);
102 void checkasm_check_huffyuvdsp(void);
103 void checkasm_check_idctdsp(void);
104 void checkasm_check_jpeg2000dsp(void);
105 void checkasm_check_llauddsp(void);
106 void checkasm_check_llviddsp(void);
107 void checkasm_check_llviddspenc(void);
108 void checkasm_check_lpc(void);
109 void checkasm_check_motion(void);
110 void checkasm_check_nlmeans(void);
111 void checkasm_check_opusdsp(void);
112 void checkasm_check_pixblockdsp(void);
113 void checkasm_check_sbrdsp(void);
114 void checkasm_check_rv34dsp(void);
115 void checkasm_check_rv40dsp(void);
116 void checkasm_check_svq1enc(void);
117 void checkasm_check_synth_filter(void);
118 void checkasm_check_sw_gbrp(void);
119 void checkasm_check_sw_rgb(void);
120 void checkasm_check_sw_scale(void);
121 void checkasm_check_takdsp(void);
122 void checkasm_check_utvideodsp(void);
123 void checkasm_check_v210dec(void);
124 void checkasm_check_v210enc(void);
125 void checkasm_check_vc1dsp(void);
126 void checkasm_check_vf_bwdif(void);
127 void checkasm_check_vf_eq(void);
128 void checkasm_check_vf_gblur(void);
129 void checkasm_check_vf_hflip(void);
130 void checkasm_check_vf_threshold(void);
131 void checkasm_check_vf_sobel(void);
132 void checkasm_check_vp8dsp(void);
133 void checkasm_check_vp9dsp(void);
134 void checkasm_check_videodsp(void);
135 void checkasm_check_vorbisdsp(void);
136 void checkasm_check_vvc_mc(void);
137 
138 struct CheckasmPerf;
139 
140 void *checkasm_check_func(void *func, const char *name, ...) av_printf_format(2, 3);
141 int checkasm_bench_func(void);
142 void checkasm_fail_func(const char *msg, ...) av_printf_format(1, 2);
144 void checkasm_report(const char *name, ...) av_printf_format(1, 2);
145 void checkasm_set_signal_handler_state(int enabled);
146 int checkasm_handle_signal(int s);
148 
149 /* float compare utilities */
150 int float_near_ulp(float a, float b, unsigned max_ulp);
151 int float_near_abs_eps(float a, float b, float eps);
152 int float_near_abs_eps_ulp(float a, float b, float eps, unsigned max_ulp);
153 int float_near_ulp_array(const float *a, const float *b, unsigned max_ulp,
154  unsigned len);
155 int float_near_abs_eps_array(const float *a, const float *b, float eps,
156  unsigned len);
157 int float_near_abs_eps_array_ulp(const float *a, const float *b, float eps,
158  unsigned max_ulp, unsigned len);
159 int double_near_abs_eps(double a, double b, double eps);
160 int double_near_abs_eps_array(const double *a, const double *b, double eps,
161  unsigned len);
162 
163 extern AVLFG checkasm_lfg;
164 #define rnd() av_lfg_get(&checkasm_lfg)
165 
166 static av_unused void *func_ref, *func_new;
167 
168 #define BENCH_RUNS 1000 /* Trade-off between accuracy and speed */
169 
170 /* Decide whether or not the specified function needs to be tested */
171 #define check_func(func, ...) (checkasm_save_context(), func_ref = checkasm_check_func((func_new = func), __VA_ARGS__))
172 
173 /* Declare the function prototype. The first argument is the return value, the remaining
174  * arguments are the function parameters. Naming parameters is optional. */
175 #define declare_func(ret, ...) declare_new(ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
176 #define declare_func_float(ret, ...) declare_new_float(ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
177 #define declare_func_emms(cpu_flags, ret, ...) declare_new_emms(cpu_flags, ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
178 
179 /* Indicate that the current test has failed */
180 #define fail() checkasm_fail_func("%s:%d", av_basename(__FILE__), __LINE__)
181 
182 /* Print the test outcome */
183 #define report checkasm_report
184 
185 /* Call the reference function */
186 #define call_ref(...)\
187  (checkasm_set_signal_handler_state(1),\
188  ((func_type *)func_ref)(__VA_ARGS__));\
189  checkasm_set_signal_handler_state(0)
190 
191 #if ARCH_X86 && HAVE_X86ASM
192 /* Verifies that clobbered callee-saved registers are properly saved and restored
193  * and that either no MMX registers are touched or emms is issued */
194 void checkasm_checked_call(void *func, ...);
195 /* Verifies that clobbered callee-saved registers are properly saved and restored
196  * and issues emms for asm functions which are not required to do so */
197 void checkasm_checked_call_emms(void *func, ...);
198 /* Verifies that clobbered callee-saved registers are properly saved and restored
199  * but doesn't issue emms. Meant for dsp functions returning float or double */
200 void checkasm_checked_call_float(void *func, ...);
201 
202 #if ARCH_X86_64
203 /* Evil hack: detect incorrect assumptions that 32-bit ints are zero-extended to 64-bit.
204  * This is done by clobbering the stack with junk around the stack pointer and calling the
205  * assembly function through checked_call() with added dummy arguments which forces all
206  * real arguments to be passed on the stack and not in registers. For 32-bit arguments the
207  * upper half of the 64-bit register locations on the stack will now contain junk which will
208  * cause misbehaving functions to either produce incorrect output or segfault. Note that
209  * even though this works extremely well in practice, it's technically not guaranteed
210  * and false negatives is theoretically possible, but there can never be any false positives.
211  */
212 void checkasm_stack_clobber(uint64_t clobber, ...);
213 #define declare_new(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__)\
214  = (void *)checkasm_checked_call;
215 #define declare_new_float(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__)\
216  = (void *)checkasm_checked_call_float;
217 #define declare_new_emms(cpu_flags, ret, ...) \
218  ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__) = \
219  ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \
220  (void *)checkasm_checked_call;
221 #define CLOB (UINT64_C(0xdeadbeefdeadbeef))
222 #define call_new(...) (checkasm_set_signal_handler_state(1),\
223  checkasm_stack_clobber(CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,\
224  CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB),\
225  checked_call(func_new, 0, 0, 0, 0, 0, __VA_ARGS__));\
226  checkasm_set_signal_handler_state(0)
227 #elif ARCH_X86_32
228 #define declare_new(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call;
229 #define declare_new_float(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call_float;
230 #define declare_new_emms(cpu_flags, ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = \
231  ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \
232  (void *)checkasm_checked_call;
233 #define call_new(...)\
234  (checkasm_set_signal_handler_state(1),\
235  checked_call(func_new, __VA_ARGS__));\
236  checkasm_set_signal_handler_state(0)
237 #endif
238 #elif ARCH_ARM && HAVE_ARMV5TE_EXTERNAL
239 /* Use a dummy argument, to offset the real parameters by 2, not only 1.
240  * This makes sure that potential 8-byte-alignment of parameters is kept the same
241  * even when the extra parameters have been removed. */
242 void checkasm_checked_call_vfp(void *func, int dummy, ...);
243 void checkasm_checked_call_novfp(void *func, int dummy, ...);
244 extern void (*checkasm_checked_call)(void *func, int dummy, ...);
245 #define declare_new(ret, ...) ret (*checked_call)(void *, int dummy, __VA_ARGS__, \
246  int, int, int, int, int, int, int, int, \
247  int, int, int, int, int, int, int) = (void *)checkasm_checked_call;
248 #define call_new(...) \
249  (checkasm_set_signal_handler_state(1),\
250  checked_call(func_new, 0, __VA_ARGS__, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0));\
251  checkasm_set_signal_handler_state(0)
252 #elif ARCH_AARCH64 && !defined(__APPLE__)
253 void checkasm_stack_clobber(uint64_t clobber, ...);
254 void checkasm_checked_call(void *func, ...);
255 #define declare_new(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, int, int, __VA_ARGS__,\
256  int, int, int, int, int, int, int, int,\
257  int, int, int, int, int, int, int)\
258  = (void *)checkasm_checked_call;
259 #define CLOB (UINT64_C(0xdeadbeefdeadbeef))
260 #define call_new(...) (checkasm_set_signal_handler_state(1),\
261  checkasm_stack_clobber(CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,\
262  CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB),\
263  checked_call(func_new, 0, 0, 0, 0, 0, 0, 0, __VA_ARGS__,\
264  7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0));\
265  checkasm_set_signal_handler_state(0)
266 #elif ARCH_RISCV
267 void checkasm_set_function(void *);
268 void *checkasm_get_wrapper(void);
269 
270 #if HAVE_RV && (__riscv_xlen == 64) && defined (__riscv_d)
271 #define declare_new(ret, ...) \
272  ret (*checked_call)(__VA_ARGS__) = checkasm_get_wrapper();
273 #define call_new(...) \
274  (checkasm_set_signal_handler_state(1),\
275  checkasm_set_function(func_new), checked_call(__VA_ARGS__));\
276  checkasm_set_signal_handler_state(0)
277 #else
278 #define declare_new(ret, ...)
279 #define call_new(...)\
280  (checkasm_set_signal_handler_state(1),\
281  ((func_type *)func_new)(__VA_ARGS__));\
282  checkasm_set_signal_handler_state(0)
283 #endif
284 #else
285 #define declare_new(ret, ...)
286 #define declare_new_float(ret, ...)
287 #define declare_new_emms(cpu_flags, ret, ...)
288 /* Call the function */
289 #define call_new(...)\
290  (checkasm_set_signal_handler_state(1),\
291  ((func_type *)func_new)(__VA_ARGS__));\
292  checkasm_set_signal_handler_state(0)
293 #endif
294 
295 #ifndef declare_new_emms
296 #define declare_new_emms(cpu_flags, ret, ...) declare_new(ret, __VA_ARGS__)
297 #endif
298 #ifndef declare_new_float
299 #define declare_new_float(ret, ...) declare_new(ret, __VA_ARGS__)
300 #endif
301 
302 typedef struct CheckasmPerf {
303  int sysfd;
304  uint64_t cycles;
306 } CheckasmPerf;
307 
308 #if defined(AV_READ_TIME) || CONFIG_LINUX_PERF || CONFIG_MACOS_KPERF
309 
310 #if CONFIG_LINUX_PERF
311 #define PERF_START(t) do { \
312  ioctl(sysfd, PERF_EVENT_IOC_RESET, 0); \
313  ioctl(sysfd, PERF_EVENT_IOC_ENABLE, 0); \
314 } while (0)
315 #define PERF_STOP(t) do { \
316  int ret; \
317  ioctl(sysfd, PERF_EVENT_IOC_DISABLE, 0); \
318  ret = read(sysfd, &t, sizeof(t)); \
319  (void)ret; \
320 } while (0)
321 #elif CONFIG_MACOS_KPERF
322 #define PERF_START(t) t = ff_kperf_cycles()
323 #define PERF_STOP(t) t = ff_kperf_cycles() - t
324 #else
325 #define PERF_START(t) t = AV_READ_TIME()
326 #define PERF_STOP(t) t = AV_READ_TIME() - t
327 #endif
328 
329 /* Benchmark the function */
330 #define bench_new(...)\
331  do {\
332  if (checkasm_bench_func()) {\
333  struct CheckasmPerf *perf = checkasm_get_perf_context();\
334  av_unused const int sysfd = perf->sysfd;\
335  func_type *tfunc = func_new;\
336  uint64_t tsum = 0;\
337  int ti, tcount = 0;\
338  uint64_t t = 0; \
339  checkasm_set_signal_handler_state(1);\
340  for (ti = 0; ti < BENCH_RUNS; ti++) {\
341  PERF_START(t);\
342  tfunc(__VA_ARGS__);\
343  tfunc(__VA_ARGS__);\
344  tfunc(__VA_ARGS__);\
345  tfunc(__VA_ARGS__);\
346  PERF_STOP(t);\
347  if (t*tcount <= tsum*4 && ti > 0) {\
348  tsum += t;\
349  tcount++;\
350  }\
351  }\
352  emms_c();\
353  perf->cycles += t;\
354  perf->iterations++;\
355  checkasm_set_signal_handler_state(0);\
356  }\
357  } while (0)
358 #else
359 #define bench_new(...) while(0)
360 #define PERF_START(t) while(0)
361 #define PERF_STOP(t) while(0)
362 #endif
363 
364 #define DECL_CHECKASM_CHECK_FUNC(type) \
365 int checkasm_check_##type(const char *file, int line, \
366  const type *buf1, ptrdiff_t stride1, \
367  const type *buf2, ptrdiff_t stride2, \
368  int w, int h, const char *name)
369 
370 DECL_CHECKASM_CHECK_FUNC(uint8_t);
371 DECL_CHECKASM_CHECK_FUNC(uint16_t);
372 DECL_CHECKASM_CHECK_FUNC(uint32_t);
373 DECL_CHECKASM_CHECK_FUNC(int16_t);
375 
376 #define PASTE(a,b) a ## b
377 #define CONCAT(a,b) PASTE(a,b)
378 
379 #define checkasm_check(prefix, ...) CONCAT(checkasm_check_, prefix)(__FILE__, __LINE__, __VA_ARGS__)
380 
381 #endif /* TESTS_CHECKASM_CHECKASM_H */
checkasm_check_nlmeans
void checkasm_check_nlmeans(void)
Definition: vf_nlmeans.c:32
func
int(* func)(AVBPrint *dst, const char *in, const char *arg)
Definition: jacosubdec.c:68
checkasm_lfg
AVLFG checkasm_lfg
Definition: checkasm.c:353
checkasm_check_sw_gbrp
void checkasm_check_sw_gbrp(void)
Definition: sw_gbrp.c:401
checkasm_check_vp8dsp
void checkasm_check_vp8dsp(void)
Definition: vp8dsp.c:507
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
checkasm_check_videodsp
void checkasm_check_videodsp(void)
Definition: videodsp.c:81
checkasm_check_vf_eq
void checkasm_check_vf_eq(void)
Definition: vf_eq.c:76
checkasm_check_v210dec
void checkasm_check_v210dec(void)
Definition: v210dec.c:47
checkasm_check_aacencdsp
void checkasm_check_aacencdsp(void)
Definition: aacencdsp.c:64
av_unused
#define av_unused
Definition: attributes.h:131
checkasm_check_hevc_idct
void checkasm_check_hevc_idct(void)
Definition: hevc_idct.c:108
checkasm_check_sw_scale
void checkasm_check_sw_scale(void)
Definition: sw_scale.c:362
checkasm_bench_func
void int checkasm_bench_func(void)
Definition: checkasm.c:944
b
#define b
Definition: input.c:41
func_ref
static av_unused void * func_ref
Definition: checkasm.h:166
checkasm_check_aacpsdsp
void checkasm_check_aacpsdsp(void)
Definition: aacpsdsp.c:234
checkasm_check_func
void * checkasm_check_func(void *func, const char *name,...) av_printf_format(2
CheckasmPerf::sysfd
int sysfd
Definition: checkasm.h:303
checkasm_check_alacdsp
void checkasm_check_alacdsp(void)
Definition: alacdsp.c:116
checkasm_check_llviddspenc
void checkasm_check_llviddspenc(void)
Definition: llviddspenc.c:104
double_near_abs_eps
int double_near_abs_eps(double a, double b, double eps)
Definition: checkasm.c:431
checkasm_check_h264dsp
void checkasm_check_h264dsp(void)
Definition: h264dsp.c:441
checkasm_check_ac3dsp
void checkasm_check_ac3dsp(void)
Definition: ac3dsp.c:193
checkasm_check_motion
void checkasm_check_motion(void)
Definition: motion.c:146
func_new
static av_unused void * func_new
Definition: checkasm.h:166
float_near_abs_eps_ulp
int float_near_abs_eps_ulp(float a, float b, float eps, unsigned max_ulp)
Definition: checkasm.c:414
CheckasmPerf
Definition: checkasm.h:302
dummy
int dummy
Definition: motion.c:66
checkasm_check_vp9dsp
void checkasm_check_vp9dsp(void)
Definition: vp9dsp.c:627
checkasm_check_vf_threshold
void checkasm_check_vf_threshold(void)
Definition: vf_threshold.c:79
checkasm_check_vf_gblur
void checkasm_check_vf_gblur(void)
Definition: vf_gblur.c:82
checkasm_check_vvc_mc
void checkasm_check_vvc_mc(void)
Definition: vvc_mc.c:325
checkasm_report
void checkasm_report(const char *name,...) av_printf_format(1
checkasm_check_float_dsp
void checkasm_check_float_dsp(void)
Definition: float_dsp.c:281
double_near_abs_eps_array
int double_near_abs_eps_array(const double *a, const double *b, double eps, unsigned len)
Definition: checkasm.c:438
checkasm_check_pixblockdsp
void checkasm_check_pixblockdsp(void)
Definition: pixblockdsp.c:82
checkasm_check_bswapdsp
void checkasm_check_bswapdsp(void)
Definition: bswapdsp.c:60
s
#define s(width, name)
Definition: cbs_vp9.c:198
checkasm_check_vf_bwdif
void checkasm_check_vf_bwdif(void)
Definition: vf_bwdif.c:72
lfg.h
checkasm_check_sw_rgb
void checkasm_check_sw_rgb(void)
Definition: sw_rgb.c:182
checkasm_check_hevc_sao
void checkasm_check_hevc_sao(void)
Definition: hevc_sao.c:141
checkasm_check_hevc_pel
void checkasm_check_hevc_pel(void)
Definition: hevc_pel.c:607
CheckasmPerf::iterations
int iterations
Definition: checkasm.h:305
checkasm_check_takdsp
void checkasm_check_takdsp(void)
Definition: takdsp.c:145
checkasm_check_fmtconvert
void checkasm_check_fmtconvert(void)
Definition: fmtconvert.c:46
checkasm_set_signal_handler_state
void void checkasm_set_signal_handler_state(int enabled)
Definition: checkasm.c:970
macos_kperf.h
float_near_abs_eps_array
int float_near_abs_eps_array(const float *a, const float *b, float eps, unsigned len)
Definition: checkasm.c:402
av_printf_format
#define av_printf_format(fmtpos, attrpos)
Definition: attributes.h:161
float_near_abs_eps_array_ulp
int float_near_abs_eps_array_ulp(const float *a, const float *b, float eps, unsigned max_ulp, unsigned len)
Definition: checkasm.c:419
timer.h
checkasm_check_vorbisdsp
void checkasm_check_vorbisdsp(void)
Definition: vorbisdsp.c:76
checkasm_check_rv40dsp
void checkasm_check_rv40dsp(void)
Definition: rv40dsp.c:71
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
checkasm_check_vc1dsp
void checkasm_check_vc1dsp(void)
Definition: vc1dsp.c:476
checkasm_check_h264chroma
void checkasm_check_h264chroma(void)
Definition: h264chroma.c:81
AVLFG
Context structure for the Lagged Fibonacci PRNG.
Definition: lfg.h:33
checkasm_check_llauddsp
void checkasm_check_llauddsp(void)
Definition: llauddsp.c:108
checkasm_context_buf
checkasm_context checkasm_context_buf
Definition: checkasm.c:651
cpu.h
checkasm_check_llviddsp
void checkasm_check_llviddsp(void)
Definition: llviddsp.c:195
checkasm_check_h264pred
void checkasm_check_h264pred(void)
Definition: h264pred.c:233
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
checkasm_fail_func
void checkasm_fail_func(const char *msg,...) av_printf_format(1
checkasm_check_huffyuvdsp
void checkasm_check_huffyuvdsp(void)
Definition: huffyuvdsp.c:95
CheckasmPerf::cycles
uint64_t cycles
Definition: checkasm.h:304
float_near_abs_eps
int float_near_abs_eps(float a, float b, float eps)
Definition: checkasm.c:391
checkasm_check_fixed_dsp
void checkasm_check_fixed_dsp(void)
Definition: fixed_dsp.c:133
checkasm_check_colorspace
void checkasm_check_colorspace(void)
Definition: vf_colorspace.c:309
checkasm_check_utvideodsp
void checkasm_check_utvideodsp(void)
Definition: utvideodsp.c:90
emms.h
checkasm_check_flacdsp
void checkasm_check_flacdsp(void)
Definition: flacdsp.c:79
internal.h
checkasm_check_idctdsp
void checkasm_check_idctdsp(void)
Definition: idctdsp.c:95
checkasm_check_synth_filter
void checkasm_check_synth_filter(void)
Definition: synth_filter.c:47
checkasm_check_av_tx
void checkasm_check_av_tx(void)
Definition: av_tx.c:102
checkasm_check_blockdsp
void checkasm_check_blockdsp(void)
Definition: blockdsp.c:84
checkasm_check_lpc
void checkasm_check_lpc(void)
Definition: lpc.c:60
CONTEXT
#define CONTEXT
Definition: af_asetrate.c:32
len
int len
Definition: vorbis_enc_data.h:426
checkasm_check_g722dsp
void checkasm_check_g722dsp(void)
Definition: g722dsp.c:53
checkasm_check_svq1enc
void checkasm_check_svq1enc(void)
Definition: svq1enc.c:62
checkasm_check_vf_hflip
void checkasm_check_vf_hflip(void)
Definition: vf_hflip.c:72
checkasm_check_blend
void checkasm_check_blend(void)
Definition: vf_blend.c:89
checkasm_check_afir
void checkasm_check_afir(void)
Definition: af_afir.c:144
checkasm_check_h264qpel
void checkasm_check_h264qpel(void)
Definition: h264qpel.c:51
status
ov_status_e status
Definition: dnn_backend_openvino.c:121
checkasm_get_perf_context
void struct CheckasmPerf * checkasm_get_perf_context(void)
Definition: checkasm.c:989
checkasm_check_vf_sobel
void checkasm_check_vf_sobel(void)
Definition: vf_convolution.c:100
checkasm_check_v210enc
void checkasm_check_v210enc(void)
Definition: v210enc.c:84
checkasm_check_sbrdsp
void checkasm_check_sbrdsp(void)
Definition: sbrdsp.c:257
checkasm_check_hevc_deblock
void checkasm_check_hevc_deblock(void)
Definition: hevc_deblock.c:262
checkasm_handle_signal
int checkasm_handle_signal(int s)
Definition: checkasm.c:974
DECL_CHECKASM_CHECK_FUNC
#define DECL_CHECKASM_CHECK_FUNC(type)
Definition: checkasm.h:364
checkasm_check_jpeg2000dsp
void checkasm_check_jpeg2000dsp(void)
Definition: jpeg2000dsp.c:92
checkasm_check_hevc_add_res
void checkasm_check_hevc_add_res(void)
Definition: hevc_add_res.c:87
int32_t
int32_t
Definition: audioconvert.c:56
checkasm_context
sigjmp_buf checkasm_context
Definition: checkasm.h:71
checkasm_check_rv34dsp
void checkasm_check_rv34dsp(void)
Definition: rv34dsp.c:82
avstring.h
checkasm_check_audiodsp
void checkasm_check_audiodsp(void)
Definition: audiodsp.c:52
float_near_ulp
int float_near_ulp(float a, float b, unsigned max_ulp)
Definition: checkasm.c:361
checkasm_check_exrdsp
void checkasm_check_exrdsp(void)
Definition: exrdsp.c:77
float_near_ulp_array
int float_near_ulp_array(const float *a, const float *b, unsigned max_ulp, unsigned len)
Definition: checkasm.c:379
checkasm_check_opusdsp
void checkasm_check_opusdsp(void)
Definition: opusdsp.c:86