reconmmx.asm
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. ADD_1: dd 01010101h, 01010101h
  2. MASK_AND: dd 7f7f7f7fh, 7f7f7f7fh
  3. PLUS_384: dd 01800180h, 01800180h
  4. PLUS_128: dd 00800080h, 00800080h
  5. %assign LocalFrameSize  0
  6. %assign RegisterStorageSize  16
  7. ; Arguments:
  8. %assign source                    LocalFrameSize + RegisterStorageSize +  4
  9. %assign dest                      LocalFrameSize + RegisterStorageSize +  8
  10. %assign lx2                       LocalFrameSize + RegisterStorageSize + 12
  11. %assign h                         LocalFrameSize + RegisterStorageSize + 16
  12. ; Locals (on local stack frame)
  13. ; extern void C rec_mmx (
  14. ;                                     unsigned char *source,
  15. ;                                     unsigned char *dest,
  16. ;                                     int lx2,
  17. ;                                     int h
  18. ;
  19. ;  The local variables are on the stack,
  20. ;
  21. global recva_mmx
  22. global recvac_mmx
  23. global rech_mmx
  24. global rechc_mmx
  25. global add_block_mmx
  26. global set_block_mmx
  27.   align 16
  28. rech_mmx:
  29.   push       esi
  30.   push       edi
  31.   push       ecx
  32.   push       ebx
  33.   mov        esi, [esp+source]
  34.   mov        edi, [esp+dest]
  35.   mov        ecx, [esp+h]
  36.   mov        ebx, [esp+lx2]
  37.   movq       mm5, [MASK_AND]
  38.   movq       mm6, [ADD_1]
  39. .rech1:
  40.   movq       mm0,[esi]
  41.   movq       mm1,[esi+1]
  42.   movq       mm2,[esi+8]
  43.   movq       mm3,[esi+9]
  44.   psrlw      mm0,1
  45.   psrlw      mm1,1
  46.   psrlw      mm2,1
  47.   psrlw      mm3,1
  48.   pand       mm0,mm5
  49.   pand       mm1,mm5
  50.   pand       mm2,mm5
  51.   pand       mm3,mm5
  52.   paddusb    mm0,mm1
  53.   paddusb    mm2,mm3
  54.   paddusb    mm0,mm6
  55.   paddusb    mm2,mm6
  56.   movq       [edi],mm0
  57.   add        esi,ebx
  58.   movq       [edi+8],mm2
  59.   add        edi,ebx
  60.   dec        ecx
  61.   jnz        .rech1
  62.   emms
  63.   pop        ebx
  64.   pop        ecx
  65.   pop        edi
  66.   pop        esi
  67.   ret
  68.   align 16
  69. rechc_mmx:
  70.   push       esi
  71.   push       edi
  72.   push       ecx
  73.   push       ebx
  74. ;  sub        esp, LocalFrameSize
  75.   mov        esi, [esp+source]
  76.   mov        edi, [esp+dest]
  77.   mov        ecx, [esp+h]
  78.   mov        ebx, [esp+lx2]
  79.   movq       mm5, [MASK_AND]
  80.   movq       mm6, [ADD_1]
  81. .rechc1:
  82.   movq       mm0,[esi]
  83.   movq       mm1,[esi+1]
  84.   psrlw      mm0,1
  85.   psrlw      mm1,1
  86.   pand       mm0,mm5
  87.   pand       mm1,mm5
  88.   paddusb    mm0,mm1
  89.   paddusb    mm0,mm6
  90.   movq       [edi],mm0
  91.   add        edi,ebx
  92.   add        esi,ebx
  93.   dec        ecx
  94.   jnz        .rechc1
  95.   emms
  96. ;  add        esp, LocalFrameSize
  97.   pop        ebx
  98.   pop        ecx
  99.   pop        edi
  100.   pop        esi
  101.   ret
  102. %assign RegisterStorageSize  20
  103. %assign source                    LocalFrameSize + RegisterStorageSize +  4
  104. %assign dest                      LocalFrameSize + RegisterStorageSize +  8
  105. %assign lx                        LocalFrameSize + RegisterStorageSize + 12
  106. %assign lx2                       LocalFrameSize + RegisterStorageSize + 16
  107. %assign h                         LocalFrameSize + RegisterStorageSize + 20
  108.   align 16
  109. recva_mmx:
  110.   push       esi
  111.   push       edi
  112.   push       ecx
  113.   push       ebx
  114.   push       edx
  115.   mov        esi, [esp+source]
  116.   mov        edi, [esp+dest]
  117.   mov        ecx, [esp+h]
  118.   mov        ebx, [esp+lx2]
  119.   mov        edx, [esp+lx]
  120.   movq      mm7, [MASK_AND]
  121.   movq      mm6, [ADD_1]
  122. .recva1:
  123.   movq       mm0,[esi]
  124.   movq       mm1,[esi+edx]
  125.   movq       mm2,[esi+8]
  126.   movq       mm3,[esi+edx+8]
  127.   movq       mm4,[edi]
  128.   movq      mm5,[edi+8]
  129.   psrlw      mm0,1
  130.   psrlw      mm1,1
  131.   psrlw      mm2,1
  132.   psrlw      mm3,1
  133.   psrlw      mm4,1
  134.   psrlw      mm5,1
  135.   pand       mm0,mm7
  136.   pand       mm1,mm7
  137.   pand       mm2,mm7
  138.   pand       mm3,mm7
  139.   pand       mm4,mm7
  140.   pand       mm5,mm7
  141.   paddusb    mm0,mm1
  142.   paddusb    mm2,mm3
  143.   paddusb    mm0,mm6
  144.   paddusb    mm2,mm6
  145.   psrlw      mm0,1
  146.   psrlw      mm2,1
  147.   pand       mm0,mm7
  148.   pand       mm2,mm7
  149.   paddusb    mm4,mm0
  150.   paddusb    mm5,mm2
  151.   paddusb    mm4,mm6
  152.   paddusb    mm5,mm6
  153.   movq       [edi],mm4
  154.   movq       [edi+8],mm5
  155.   add        edi,ebx
  156.   add        esi,ebx
  157.   dec        ecx
  158.   jnz        near .recva1
  159.   emms
  160.   pop        edx
  161.   pop        ebx
  162.   pop        ecx
  163.   pop        edi
  164.   pop        esi
  165.   ret
  166.   align 16
  167. recvac_mmx:
  168.   push       esi
  169.   push       edi
  170.   push       ecx
  171.   push       ebx
  172.   push       edx
  173.   mov        esi, [esp+source]
  174.   mov        edi, [esp+dest]
  175.   mov        ecx, [esp+h]
  176.   mov        ebx, [esp+lx2]
  177.   mov        edx, [esp+lx]
  178.   movq      mm5, [MASK_AND]
  179.   movq      mm6, [ADD_1]
  180. .recvac1:
  181.   movq       mm0,[esi]
  182.   movq       mm1,[esi+edx]
  183.   movq       mm4,[edi]
  184.   psrlw      mm0,1
  185.   psrlw      mm1,1
  186.   psrlw      mm4,1
  187.   pand       mm0,mm5
  188.   pand       mm1,mm5
  189.   pand       mm4,mm5
  190.   paddusb    mm0,mm1
  191.   paddusb    mm0,mm6
  192.   psrlw      mm0,1
  193.   pand       mm0,mm5
  194.   paddusb    mm4,mm0
  195.   paddusb    mm4,mm6
  196.   movq       [edi],mm4
  197.   add        edi,ebx
  198.   add        esi,ebx
  199.   dec        ecx
  200.   jnz        .recvac1
  201.   emms
  202.   pop        edx
  203.   pop        ebx
  204.   pop        ecx
  205.   pop        edi
  206.   pop        esi
  207.   ret
  208. %assign RegisterStorageSize  20
  209. %assign rfp                       LocalFrameSize + RegisterStorageSize +  4
  210. %assign bp                        LocalFrameSize + RegisterStorageSize +  8
  211. %assign iincr                     LocalFrameSize + RegisterStorageSize + 12
  212. ; FIXME clipping needs to be done
  213.   align 16
  214. add_block_mmx:
  215.   push       esi
  216.   push       edi
  217.   push       ecx
  218.   push       ebx
  219.   push       edx
  220.   mov        esi, [esp+bp]
  221.   mov        edi, [esp+rfp]
  222.   mov        ebx, [esp+iincr]
  223. ;  movq       mm7, [PLUS_384]
  224.   mov        ecx,8
  225.   pxor        mm2,mm2 ; clear
  226. %rep 8
  227.   movq       mm0, [edi] ; get dest
  228.   movq      mm1,mm0
  229.   punpcklbw  mm0,mm2
  230.   punpckhbw  mm1,mm2
  231.   paddsw     mm0, [esi]
  232.   paddsw     mm1, [esi+8]
  233. ;  paddsw     mm0, mm7
  234. ;  paddsw     mm1, mm7
  235.   packuswb   mm0,mm1      
  236.   movq      [edi], mm0
  237.   add        edi,ebx
  238.   add      esi,16
  239. %endrep
  240.   emms
  241.   pop        edx
  242.   pop      ebx
  243.   pop        ecx
  244.   pop        edi
  245.   pop        esi
  246.   ret
  247.   align 16
  248. set_block_mmx:
  249.   push       esi
  250.   push       edi
  251.   push       ecx
  252.   push       ebx
  253.   push       edx
  254.   mov        esi, [esp+bp]
  255.   mov        edi, [esp+rfp]
  256.   mov        ebx, [esp+iincr]
  257.   movq       mm7, [PLUS_128]
  258. %rep 4
  259.   movq       mm0, [esi]
  260.   movq       mm1, [esi+8]
  261.   paddsw     mm0, mm7
  262.   movq       mm2, [esi+16]
  263.   paddsw     mm1, mm7
  264.   movq       mm3, [esi+24]
  265.   paddsw     mm2, mm7
  266.   packuswb   mm0, mm1
  267.   paddsw     mm3, mm7
  268.   movq       [edi], mm0
  269.   packuswb   mm2, mm3
  270.   add        edi, ebx
  271.   add        esi, 32
  272.   movq       [edi], mm2
  273.   add        edi, ebx
  274. %endrep
  275.   emms
  276.   pop        edx
  277.   pop        ebx
  278.   pop        ecx
  279.   pop        edi
  280.   pop        esi
  281.   ret