home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 275 / DPCS0111DVD.ISO / Toolkit / Audio-Visual / VirtualDub / Source / VirtualDub-1.9.10-src.7z / src / Kasumi / source / a_stretchrgb_mmx.asm < prev    next >
Encoding:
Assembly Source File  |  2009-09-14  |  5.7 KB  |  327 lines

  1.         segment    .rdata, align=16
  2.  
  3. x0020w            dq    00020002000200020h
  4. rb_mask_555        dq    07c1f7c1f7c1f7c1fh
  5. g_mask_555        dq    003e003e003e003e0h
  6. rb_mask_888        dq    000ff00ff00ff00ffh
  7. g_mask_888        dq    00000ff000000ff00h
  8.  
  9.         segment    .text
  10.  
  11.         struc    VDPixmapReferenceStretchBltBilinearParameters
  12. .dst        resd    1
  13. .src        resd    1
  14. .u            resd    1
  15. .uinc        resd    1
  16. .dudx        resd    1
  17.  
  18. .xprepos    resd    1
  19. .xpostpos    resd    1
  20. .xprecopy    resd    1
  21. .xpostcopy    resd    1
  22. .xmidsize    resd    1
  23.         endstruc
  24.  
  25.  
  26.  
  27.         global    _vdasm_stretchbltV_XRGB1555_to_XRGB1555_MMX
  28. _vdasm_stretchbltV_XRGB1555_to_XRGB1555_MMX:
  29.         push        ebp
  30.         push        edi
  31.         push        esi
  32.         push        ebx
  33.  
  34.         mov            eax, [esp+20+16]
  35.         and            eax, 0f8000000h
  36.         mov            ebx, [esp+8+16]
  37.         mov            ecx, [esp+12+16]
  38.         jz            .noreverse
  39.         xchg        ebx, ecx
  40.         js            .noreverse
  41.         neg            eax
  42.         xchg        ebx, ecx
  43. .noreverse:
  44.         shr            eax, 16
  45.         mov            [esp+20+16], eax
  46.         mov            edx, [esp+4+16]
  47.         mov            eax, [esp+16+16]
  48.         add            eax, eax
  49.         lea            ebx, [ebx+eax-6]
  50.         lea            ecx, [ecx+eax-6]
  51.         lea            edx, [edx+eax-6]
  52.         neg            eax
  53.  
  54.         movd        mm4, dword [esp+20+16]
  55.         punpcklwd    mm4, mm4
  56.         punpckldq    mm4, mm4
  57.  
  58.         movq        mm6, [rb_mask_555]
  59.         movq        mm7, [g_mask_555]
  60.  
  61. .xstart:
  62.         add            eax, 6
  63.         jbe            .doodd
  64. .xloop:
  65.         movq        mm0, [ebx+eax]
  66.         movq        mm1, [ecx+eax]
  67.         movq        mm2, mm7
  68.         movq        mm3, mm7
  69.  
  70.         pand        mm2, mm0
  71.         pand        mm3, mm1
  72.         pand        mm0, mm6
  73.         pand        mm1, mm6
  74.  
  75.         psubw        mm3, mm2
  76.         psubw        mm1, mm0
  77.  
  78.         pmulhw        mm3, mm4
  79.         pmulhw        mm1, mm4
  80.  
  81.         psubw        mm0, mm1
  82.         psubw        mm2, mm3
  83.  
  84.         pand        mm0, mm6
  85.         pand        mm2, mm7
  86.  
  87.         paddw        mm0, mm2
  88.  
  89.         movq        [edx+eax], mm0
  90.         add            eax, 8
  91.         jnc            .xloop
  92.  
  93. .doodd:
  94.         sub            eax, 6
  95.         jz            .noodd
  96. .odd:
  97.         movzx        esi, word [ebx+eax+6]
  98.         movd        mm0, esi
  99.         movzx        esi, word [ecx+eax+6]
  100.         movd        mm1, esi
  101.         movq        mm2, mm7
  102.         movq        mm3, mm7
  103.  
  104.         pand        mm2, mm0
  105.         pand        mm3, mm1
  106.         pand        mm0, mm6
  107.         pand        mm1, mm6
  108.  
  109.         psubw        mm3, mm2
  110.         psubw        mm1, mm0
  111.  
  112.         pmulhw        mm3, mm4
  113.         pmulhw        mm1, mm4
  114.  
  115.         psubw        mm0, mm1
  116.         psubw        mm2, mm3
  117.  
  118.         pand        mm0, mm6
  119.         pand        mm2, mm7
  120.  
  121.         paddw        mm0, mm2
  122.  
  123.         movd        esi, mm0
  124.         mov            [edx+eax+6], si
  125.         add            eax,2
  126.         jne            .odd
  127.  
  128. .noodd:
  129.         emms
  130.         pop            ebx
  131.         pop            esi
  132.         pop            edi
  133.         pop            ebp
  134.         ret
  135.  
  136.  
  137.     global    _vdasm_stretchbltH_XRGB8888_to_XRGB8888_MMX
  138. _vdasm_stretchbltH_XRGB8888_to_XRGB8888_MMX:
  139.         push        ebp
  140.         push        edi
  141.         push        esi
  142.         push        ebx
  143.  
  144.         mov            edx, [esp+4+16]
  145.  
  146.         mov            ebx, [edx+VDPixmapReferenceStretchBltBilinearParameters.src]
  147.         mov            edi, [edx+VDPixmapReferenceStretchBltBilinearParameters.dst]
  148.  
  149.         mov            ecx, [edx+VDPixmapReferenceStretchBltBilinearParameters.xprecopy]
  150.         or            ecx, ecx
  151.         jz            .noprecopy
  152.         mov            eax, [edx+VDPixmapReferenceStretchBltBilinearParameters.xprepos]
  153.         mov            eax, [ebx+eax]
  154.         lea            ebp, [ecx*4]
  155.         sub            edi, ebp
  156.         rep            stosd
  157. .noprecopy:
  158.         mov            ebp, [edx+VDPixmapReferenceStretchBltBilinearParameters.xmidsize]
  159.         add            ebp, ebp
  160.         add            ebp, ebp
  161.         add            edi, ebp
  162.         neg            ebp
  163.  
  164.         mov            esi, [edx+VDPixmapReferenceStretchBltBilinearParameters.u]
  165.         mov            eax, [edx+VDPixmapReferenceStretchBltBilinearParameters.dudx]
  166.         mov            edx, [edx+VDPixmapReferenceStretchBltBilinearParameters.uinc]
  167.         movd        mm2, esi
  168.         movd        mm3, eax
  169.         shr            ebx, 2
  170.  
  171.         movq        mm5, mm2
  172.         punpcklwd    mm5, mm5
  173.         punpckhdq    mm5, mm5
  174.         movq        mm4, mm5
  175.         psraw        mm4, 15
  176.  
  177. .xloop:
  178.         movd        mm0, dword [ebx*4]
  179.         pxor        mm7, mm7
  180.         movd        mm1, dword [ebx*4+4]
  181.         punpcklbw    mm0, mm7
  182.         punpcklbw    mm1, mm7
  183.         psubw        mm1, mm0
  184.         pand        mm4, mm1
  185.         pmulhw        mm1, mm5
  186.         paddw        mm1, mm4
  187.         paddw        mm0, mm1
  188.         packuswb    mm0, mm0
  189.         movd        dword [edi+ebp], mm0
  190.  
  191.         add            esi, eax
  192.         adc            ebx, edx
  193.  
  194.         paddd        mm2, mm3
  195.         movq        mm5, mm2
  196.         punpcklwd    mm5, mm5
  197.         punpckhdq    mm5, mm5
  198.         movq        mm4, mm5
  199.         psraw        mm4, 15
  200.         add            ebp, 4
  201.         jnz            .xloop
  202.  
  203.         mov            edx, [esp+4+16]
  204.         mov            ecx, [edx+VDPixmapReferenceStretchBltBilinearParameters.xpostcopy]
  205.         or            ecx, ecx
  206.         jz            .nopostcopy
  207.         mov            eax, [edx+VDPixmapReferenceStretchBltBilinearParameters.xpostpos]
  208.         add            eax, [edx+VDPixmapReferenceStretchBltBilinearParameters.src]
  209.         mov            eax, [eax]
  210.         rep            stosd
  211. .nopostcopy:
  212.  
  213.         emms
  214.         pop            ebx
  215.         pop            esi
  216.         pop            edi
  217.         pop            ebp
  218.         ret
  219.  
  220.     global    _vdasm_stretchbltV_XRGB8888_to_XRGB8888_MMX
  221. _vdasm_stretchbltV_XRGB8888_to_XRGB8888_MMX:
  222.         push        ebp
  223.         push        edi
  224.         push        esi
  225.         push        ebx
  226.  
  227.         mov            eax, [esp+20+16]
  228.         and            eax, 0ff000000h
  229.         mov            ebx, [esp+8+16]
  230.         mov            ecx, [esp+12+16]
  231.         jz            .noreverse
  232.         xchg        ebx, ecx
  233.         js            .noreverse
  234.         neg            eax
  235.         xchg        ebx, ecx
  236. .noreverse:
  237.         shr            eax, 16
  238.         mov            [esp+20+16], eax
  239.         mov            edx, [esp+4+16]
  240.         mov            eax, [esp+16+16]
  241.         add            eax, eax
  242.         add            eax, eax
  243.         lea            ebx, [ebx+eax-4]
  244.         lea            ecx, [ecx+eax-4]
  245.         lea            edx, [edx+eax-4]
  246.         neg            eax
  247.  
  248.         movd        mm4, dword [esp+20+16]
  249.         punpcklwd    mm4, mm4
  250.         punpckldq    mm4, mm4
  251.  
  252.         movq        mm6, [rb_mask_888]
  253.         movq        mm7, [g_mask_888]
  254.  
  255. .xstart:
  256.         add            eax, 4
  257.         jbe            .doodd
  258. .xloop:
  259.         movq        mm0, [ebx+eax]
  260.         movq        mm1, [ecx+eax]
  261.         movq        mm2, mm0
  262.         movq        mm3, mm1
  263.         psrlw        mm2, 8
  264.         psrlw        mm3, 8
  265.         pand        mm0, mm6
  266.         pand        mm1, mm6
  267.  
  268.         psubw        mm3, mm2
  269.         psubw        mm1, mm0
  270.  
  271.         pmulhw        mm3, mm4
  272.         pmulhw        mm1, mm4
  273.  
  274.         psubw        mm0, mm1
  275.         psubw        mm2, mm3
  276.  
  277.         pand        mm0, mm6
  278.  
  279.         psllw        mm2, 8
  280.  
  281.         paddw        mm0, mm2
  282.  
  283.         movq        qword [edx+eax], mm0
  284.         add            eax, 8
  285.         jnc            .xloop
  286.  
  287. .doodd:
  288.         sub            eax, 4
  289.         jz            .noodd
  290. .odd:
  291.         movd        mm0, dword [ebx]
  292.         movd        mm1, dword [ecx]
  293.         movq        mm2, mm0
  294.         movq        mm3, mm1
  295.         psrlw        mm2, 8
  296.         psrlw        mm3, 8
  297.         pand        mm0, mm6
  298.         pand        mm1, mm6
  299.  
  300.         psubw        mm3, mm2
  301.         psubw        mm1, mm0
  302.  
  303.         pmulhw        mm3, mm4
  304.         pmulhw        mm1, mm4
  305.  
  306.         psubw        mm0, mm1
  307.         psubw        mm2, mm3
  308.  
  309.         pand        mm0, mm6
  310.  
  311.         psllw        mm2, 8
  312.  
  313.         paddw        mm0, mm2
  314.  
  315.         movd        dword [edx], mm0
  316.  
  317. .noodd:
  318.         emms
  319.         pop            ebx
  320.         pop            esi
  321.         pop            edi
  322.         pop            ebp
  323.         ret
  324.  
  325.  
  326.         end
  327.