Go to the documentation of this file.
23 #ifndef TESTS_CHECKASM_CHECKASM_H
24 #define TESTS_CHECKASM_CHECKASM_H
31 #include <sys/ioctl.h>
32 #include <asm/unistd.h>
33 #include <linux/perf_event.h>
34 #elif CONFIG_MACOS_KPERF
47 #if defined(__i386__) || defined(_M_IX86)
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)
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))
65 #define checkasm_context void*
66 #define checkasm_save_context() 0
67 #define checkasm_load_context() do {} while (0)
69 #elif defined(_WASI_EMULATED_SIGNAL)
70 #define checkasm_context void*
71 #define checkasm_save_context() 0
72 #define checkasm_load_context() do {} while (0)
76 #define checkasm_save_context() checkasm_handle_signal(sigsetjmp(checkasm_context_buf, 1))
77 #define checkasm_load_context(s) siglongjmp(checkasm_context_buf, s)
202 unsigned max_ulp,
unsigned len);
208 #define rnd() av_lfg_get(&checkasm_lfg)
215 #define check_func(func, ...) (checkasm_save_context(), func_ref = checkasm_check_func((func_new = func), __VA_ARGS__))
216 #define check_key(key, ...) (checkasm_save_context(), checkasm_check_func(key, __VA_ARGS__))
220 #define declare_func(ret, ...) declare_new(ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
221 #define declare_func_float(ret, ...) declare_new_float(ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
222 #define declare_func_emms(cpu_flags, ret, ...) declare_new_emms(cpu_flags, ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__)
225 #define fail() checkasm_fail_func("%s:%d", av_basename(__FILE__), __LINE__)
228 #define report checkasm_report
231 #define call_ref(...)\
232 checkasm_call((func_type *)func_ref, __VA_ARGS__)
234 #define checkasm_call(func, ...) \
235 (checkasm_set_signal_handler_state(1),\
236 (func)(__VA_ARGS__));\
237 checkasm_set_signal_handler_state(0)
239 #define call_new(...) checkasm_call_checked(((func_type *)func_new), __VA_ARGS__)
241 #if ARCH_X86 && HAVE_X86ASM
244 void checkasm_checked_call(
void *
func, ...);
247 void checkasm_checked_call_emms(
void *
func, ...);
250 void checkasm_checked_call_float(
void *
func, ...);
262 void checkasm_stack_clobber(uint64_t clobber, ...);
263 #define declare_new(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__)\
264 = (void *)checkasm_checked_call;
265 #define declare_new_float(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__)\
266 = (void *)checkasm_checked_call_float;
267 #define declare_new_emms(cpu_flags, ret, ...) \
268 ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__) = \
269 ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \
270 (void *)checkasm_checked_call;
271 #define CLOB (UINT64_C(0xdeadbeefdeadbeef))
272 #define checkasm_call_checked(func, ...) \
273 (checkasm_set_signal_handler_state(1),\
274 checkasm_stack_clobber(CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,\
275 CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB),\
276 checked_call((func), 0, 0, 0, 0, 0, __VA_ARGS__));\
277 checkasm_set_signal_handler_state(0)
279 #define declare_new(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call;
280 #define declare_new_float(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call_float;
281 #define declare_new_emms(cpu_flags, ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = \
282 ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \
283 (void *)checkasm_checked_call;
284 #define checkasm_call_checked(func, ...)\
285 (checkasm_set_signal_handler_state(1),\
286 checked_call((func), __VA_ARGS__));\
287 checkasm_set_signal_handler_state(0)
289 #elif ARCH_ARM && HAVE_ARMV5TE_EXTERNAL
293 void checkasm_checked_call_vfp(
void *
func,
int dummy, ...);
294 void checkasm_checked_call_novfp(
void *
func,
int dummy, ...);
295 extern void (*checkasm_checked_call)(
void *
func,
int dummy, ...);
296 #define declare_new(ret, ...) ret (*checked_call)(void *, int dummy, __VA_ARGS__, \
297 int, int, int, int, int, int, int, int, \
298 int, int, int, int, int, int, int) = (void *)checkasm_checked_call;
299 #define checkasm_call_checked(func, ...) \
300 (checkasm_set_signal_handler_state(1),\
301 checked_call((func), 0, __VA_ARGS__, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0));\
302 checkasm_set_signal_handler_state(0)
303 #elif ARCH_AARCH64 && !defined(__APPLE__)
304 void checkasm_stack_clobber(uint64_t clobber, ...);
305 void checkasm_checked_call(
void *
func, ...);
306 #define declare_new(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, int, int, __VA_ARGS__,\
307 int, int, int, int, int, int, int, int,\
308 int, int, int, int, int, int, int)\
309 = (void *)checkasm_checked_call;
310 #define CLOB (UINT64_C(0xdeadbeefdeadbeef))
311 #define checkasm_call_checked(func, ...) (checkasm_set_signal_handler_state(1),\
312 checkasm_stack_clobber(CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,\
313 CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB),\
314 checked_call((func), 0, 0, 0, 0, 0, 0, 0, __VA_ARGS__,\
315 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0));\
316 checkasm_set_signal_handler_state(0)
318 void checkasm_set_function(
void *);
319 void *checkasm_get_wrapper(
void);
322 #define declare_new(ret, ...) \
323 ret (*checked_call)(__VA_ARGS__) = checkasm_get_wrapper();
324 #define checkasm_call_checked(func, ...) \
325 (checkasm_set_signal_handler_state(1),\
326 checkasm_set_function(func), checked_call(__VA_ARGS__));\
327 checkasm_set_signal_handler_state(0)
329 #define declare_new(ret, ...)
330 #define checkasm_call_checked(func, ...)\
331 (checkasm_set_signal_handler_state(1),\
332 (func)(__VA_ARGS__));\
333 checkasm_set_signal_handler_state(0)
336 #define declare_new(ret, ...)
337 #define declare_new_float(ret, ...)
338 #define declare_new_emms(cpu_flags, ret, ...)
340 #define checkasm_call_checked(func, ...)\
341 (checkasm_set_signal_handler_state(1),\
342 (func)(__VA_ARGS__));\
343 checkasm_set_signal_handler_state(0)
346 #ifndef declare_new_emms
347 #define declare_new_emms(cpu_flags, ret, ...) declare_new(ret, __VA_ARGS__)
349 #ifndef declare_new_float
350 #define declare_new_float(ret, ...) declare_new(ret, __VA_ARGS__)
359 #if defined(AV_READ_TIME) || CONFIG_LINUX_PERF || CONFIG_MACOS_KPERF
361 #if CONFIG_LINUX_PERF
362 #define PERF_START(t) do { \
363 ioctl(sysfd, PERF_EVENT_IOC_RESET, 0); \
364 ioctl(sysfd, PERF_EVENT_IOC_ENABLE, 0); \
366 #define PERF_STOP(t) do { \
368 ioctl(sysfd, PERF_EVENT_IOC_DISABLE, 0); \
369 ret = read(sysfd, &t, sizeof(t)); \
372 #elif CONFIG_MACOS_KPERF
373 #define PERF_START(t) t = ff_kperf_cycles()
374 #define PERF_STOP(t) t = ff_kperf_cycles() - t
376 #define PERF_START(t) t = AV_READ_TIME()
377 #define PERF_STOP(t) t = AV_READ_TIME() - t
382 tfunc(__VA_ARGS__); \
383 tfunc(__VA_ARGS__); \
384 tfunc(__VA_ARGS__); \
385 tfunc(__VA_ARGS__); \
390 CALL4(__VA_ARGS__); \
391 CALL4(__VA_ARGS__); \
392 CALL4(__VA_ARGS__); \
393 CALL4(__VA_ARGS__); \
397 #define bench(func, ...)\
399 if (checkasm_bench_func()) {\
400 struct CheckasmPerf *perf = checkasm_get_perf_context();\
401 av_unused const int sysfd = perf->sysfd;\
402 func_type *tfunc = func;\
404 uint64_t ti, tcount = 0;\
406 const uint64_t truns = FFMAX(bench_runs >> 3, 1);\
407 checkasm_set_signal_handler_state(1);\
408 for (ti = 0; ti < truns; ti++) {\
410 CALL16(__VA_ARGS__);\
411 CALL16(__VA_ARGS__);\
413 if (t*tcount <= tsum*4 && ti > 0) {\
419 perf->cycles += tsum;\
420 perf->iterations += tcount;\
421 checkasm_set_signal_handler_state(0);\
425 #define bench(func, ...) while(0)
426 #define PERF_START(t) while(0)
427 #define PERF_STOP(t) while(0)
430 #define bench_new(...) bench(func_new, __VA_ARGS__)
432 #define BUF_RECT(type, name, w, h) \
433 LOCAL_ALIGNED_32(type, name##_buf, [((h)+32)*(FFALIGN(w,64)+64) + 64]); \
434 av_unused ptrdiff_t name##_stride = sizeof(type)*(FFALIGN(w,64)+64); \
435 av_unused int name##_buf_h = (h)+32; \
436 type *name = name##_buf + (FFALIGN(w,64)+64)*16 + 64
438 #define PIXEL_RECT(name, w, h) \
439 LOCAL_ALIGNED_32(uint8_t, name##_buf, [sizeof(uint16_t) * (((h)+32)*(FFALIGN(w,64)+64) + 64)],); \
440 av_unused ptrdiff_t name##_stride = sizeof(uint16_t) * (FFALIGN(w,64)+64); \
441 av_unused int name##_buf_h = (h)+32; \
442 uint8_t *name = name##_buf + (FFALIGN(w,64)+64)*16 + 64
444 #define CLEAR_BUF_RECT(name) \
445 memset(name##_buf, 0x99, name##_stride * name##_buf_h + 64)
446 #define CLEAR_PIXEL_RECT(name) \
449 #define DECL_CHECKASM_CHECK_FUNC(type) \
450 int checkasm_check_##type(const char *file, int line, \
451 const type *buf1, ptrdiff_t stride1, \
452 const type *buf2, ptrdiff_t stride2, \
453 int w, int h, const char *name, \
454 int align_w, int align_h, \
464 const float *buf1, ptrdiff_t stride1,
465 const float *buf2, ptrdiff_t stride2,
466 int w,
int h,
const char *
name,
467 unsigned max_ulp,
int align_w,
int align_h,
470 #define PASTE(a,b) a ## b
471 #define CONCAT(a,b) PASTE(a,b)
473 #define checkasm_check2(prefix, ...) CONCAT(checkasm_check_, prefix)(__FILE__, __LINE__, __VA_ARGS__)
474 #define checkasm_check(prefix, ...) checkasm_check2(prefix, __VA_ARGS__, 0, 0, 0)
477 #define checkasm_check_padded(...) \
478 checkasm_check2(__VA_ARGS__, 1, 1, 8)
483 #define checkasm_check_padded_align(...) \
484 checkasm_check2(__VA_ARGS__, 8)
489 #define checkasm_check_pixel2(buf1, stride1, buf2, stride2, ...) \
491 checkasm_check2(uint16_t, (const uint16_t*)buf1, stride1, \
492 (const uint16_t*)buf2, stride2, \
494 checkasm_check2(uint8_t, (const uint8_t*) buf1, stride1, \
495 (const uint8_t*) buf2, stride2, \
497 #define checkasm_check_pixel(...) \
498 checkasm_check_pixel2(__VA_ARGS__, 0, 0, 0)
499 #define checkasm_check_pixel_padded(...) \
500 checkasm_check_pixel2(__VA_ARGS__, 1, 1, 8)
501 #define checkasm_check_pixel_padded_align(...) \
502 checkasm_check_pixel2(__VA_ARGS__, 8)
509 #define checkasm_check_dctcoef(buf1, stride1, buf2, stride2, ...) \
511 checkasm_check(int32_t, buf1 ## _32, stride1, \
512 buf2 ## _32, stride2, \
514 checkasm_check(int16_t, buf1 ## _16, stride1, \
515 buf2 ## _16, stride2, \
void checkasm_check_nlmeans(void)
int(* func)(AVBPrint *dst, const char *in, const char *arg)
void checkasm_check_sw_gbrp(void)
void checkasm_check_vp8dsp(void)
void checkasm_check_idet(void)
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
void checkasm_check_fdctdsp(void)
void checkasm_check_sw_xyz2rgb(void)
void checkasm_check_videodsp(void)
void checkasm_check_vf_eq(void)
void checkasm_check_dcadsp(void)
void checkasm_check_v210dec(void)
void checkasm_check_sw_yuv2yuv(void)
void checkasm_check_png(void)
void checkasm_check_aacencdsp(void)
void checkasm_check_hevc_idct(void)
void checkasm_check_sw_scale(void)
void int checkasm_bench_func(void)
static av_unused void * func_ref
void checkasm_check_aes(void)
void checkasm_check_aacpsdsp(void)
void checkasm_check_vvc_sao(void)
void * checkasm_check_func(void *func, const char *name,...) av_printf_format(2
void checkasm_check_alacdsp(void)
int double_near_abs_eps(double a, double b, double eps)
void checkasm_check_h264dsp(void)
void checkasm_check_vp9_ipred(void)
void checkasm_check_ac3dsp(void)
void checkasm_check_motion(void)
static av_unused void * func_new
void checkasm_check_h263dsp(void)
int float_near_abs_eps_ulp(float a, float b, float eps, unsigned max_ulp)
void checkasm_check_vp9dsp(void)
void checkasm_check_vf_threshold(void)
void checkasm_check_vf_gblur(void)
void checkasm_check_vvc_mc(void)
void checkasm_check_sbcdsp(void)
void checkasm_check_sw_yuv2rgb(void)
void checkasm_report(const char *name,...) av_printf_format(1
void checkasm_check_float_dsp(void)
int double_near_abs_eps_array(const double *a, const double *b, double eps, unsigned len)
int struct CheckasmPerf * checkasm_get_perf_context(void)
void checkasm_check_hevc_dequant(void)
void checkasm_check_pixblockdsp(void)
void checkasm_check_bswapdsp(void)
void checkasm_check_vf_bwdif(void)
void checkasm_check_sw_rgb(void)
void checkasm_check_hevc_sao(void)
void checkasm_check_hevc_pel(void)
int checkasm_fail_func(const char *msg,...) av_printf_format(1
void checkasm_check_mpeg4videodsp(void)
void checkasm_check_takdsp(void)
void checkasm_check_hevc_pred(void)
void checkasm_check_sw_ops(void)
void checkasm_check_fmtconvert(void)
void void checkasm_set_signal_handler_state(int enabled)
int float_near_abs_eps_array(const float *a, const float *b, float eps, unsigned len)
#define av_printf_format(fmtpos, attrpos)
int float_near_abs_eps_array_ulp(const float *a, const float *b, float eps, unsigned max_ulp, unsigned len)
void checkasm_check_vorbisdsp(void)
void checkasm_check_hpeldsp(void)
void checkasm_check_rv40dsp(void)
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
void checkasm_check_vc1dsp(void)
void checkasm_check_h264chroma(void)
Context structure for the Lagged Fibonacci PRNG.
void checkasm_check_llauddsp(void)
checkasm_context checkasm_context_buf
void checkasm_check_vp9_loopfilter(void)
void checkasm_check_llviddsp(void)
void checkasm_check_vp9_mc(void)
void checkasm_check_vp3dsp(void)
void checkasm_check_vf_pp7(void)
void checkasm_check_diracdsp(void)
void checkasm_check_h264pred(void)
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
void checkasm_check_huffyuvdsp(void)
int float_near_abs_eps(float a, float b, float eps)
void checkasm_check_fixed_dsp(void)
void checkasm_check_colorspace(void)
void checkasm_check_utvideodsp(void)
void checkasm_check_huffyuvencdsp(void)
void checkasm_check_sw_range_convert(void)
void checkasm_check_mpegvideoencdsp(void)
void checkasm_check_flacdsp(void)
void checkasm_check_idctdsp(void)
void checkasm_check_synth_filter(void)
void checkasm_check_av_tx(void)
void checkasm_check_blockdsp(void)
void checkasm_check_lpc(void)
void checkasm_check_g722dsp(void)
void checkasm_check_svq1enc(void)
void checkasm_check_vf_hflip(void)
void checkasm_check_lls(void)
void checkasm_check_scene_sad(void)
void checkasm_check_blend(void)
void checkasm_check_afir(void)
void checkasm_check_vf_fspp(void)
void checkasm_check_h264qpel(void)
void checkasm_check_colordetect(void)
void checkasm_check_mpegvideo_unquantize(void)
void checkasm_check_vf_sobel(void)
void checkasm_check_crc(void)
void checkasm_check_vp6dsp(void)
void checkasm_check_qpeldsp(void)
void checkasm_check_vp9_itxfm(void)
void checkasm_check_blackdetect(void)
void checkasm_check_v210enc(void)
void checkasm_check_sbrdsp(void)
void checkasm_check_pixelutils(void)
void checkasm_check_hevc_deblock(void)
void checkasm_check_snowdsp(void)
int checkasm_handle_signal(int s)
#define DECL_CHECKASM_CHECK_FUNC(type)
void checkasm_check_apv_dsp(void)
void checkasm_check_jpeg2000dsp(void)
int checkasm_check_float_ulp(const char *file, int line, const float *buf1, ptrdiff_t stride1, const float *buf2, ptrdiff_t stride2, int w, int h, const char *name, unsigned max_ulp, int align_w, int align_h, int padding)
void checkasm_check_hevc_add_res(void)
sigjmp_buf checkasm_context
void checkasm_check_rv34dsp(void)
void checkasm_check_cavsdsp(void)
void checkasm_check_audiodsp(void)
int float_near_ulp(float a, float b, unsigned max_ulp)
void checkasm_check_vvc_alf(void)
void checkasm_check_exrdsp(void)
int float_near_ulp_array(const float *a, const float *b, unsigned max_ulp, unsigned len)
void checkasm_check_llvidencdsp(void)
void checkasm_check_opusdsp(void)