Spaces:
Runtime error
Runtime error
/* | |
* Assembly testing and benchmarking tool | |
* Copyright (c) 2015 Henrik Gramner | |
* Copyright (c) 2008 Loren Merritt | |
* | |
* This file is part of FFmpeg. | |
* | |
* FFmpeg is free software; you can redistribute it and/or modify | |
* it under the terms of the GNU General Public License as published by | |
* the Free Software Foundation; either version 2 of the License, or | |
* (at your option) any later version. | |
* | |
* FFmpeg is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
* GNU General Public License for more details. | |
* | |
* You should have received a copy of the GNU General Public License along | |
* with FFmpeg; if not, write to the Free Software Foundation, Inc., | |
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
*/ | |
void checkasm_check_aacpsdsp(void); | |
void checkasm_check_afir(void); | |
void checkasm_check_alacdsp(void); | |
void checkasm_check_audiodsp(void); | |
void checkasm_check_av_tx(void); | |
void checkasm_check_blend(void); | |
void checkasm_check_blockdsp(void); | |
void checkasm_check_bswapdsp(void); | |
void checkasm_check_colorspace(void); | |
void checkasm_check_exrdsp(void); | |
void checkasm_check_fixed_dsp(void); | |
void checkasm_check_flacdsp(void); | |
void checkasm_check_float_dsp(void); | |
void checkasm_check_fmtconvert(void); | |
void checkasm_check_g722dsp(void); | |
void checkasm_check_h264dsp(void); | |
void checkasm_check_h264pred(void); | |
void checkasm_check_h264qpel(void); | |
void checkasm_check_hevc_add_res(void); | |
void checkasm_check_hevc_idct(void); | |
void checkasm_check_hevc_pel(void); | |
void checkasm_check_hevc_sao(void); | |
void checkasm_check_huffyuvdsp(void); | |
void checkasm_check_idctdsp(void); | |
void checkasm_check_jpeg2000dsp(void); | |
void checkasm_check_llviddsp(void); | |
void checkasm_check_llviddspenc(void); | |
void checkasm_check_lpc(void); | |
void checkasm_check_motion(void); | |
void checkasm_check_nlmeans(void); | |
void checkasm_check_opusdsp(void); | |
void checkasm_check_pixblockdsp(void); | |
void checkasm_check_sbrdsp(void); | |
void checkasm_check_synth_filter(void); | |
void checkasm_check_sw_gbrp(void); | |
void checkasm_check_sw_rgb(void); | |
void checkasm_check_sw_scale(void); | |
void checkasm_check_utvideodsp(void); | |
void checkasm_check_v210dec(void); | |
void checkasm_check_v210enc(void); | |
void checkasm_check_vc1dsp(void); | |
void checkasm_check_vf_eq(void); | |
void checkasm_check_vf_gblur(void); | |
void checkasm_check_vf_hflip(void); | |
void checkasm_check_vf_threshold(void); | |
void checkasm_check_vf_sobel(void); | |
void checkasm_check_vp8dsp(void); | |
void checkasm_check_vp9dsp(void); | |
void checkasm_check_videodsp(void); | |
void checkasm_check_vorbisdsp(void); | |
struct CheckasmPerf; | |
void *checkasm_check_func(void *func, const char *name, ...) av_printf_format(2, 3); | |
int checkasm_bench_func(void); | |
void checkasm_fail_func(const char *msg, ...) av_printf_format(1, 2); | |
struct CheckasmPerf *checkasm_get_perf_context(void); | |
void checkasm_report(const char *name, ...) av_printf_format(1, 2); | |
/* float compare utilities */ | |
int float_near_ulp(float a, float b, unsigned max_ulp); | |
int float_near_abs_eps(float a, float b, float eps); | |
int float_near_abs_eps_ulp(float a, float b, float eps, unsigned max_ulp); | |
int float_near_ulp_array(const float *a, const float *b, unsigned max_ulp, | |
unsigned len); | |
int float_near_abs_eps_array(const float *a, const float *b, float eps, | |
unsigned len); | |
int float_near_abs_eps_array_ulp(const float *a, const float *b, float eps, | |
unsigned max_ulp, unsigned len); | |
int double_near_abs_eps(double a, double b, double eps); | |
int double_near_abs_eps_array(const double *a, const double *b, double eps, | |
unsigned len); | |
extern AVLFG checkasm_lfg; | |
static av_unused void *func_ref, *func_new; | |
/* Decide whether or not the specified function needs to be tested */ | |
/* Declare the function prototype. The first argument is the return value, the remaining | |
* arguments are the function parameters. Naming parameters is optional. */ | |
/* Indicate that the current test has failed */ | |
/* Print the test outcome */ | |
/* Call the reference function */ | |
/* Verifies that clobbered callee-saved registers are properly saved and restored | |
* and that either no MMX registers are touched or emms is issued */ | |
void checkasm_checked_call(void *func, ...); | |
/* Verifies that clobbered callee-saved registers are properly saved and restored | |
* and issues emms for asm functions which are not required to do so */ | |
void checkasm_checked_call_emms(void *func, ...); | |
/* Verifies that clobbered callee-saved registers are properly saved and restored | |
* but doesn't issue emms. Meant for dsp functions returning float or double */ | |
void checkasm_checked_call_float(void *func, ...); | |
/* Evil hack: detect incorrect assumptions that 32-bit ints are zero-extended to 64-bit. | |
* This is done by clobbering the stack with junk around the stack pointer and calling the | |
* assembly function through checked_call() with added dummy arguments which forces all | |
* real arguments to be passed on the stack and not in registers. For 32-bit arguments the | |
* upper half of the 64-bit register locations on the stack will now contain junk which will | |
* cause misbehaving functions to either produce incorrect output or segfault. Note that | |
* even though this works extremely well in practice, it's technically not guaranteed | |
* and false negatives is theoretically possible, but there can never be any false positives. | |
*/ | |
void checkasm_stack_clobber(uint64_t clobber, ...); | |
/* Use a dummy argument, to offset the real parameters by 2, not only 1. | |
* This makes sure that potential 8-byte-alignment of parameters is kept the same | |
* even when the extra parameters have been removed. */ | |
void checkasm_checked_call_vfp(void *func, int dummy, ...); | |
void checkasm_checked_call_novfp(void *func, int dummy, ...); | |
extern void (*checkasm_checked_call)(void *func, int dummy, ...); | |
void checkasm_stack_clobber(uint64_t clobber, ...); | |
void checkasm_checked_call(void *func, ...); | |
void checkasm_set_function(void *); | |
void *checkasm_get_wrapper(void); | |
/* Call the function */ | |
typedef struct CheckasmPerf { | |
int sysfd; | |
uint64_t cycles; | |
int iterations; | |
} CheckasmPerf; | |
/* Benchmark the function */ | |
DECL_CHECKASM_CHECK_FUNC(uint8_t); | |
DECL_CHECKASM_CHECK_FUNC(uint16_t); | |
DECL_CHECKASM_CHECK_FUNC(uint32_t); | |
DECL_CHECKASM_CHECK_FUNC(int16_t); | |
DECL_CHECKASM_CHECK_FUNC(int32_t); | |