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

VC书籍

开发平台:

Visual C++

  1. #include "postprocess_mmx.h"
  2. INLINE void deblock_vert_copy_and_unpack(int stride, uint8_t *source, uint64_t *dest, int n) {
  3. uint64_t *pmm1 = (uint64_t *)source;
  4. uint64_t *pmm2 = (uint64_t *)dest;
  5. int i = -n / 2;
  6. #ifdef PP_SELF_CHECK
  7. int j, k;
  8. #endif
  9. __asm {
  10. push edi
  11. push eax
  12. push ebx
  13. mov edi, i
  14. mov eax, pmm1
  15. mov ebx, pmm2
  16. pxor   mm7, mm7                        /* set mm7 = 0                     */
  17. deblock_v_L1:                             /* now p1 is in mm1                */
  18. movq   mm0, [eax]                     /* mm0 = v[0*stride]               */
  19. #ifdef PREFETCH_ENABLE
  20. prefetcht0 0[ebx]                 
  21. #endif
  22. add   eax, stride                    /* p_data += stride                */
  23. movq   mm1, mm0                        /* mm1 = v[0*stride]               */
  24. punpcklbw mm0, mm7                     /* unpack low bytes (left hand 4)  */
  25. movq   mm2, [eax]                     /* mm2 = v[0*stride]               */
  26. punpckhbw mm1, mm7                     /* unpack high bytes (right hand 4)*/
  27. movq   mm3, mm2                        /* mm3 = v[0*stride]               */
  28. punpcklbw mm2, mm7                     /* unpack low bytes (left hand 4)  */
  29. movq   [ebx], mm0                     /* v_local[n] = mm0 (left)         */
  30. add   eax, stride                    /* p_data += stride                */
  31. movq   8[ebx], mm1                    /* v_local[n+8] = mm1 (right)      */
  32. punpckhbw mm3, mm7                     /* unpack high bytes (right hand 4)*/
  33. movq   16[ebx], mm2                   /* v_local[n+16] = mm2 (left)      */
  34. movq   24[ebx], mm3                   /* v_local[n+24] = mm3 (right)     */
  35. add   ebx, 32                        /* p_data2 += 8                    */
  36. add   i, 1                            /* increment loop counter          */
  37. jne    deblock_v_L1             
  38. pop ebx
  39. pop eax
  40. pop edi
  41. };
  42. #ifdef PP_SELF_CHECK
  43. for (k=0; k<n; k++) {
  44. for (j=0; j<8; j++) {
  45. if ( ((uint16_t *)dest)[k*8+j] != source[k*stride+j] ) {
  46. printf("ERROR: MMX copy block is flawed at (%d, %d)n", j, k);  
  47. }
  48. }
  49. #endif
  50. }