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_bltrgb_mmx.asm next >
Encoding:
Assembly Source File  |  2009-09-14  |  15.1 KB  |  807 lines

  1.         section    .rdata, rdata
  2.  
  3. x07b        dq        00707070707070707h
  4. x0200w        dq        00200020002000200h
  5. x001fw        dq        0001f001f001f001fh
  6. xffc0w        dq        0ffc0ffc0ffc0ffc0h
  7. xffe0w        dq        0ffe0ffe0ffe0ffe0h
  8. x2080w        dq        02080208020802080h
  9. x4200w        dq        04200420042004200h
  10. rb_mask5    dq        000f800f800f800f8h
  11. g_mask5        dq        00000f8000000f800h
  12. g_mask6        dq        00000fc000000fc00h
  13. rb_mul_565    dq        02000000420000004h
  14. rb_mul_555    dq        02000000820000008h
  15. r_mask_555    dq        07c007c007c007c00h
  16. g_mask_555    dq        003e003e003e003e0h
  17. b_mask_555    dq        0001f001f001f001fh
  18. r_mask_565    dq        0f800f800f800f800h
  19. g_mask_565    dq        007e007e007e007e0h
  20. b_mask_565    dq        0001f001f001f001fh
  21.  
  22. %macro prologue 1
  23.             push    ebx
  24.             push    esi
  25.             push    edi
  26.             push    ebp
  27.             ;.fpo    (0,%1,4,4,1,0)
  28. %endmacro
  29.  
  30. %macro epilogue 0
  31.             pop        ebp
  32.             pop        edi
  33.             pop        esi
  34.             pop        ebx
  35. %endmacro
  36.  
  37.         section    .text
  38.  
  39.     global    _vdasm_pixblt_RGB565_to_XRGB1555_MMX
  40. _vdasm_pixblt_RGB565_to_XRGB1555_MMX:
  41.         prologue    6
  42.  
  43.         mov        ebp, [esp+20+16]
  44.         mov        edi, [esp+24+16]
  45.         add        ebp, ebp
  46.         mov        edx, [esp+4+16]
  47.         mov        ecx, [esp+12+16]
  48.         lea        edx, [edx+ebp-6]
  49.         lea        ecx, [ecx+ebp-6]
  50.         neg        ebp
  51.         mov        [esp+20+16], ebp
  52.  
  53.         movq    mm5, [x001fw]
  54.         movq    mm4, [xffc0w]
  55.  
  56. .yloop:
  57.         mov        ebp, [esp+20+16]
  58.         add        ebp, 6
  59.         jbe        .odd
  60.  
  61. .xloop:
  62.         movq    mm0, [ecx+ebp]
  63.         movq    mm1, mm5
  64.         pand    mm1, mm0
  65.         pand    mm0, mm4
  66.         psrlq    mm0, 1
  67.         paddw    mm0, mm1
  68.         movq    [edx+ebp], mm0
  69.         add        ebp, 8
  70.         jnc        .xloop
  71.  
  72.         sub        ebp, 6
  73.         jz        .noodd
  74. .odd:
  75.         movzx    eax, word [ecx+ebp+6]
  76.         mov        ebx, 0001f001fh
  77.         and        ebx, eax
  78.         and        eax, 0ffc0ffc0h
  79.         shr        eax, 1
  80.         add        eax, ebx
  81.         mov        [edx+ebp+6], ax
  82.         add        ebp, 2
  83.         jnz        .odd
  84. .noodd:
  85.         add        ecx, [esp+16+16]
  86.         add        edx, [esp+8+16]
  87.         dec        edi
  88.         jne        .yloop
  89.  
  90.         emms
  91.         epilogue
  92.         ret
  93.  
  94.     global    _vdasm_pixblt_XRGB8888_to_XRGB1555_MMX
  95. _vdasm_pixblt_XRGB8888_to_XRGB1555_MMX:
  96.         prologue    6
  97.  
  98.         mov        ebp, [esp+20+16]
  99.         mov        edi, [esp+24+16]
  100.         add        ebp, ebp
  101.         mov        edx, [esp+4+16]
  102.         mov        ecx, [esp+12+16]
  103.         lea        edx, [edx+ebp-14]
  104.         lea        ecx, [ecx+ebp*2-28]
  105.         neg        ebp
  106.         mov        [esp+20+16], ebp
  107.  
  108.         movq        mm5,[rb_mul_555]
  109.         movq        mm6,[rb_mask5]
  110.         movq        mm7,[g_mask5]
  111.  
  112. .yloop:
  113.         mov            ebp, [esp+20+16]
  114.         add            ebp, 14
  115.         jbe            .odd
  116.  
  117.         ;This code uses the "pmaddwd" trick for 32->16 conversions from Intel's MMX
  118.         ;Application Notes.
  119.  
  120.         movq        mm0,[ecx+ebp*2]        ;allocate 0    (0123)
  121.         movq        mm2,mm0                ;allocate 2    (0 23)
  122.  
  123.         movq        mm1,[ecx+ebp*2+8]    ;allocate 1    (0123)
  124.         movq        mm3,mm1                ;allocate 3    (0123)
  125.         pand        mm0,mm6
  126.         pmaddwd        mm0,mm5
  127.         pand        mm1,mm6
  128.         pmaddwd        mm1,mm5
  129.         pand        mm2,mm7
  130.         pand        mm3,mm7
  131.         jmp            .xloopstart
  132.  
  133.         align 16
  134. .xloop:
  135.         movq        mm0,[ecx+ebp*2]        ;allocate 0    (01234)
  136.         por            mm4,mm2                ;free 2        (01 34)
  137.  
  138.         por            mm3,mm1                ;free 3        (01 34)
  139.         movq        mm2,mm0                ;allocate 2    (0 234)
  140.  
  141.         movq        mm1,[ecx+ebp*2+8]    ;allocate 1    (01234)
  142.         psrld        mm4,6
  143.  
  144.         psrld        mm3,6
  145.         pand        mm0,mm6
  146.  
  147.         packssdw    mm4,mm3                ;free 3        (012 4)
  148.         movq        mm3,mm1                ;allocate 3    (01234)
  149.  
  150.         pmaddwd        mm0,mm5
  151.         pand        mm1,mm6
  152.  
  153.         pmaddwd        mm1,mm5
  154.         pand        mm2,mm7
  155.  
  156.         movq        [edx+ebp-8],mm4        ;free 4        (0123 )
  157.         pand        mm3,mm7
  158.  
  159. .xloopstart:
  160.         movq        mm4,[ecx+ebp*2+16]    ;allocate 4    (01234)
  161.         por            mm0,mm2                ;free 2        (01 34)
  162.  
  163.         por            mm1,mm3                ;free 3        (01  4)
  164.         psrld        mm0,6
  165.  
  166.         movq        mm3,[ecx+ebp*2+24]    ;allocate 3    (01 34)
  167.         movq        mm2,mm4                ;allocate 2    (01234)
  168.  
  169.         psrld        mm1,6
  170.         pand        mm4,mm6
  171.  
  172.         packssdw    mm0,mm1                ;free 1        (0 234)
  173.         movq        mm1,mm3                ;allocate 1    (01234)
  174.  
  175.         movq        [edx+ebp],mm0        ;free 0        ( 1234)
  176.         pand        mm3,mm6
  177.  
  178.         pmaddwd        mm4,mm5
  179.         add            ebp,16
  180.  
  181.         pmaddwd        mm3,mm5
  182.         pand        mm2,mm7
  183.  
  184.         pand        mm1,mm7
  185.         jnc            .xloop
  186.  
  187.         por            mm4,mm2                ;free 2        (01 34)
  188.         por            mm3,mm1                ;free 3        (01 34)
  189.         psrld        mm4,6
  190.         psrld        mm3,6
  191.         packssdw    mm4,mm3                ;free 3        (012 4)
  192.         movq        [edx+ebp-8],mm4        ;free 4        (0123 )
  193.  
  194. .odd:
  195.         sub            ebp, 14
  196.         jz            .noodd
  197. .oddloop:
  198.         mov            eax, [ecx+ebp*2+28]
  199.         mov            ebx, 00f80000h
  200.         mov            esi, eax
  201.         and            ebx, eax
  202.         shr            ebx, 9
  203.         and            esi, 0000f800h
  204.         shr            esi, 6
  205.         and            eax, 000000f8h
  206.         shr            eax, 3
  207.         add            esi, ebx
  208.         add            eax, esi
  209.         mov            [edx+ebp+14], ax
  210.         add            ebp, 2
  211.         jnz            .oddloop
  212. .noodd:
  213.         add        ecx, [esp+16+16]
  214.         add        edx, [esp+8+16]
  215.         dec        edi
  216.         jne        .yloop
  217.  
  218.         emms
  219.         epilogue
  220.         ret
  221.  
  222.     global    _vdasm_pixblt_XRGB1555_to_RGB565_MMX
  223. _vdasm_pixblt_XRGB1555_to_RGB565_MMX:
  224.         prologue    6
  225.  
  226.         mov        ebp, [esp+20+16]
  227.         mov        edi, [esp+24+16]
  228.         add        ebp, ebp
  229.         mov        edx, [esp+4+16]
  230.         mov        ecx, [esp+12+16]
  231.         lea        edx, [edx+ebp-6]
  232.         lea        ecx, [ecx+ebp-6]
  233.         neg        ebp
  234.         mov        [esp+20+16], ebp
  235.  
  236.         movq    mm5, [x0200w]
  237.         movq    mm4, [xffe0w]
  238.  
  239. .yloop:
  240.         mov        ebp, [esp+20+16]
  241.         add        ebp, 6
  242.         jbe        .odd
  243.  
  244. .xloop:
  245.         movq    mm0, [ecx+ebp]
  246.         movq    mm1, mm4
  247.         movq    mm2, mm0
  248.         pand    mm1, mm0
  249.         pand    mm0, mm5
  250.         paddw    mm1, mm2
  251.         psrlq    mm0, 4
  252.         paddw    mm0, mm1
  253.         movq    [edx+ebp], mm0
  254.         add        ebp, 8
  255.         jnc        .xloop
  256.  
  257. .odd:
  258.         sub        ebp, 6
  259.         jz        .noodd
  260. .oddloop:
  261.         movzx    eax, word [ecx+ebp+6]
  262.         mov        ebx, 02000200h
  263.         mov        esi, eax
  264.         and        ebx, eax
  265.         shr        ebx, 4
  266.         and        esi, 0ffe0ffe0h
  267.         add        eax, esi
  268.         add        eax, ebx
  269.         mov        [edx+ebp+6], ax
  270.         add        ebp, 2
  271.         jnz        .oddloop
  272. .noodd:
  273.         add        ecx, [esp+16+16]
  274.         add        edx, [esp+8+16]
  275.         dec        edi
  276.         jne        .yloop
  277.  
  278.         emms
  279.         epilogue
  280.         ret
  281.  
  282.  
  283.     global    _vdasm_pixblt_XRGB8888_to_RGB565_MMX
  284. _vdasm_pixblt_XRGB8888_to_RGB565_MMX:
  285.         prologue    6
  286.  
  287.         mov        ebp, [esp+20+16]
  288.         mov        edi, [esp+24+16]
  289.         add        ebp, ebp
  290.         mov        edx, [esp+4+16]
  291.         mov        ecx, [esp+12+16]
  292.         lea        edx, [edx+ebp-14]
  293.         lea        ecx, [ecx+ebp*2-28]
  294.         neg        ebp
  295.         mov        [esp+20+16], ebp
  296.  
  297.         movq        mm5,[rb_mul_565]
  298.         movq        mm6,[rb_mask5]
  299.         movq        mm7,[g_mask6]
  300.  
  301. .yloop:
  302.         mov            ebp, [esp+20+16]
  303.         add            ebp, 14
  304.         jbe            .odd
  305.  
  306.         ;This code uses the "pmaddwd" trick for 32->16 conversions from Intel's MMX
  307.         ;Application Notes.
  308.  
  309.         movq        mm0,[ecx+ebp*2]        ;allocate 0    (0123)
  310.         movq        mm2,mm0                ;allocate 2    (0 23)
  311.  
  312.         movq        mm1,[ecx+ebp*2+8]    ;allocate 1    (0123)
  313.         movq        mm3,mm1                ;allocate 3    (0123)
  314.         pand        mm0,mm6
  315.         pmaddwd        mm0,mm5
  316.         pand        mm1,mm6
  317.         pmaddwd        mm1,mm5
  318.         pand        mm2,mm7
  319.         pand        mm3,mm7
  320.         jmp            .xloopstart
  321.  
  322.         align 16
  323. .xloop:
  324.         movq        mm0,[ecx+ebp*2]        ;allocate 0    (01234)
  325.         por            mm4,mm2                ;free 2        (01 34)
  326.  
  327.         por            mm3,mm1                ;free 3        (01 34)
  328.         pslld        mm4,16-5
  329.  
  330.         pslld        mm3,16-5
  331.         movq        mm2,mm0                ;allocate 2    (0 234)
  332.  
  333.         movq        mm1,[ecx+ebp*2+8]    ;allocate 1    (01234)
  334.         psrad        mm4,16
  335.  
  336.         psrad        mm3,16
  337.         pand        mm0,mm6
  338.  
  339.         packssdw    mm4,mm3                ;free 3        (012 4)
  340.         movq        mm3,mm1                ;allocate 3    (01234)
  341.  
  342.         pmaddwd        mm0,mm5
  343.         pand        mm1,mm6
  344.  
  345.         pmaddwd        mm1,mm5
  346.         pand        mm2,mm7
  347.  
  348.         movq        [edx+ebp-8],mm4        ;free 4        (0123 )
  349.         pand        mm3,mm7
  350.  
  351. .xloopstart:
  352.         movq        mm4,[ecx+ebp*2+16]    ;allocate 4    (01234)
  353.         por            mm0,mm2                ;free 2        (01 34)
  354.  
  355.         por            mm1,mm3                ;free 3        (01  4)
  356.         pslld        mm0,16-5
  357.  
  358.         movq        mm3,[ecx+ebp*2+24]    ;allocate 3    (01 34)
  359.         pslld        mm1,16-5
  360.  
  361.         psrad        mm0,16
  362.         movq        mm2,mm4                ;allocate 2    (01234)
  363.  
  364.         psrad        mm1,16
  365.         pand        mm4,mm6
  366.  
  367.         packssdw    mm0,mm1                ;free 1        (0 234)
  368.         movq        mm1,mm3                ;allocate 1    (01234)
  369.  
  370.         movq        [edx+ebp],mm0        ;free 0        ( 1234)
  371.         pand        mm3,mm6
  372.  
  373.         pmaddwd        mm4,mm5
  374.         add            ebp,16
  375.  
  376.         pmaddwd        mm3,mm5
  377.         pand        mm2,mm7
  378.  
  379.         pand        mm1,mm7
  380.         jnc            .xloop
  381.  
  382.         por            mm4,mm2                ;free 2        (01 34)
  383.         por            mm3,mm1                ;free 3        (01 34)
  384.         psllq        mm4,16-5
  385.         psllq        mm3,16-5
  386.         psrad        mm4,16
  387.         psrad        mm3,16
  388.         packssdw    mm4,mm3                ;free 3        (012 4)
  389.         movq        [edx+ebp-8],mm4        ;free 4        (0123 )
  390.  
  391. .odd:
  392.         sub            ebp, 14
  393.         jz            .noodd
  394. .oddloop:
  395.         mov            eax, [ecx+ebp*2+28]
  396.         mov            ebx, 00f80000h
  397.         mov            esi, eax
  398.         and            ebx, eax
  399.         and            eax, 000000f8h
  400.         shr            eax, 3
  401.         and            esi, 0000fc00h
  402.         shr            ebx, 8
  403.         shr            esi, 5
  404.         add            eax, ebx
  405.         add            eax, esi
  406.         mov            [edx+ebp+14], ax
  407.         add            ebp, 2
  408.         jnz            .oddloop
  409. .noodd:
  410.         add        ecx, [esp+16+16]
  411.         add        edx, [esp+8+16]
  412.         dec        edi
  413.         jne        .yloop
  414.  
  415.         emms
  416.         epilogue
  417.         ret
  418.  
  419.     global    _vdasm_pixblt_XRGB8888_to_RGB888_MMX
  420. _vdasm_pixblt_XRGB8888_to_RGB888_MMX:
  421.         prologue    6
  422.  
  423.         mov            esi,[esp+12+16]
  424.         mov            edi,[esp+4+16]
  425.  
  426.         mov            ecx,[esp+20+16]
  427.         lea            eax,[ecx+ecx*2]
  428.         lea            ebx,[ecx*4]
  429.         sub            [esp+8+16],eax
  430.         sub            [esp+16+16],ebx
  431.         
  432.         pcmpeqb        mm7,mm7
  433.         psrld        mm7,8
  434.         movq        mm6,mm7
  435.         psllq        mm7,32            ;mm7 = high rgb mask
  436.         psrlq        mm6,32            ;mm6 = low rgb mask
  437.         
  438.         mov            ebp,[esp+20+16]
  439.         mov            edx,[esp+24+16]
  440.         mov            eax,[esp+16+16]
  441.         mov            ebx,[esp+ 8+16]
  442. .yloop:
  443.         mov            ecx,ebp
  444.         shr            ecx,3
  445.         jz            .checkodd
  446. .xloop:
  447.         movq        mm0,[esi]        ;mm0 = a1r1g1b1a0r0g0b0
  448.         movq        mm1,mm6
  449.         
  450.         movq        mm2,[esi+8]        ;mm2 = a3r3g3b3a2r2g2b2
  451.         pand        mm1,mm0            ;mm1 = ----------r0g0b0
  452.         
  453.         movq        mm3,mm6
  454.         pand        mm0,mm7            ;mm0 = --r1g1b1--------
  455.         
  456.         movq        mm4,mm2
  457.         pand        mm3,mm2            ;mm3 = ----------r2g2b2
  458.         
  459.         psrlq        mm0,8            ;mm0 = ----r1g1b1------
  460.         pand        mm2,mm7            ;mm2 = --r3g3b3--------
  461.         
  462.         movq        mm5,[esi+16]    ;mm5 = a5r5g5b5a4r4g4b4
  463.         psllq        mm4,48            ;mm4 = g2b2------------
  464.         
  465.         por            mm0,mm1            ;mm0 = ----r1g1b1r0g0b0
  466.         psrlq        mm3,16            ;mm3 = --------------r2
  467.         
  468.         por            mm0,mm4            ;mm0 = g2b2r1g1b1r0g0b0
  469.         movq        mm1,mm6
  470.         
  471.         pand        mm1,mm5            ;mm1 = ----------r4g4b4
  472.         psrlq        mm2,24            ;mm2 = --------r3g3b3--
  473.         
  474.         movq        [edi],mm0
  475.         pand        mm5,mm7            ;mm5 = --r5g5b5--------
  476.         
  477.         psllq        mm1,32            ;mm1 = --r4g4b4--------
  478.         movq        mm4,mm5            ;mm4 = --r5g5b5--------
  479.         
  480.         por            mm2,mm3            ;mm2 = --------r3g3b3r2
  481.         psllq        mm5,24            ;mm5 = b5--------------
  482.         
  483.         movq        mm3,[esi+24]    ;mm3 = a7r7g7b7a6r6g6b6
  484.         por            mm2,mm1            ;mm2 = --r4g4b4r3g3b3r2
  485.         
  486.         movq        mm1,mm6
  487.         por            mm2,mm5            ;mm2 = b5r4g4b4r3g3b3r2
  488.         
  489.         psrlq        mm4,40            ;mm4 = ------------r5g5
  490.         pand        mm1,mm3            ;mm1 = ----------r6g6b6
  491.         
  492.         psllq        mm1,16            ;mm1 = ------r6g6b6----    
  493.         pand        mm3,mm7            ;mm3 = --r7g7b7--------
  494.         
  495.         por            mm4,mm1            ;mm4 = ------r6g6b6r5g5
  496.         psllq        mm3,8            ;mm3 = r7g7b7----------
  497.         
  498.         movq        [edi+8],mm2
  499.         por            mm4,mm3            ;mm4 = r7g7b7r6g6b6r5g5
  500.         
  501.         add            esi,32
  502.         sub            ecx,1
  503.         
  504.         movq        [edi+16],mm4    ;mm3
  505.  
  506.         lea            edi,[edi+24]
  507.         jne            .xloop
  508.     
  509. .checkodd:
  510.         mov            ecx,ebp
  511.         and            ecx,7
  512.         jz            .noodd
  513.         movd        mm0,eax
  514. .oddloop:
  515.         mov            eax,[esi]
  516.         add            esi,4
  517.         mov            [edi],ax
  518.         shr            eax,16
  519.         mov            [edi+2],al
  520.         add            edi,3
  521.         sub            ecx,1
  522.         jnz            .oddloop
  523.         movd        eax,mm0
  524. .noodd:
  525.         add            esi,eax
  526.         add            edi,ebx
  527.  
  528.         sub            edx,1
  529.         jne            .yloop
  530.  
  531.         emms
  532.  
  533.         epilogue
  534.         ret
  535.  
  536.     global    _vdasm_pixblt_XRGB1555_to_XRGB8888_MMX
  537. _vdasm_pixblt_XRGB1555_to_XRGB8888_MMX:
  538.         prologue    6
  539.  
  540.         mov        ebp, [esp+20+16]
  541.         mov        edi, [esp+24+16]
  542.         add        ebp, ebp
  543.         mov        edx, [esp+4+16]
  544.         mov        ecx, [esp+12+16]
  545.         lea        edx, [edx+ebp*2-12]
  546.         lea        ecx, [ecx+ebp-6]
  547.         neg        ebp
  548.         mov        [esp+20+16], ebp
  549.  
  550.         movq    mm5, [r_mask_555]
  551.         movq    mm6, [g_mask_555]
  552.         movq    mm7, [b_mask_555]
  553.  
  554. .yloop:
  555.         mov        ebp, [esp+20+16]
  556.         add        ebp, 6
  557.         jbe        .odd
  558.  
  559. .xloop:
  560.         movq        mm0, [ecx+ebp]
  561.         movq        mm1, mm6
  562.         movq        mm2, mm7
  563.         pand        mm1, mm0
  564.         pand        mm2, mm0
  565.         pand        mm0, mm5
  566.  
  567.         paddw        mm0, mm0
  568.         pmulhw        mm1, [x4200w]
  569.         psllq        mm2, 3
  570.         paddw        mm0, mm2
  571.         movq        mm2, mm0
  572.         psrlw        mm0, 5
  573.         pand        mm0, [x07b]
  574.         paddw        mm0, mm2
  575.         movq        mm2, mm0
  576.         punpcklbw    mm0, mm1
  577.         punpckhbw    mm2, mm1
  578.  
  579.         movq    [edx+ebp*2], mm0
  580.         movq    [edx+ebp*2+8], mm2
  581.         add        ebp, 8
  582.         jnc        .xloop
  583. .odd:
  584.         sub        ebp, 6
  585.         jz        .noodd
  586. .oddloop:
  587.         movzx    eax, word [ecx+ebp+6]
  588.         mov        ebx, 03e0h
  589.         mov        esi, 001fh
  590.         and        ebx, eax
  591.         and        esi, eax
  592.         and        eax, 07c00h
  593.         shl        esi, 3
  594.         shl        ebx, 6
  595.         shl        eax, 9
  596.         add        ebx, esi
  597.         add        eax, ebx
  598.         mov        ebx, eax
  599.         shr        eax, 5
  600.         and        eax, 070707h
  601.         add        eax, ebx
  602.         mov        [edx+ebp*2+12], eax
  603.         add        ebp, 2
  604.         jnz        .oddloop
  605. .noodd:
  606.         add        ecx, [esp+16+16]
  607.         add        edx, [esp+8+16]
  608.         dec        edi
  609.         jne        .yloop
  610.  
  611.         emms
  612.         epilogue
  613.         ret
  614.  
  615.  
  616.     global    _vdasm_pixblt_RGB565_to_XRGB8888_MMX
  617. _vdasm_pixblt_RGB565_to_XRGB8888_MMX:
  618.         prologue    6
  619.  
  620.         mov        ebp, [esp+20+16]
  621.         mov        edi, [esp+24+16]
  622.         add        ebp, ebp
  623.         mov        edx, [esp+4+16]
  624.         mov        ecx, [esp+12+16]
  625.         lea        edx, [edx+ebp*2-12]
  626.         lea        ecx, [ecx+ebp-6]
  627.         neg        ebp
  628.         mov        [esp+20+16], ebp
  629.  
  630.         movq    mm5, [r_mask_565]
  631.         movq    mm6, [g_mask_565]
  632.         movq    mm7, [b_mask_565]
  633.  
  634. .yloop:
  635.         mov        ebp, [esp+20+16]
  636.         add        ebp, 6
  637.         jbe        .odd
  638.  
  639. .xloop:
  640.         movq        mm0, [ecx+ebp]
  641.         movq        mm1, mm6
  642.         movq        mm2, mm7
  643.         pand        mm1, mm0
  644.         pand        mm2, mm0
  645.         pand        mm0, mm5
  646.  
  647.         pmulhw        mm1, [x2080w]
  648.         psllq        mm2, 3
  649.         paddw        mm0, mm2
  650.         movq        mm2, mm0
  651.         psrlw        mm0, 5
  652.         pand        mm0, [x07b]
  653.         paddw        mm0, mm2
  654.         movq        mm2, mm0
  655.         punpcklbw    mm0, mm1
  656.         punpckhbw    mm2, mm1
  657.  
  658.         movq    [edx+ebp*2], mm0
  659.         movq    [edx+ebp*2+8], mm2
  660.         add        ebp, 8
  661.         jnc        .xloop
  662.  
  663. .odd:
  664.         sub        ebp, 6
  665.         jz        .noodd
  666.         push    edi
  667. .oddloop:
  668.         movzx    eax, word [ecx+ebp+6]
  669.         mov        ebx, 0000f800h
  670.         and        ebx, eax
  671.         mov        esi, eax
  672.         shl        ebx, 8
  673.         mov        edi, eax
  674.         shl        eax, 3
  675.         and        esi, 000007e0h
  676.         and        eax, 000000f8h
  677.         add        ebx, eax
  678.         shl        esi, 5
  679.         mov        eax, ebx
  680.         shr        ebx, 5
  681.         and        edi, 00000600h
  682.         shr        edi, 1
  683.         and        ebx, 00070007h
  684.         add        esi, edi
  685.         add        eax, ebx
  686.         add        eax, esi
  687.         mov        [edx+ebp*2+12], eax
  688.         add        ebp, 2
  689.         jnz        .oddloop
  690.         pop        edi
  691. .noodd:
  692.         add        ecx, [esp+16+16]
  693.         add        edx, [esp+8+16]
  694.         dec        edi
  695.         jne        .yloop
  696.  
  697.         emms
  698.         epilogue
  699.         ret
  700.  
  701.  
  702.     global    _vdasm_pixblt_RGB888_to_XRGB8888_MMX
  703. _vdasm_pixblt_RGB888_to_XRGB8888_MMX:
  704.         prologue    6
  705.  
  706.         mov        esi,[esp+12+16]
  707.         mov        edi,[esp+4+16]
  708.  
  709.         mov        ecx,[esp+20+16]
  710.         lea        eax,[ecx+ecx*2]
  711.         lea        ebx,[ecx*4]
  712.         sub        [esp+8+16],ebx
  713.         sub        [esp+16+16],eax
  714.  
  715.         mov        edx,[esp+24+16]
  716.         mov        ebx,[esp+20+16]
  717.         mov        ecx,[esp+16+16]
  718.         mov        eax,[esp+ 8+16]
  719.         
  720.         ;ebx    horizontal count backup
  721.         ;ecx    source modulo
  722.         ;edx    vertical count
  723.         ;esi    source
  724.         ;edi    destination
  725.         ;ebp    horizontal count
  726.     
  727. .yloop:
  728.         mov    ebp,ebx
  729.         shr    ebp,3
  730.         jz    .checkodd
  731. .xloop:
  732.         movq        mm0,[esi]        ;mm0: g2b2r1g1b1r0g0b0
  733.         movq        mm1,mm0            ;
  734.         
  735.         psrlq        mm1,24            ;mm1: ------g2b2r1g1b1
  736.         movq        mm2,mm0            ;
  737.         
  738.         movq        mm3,[esi+8]        ;mm3: b5r4g4b4r3g3b3r2
  739.         punpckldq    mm0,mm1            ;mm0: b2r1g1b1b1r0g0b0    [qword 0 ready]
  740.         
  741.         movq        mm4,mm3            ;mm4: b5r4g4b4r3g3b3r2
  742.         psllq        mm3,48            ;mm3: b3r2------------
  743.         
  744.         movq        mm5,mm4            ;mm5: b5r4g4b4r3g3b3r2
  745.         psrlq        mm2,16            ;mm2: ----g2b2--------
  746.         
  747.         movq        mm1,[esi+16]    ;mm1: r7g7b7r6g6b6r5g5
  748.         por            mm2,mm3            ;mm2: b3r2g2b2--------
  749.         
  750.         movq        [edi],mm0        ;
  751.         psllq        mm4,24            ;mm4: b4r3g3b3r2------
  752.         
  753.         movq        mm3,mm5            ;mm3: b5r4g4b4r3g3b3r2
  754.         psrlq        mm5,24            ;mm5: ------b5r4g4b4r3
  755.         
  756.         movq        mm0,mm1            ;mm0: r7g7b7r6g6b6r5g5
  757.         psllq        mm1,40            ;mm1: b6r5g5----------
  758.         
  759.         punpckhdq    mm2,mm4            ;mm2: b4r3g3b3b3r2g2b2 [qword 1 ready]
  760.         por            mm1,mm5            ;mm1: b6r5g5b5r4g4b4r3
  761.         
  762.         movq        mm4,mm0            ;mm4: r7g7b7r6g6b6r5g5
  763.         punpckhdq    mm3,mm1            ;mm3: b6r5g5b5b5r4g4b4 [qword 2 ready]
  764.         
  765.         movq        [edi+8],mm2
  766.         psrlq        mm0,16            ;mm0: ----r7g7b7r6g6b6
  767.         
  768.         movq        [edi+16],mm3
  769.         psrlq        mm4,40            ;mm4: ----------r7g7b7
  770.         
  771.         punpckldq    mm0,mm4            ;mm0: --r7g7b7b7r6g6b6 [qword 3 ready]
  772.         add            esi,24
  773.         
  774.         movq        [edi+24],mm0
  775.             
  776.         add            edi,32
  777.         sub            ebp,1
  778.         jne            .xloop
  779.  
  780. .checkodd:
  781.         mov            ebp,ebx
  782.         and            ebp,7
  783.         jz            .noodd
  784.         movd        mm7,eax
  785. .oddloop:
  786.         mov            ax,[esi]
  787.         mov            [edi],ax
  788.         mov            al,[esi+2]
  789.         mov            [edi+2],al
  790.         add            esi,3
  791.         add            edi,4
  792.         sub            ebp,1
  793.         jne            .oddloop
  794.         
  795.         movd        eax,mm7
  796. .noodd:
  797.         add            esi,ecx
  798.         add            edi,eax
  799.  
  800.         sub            edx,1
  801.         jne            .yloop
  802.         emms
  803.         epilogue
  804.         ret
  805.  
  806.         end
  807.