fast_copy.c
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:2k
源码类别:

VC书籍

开发平台:

Visual C++

  1. #include "postprocess_mmx.h"
  2. void fast_copy(unsigned char *src, int src_stride,
  3.                  unsigned char *dst, int dst_stride, 
  4.                  int horizontal_size,   int vertical_size) {
  5. uint8_t *pmm1;
  6. uint8_t *pmm2;
  7. int x, y;
  8. #ifdef PP_SELF_CHECK
  9. int j, k;
  10. #endif
  11. pmm1 = src;
  12. pmm2 = dst;
  13. for (y=0; y<vertical_size; y++) {
  14. x = - horizontal_size / 8;
  15. __asm {
  16. push edi
  17. push ebx
  18. push ecx
  19. mov edi, x
  20. mov ebx, pmm1
  21. mov ecx, pmm2
  22. L123:                                         /*                                 */
  23. movq   mm0, [ebx]                         /* mm0 = *pmm1                     */
  24. movq   [ecx], mm0                         /* *pmm2 = mm0                     */
  25. add   ecx, 8                              /* pmm2 +=8                        */
  26. #ifdef PREFETCH_ENABLE
  27. prefetcht0 32[ebx]                        /* prefetch ahead                  */
  28. #endif
  29. add   ebx, 8                              /* pmm1 +=8                        */
  30. add   edi, 1                              /* increment loop counter          */
  31. jne    L123
  32. pop ecx
  33. pop ebx
  34. pop edi
  35.   
  36. };
  37. pmm1 += src_stride;
  38. pmm2 += dst_stride;
  39. }
  40. #ifdef PP_SELF_CHECK
  41. for (k=0; k<vertical_size; k++) {
  42. for (j=0; j<horizontal_size; j++) {
  43. if (dst[k*dst_stride + j] != src[k*src_stride + j]) {
  44. printf("problem with MMX fast copy - Yn");
  45. }
  46. }
  47. }
  48. #endif
  49. __asm { 
  50. emms
  51. };
  52. }