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

VC书籍

开发平台:

Visual C++

  1. #include "postprocess_mmx.h"
  2. INLINE int deblock_horiz_useDC(uint8_t *v, int stride) {
  3. const uint64_t mm64_mask   = 0x00fefefefefefefe;
  4. uint32_t mm32_result;
  5. uint64_t *pmm1;
  6. int eq_cnt, useDC;
  7. #ifdef PP_SELF_CHECK
  8. int eq_cnt2, j, k;
  9. #endif
  10. pmm1 = (uint64_t *)(&(v[1])); 
  11. __asm {
  12. push eax
  13. mov eax, pmm1
  14. movq mm6, mm64_mask          /*mm6 = 0x00fefefefefefefe       */
  15. pxor mm4, mm4                /*mm4 = 0x0000000000000000       */
  16. movq mm1, qword ptr [eax]   /* mm1 = *pmm            0 1 2 3 4 5 6 7    */
  17. add eax, stride            /* eax += stride/8      0 1 2 3 4 5 6 7    */
  18. movq mm5, mm1                /* mm5 = mm1             0 1 2 3 4 5 6 7    */
  19. psrlq mm1, 8                 /* mm1 >>= 8             0 1 2 3 4 5 6 7    */
  20. movq mm2, mm5                /* mm2 = mm5             0 1 2 3 4 5 6 7    */
  21. psubusb mm5, mm1             /* mm5 -= mm1            0 1 2 3 4 5 6 7    */
  22. movq mm3, qword ptr [eax]   /* mm3 = *pmm            0 1 2 3 4 5 6 7    */
  23. psubusb mm1, mm2             /* mm1 -= mm2            0 1 2 3 4 5 6 7    */
  24. add eax, stride            /* eax += stride/8      0 1 2 3 4 5 6 7    */
  25. por mm5, mm1                 /* mm5 |= mm1            0 1 2 3 4 5 6 7    */
  26. movq mm0, mm3                /* mm0 = mm3             0 1 2 3 4 5 6 7    */
  27. pand mm5, mm6                /* mm5 &= 0xfefefefefefefefe     */      
  28. pxor mm7, mm7                /*mm7 = 0x0000000000000000       */
  29. pcmpeqb mm5, mm4             /* are the bytes of mm5 == 0 ?   */
  30. movq mm1, qword ptr [eax]   /* mm3 = *pmm            0 1 2 3 4 5 6 7    */
  31. psubb mm7, mm5               /* mm7 has running total of eqcnts */
  32. psrlq mm3, 8                 /* mm3 >>= 8             0 1 2 3 4 5 6 7    */
  33. movq mm5, mm0                /* mm5 = mm0             0 1 2 3 4 5 6 7    */
  34. psubusb mm0, mm3             /* mm0 -= mm3            0 1 2 3 4 5 6 7    */
  35. add eax, stride            /* eax += stride/8      0 1 2 3 4 5 6 7    */
  36. psubusb mm3, mm5             /* mm3 -= mm5            0 1 2 3 4 5 6 7    */
  37. movq mm5, qword ptr [eax]   /* mm5 = *pmm            0 1 2 3 4 5 6 7    */
  38. por mm0, mm3                 /* mm0 |= mm3            0 1 2 3 4 5 6 7    */
  39. movq mm3, mm1                /* mm3 = mm1             0 1 2 3 4 5 6 7    */
  40. pand mm0, mm6                /* mm0 &= 0xfefefefefefefefe     */      
  41. psrlq   mm1, 8               /* mm1 >>= 8             0 1 2 3 4 5 6 7    */
  42. pcmpeqb mm0, mm4             /* are the bytes of mm0 == 0 ?   */
  43. movq mm2, mm3                /* mm2 = mm3             0 1 2 3 4 5 6 7    */
  44. psubb mm7, mm0               /* mm7 has running total of eqcnts */
  45. psubusb mm3, mm1             /* mm3 -= mm1            0 1 2 3 4 5 6 7    */
  46. psubusb mm1, mm2             /* mm1 -= mm2            0 1 2 3 4 5 6 7    */
  47. por mm3, mm1                 /* mm3 |= mm1            0 1 2 3 4 5 6 7    */
  48. movq mm1, mm5                /* mm1 = mm5             0 1 2 3 4 5 6 7    */
  49. pand    mm3, mm6             /* mm3 &= 0xfefefefefefefefe     */      
  50. psrlq   mm5, 8               /* mm5 >>= 8             0 1 2 3 4 5 6 7    */
  51. pcmpeqb mm3, mm4             /* are the bytes of mm3 == 0 ?   */
  52. movq    mm0, mm1             /* mm0 = mm1             0 1 2 3 4 5 6 7    */
  53. psubb   mm7, mm3             /* mm7 has running total of eqcnts */
  54. psubusb mm1, mm5             /* mm1 -= mm5            0 1 2 3 4 5 6 7    */
  55. psubusb mm5, mm0             /* mm5 -= mm0            0 1 2 3 4 5 6 7    */
  56. por     mm1, mm5             /* mm1 |= mm5            0 1 2 3 4 5 6 7    */
  57. pand    mm1, mm6             /* mm1 &= 0xfefefefefefefefe     */      
  58. pcmpeqb mm1, mm4             /* are the bytes of mm1 == 0 ?   */
  59. psubb   mm7, mm1             /* mm7 has running total of eqcnts */
  60. movq    mm1, mm7             /* mm1 = mm7             0 1w2 3 4 5 6 7r   */
  61. psllq   mm7, 8               /* mm7 >>= 24            0 1 2 3 4 5 6 7m   */
  62. psrlq   mm1, 24              /* mm7 >>= 24            0 1 2 3 4 5 6 7m   */
  63. paddb   mm7, mm1             /* mm7 has running total of eqcnts */
  64. movq mm1, mm7                /* mm1 = mm7             0 1w2 3 4 5 6 7r   */
  65. psrlq mm7, 16                /* mm7 >>= 16            0 1 2 3 4 5 6 7m   */
  66. paddb   mm7, mm1             /* mm7 has running total of eqcnts */
  67. movq mm1, mm7                /* mm1 = mm7             0 1w2 3 4 5 6 7r   */
  68. psrlq   mm7, 8               /* mm7 >>= 8             0 1 2 3 4 5 6 7m   */
  69. paddb mm7, mm1               /* mm7 has running total of eqcnts */
  70. movd mm32_result, mm7               
  71. pop eax
  72. };
  73. eq_cnt = mm32_result & 0xff;
  74. #ifdef PP_SELF_CHECK
  75. eq_cnt2 = 0;
  76. for (k=0; k<4; k++) {
  77. for (j=1; j<=7; j++) {
  78. if (ABS(v[j+k*stride]-v[1+j+k*stride]) <= 1) eq_cnt2++;
  79. }
  80. }
  81. if (eq_cnt2 != eq_cnt) printf("ERROR: MMX version of useDC is incorrectn");
  82. #endif
  83. useDC = eq_cnt >= DEBLOCK_HORIZ_USEDC_THR;
  84. return useDC;
  85. }