mmxfrag.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #if !defined(_x86_vc_mmxfrag_H)
  2. # define _x86_vc_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. src=(_src); \
  13. dst=(_dst); \
  14. __asm mov SRC,src \
  15. __asm mov DST,dst \
  16. __asm mov YSTRIDE,_ystride \
  17. /*src+0*ystride*/ \
  18. __asm movq mm0,[SRC] \
  19. /*src+1*ystride*/ \
  20. __asm movq mm1,[SRC+YSTRIDE] \
  21. /*ystride3=ystride*3*/ \
  22. __asm lea YSTRIDE3,[YSTRIDE+YSTRIDE*2] \
  23. /*src+2*ystride*/ \
  24. __asm movq mm2,[SRC+YSTRIDE*2] \
  25. /*src+3*ystride*/ \
  26. __asm movq mm3,[SRC+YSTRIDE3] \
  27. /*dst+0*ystride*/ \
  28. __asm movq [DST],mm0 \
  29. /*dst+1*ystride*/ \
  30. __asm movq [DST+YSTRIDE],mm1 \
  31. /*Pointer to next 4.*/ \
  32. __asm lea SRC,[SRC+YSTRIDE*4] \
  33. /*dst+2*ystride*/ \
  34. __asm movq [DST+YSTRIDE*2],mm2 \
  35. /*dst+3*ystride*/ \
  36. __asm movq [DST+YSTRIDE3],mm3 \
  37. /*Pointer to next 4.*/ \
  38. __asm lea DST,[DST+YSTRIDE*4] \
  39. /*src+0*ystride*/ \
  40. __asm movq mm0,[SRC] \
  41. /*src+1*ystride*/ \
  42. __asm movq mm1,[SRC+YSTRIDE] \
  43. /*src+2*ystride*/ \
  44. __asm movq mm2,[SRC+YSTRIDE*2] \
  45. /*src+3*ystride*/ \
  46. __asm movq mm3,[SRC+YSTRIDE3] \
  47. /*dst+0*ystride*/ \
  48. __asm movq [DST],mm0 \
  49. /*dst+1*ystride*/ \
  50. __asm movq [DST+YSTRIDE],mm1 \
  51. /*dst+2*ystride*/ \
  52. __asm movq [DST+YSTRIDE*2],mm2 \
  53. /*dst+3*ystride*/ \
  54. __asm movq [DST+YSTRIDE3],mm3 \
  55. } \
  56. while(0)
  57. # endif
  58. #endif