mmxfrag.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #if !defined(_x86_mmxfrag_H)
  2. # define _x86_mmxfrag_H (1)
  3. # include <stddef.h>
  4. # include "x86int.h"
  5. #if defined(OC_X86_ASM)
  6. /*Copies an 8x8 block of pixels from _src to _dst, assuming _ystride bytes
  7. between rows.*/
  8. #define OC_FRAG_COPY_MMX(_dst,_src,_ystride) \
  9. do{ \
  10. const unsigned char *src; \
  11. unsigned char *dst; \
  12. ptrdiff_t ystride3; \
  13. src=(_src); \
  14. dst=(_dst); \
  15. __asm__ __volatile__( \
  16. /*src+0*ystride*/ \
  17. "movq (%[src]),%%mm0\n\t" \
  18. /*src+1*ystride*/ \
  19. "movq (%[src],%[ystride]),%%mm1\n\t" \
  20. /*ystride3=ystride*3*/ \
  21. "lea (%[ystride],%[ystride],2),%[ystride3]\n\t" \
  22. /*src+2*ystride*/ \
  23. "movq (%[src],%[ystride],2),%%mm2\n\t" \
  24. /*src+3*ystride*/ \
  25. "movq (%[src],%[ystride3]),%%mm3\n\t" \
  26. /*dst+0*ystride*/ \
  27. "movq %%mm0,(%[dst])\n\t" \
  28. /*dst+1*ystride*/ \
  29. "movq %%mm1,(%[dst],%[ystride])\n\t" \
  30. /*Pointer to next 4.*/ \
  31. "lea (%[src],%[ystride],4),%[src]\n\t" \
  32. /*dst+2*ystride*/ \
  33. "movq %%mm2,(%[dst],%[ystride],2)\n\t" \
  34. /*dst+3*ystride*/ \
  35. "movq %%mm3,(%[dst],%[ystride3])\n\t" \
  36. /*Pointer to next 4.*/ \
  37. "lea (%[dst],%[ystride],4),%[dst]\n\t" \
  38. /*src+0*ystride*/ \
  39. "movq (%[src]),%%mm0\n\t" \
  40. /*src+1*ystride*/ \
  41. "movq (%[src],%[ystride]),%%mm1\n\t" \
  42. /*src+2*ystride*/ \
  43. "movq (%[src],%[ystride],2),%%mm2\n\t" \
  44. /*src+3*ystride*/ \
  45. "movq (%[src],%[ystride3]),%%mm3\n\t" \
  46. /*dst+0*ystride*/ \
  47. "movq %%mm0,(%[dst])\n\t" \
  48. /*dst+1*ystride*/ \
  49. "movq %%mm1,(%[dst],%[ystride])\n\t" \
  50. /*dst+2*ystride*/ \
  51. "movq %%mm2,(%[dst],%[ystride],2)\n\t" \
  52. /*dst+3*ystride*/ \
  53. "movq %%mm3,(%[dst],%[ystride3])\n\t" \
  54. :[dst]"+r"(dst),[src]"+r"(src),[ystride3]"=&r"(ystride3) \
  55. :[ystride]"r"((ptrdiff_t)(_ystride)) \
  56. :"memory" \
  57. ); \
  58. } \
  59. while(0)
  60. # endif
  61. #endif