reconmmx.s
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:15k
源码类别:

DVD

开发平台:

Unix_Linux

  1. ;-------------------------------------------------------------------------
  2. ADD_1: dd 01010101h, 01010101h
  3. MASK_AND: dd 7f7f7f7fh, 7f7f7f7fh
  4. PLUS_384: dd 01800180h, 01800180h
  5. PLUS_128: dd 00800080h, 00800080h
  6. %assign LocalFrameSize  0
  7. %assign RegisterStorageSize  16
  8. ; Arguments:
  9. %assign source                    LocalFrameSize + RegisterStorageSize +  4
  10. %assign dest                      LocalFrameSize + RegisterStorageSize +  8
  11. %assign lx2                       LocalFrameSize + RegisterStorageSize + 12
  12. %assign h                         LocalFrameSize + RegisterStorageSize + 16
  13. ; Locals (on local stack frame)
  14. ; extern void C rec_mmx (
  15. ;                                     unsigned char *source,
  16. ;                                     unsigned char *dest,
  17. ;                                     int lx2,
  18. ;                                     int h
  19. ;
  20. ;  The local variables are on the stack,
  21. ;
  22. global rec 
  23. global recc
  24. global reca
  25. global recac
  26. global recv
  27. global recvc
  28. global recva
  29. global recvac
  30. global rech
  31. global rechc
  32. global add_block_mmx
  33. global set_block_mmx
  34.   align 16
  35. rec:
  36.   push       esi
  37.   push       edi
  38.   push       ecx
  39.   push       ebx
  40. ;  sub        esp, LocalFrameSize
  41.   mov        esi, [esp+source]
  42.   mov        edi, [esp+dest]
  43.   mov        ecx, [esp+h]
  44.   mov        ebx, [esp+lx2]
  45. .rec1:
  46.   movq      mm0,[esi]
  47.   movq       mm1,[esi+8]
  48.   movq       [edi],mm0
  49.   add        esi,ebx
  50.   movq       [edi+8],mm1
  51.   add        edi,ebx
  52.   dec        ecx
  53.   jnz      .rec1
  54.   emms
  55. ;  add        esp, LocalFrameSize
  56.   pop        ebx
  57.   pop        ecx
  58.   pop        edi
  59.   pop        esi
  60.   ret 
  61.   align 16
  62. recc:
  63.   push       esi
  64.   push       edi
  65.   push       ecx
  66.   push       ebx
  67. ;  sub        esp, LocalFrameSize
  68.   mov        esi, [esp+source]
  69.   mov        edi, [esp+dest]
  70.   mov        ecx, [esp+h]
  71.   mov        ebx, [esp+lx2]
  72. .recc1:
  73.   movq       mm0,[esi]
  74.   movq       [edi],mm0
  75.   add        edi,ebx
  76.   add        esi,ebx
  77.   dec        ecx
  78.   jnz        .recc1
  79.   emms
  80. ;  add        esp, LocalFrameSize
  81.   pop        ebx
  82.   pop        ecx
  83.   pop        edi
  84.   pop        esi
  85.   ret
  86.   align 16
  87. reca:
  88.   push       esi
  89.   push       edi
  90.   push       ecx
  91.   push       ebx
  92. ;  sub        esp, LocalFrameSize
  93.   mov        esi, [esp+source]
  94.   mov        edi, [esp+dest]
  95.   mov        ecx, [esp+h]
  96.   mov        ebx, [esp+lx2]
  97.   movq      mm5, [MASK_AND]
  98.   movq      mm6, [ADD_1]
  99. .reca1:
  100.   movq       mm0,[esi]
  101.   movq       mm1,[edi]
  102.   movq       mm2,[esi+8]
  103.   movq       mm3,[edi+8]
  104.   psrlw      mm0,1
  105.   psrlw      mm1,1
  106.   psrlw      mm2,1
  107.   psrlw      mm3,1
  108.   pand      mm0,mm5
  109.   pand      mm1,mm5
  110.   pand      mm2,mm5
  111.   pand      mm3,mm5
  112.   paddusb    mm0,mm1
  113.   paddusb    mm2,mm3
  114.   paddusb    mm0,mm6
  115.   paddusb    mm2,mm6
  116.   movq       [edi],mm0
  117.   add        esi,ebx
  118.   movq      [edi+8],mm2
  119.   add        edi,ebx
  120.   dec        ecx
  121.   jnz        .reca1
  122.   emms
  123. ;  add        esp, LocalFrameSize
  124.   pop        ebx
  125.   pop        ecx
  126.   pop        edi
  127.   pop        esi
  128.   ret
  129.   align 16
  130. recac:
  131.   push       esi
  132.   push       edi
  133.   push       ecx
  134.   push       ebx
  135. ;  sub        esp, LocalFrameSize
  136.   mov        esi, [esp+source]
  137.   mov        edi, [esp+dest]
  138.   mov        ecx, [esp+h]
  139.   mov        ebx, [esp+lx2]
  140.   movq      mm5, [MASK_AND]
  141.   movq      mm6, [ADD_1]
  142. .recac1:
  143.   movq       mm0,[esi]
  144.   movq       mm1,[edi]
  145.   psrlw      mm0,1
  146.   psrlw      mm1,1
  147.   pand       mm0,mm5
  148.   pand       mm1,mm5
  149.   paddusb    mm0,mm1
  150.   paddusb    mm0,mm6
  151.   movq       [edi],mm0
  152.   add        edi,ebx
  153.   add        esi,ebx
  154.   dec        ecx
  155.   jnz        .recac1
  156.   emms
  157. ;  add        esp, LocalFrameSize
  158.   pop        ebx
  159.   pop        ecx
  160.   pop        edi
  161.   pop        esi
  162.   ret
  163.   align 16
  164. rech:
  165.   push       esi
  166.   push       edi
  167.   push       ecx
  168.   push       ebx
  169.   mov        esi, [esp+source]
  170.   mov        edi, [esp+dest]
  171.   mov        ecx, [esp+h]
  172.   mov        ebx, [esp+lx2]
  173.   movq       mm5, [MASK_AND]
  174.   movq       mm6, [ADD_1]
  175. .rech1:
  176.   movq       mm0,[esi]
  177.   movq       mm1,[esi+1]
  178.   movq       mm2,[esi+8]
  179.   movq       mm3,[esi+9]
  180.   psrlw      mm0,1
  181.   psrlw      mm1,1
  182.   psrlw      mm2,1
  183.   psrlw      mm3,1
  184.   pand       mm0,mm5
  185.   pand       mm1,mm5
  186.   pand       mm2,mm5
  187.   pand       mm3,mm5
  188.   paddusb    mm0,mm1
  189.   paddusb    mm2,mm3
  190.   paddusb    mm0,mm6
  191.   paddusb    mm2,mm6
  192.   movq       [edi],mm0
  193.   add        esi,ebx
  194.   movq       [edi+8],mm2
  195.   add        edi,ebx
  196.   dec        ecx
  197.   jnz        .rech1
  198.   emms
  199.   pop        ebx
  200.   pop        ecx
  201.   pop        edi
  202.   pop        esi
  203.   ret
  204.   align 16
  205. rechc:
  206.   push       esi
  207.   push       edi
  208.   push       ecx
  209.   push       ebx
  210. ;  sub        esp, LocalFrameSize
  211.   mov        esi, [esp+source]
  212.   mov        edi, [esp+dest]
  213.   mov        ecx, [esp+h]
  214.   mov        ebx, [esp+lx2]
  215.   movq       mm5, [MASK_AND]
  216.   movq       mm6, [ADD_1]
  217. .rechc1:
  218.   movq       mm0,[esi]
  219.   movq       mm1,[esi+1]
  220.   psrlw      mm0,1
  221.   psrlw      mm1,1
  222.   pand       mm0,mm5
  223.   pand       mm1,mm5
  224.   paddusb    mm0,mm1
  225.   paddusb    mm0,mm6
  226.   movq       [edi],mm0
  227.   add        edi,ebx
  228.   add        esi,ebx
  229.   dec        ecx
  230.   jnz        .rechc1
  231.   emms
  232. ;  add        esp, LocalFrameSize
  233.   pop        ebx
  234.   pop        ecx
  235.   pop        edi
  236.   pop        esi
  237.   ret
  238. %assign RegisterStorageSize  20
  239. %assign source                    LocalFrameSize + RegisterStorageSize +  4
  240. %assign dest                      LocalFrameSize + RegisterStorageSize +  8
  241. %assign lx                        LocalFrameSize + RegisterStorageSize + 12
  242. %assign lx2                       LocalFrameSize + RegisterStorageSize + 16
  243. %assign h                         LocalFrameSize + RegisterStorageSize + 20
  244.   align 16
  245. recv:
  246.   push       esi
  247.   push       edi
  248.   push       ecx
  249.   push       ebx
  250.   push      edx
  251.   mov        esi, [esp+source]
  252.   mov        edi, [esp+dest]
  253.   mov        ecx, [esp+h]
  254.   mov        ebx, [esp+lx2]
  255.   mov        edx, [esp+lx]
  256.   movq      mm5, [MASK_AND]
  257.   movq      mm6, [ADD_1]
  258. .recv1:
  259.   movq       mm0,[esi]
  260.   movq       mm1,[esi+edx]
  261.   movq       mm2,[esi+8]
  262.   movq       mm3,[esi+edx+8]
  263.   psrlw      mm0,1
  264.   psrlw      mm1,1
  265.   psrlw      mm2,1
  266.   psrlw      mm3,1
  267.   pand       mm0,mm5
  268.   pand       mm1,mm5
  269.   pand       mm2,mm5
  270.   pand       mm3,mm5
  271.   paddusb    mm0,mm1
  272.   paddusb    mm2,mm3
  273.   paddusb    mm0,mm6
  274.   paddusb    mm2,mm6
  275.   movq       [edi],mm0
  276.   add        esi,ebx
  277.   movq       [edi+8],mm2
  278.   add        edi,ebx
  279.   dec        ecx
  280.   jnz        .recv1
  281.   emms
  282.   pop      edx
  283.   pop        ebx
  284.   pop        ecx
  285.   pop        edi
  286.   pop        esi
  287.   ret
  288.   align 16
  289. recvc:
  290.   push       esi
  291.   push       edi
  292.   push       ecx
  293.   push       ebx
  294.   push       edx
  295.   mov        esi, [esp+source]
  296.   mov        edi, [esp+dest]
  297.   mov        ecx, [esp+h]
  298.   mov        ebx, [esp+lx2]
  299.   mov        edx, [esp+lx]
  300.   movq      mm5, [MASK_AND]
  301.   movq      mm6, [ADD_1]
  302. .recvc1:
  303.   movq       mm0,[esi]
  304.   movq       mm1,[esi+edx]
  305.   psrlw      mm0,1
  306.   psrlw      mm1,1
  307.   pand       mm0,mm5
  308.   pand       mm1,mm5
  309.   paddusb    mm0,mm1
  310.   paddusb    mm0,mm6
  311.   movq       [edi],mm0
  312.   add        edi,ebx
  313.   add        esi,ebx
  314.   dec        ecx
  315.   jnz        .recvc1
  316.   emms
  317.   pop        edx
  318.   pop        ebx
  319.   pop        ecx
  320.   pop        edi
  321.   pop        esi
  322.   ret
  323.   align 16
  324. recva:
  325.   push       esi
  326.   push       edi
  327.   push       ecx
  328.   push       ebx
  329.   push       edx
  330.   mov        esi, [esp+source]
  331.   mov        edi, [esp+dest]
  332.   mov        ecx, [esp+h]
  333.   mov        ebx, [esp+lx2]
  334.   mov        edx, [esp+lx]
  335.   movq      mm7, [MASK_AND]
  336.   movq      mm6, [ADD_1]
  337. .recva1:
  338.   movq       mm0,[esi]
  339.   movq       mm1,[esi+edx]
  340.   movq       mm2,[esi+8]
  341.   movq       mm3,[esi+edx+8]
  342.   movq       mm4,[edi]
  343.   movq      mm5,[edi+8]
  344.   psrlw      mm0,1
  345.   psrlw      mm1,1
  346.   psrlw      mm2,1
  347.   psrlw      mm3,1
  348.   psrlw      mm4,1
  349.   psrlw      mm5,1
  350.   pand       mm0,mm7
  351.   pand       mm1,mm7
  352.   pand       mm2,mm7
  353.   pand       mm3,mm7
  354.   pand       mm4,mm7
  355.   pand       mm5,mm7
  356.   paddusb    mm0,mm1
  357.   paddusb    mm2,mm3
  358.   paddusb    mm0,mm6
  359.   paddusb    mm2,mm6
  360.   psrlw      mm0,1
  361.   psrlw      mm2,1
  362.   pand       mm0,mm7
  363.   pand       mm2,mm7
  364.   paddusb    mm4,mm0
  365.   paddusb    mm5,mm2
  366.   paddusb    mm4,mm6
  367.   paddusb    mm5,mm6
  368.   movq       [edi],mm4
  369.   movq       [edi+8],mm5
  370.   add        edi,ebx
  371.   add        esi,ebx
  372.   dec        ecx
  373.   jnz        near .recva1
  374.   emms
  375.   pop        edx
  376.   pop        ebx
  377.   pop        ecx
  378.   pop        edi
  379.   pop        esi
  380.   ret
  381.   align 16
  382. recvac:
  383.   push       esi
  384.   push       edi
  385.   push       ecx
  386.   push       ebx
  387.   push       edx
  388.   mov        esi, [esp+source]
  389.   mov        edi, [esp+dest]
  390.   mov        ecx, [esp+h]
  391.   mov        ebx, [esp+lx2]
  392.   mov        edx, [esp+lx]
  393.   movq      mm5, [MASK_AND]
  394.   movq      mm6, [ADD_1]
  395. .recvac1:
  396.   movq       mm0,[esi]
  397.   movq       mm1,[esi+edx]
  398.   movq       mm4,[edi]
  399.   psrlw      mm0,1
  400.   psrlw      mm1,1
  401.   psrlw      mm4,1
  402.   pand       mm0,mm5
  403.   pand       mm1,mm5
  404.   pand       mm4,mm5
  405.   paddusb    mm0,mm1
  406.   paddusb    mm0,mm6
  407.   psrlw      mm0,1
  408.   pand       mm0,mm5
  409.   paddusb    mm4,mm0
  410.   paddusb    mm4,mm6
  411.   movq       [edi],mm4
  412.   add        edi,ebx
  413.   add        esi,ebx
  414.   dec        ecx
  415.   jnz        .recvac1
  416.   emms
  417.   pop        edx
  418.   pop        ebx
  419.   pop        ecx
  420.   pop        edi
  421.   pop        esi
  422.   ret
  423. %assign RegisterStorageSize  20
  424. %assign rfp                       LocalFrameSize + RegisterStorageSize +  4
  425. %assign bp                        LocalFrameSize + RegisterStorageSize +  8
  426. %assign iincr                     LocalFrameSize + RegisterStorageSize + 12
  427. ; FIXME clipping needs to be done
  428.   align 16
  429. add_block_mmx:
  430.   push       esi
  431.   push       edi
  432.   push       ecx
  433.   push       ebx
  434.   push       edx
  435.   mov        esi, [esp+bp]
  436.   mov        edi, [esp+rfp]
  437.   mov        ebx, [esp+iincr]
  438. ;  movq       mm7, [PLUS_384]
  439.   mov        ecx,8
  440.   pxor        mm2,mm2 ; clear
  441. %rep 8
  442.   movq       mm0, [edi] ; get dest
  443.   movq      mm1,mm0
  444.   punpcklbw  mm0,mm2
  445.   punpckhbw  mm1,mm2
  446.   paddsw     mm0, [esi]
  447.   paddsw     mm1, [esi+8]
  448. ;  paddsw     mm0, mm7
  449. ;  paddsw     mm1, mm7
  450.   packuswb   mm0,mm1      
  451.   movq      [edi], mm0
  452.   add        edi,ebx
  453.   add      esi,16
  454. %endrep
  455.   emms
  456.   pop        edx
  457.   pop      ebx
  458.   pop        ecx
  459.   pop        edi
  460.   pop        esi
  461.   ret
  462.   align 16
  463. set_block_mmx:
  464.   push       esi
  465.   push       edi
  466.   push       ecx
  467.   push       ebx
  468.   push       edx
  469.   mov        esi, [esp+bp]
  470.   mov        edi, [esp+rfp]
  471.   mov        ebx, [esp+iincr]
  472.   movq       mm7, [PLUS_128]
  473. %rep 4
  474.   movq       mm0, [esi]
  475.   movq       mm1, [esi+8]
  476.   paddsw     mm0, mm7
  477.   movq       mm2, [esi+16]
  478.   paddsw     mm1, mm7
  479.   movq       mm3, [esi+24]
  480.   paddsw     mm2, mm7
  481.   packuswb   mm0, mm1
  482.   paddsw     mm3, mm7
  483.   movq       [edi], mm0
  484.   packuswb   mm2, mm3
  485.   add        edi, ebx
  486.   add        esi, 32
  487.   movq       [edi], mm2
  488.   add        edi, ebx
  489. %endrep
  490.   emms
  491.   pop        edx
  492.   pop        ebx
  493.   pop        ecx
  494.   pop        edi
  495.   pop        esi
  496.   ret
  497. ;
  498. ;_64_minus_index: dd 64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34
  499. ; dd 33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
  500. ;
  501. ;extern     _buf_pointer
  502. ;extern     _end_buf
  503. ;extern     _bit_count
  504. ;
  505. ;
  506. ;global    _getbits
  507. ;_getbits:
  508. ;
  509. ;        mov     eax, [_bit_count]               ; Number of valid bits in MM0
  510. ;        mov     ecx, [ESP+4]                     ; Parameter. How many bits should we
  511. ;                                                ; read.
  512. ;
  513. ;        sub     eax,ecx                         ; Do we have enough bits in MM0
  514. ;        jl      new64bit                        ; If not get new 64 bits
  515. ;
  516. ;        movd    MM3,[_64_minus_index+ecx*4]      ;MM3 = 64 - number of needed bits.
  517. ;        movq    MM2,MM0
  518. ;
  519. ;        movd            mm1,ecx                 ; # of bits to read
  520. ;        psrlq   MM2,MM3                         ; MM2 now has valid bitstream in least
  521. ;                                                ; significant part
  522. ;
  523. ;        mov     [_bit_count],eax                ; Update number of valid bits.
  524. ;
  525. ;        movd    eax,MM2                         ; move the result into eax
  526. ;        psllq   MM0,MM1                         ; throw away those bits
  527. ;
  528. ;        ret
  529. ;
  530. ;new64bit:
  531. ;        movd    MM3,[_64_minus_index+ecx*4]      ;MM3 = 64 - number of requested bits
  532. ;                                                ;(for shifting)
  533. ;        movq    MM2,MM0                         ; copy left over bits
  534. ;
  535. ;        mov     edx,[_buf_pointer]              ;pointer to bitstream
  536. ;        mov     ecx,[_end_buf]                    ;read pointer to end of buffer
  537. ;
  538. ;        add     edx,8                           ;update the pointer
  539. ;        add     eax,64                          ;eax = 64- # of bits we missed in old
  540. ;                                                ;group
  541. ;
  542. ;        cmp     edx,ecx                         ;do we have another qword to read
  543. ;        mov     [_buf_pointer],edx              ;save new value
  544. ;
  545. ;        mov     ecx,[edx-8]                     ;read next qword (dword here)
  546. ;        mov     edx,[edx-4]                     ;(dword here)
  547. ;
  548. ;        jge     do_refill                       ;do_refill
  549. ;refill:
  550. ;        ; now convert from bigendian to little and
  551. ;        ; but make use of left over bits (MM2) before using these
  552. ;        bswap   edx                             ;swapping the first 32 bit
  553. ;        bswap   ecx                             ;swapping the second 32 bit
  554. ;
  555. ;        movd            mm4,ecx                 ;second 32 bit in mm4
  556. ;        psrlq   mm2,mm3                         ;mm2 has remaining bits in least
  557. ;                                                ;significant part with room for new
  558. ;                                                ;bits to right of it
  559. ;        movd            mm1,edx                 ;move first 32 bit
  560. ;        psllq   mm4,32                          ;shiftsecond 32 bit to upper part of
  561. ;                                                ;register
  562. ;
  563. ;        movd    mm3,eax                         ;mm3 gets the shift counter
  564. ;        por     mm4,mm1                         ;combine the 64 swapped data into mm4
  565. ;
  566. ;        movq    mm0,mm4                         ;save new word in mm0 for next time
  567. ;        psrlq   mm4,mm3                         ;mm4 = new bits we now need in least
  568. ;                                                ;significant part
  569. ;
  570. ;        mov     [_bit_count],eax                   ;Save bit count for next time
  571. ;        por     mm2,mm4                         ;combine remaining bits with the bits
  572. ;                                                ;from new word
  573. ;
  574. ;        movd    mm1,[_64_minus_index+4*eax]      ;# of bits we missed in old group
  575. ;
  576. ;        movd    eax,mm2                         ;return bits in eax
  577. ;        psllq   mm0,mm1                         ;remove the bits we just
  578. ;                                                ;read from mm0
  579. ;
  580. ;        RET
  581. ;do_refill:
  582. ;        PUSH    EAX
  583. ;        PUSH    EDX
  584. ;        PUSH    ECX
  585. ;        CALL    _refill_buffer
  586. ;        POP     ECX
  587. ;        POP     EDX
  588. ;        POP     EAX
  589. ;        JMP     refill