00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <stdint.h>
00023 #include <stdlib.h>
00024 #include <stdarg.h>
00025
00026 #include "libavutil/bswap.h"
00027
00028 #define storexmmregs(mem) \
00029 __asm__ volatile( \
00030 "movups %%xmm6 , 0x00(%0)\n\t" \
00031 "movups %%xmm7 , 0x10(%0)\n\t" \
00032 "movups %%xmm8 , 0x20(%0)\n\t" \
00033 "movups %%xmm9 , 0x30(%0)\n\t" \
00034 "movups %%xmm10, 0x40(%0)\n\t" \
00035 "movups %%xmm11, 0x50(%0)\n\t" \
00036 "movups %%xmm12, 0x60(%0)\n\t" \
00037 "movups %%xmm13, 0x70(%0)\n\t" \
00038 "movups %%xmm14, 0x80(%0)\n\t" \
00039 "movups %%xmm15, 0x90(%0)\n\t" \
00040 :: "r"(mem) : "memory")
00041
00042 #define testxmmclobbers(func, ctx, ...) \
00043 uint64_t xmm[2][10][2]; \
00044 int ret; \
00045 storexmmregs(xmm[0]); \
00046 ret = __real_ ## func(ctx, __VA_ARGS__); \
00047 storexmmregs(xmm[1]); \
00048 if (memcmp(xmm[0], xmm[1], sizeof(xmm[0]))) { \
00049 int i; \
00050 av_log(ctx, AV_LOG_ERROR, \
00051 "XMM REGS CLOBBERED IN %s!\n", #func); \
00052 for (i = 0; i < 10; i ++) \
00053 if (xmm[0][i][0] != xmm[1][i][0] || \
00054 xmm[0][i][1] != xmm[1][i][1]) { \
00055 av_log(ctx, AV_LOG_ERROR, \
00056 "xmm%-2d = %016"PRIx64"%016"PRIx64"\n", \
00057 6 + i, av_bswap64(xmm[0][i][0]), \
00058 av_bswap64(xmm[0][i][1])); \
00059 av_log(ctx, AV_LOG_ERROR, \
00060 " -> %016"PRIx64"%016"PRIx64"\n", \
00061 av_bswap64(xmm[1][i][0]), \
00062 av_bswap64(xmm[1][i][1])); \
00063 } \
00064 abort(); \
00065 } \
00066 return ret
00067
00068 #define wrap(func) \
00069 int __real_ ## func; \
00070 int __wrap_ ## func; \
00071 int __wrap_ ## func