w64xmmtest.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * check XMM registers for clobbers on Win64
  3. * Copyright (c) 2008 Ramiro Polla <ramiro.polla@gmail.com>
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #ifndef AVUTIL_X86_W64XMMTEST_H
  22. #define AVUTIL_X86_W64XMMTEST_H
  23. #include <inttypes.h>
  24. #include <stdint.h>
  25. #include <stdlib.h>
  26. #include <stdarg.h>
  27. #include <string.h>
  28. #include "libavutil/bswap.h"
  29. #define storexmmregs(mem) \
  30. __asm__ volatile( \
  31. "movups %%xmm6 , 0x00(%0)\n\t" \
  32. "movups %%xmm7 , 0x10(%0)\n\t" \
  33. "movups %%xmm8 , 0x20(%0)\n\t" \
  34. "movups %%xmm9 , 0x30(%0)\n\t" \
  35. "movups %%xmm10, 0x40(%0)\n\t" \
  36. "movups %%xmm11, 0x50(%0)\n\t" \
  37. "movups %%xmm12, 0x60(%0)\n\t" \
  38. "movups %%xmm13, 0x70(%0)\n\t" \
  39. "movups %%xmm14, 0x80(%0)\n\t" \
  40. "movups %%xmm15, 0x90(%0)\n\t" \
  41. :: "r"(mem) : "memory")
  42. #define testxmmclobbers(func, ctx, ...) \
  43. uint64_t xmm[2][10][2]; \
  44. int ret; \
  45. storexmmregs(xmm[0]); \
  46. ret = __real_ ## func(ctx, __VA_ARGS__); \
  47. storexmmregs(xmm[1]); \
  48. if (memcmp(xmm[0], xmm[1], sizeof(xmm[0]))) { \
  49. int i; \
  50. av_log(ctx, AV_LOG_ERROR, \
  51. "XMM REGS CLOBBERED IN %s!\n", #func); \
  52. for (i = 0; i < 10; i ++) \
  53. if (xmm[0][i][0] != xmm[1][i][0] || \
  54. xmm[0][i][1] != xmm[1][i][1]) { \
  55. av_log(ctx, AV_LOG_ERROR, \
  56. "xmm%-2d = %016"PRIx64"%016"PRIx64"\n", \
  57. 6 + i, av_bswap64(xmm[0][i][0]), \
  58. av_bswap64(xmm[0][i][1])); \
  59. av_log(ctx, AV_LOG_ERROR, \
  60. " -> %016"PRIx64"%016"PRIx64"\n", \
  61. av_bswap64(xmm[1][i][0]), \
  62. av_bswap64(xmm[1][i][1])); \
  63. } \
  64. abort(); \
  65. } \
  66. return ret
  67. #define wrap(func) \
  68. int __real_ ## func; \
  69. int __wrap_ ## func; \
  70. int __wrap_ ## func
  71. #endif /* AVUTIL_X86_W64XMMTEST_H */