transferIDCT_mmx.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:9k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #ifdef _TEST_TRANSFER
  2. #include <stdio.h>
  3. #endif
  4. #include "portab.h"
  5. void transferIDCT_add(int16_t *sourceS16, uint8_t *destU8, int stride) {
  6. #ifdef _TEST_TRANSFER
  7. uint8_t reference_dest[64];
  8. int x, y, sum16;
  9. for (y=0; y<8; y++) {
  10. for (x=0; x<8; x++) {
  11. sum16 = (destU8[stride*y + x] + sourceS16[8*y + x]);
  12. if      (sum16 > 255) reference_dest[8*y + x] = 255;
  13. else if (sum16 <   0) reference_dest[8*y + x] =   0;
  14. else                  reference_dest[8*y + x] = (uint8_t)sum16;
  15. }
  16. }
  17. #endif
  18. _asm {
  19. ; not sure about the state handling here - there must be a better way
  20. push eax
  21. push ebx
  22. push edi
  23. mov eax, sourceS16           ;  parameter 1, *sourceS16
  24. mov ebx, destU8              ;  parameter 2, *destU8
  25. mov edi, stride              ;  parameter 3, stride
  26. pxor mm7, mm7                ;  set mm7 = 0
  27. ; lines 0 to 7 all scheduled in together
  28. movq mm0,  qword ptr [ebx]   ;  eight bytes of destination into mm4
  29. movq mm1,  mm0               ;  eight bytes of destination into mm0
  30. punpcklbw mm0, mm7           ;  unpack first 4 bytes from dest into mm4
  31. punpckhbw mm1, mm7           ;  unpack next 4 bytes from dest into mm5
  32. paddsw mm0, qword ptr [eax]  ;  add source and destination
  33. paddsw mm1, qword ptr [eax+8];  add source and destination
  34. packuswb mm0, mm1            ;  pack mm0 and mm1 into mm0
  35. movq  qword ptr  [ebx], mm0  ;  copy output to destination
  36. add ebx, edi                 ;  add +stride to dest ptr
  37. movq mm2,  qword ptr [ebx]   ;  eight bytes of destination into mm4
  38. movq mm3,  mm2               ;  eight bytes of destination into mm3
  39. punpcklbw mm2, mm7           ;  unpack first 4 bytes from dest into mm4
  40. punpckhbw mm3, mm7           ;  unpack next 4 bytes from dest into mm5
  41. paddsw mm2, qword ptr [eax+16]  ;  add source and destination
  42. paddsw mm3, qword ptr [eax+24];  add source and destination
  43. packuswb mm2, mm3            ;  pack mm0 and mm1 into mm0
  44. movq  qword ptr  [ebx], mm2  ;  copy output to destination
  45. add ebx, edi                 ;  add +stride to dest ptr
  46. movq mm4,  qword ptr [ebx]   ;  eight bytes of destination into mm4
  47. movq mm5,  mm4               ;  eight bytes of destination into mm5
  48. punpcklbw mm4, mm7           ;  unpack first 4 bytes from dest into mm4
  49. punpckhbw mm5, mm7           ;  unpack next 4 bytes from dest into mm5
  50. paddsw mm4, qword ptr [eax+32]  ;  add source and destination
  51. paddsw mm5, qword ptr [eax+40];  add source and destination
  52. packuswb mm4, mm5            ;  pack mm0 and mm1 into mm0
  53. movq  qword ptr  [ebx], mm4  ;  copy output to destination
  54. add ebx, edi                 ;  add +stride to dest ptr
  55. movq mm0,  qword ptr [ebx]   ;  eight bytes of destination into mm4
  56. movq mm1,  qword ptr [ebx]   ;  eight bytes of destination into mm5
  57. punpcklbw mm0, mm7           ;  unpack first 4 bytes from dest into mm4
  58. punpckhbw mm1, mm7           ;  unpack next 4 bytes from dest into mm5
  59. paddsw mm0, qword ptr [eax+48]  ;  add source and destination
  60. paddsw mm1, qword ptr [eax+56];  add source and destination
  61. packuswb mm0, mm1            ;  pack mm0 and mm1 into mm0
  62. add eax, 64                  ;  add +64 to source ptr                
  63. movq  qword ptr  [ebx], mm0  ;  copy output to destination
  64. add ebx, edi                 ;  add +stride to dest ptr
  65. movq mm2,  qword ptr [ebx]   ;  eight bytes of destination into mm4
  66. movq mm3,  mm2               ;  eight bytes of destination into mm3
  67. punpcklbw mm2, mm7           ;  unpack first 4 bytes from dest into mm4
  68. punpckhbw mm3, mm7           ;  unpack next 4 bytes from dest into mm5
  69. paddsw mm2, qword ptr [eax]  ;  add source and destination
  70. paddsw mm3, qword ptr [eax+8];  add source and destination
  71. packuswb mm2, mm3            ;  pack mm0 and mm1 into mm0
  72. add eax, 16                  ;  add +16 to source ptr                
  73. movq  qword ptr  [ebx], mm2  ;  copy output to destination
  74. add ebx, edi                 ;  add +stride to dest ptr
  75. movq mm4,  qword ptr [ebx]   ;  eight bytes of destination into mm4
  76. movq mm5,  mm4               ;  eight bytes of destination into mm5
  77. punpcklbw mm4, mm7           ;  unpack first 4 bytes from dest into mm4
  78. punpckhbw mm5, mm7           ;  unpack next 4 bytes from dest into mm5
  79. paddsw mm4, qword ptr [eax]  ;  add source and destination
  80. paddsw mm5, qword ptr [eax+8];  add source and destination
  81. packuswb mm4, mm5            ;  pack mm0 and mm1 into mm0
  82. add eax, 16                  ;  add +16 to source ptr                
  83. movq  qword ptr  [ebx], mm4  ;  copy output to destination
  84. add ebx, edi                 ;  add +stride to dest ptr
  85. movq mm0,  qword ptr [ebx]   ;  eight bytes of destination into mm4
  86. movq mm1,  mm0               ;  eight bytes of destination into mm1
  87. punpcklbw mm0, mm7           ;  unpack first 4 bytes from dest into mm4
  88. punpckhbw mm1, mm7           ;  unpack next 4 bytes from dest into mm5
  89. paddsw mm0, qword ptr [eax]  ;  add source and destination
  90. paddsw mm1, qword ptr [eax+8];  add source and destination
  91. packuswb mm0, mm1            ;  pack mm0 and mm1 into mm0
  92. add eax, 16                  ;  add +16 to source ptr                
  93. movq  qword ptr  [ebx], mm0  ;  copy output to destination
  94. add ebx, edi                 ;  add +stride to dest ptr
  95. movq mm2,  qword ptr [ebx]   ;  eight bytes of destination into mm4
  96. movq mm3,  mm2               ;  eight bytes of destination into mm3
  97. punpcklbw mm2, mm7           ;  unpack first 4 bytes from dest into mm4
  98. punpckhbw mm3, mm7           ;  unpack next 4 bytes from dest into mm5
  99. paddsw mm2, qword ptr [eax]  ;  add source and destination
  100. paddsw mm3, qword ptr [eax+8];  add source and destination
  101. packuswb mm2, mm3            ;  pack mm0 and mm1 into mm0
  102. movq  qword ptr  [ebx], mm2  ;  copy output to destination
  103. pop edi
  104. pop ebx 
  105. pop eax
  106. emms
  107. }
  108. #ifdef _TEST_TRANSFER
  109. for (y=0; y<8; y++) {
  110. for (x=0; x<8; x++) {
  111. if (reference_dest[8*y + x] != destU8[stride*y + x]) printf("transferIDCT_add() is brokenn");
  112. }
  113. }
  114. #endif
  115.   
  116. }
  117. void transferIDCT_copy(int16_t *sourceS16, uint8_t *destU8, int stride) {
  118. #ifdef _TEST_TRANSFER
  119. int x, y, clipped;
  120. #endif
  121. _asm {
  122. ; not sure about the state handling here - there must be a better way
  123. push eax
  124. push ebx
  125. push edi
  126. mov eax, sourceS16           ;  parameter 1, *sourceS16
  127. mov ebx, destU8              ;  parameter 2, *destU8
  128. mov edi, stride              ;  parameter 3, stride
  129. ; lines 0 to 7 schedueled into each other...
  130. movq mm0, qword ptr [eax]       ;  move first four words into mm0
  131. packuswb mm0, qword ptr [eax+8] ;  pack mm0 and the next four words into mm0
  132. movq mm1, qword ptr [eax+16]    ;  move first four words into mm1
  133. packuswb mm1, qword ptr [eax+24];  pack mm0 and the next four words into mm1
  134. movq mm2, qword ptr [eax+32]    ;  move first four words into mm2
  135. packuswb mm2, qword ptr [eax+40];  pack mm0 and the next four words into mm2
  136. movq mm3, qword ptr [eax+48]    ;  move first four words into mm3
  137. packuswb mm3, qword ptr [eax+56] ;  pack mm3 and the next four words into mm3
  138. movq qword ptr [ebx], mm0       ;  copy output to destination
  139. add ebx, edi                    ;  add +stride to dest ptr
  140. movq qword ptr [ebx], mm1       ;  copy output to destination
  141. add ebx, edi                    ;  add +stride to dest ptr
  142. movq qword ptr [ebx], mm2       ;  copy output to destination
  143. add ebx, edi                    ;  add +stride to dest ptr
  144. movq qword ptr [ebx], mm3       ;  copy output to destination
  145. add ebx, edi                    ;  add +stride to dest ptr
  146. movq mm0, qword ptr [eax+64]    ;  move first four words into mm0
  147. add eax, 64                     ;  add 64 to source ptr                
  148. packuswb mm0, qword ptr [eax+8] ;  pack mm0 and the next four words into mm0
  149. movq mm1, qword ptr [eax+16]    ;  move first four words into mm1
  150. packuswb mm1, qword ptr [eax+24];  pack mm0 and the next four words into mm1
  151. movq mm2, qword ptr [eax+32]    ;  move first four words into mm2
  152. packuswb mm2, qword ptr [eax+40];  pack mm0 and the next four words into mm2
  153. movq mm3, qword ptr [eax+48]    ;  move first four words into mm3
  154. packuswb mm3, qword ptr [eax+56];  pack mm3 and the next four words into mm3
  155. movq qword ptr [ebx], mm0       ;  copy output to destination
  156. add ebx, edi                    ;  add +stride to dest ptr
  157. movq qword ptr [ebx], mm1       ;  copy output to destination
  158. add ebx, edi                    ;  add +stride to dest ptr
  159. movq qword ptr [ebx], mm2       ;  copy output to destination
  160. add ebx, edi                    ;  add +stride to dest ptr
  161. movq qword ptr [ebx], mm3       ;  copy output to destination
  162. pop edi
  163. pop ebx 
  164. pop eax
  165. emms
  166. }
  167. #ifdef _TEST_TRANSFER
  168. for (y=0; y<8; y++) {
  169. for (x=0; x<8; x++) {
  170. clipped = sourceS16[8*y + x];
  171. if (clipped > 255) clipped = 255;
  172. if (clipped <   0) clipped =   0;
  173. if (clipped != destU8[stride*y+x]) printf("transferIDCT_copy() is brokenn");
  174. }
  175. }
  176. #endif
  177. }