X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=tests%2Fcheckasm%2Fcheckasm.h;h=bd1715633462f0bf7f26d492f6c23a50b1cab4ef;hb=25955c927fcf88d1deea16f2d4ff86eb5a78a774;hp=73b7e429a451bdfdde7846c96d612552cebd26bb;hpb=00e91d06767a5a28524cbfc271141970f744db23;p=ffmpeg diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h index 73b7e429a45..bd171563346 100644 --- a/tests/checkasm/checkasm.h +++ b/tests/checkasm/checkasm.h @@ -26,16 +26,20 @@ #include #include "config.h" #include "libavutil/avstring.h" +#include "libavutil/cpu.h" #include "libavutil/lfg.h" #include "libavutil/timer.h" void checkasm_check_alacdsp(void); void checkasm_check_bswapdsp(void); +void checkasm_check_dcadsp(void); void checkasm_check_flacdsp(void); +void checkasm_check_fmtconvert(void); void checkasm_check_h264pred(void); void checkasm_check_h264qpel(void); void checkasm_check_jpeg2000dsp(void); void checkasm_check_pixblockdsp(void); +void checkasm_check_synth_filter(void); void checkasm_check_v210enc(void); void checkasm_check_vp9dsp(void); @@ -45,6 +49,17 @@ void checkasm_fail_func(const char *msg, ...) av_printf_format(1, 2); void checkasm_update_bench(int iterations, uint64_t cycles); 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); + extern AVLFG checkasm_lfg; #define rnd() av_lfg_get(&checkasm_lfg) @@ -58,6 +73,7 @@ static av_unused void *func_ref, *func_new; /* Declare the function prototype. The first argument is the return value, the remaining * arguments are the function parameters. Naming parameters is optional. */ #define declare_func(ret, ...) declare_new(ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__) +#define declare_func_emms(cpu_flags, ret, ...) declare_new_emms(cpu_flags, ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__) /* Indicate that the current test has failed */ #define fail() checkasm_fail_func("%s:%d", av_basename(__FILE__), __LINE__) @@ -69,8 +85,12 @@ static av_unused void *func_ref, *func_new; #define call_ref(...) ((func_type *)func_ref)(__VA_ARGS__) #if ARCH_X86 && HAVE_YASM -/* Verifies that clobbered callee-saved registers are properly saved and restored */ +/* 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, ...); #if ARCH_X86_64 /* Evil hack: detect incorrect assumptions that 32-bit ints are zero-extended to 64-bit. @@ -85,20 +105,45 @@ void checkasm_checked_call(void *func, ...); void checkasm_stack_clobber(uint64_t clobber, ...); #define declare_new(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__)\ = (void *)checkasm_checked_call; +#define declare_new_emms(cpu_flags, ret, ...) \ + ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__) = \ + ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \ + (void *)checkasm_checked_call; #define CLOB (UINT64_C(0xdeadbeefdeadbeef)) #define call_new(...) (checkasm_stack_clobber(CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,\ CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB),\ checked_call(func_new, 0, 0, 0, 0, 0, __VA_ARGS__)) #elif ARCH_X86_32 #define declare_new(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call; +#define declare_new_emms(cpu_flags, ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = \ + ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \ + (void *)checkasm_checked_call; #define call_new(...) checked_call(func_new, __VA_ARGS__) #endif +#elif ARCH_ARM && HAVE_ARMV5TE_EXTERNAL +/* 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, ...); +#define declare_new(ret, ...) ret (*checked_call)(void *, int dummy, __VA_ARGS__) = (void *)checkasm_checked_call; +#define call_new(...) checked_call(func_new, 0, __VA_ARGS__) +#elif ARCH_AARCH64 && !defined(__APPLE__) +void checkasm_checked_call(void *func, ...); +#define declare_new(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call; +#define call_new(...) checked_call(func_new, __VA_ARGS__) #else #define declare_new(ret, ...) +#define declare_new_emms(cpu_flags, ret, ...) /* Call the function */ #define call_new(...) ((func_type *)func_new)(__VA_ARGS__) #endif +#ifndef declare_new_emms +#define declare_new_emms(cpu_flags, ret, ...) declare_new(ret, __VA_ARGS__) +#endif + /* Benchmark the function */ #ifdef AV_READ_TIME #define bench_new(...)\