w64xmmtest.h 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 Libav.
  6. *
  7. * Libav 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. * Libav 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 Libav; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include <stdint.h>
  22. #include <stdlib.h>
  23. #include <stdarg.h>
  24. #include "libavutil/bswap.h"
  25. #define storexmmregs(mem) \
  26. __asm__ volatile( \
  27. "movups %%xmm6 , 0x00(%0)\n\t" \
  28. "movups %%xmm7 , 0x10(%0)\n\t" \
  29. "movups %%xmm8 , 0x20(%0)\n\t" \
  30. "movups %%xmm9 , 0x30(%0)\n\t" \
  31. "movups %%xmm10, 0x40(%0)\n\t" \
  32. "movups %%xmm11, 0x50(%0)\n\t" \
  33. "movups %%xmm12, 0x60(%0)\n\t" \
  34. "movups %%xmm13, 0x70(%0)\n\t" \
  35. "movups %%xmm14, 0x80(%0)\n\t" \
  36. "movups %%xmm15, 0x90(%0)\n\t" \
  37. :: "r"(mem) : "memory")
  38. #define testxmmclobbers(func, ctx, ...) \
  39. uint64_t xmm[2][10][2]; \
  40. int ret; \
  41. storexmmregs(xmm[0]); \
  42. ret = __real_ ## func(ctx, __VA_ARGS__); \
  43. storexmmregs(xmm[1]); \
  44. if (memcmp(xmm[0], xmm[1], sizeof(xmm[0]))) { \
  45. int i; \
  46. av_log(ctx, AV_LOG_ERROR, \
  47. "XMM REGS CLOBBERED IN %s!\n", #func); \
  48. for (i = 0; i < 10; i ++) \
  49. if (xmm[0][i][0] != xmm[1][i][0] || \
  50. xmm[0][i][1] != xmm[1][i][1]) { \
  51. av_log(ctx, AV_LOG_ERROR, \
  52. "xmm%-2d = %016"PRIx64"%016"PRIx64"\n", \
  53. 6 + i, av_bswap64(xmm[0][i][0]), \
  54. av_bswap64(xmm[0][i][1])); \
  55. av_log(ctx, AV_LOG_ERROR, \
  56. " -> %016"PRIx64"%016"PRIx64"\n", \
  57. av_bswap64(xmm[1][i][0]), \
  58. av_bswap64(xmm[1][i][1])); \
  59. } \
  60. abort(); \
  61. } \
  62. return ret
  63. #define wrap(func) \
  64. int __real_ ## func; \
  65. int __wrap_ ## func; \
  66. int __wrap_ ## func