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_spanutils_isse.asm < prev    next >
Encoding:
Assembly Source File  |  2009-09-14  |  4.1 KB  |  194 lines

  1.         section    .rdata, rdata, align=16
  2.  
  3. xfefefefefefefefe    dq    0fefefefefefefefeh
  4. xe0e0e0e0e0e0e0e0    dq    0e0e0e0e0e0e0e0e0h
  5. x0002000200020002    dq    00002000200020002h
  6.  
  7.         section    .text
  8.  
  9. ;==============================================================================
  10.         global _vdasm_horiz_expand2x_coaligned_ISSE
  11. _vdasm_horiz_expand2x_coaligned_ISSE:
  12.         mov            ecx, [esp+8]
  13.         mov            edx, [esp+4]
  14.         mov            eax, [esp+12]
  15. .xloop:
  16.         movq        mm0, [ecx]
  17.         movq        mm1, mm0
  18.         pavgb        mm0, [ecx+1]
  19.         movq        mm2, mm1
  20.         punpcklbw    mm1, mm0
  21.         punpckhbw    mm2, mm0
  22.  
  23.         movq        [edx], mm1
  24.         movq        [edx+8], mm2
  25.         add            edx, 16
  26.         add            ecx, 8
  27.  
  28.         sub            eax, 16
  29.         jne            .xloop
  30.         ret
  31.  
  32. ;==============================================================================
  33.         global    _vdasm_vert_average_13_ISSE
  34. _vdasm_vert_average_13_ISSE:
  35.         push    ebx
  36.         mov        ebx, [esp+12+4]
  37.         mov        ecx, [esp+8+4]
  38.         mov        edx, [esp+4+4]
  39.         mov        eax, [esp+16+4]
  40.  
  41.         add        ebx, eax
  42.         add        ecx, eax
  43.         add        edx, eax
  44.         neg        eax
  45.  
  46.         pcmpeqb    mm7, mm7
  47. .xloop:
  48.         movq    mm0, [ebx+eax]
  49.         movq    mm1, [ecx+eax]
  50.         movq    mm2, mm0
  51.  
  52.         movq    mm3, [ebx+eax+8]
  53.         pxor    mm0, mm7
  54.         pxor    mm1, mm7
  55.  
  56.         movq    mm4, [ecx+eax+8]
  57.         movq    mm5, mm3
  58.         pxor    mm3, mm7
  59.  
  60.         pxor    mm4, mm7
  61.         pavgb    mm0, mm1
  62.         pavgb    mm3, mm4
  63.  
  64.         pxor    mm0, mm7
  65.         pxor    mm3, mm7
  66.         pavgb    mm0, mm2
  67.  
  68.         movq    [edx+eax], mm0
  69.         pavgb    mm3, mm5
  70.  
  71.         movq    [edx+eax+8], mm3
  72.         add        eax, 16
  73.         jne        .xloop
  74.  
  75.         pop        ebx
  76.         ret
  77.  
  78. ;==============================================================================
  79.         global    _vdasm_vert_average_17_ISSE
  80. _vdasm_vert_average_17_ISSE:
  81.         push    ebx
  82.         mov        ebx, [esp+12+4]
  83.         mov        ecx, [esp+8+4]
  84.         mov        edx, [esp+4+4]
  85.         mov        eax, [esp+16+4]
  86.  
  87.         add        ebx, eax
  88.         add        ecx, eax
  89.         add        edx, eax
  90.         neg        eax
  91.  
  92.         ;r = avgup(avgdown(avgdown(a, b), a), a)
  93.         ;  = pavgb(~pavgb(pavgb(~a, ~b), ~a), a)
  94.         
  95.         pcmpeqb        mm7, mm7
  96. .xloop:
  97.         movq        mm0, [ecx+eax]
  98.         movq        mm1, [ebx+eax]
  99.         movq        mm2, mm0
  100.         pxor        mm0, mm7            ;~a
  101.         pxor        mm1, mm7            ;~b
  102.         pavgb        mm1, mm0            ;pavgb(~a, ~b) = ~avgdown(a, b)
  103.         pavgb        mm1, mm0            ;pavgb(~avgdown(a, b), ~a) = ~avgdown(avgdown(a, b), a)
  104.         pxor        mm1, mm7            ;avgdown(avgdown(a, b), a)
  105.         pavgb        mm1, mm2            ;pavgb(avgdown(avgdown(a, b), a), a) = round((7*a + b)/8)
  106.         movq        [edx+eax], mm1
  107.         
  108.         add        eax, 8
  109.         jne        .xloop
  110.  
  111.         pop        ebx
  112.         ret
  113.  
  114. ;==============================================================================
  115.         global    _vdasm_vert_average_35_ISSE
  116. _vdasm_vert_average_35_ISSE:
  117.         push    ebx
  118.         mov        ebx, [esp+12+4]
  119.         mov        ecx, [esp+8+4]
  120.         mov        edx, [esp+4+4]
  121.         mov        eax, [esp+16+4]
  122.  
  123.         add        ebx, eax
  124.         add        ecx, eax
  125.         add        edx, eax
  126.         neg        eax
  127.  
  128.         ;r = avgup(avgdown(avgdown(a, b), b), a)
  129.         ;  = pavgb(~pavgb(pavgb(~a, ~b), ~b), a)
  130.         
  131.         pcmpeqb        mm7, mm7
  132. .xloop:
  133.         movq        mm0, [ecx+eax]
  134.         movq        mm1, [ebx+eax]
  135.         movq        mm2, mm0
  136.         pxor        mm0, mm7        ;~a
  137.         pxor        mm1, mm7        ;~b
  138.         pavgb        mm0, mm1        ;avgup(~a, ~b) = ~avgdown(a, b)
  139.         pavgb        mm0, mm1        ;avgup(~avgdown(a, b), ~b) = ~avgdown(avgdown(a, b), b)
  140.         pxor        mm0, mm7        ;avgdown(avgdown(a, b), b)
  141.         pavgb        mm0, mm2        ;avgup(avgdown(avgdown(a, b), b), a) = round((5*a + 3*b) / 8)
  142.         movq        [edx+eax], mm0
  143.         
  144.         add        eax, 8
  145.         jne        .xloop
  146.  
  147.         pop        ebx
  148.         ret
  149.  
  150. ;==============================================================================
  151.         global    _vdasm_horiz_expand4x_coaligned_MMX
  152. _vdasm_horiz_expand4x_coaligned_MMX:
  153.         mov            edx, [esp+4]
  154.         mov            ecx, [esp+8]
  155.         mov            eax, [esp+12]
  156.         movq        mm6, qword [x0002000200020002]
  157.         pxor        mm7, mm7
  158. .xloop:
  159.         movd        mm0, [ecx]
  160.         movd        mm1, [ecx+1]
  161.         add            ecx, 4
  162.         punpcklbw    mm0, mm7
  163.         punpcklbw    mm1, mm7
  164.         psubw        mm1, mm0        ;x1
  165.         movq        mm2, mm1
  166.         paddw        mm1, mm6        ;x1 + 2
  167.         movq        mm3, mm1
  168.         paddw        mm2, mm2        ;x2
  169.         paddw        mm3, mm2        ;x3 + 2
  170.         paddw        mm2, mm6        ;x2 + 2
  171.         psraw        mm1, 2            ;x1/4
  172.         psraw        mm2, 2            ;x2/4
  173.         psraw        mm3, 2            ;x3/4
  174.         paddw        mm1, mm0
  175.         paddw        mm2, mm0
  176.         paddw        mm3, mm0
  177.         movd        mm0, [ecx-4]
  178.         packuswb    mm1, mm1
  179.         packuswb    mm2, mm2
  180.         packuswb    mm3, mm3
  181.         punpcklbw    mm0, mm1
  182.         punpcklbw    mm2, mm3
  183.         movq        mm1, mm0
  184.         punpcklwd    mm0, mm2
  185.         punpckhwd    mm1, mm2
  186.         
  187.         movq        [edx], mm0
  188.         movq        [edx+8], mm1
  189.         add            edx, 16
  190.         sub            eax, 1
  191.         jne            .xloop
  192.         
  193.         ret
  194.