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

  1. ;    VirtualDub - Video processing and capture application
  2. ;    Copyright (C) 1998-2001 Avery Lee
  3. ;
  4. ;    This program is free software; you can redistribute it and/or modify
  5. ;    it under the terms of the GNU General Public License as published by
  6. ;    the Free Software Foundation; either version 2 of the License, or
  7. ;    (at your option) any later version.
  8. ;
  9. ;    This program is distributed in the hope that it will be useful,
  10. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ;    GNU General Public License for more details.
  13. ;
  14. ;    You should have received a copy of the GNU General Public License
  15. ;    along with this program; if not, write to the Free Software
  16. ;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18.     segment    .rdata, align=16
  19.  
  20.     align 16
  21.  
  22.         global _g_VDMPEGPredict_mmx
  23.  
  24. _g_VDMPEGPredict_mmx    dd    predict_Y_normal_MMX
  25.             dd    predict_Y_halfpelX_MMX
  26.             dd    predict_Y_halfpelY_MMX
  27.             dd    predict_Y_quadpel_MMX
  28.             dd    predict_C_normal_MMX
  29.             dd    predict_C_halfpelX_MMX
  30.             dd    predict_C_halfpelY_MMX
  31.             dd    predict_C_quadpel_MMX
  32.             dd    predict_add_Y_normal_MMX
  33.             dd    predict_add_Y_halfpelX_MMX
  34.             dd    predict_add_Y_halfpelY_MMX
  35.             dd    predict_add_Y_quadpel_MMX
  36.             dd    predict_add_C_normal_MMX
  37.             dd    predict_add_C_halfpelX_MMX
  38.             dd    predict_add_C_halfpelY_MMX
  39.             dd    predict_add_C_quadpel_MMX
  40.  
  41.     align 16
  42.  
  43. MMX_01b        dq    00101010101010101h
  44. MMX_02b        dq    00202020202020202h
  45. MMX_fcb        dq    0fcfcfcfcfcfcfcfch
  46. MMX_feb        dq    0fefefefefefefefeh
  47. MMX_02w        dq    00002000200020002h
  48. MMX_04w        dq    00004000400040004h
  49.  
  50. predict_Y_halfpelX_table    dq     0,64
  51.                 dq     8,56
  52.                 dq    16,48
  53.                 dq    24,40
  54.                 dq    32,32
  55.                 dq    40,24
  56.                 dq    48,16
  57.                 dq    56, 8
  58.                 dq    64, 0
  59.  
  60.     segment    .text
  61.  
  62. %macro PREDICT_START 0
  63.         push    ebp
  64.         push    edi
  65.         push    esi
  66.         push    ebx
  67.         mov    edx,[esp+4+16]
  68.         mov    ecx,[esp+8+16]
  69.         mov    esi,[esp+12+16]    
  70. %endmacro
  71.  
  72. %macro PREDICT_END 0
  73.         pop    ebx
  74.         pop    esi
  75.         pop    edi
  76.         pop    ebp
  77. %endmacro
  78.  
  79.  
  80. ;*********************************************************
  81. ;*
  82. ;*    Luminance - quadpel
  83. ;*
  84. ;*********************************************************
  85.  
  86.     align 16
  87.  
  88. predict_Y_quadpel_MMX:
  89.     PREDICT_START
  90.     movq    mm6,[MMX_02w]
  91.  
  92.     pxor    mm7,mm7
  93.     mov    edi,16
  94. predict_Y_quadpel_MMX.loop:
  95.     mov    eax,2
  96. predict_Y_quadpel_MMX.loop_2:
  97.     movq    mm0,[ecx]
  98.  
  99.     movd    mm1,dword [ecx+8]
  100.     movq    mm4,mm0
  101.  
  102.     movq    mm2,[ecx+esi]
  103.     psrlq    mm4,8
  104.  
  105.     movd    mm3,dword [ecx+esi+8]
  106.     psllq    mm1,56
  107.  
  108.     por    mm1,mm4
  109.     movq    mm5,mm2
  110.  
  111.     psrlq    mm5,8
  112.     movq    mm4,mm0
  113.  
  114.     psllq    mm3,56
  115.     punpcklbw mm0,mm7
  116.  
  117.     por    mm3,mm5
  118.     punpckhbw mm4,mm7
  119.  
  120.     movq    mm5,mm1
  121.     punpcklbw mm1,mm7
  122.  
  123.     punpckhbw mm5,mm7
  124.     paddw    mm0,mm1        ;mm0: low total
  125.     movq    mm1,mm2
  126.  
  127.     paddw    mm4,mm5        ;mm4: high total
  128.     movq    mm5,mm3
  129.  
  130.     punpcklbw mm2,mm7
  131.     add    edx,8
  132.  
  133.     punpcklbw mm3,mm7
  134.     paddw    mm0,mm2
  135.  
  136.     punpckhbw mm1,mm7
  137.     paddw    mm0,mm3
  138.  
  139.     punpckhbw mm5,mm7
  140.     paddw    mm4,mm1
  141.     
  142.     paddw    mm4,mm5
  143.     paddw    mm0,mm6
  144.  
  145.     paddw    mm4,mm6
  146.     psrlw    mm0,2
  147.  
  148.     psrlw    mm4,2
  149.     add    ecx,8
  150.  
  151.     packuswb mm0,mm4
  152.  
  153.     movq    [edx-8],mm0
  154.  
  155.     dec    eax
  156.     jne    predict_Y_quadpel_MMX.loop_2
  157.  
  158.     lea    ecx,[ecx+esi-16]
  159.     lea    edx,[edx+esi-16]
  160.  
  161.     dec    edi
  162.     jne    predict_Y_quadpel_MMX.loop
  163.  
  164.     PREDICT_END
  165.     ret
  166.  
  167.  
  168. ;*********************************************************
  169. ;*
  170. ;*    Luminance - half-pel Y
  171. ;*
  172. ;*********************************************************
  173.  
  174.     align 16
  175. predict_Y_halfpelY_MMX:
  176.     PREDICT_START
  177.     movq    mm6,[MMX_01b]
  178.     movq    mm7,[MMX_feb]
  179.     mov    edi,8
  180.     mov    ebx,7
  181.     and    ebx,ecx
  182.     jz    predict_Y_halfpelY_MMX.loop_aligned
  183.  
  184.     shl    ebx,3
  185.     mov    edi,64
  186.     sub    edi,ebx
  187.     and    ecx,byte -8
  188.     movd    mm7,ebx
  189.     movd    mm6,edi
  190.     mov    edi,16
  191.  
  192. predict_Y_halfpelY_MMX.loop_unaligned:
  193.     movq    mm0,[ecx]
  194.  
  195.     movq    mm1,[ecx+8]
  196.     psrlq    mm0,mm7
  197.  
  198.     movq    mm2,mm1
  199.     psllq    mm1,mm6
  200.  
  201.     movq    mm3,[ecx+16]
  202.     psrlq    mm2,mm7
  203.  
  204.     psllq    mm3,mm6
  205.     por    mm0,mm1            ;[1]
  206.  
  207.     movq    mm4,[ecx+esi]
  208.     por    mm2,mm3            ;[2]
  209.  
  210.     movq    mm1,[ecx+esi+8]
  211.     psrlq    mm4,mm7
  212.  
  213.     movq    mm5,mm1
  214.     psllq    mm1,mm6
  215.  
  216.     movq    mm3,[ecx+esi+16]
  217.     psrlq    mm5,mm7
  218.  
  219.     psllq    mm3,mm6
  220.     por    mm4,mm1            ;[1]
  221.  
  222.     por    mm5,mm3            ;[2]
  223.     movq    mm1,mm0            ;[1]
  224.  
  225.     pxor    mm1,mm4            ;[1]
  226.     por    mm0,mm4            ;[1]
  227.  
  228.     pand    mm1,[MMX_feb]        ;[1]
  229.     movq    mm3,mm2            ;[2]
  230.  
  231.     psrlq    mm1,1            ;[1]
  232.     pxor    mm3,mm5            ;[2]
  233.  
  234.     pand    mm3,[MMX_feb]        ;[2]
  235.     por    mm2,mm5            ;[2]
  236.  
  237.     psubb    mm0,mm1            ;[1]
  238.     psrlq    mm3,1            ;[2]
  239.  
  240.     add    ecx,esi
  241.  
  242.     movq    [edx],mm0        ;[1]
  243.     psubb    mm2,mm3            ;[2]
  244.  
  245.     dec    edi
  246.  
  247.     movq    [edx+8],mm2        ;[2]
  248.     lea    edx,[edx+esi]
  249.     jne    predict_Y_halfpelY_MMX.loop_unaligned
  250.     PREDICT_END
  251.     ret
  252.  
  253. predict_Y_halfpelY_MMX.loop_aligned:
  254.     movq    mm0,[ecx]        ;[1]
  255.     movq    mm1,[ecx+esi]        ;[1]
  256.     movq    mm3,mm0            ;[1]
  257.     movq    mm2,[ecx+esi*2]        ;[1]
  258.     movq    mm4,mm1            ;[1]
  259.     pxor    mm3,mm1            ;[1]
  260.     por    mm0,mm1            ;[1]
  261.     pand    mm3,mm7            ;[1]
  262.     movq    mm4,mm1            ;[1]
  263.     psrlq    mm3,1            ;[1]
  264.     pxor    mm4,mm2            ;[1]
  265.     psubb    mm0,mm3            ;[1]
  266.     pand    mm4,mm7            ;[1]
  267.     movq    mm3,[ecx+8]        ;[2]
  268.     psrlq    mm4,1            ;[1]
  269.     movq    [edx],mm0        ;[1]
  270.     por    mm1,mm2            ;[1]
  271.     movq    mm0,[ecx+esi+8]        ;[2]
  272.     psubb    mm1,mm4            ;[1]
  273.     movq    [edx+esi],mm1        ;[1]
  274.     movq    mm1,mm3            ;[2]
  275.     movq    mm2,[ecx+esi*2+8]    ;[2]
  276.     movq    mm4,mm0            ;[2]
  277.     pxor    mm1,mm0            ;[2]
  278.     por    mm3,mm0            ;[2]
  279.     pand    mm1,mm7            ;[2]
  280.     movq    mm4,mm0            ;[2]
  281.     psrlq    mm1,1            ;[2]
  282.     pxor    mm4,mm2            ;[2]
  283.     psubb    mm3,mm1            ;[2]
  284.     pand    mm4,mm7            ;[2]
  285.     psrlq    mm4,1            ;[2]
  286.     lea    ecx,[ecx+esi*2]
  287.     por    mm0,mm2            ;[2]
  288.     dec    edi
  289.     movq    [edx+8],mm3        ;[2]
  290.     psubb    mm0,mm4            ;[2]
  291.     movq    [edx+esi+8],mm0        ;[2]
  292.     lea    edx,[edx+esi*2]
  293.     jne    predict_Y_halfpelY_MMX.loop_aligned
  294.  
  295.     PREDICT_END
  296.     ret
  297.  
  298. ;*********************************************************
  299. ;*
  300. ;*    Luminance - half-pel X
  301. ;*
  302. ;*********************************************************
  303.  
  304.     align 16
  305. predict_Y_halfpelX_MMX:
  306.     PREDICT_START
  307.     mov    edi,16
  308.     mov    ebx,ecx
  309.     and    ebx,7
  310.     shl    ebx,4
  311.     and    ecx,byte -8
  312.     sub    edx,esi
  313.     movq    mm7,qword [ebx+predict_Y_halfpelX_table+0]
  314.     movq    mm6,[MMX_feb]
  315.  
  316. predict_Y_halfpelX_MMX.loop:
  317.     movq    mm0,[ecx]                        ;left
  318.  
  319.     add    edx,esi
  320.  
  321.     movq    mm1,[ecx+8]                        ;left
  322.     movq    mm2,mm0                            ;left
  323.  
  324.     psrlq    mm0,mm7                            ;left
  325.     movq    mm3,mm1                            ;left
  326.  
  327.     psrlq    mm2,qword [ebx+predict_Y_halfpelX_table+16]        ;left
  328.     movq    mm4,mm1                            ;right
  329.  
  330.     psllq    mm3,qword [ebx+predict_Y_halfpelX_table+24]        ;left
  331.     movq    mm5,mm4                            ;right
  332.  
  333.     psllq    mm1,qword [ebx+predict_Y_halfpelX_table+8]        ;left
  334.     por    mm2,mm3                            ;left
  335.  
  336.     movq    mm3,[ecx+16]                        ;right
  337.     por    mm0,mm1                            ;left
  338.  
  339.     psrlq    mm5,qword [ebx+predict_Y_halfpelX_table+16]        ;right
  340.     movq    mm1,mm3                            ;right
  341.  
  342.     psllq    mm1,qword [ebx+predict_Y_halfpelX_table+24]        ;right
  343.     psrlq    mm4,mm7                            ;right
  344.  
  345.     psllq    mm3,qword [ebx+predict_Y_halfpelX_table+8]        ;right
  346.     por    mm5,mm1                            ;right
  347.  
  348.     movq    mm1,mm0                            ;left
  349.     pxor    mm0,mm2                            ;left
  350.  
  351.     por    mm1,mm2                            ;left
  352.     pand    mm0,mm6                            ;left
  353.  
  354.     psrlq    mm0,1                            ;left
  355.     por    mm4,mm3                            ;right
  356.  
  357.     psubb    mm1,mm0                            ;left
  358.     movq    mm3,mm4                            ;right
  359.  
  360.     pxor    mm4,mm5                            ;right
  361.     por    mm5,mm3                            ;right
  362.  
  363.     movq    [edx],mm1                        ;left
  364.     pand    mm4,mm6                            ;right
  365.  
  366.     psrlq    mm4,1                            ;right
  367.     add    ecx,esi
  368.  
  369.     psubb    mm5,mm4                            ;right
  370.     dec    edi
  371.  
  372.     movq    [edx+8],mm5                        ;right
  373.     jne    predict_Y_halfpelX_MMX.loop
  374.  
  375.     PREDICT_END
  376.     ret
  377.  
  378. ;*********************************************************
  379. ;*
  380. ;*    Luminance - normal
  381. ;*
  382. ;*********************************************************
  383.  
  384.     align 16
  385. predict_Y_normal_MMX:
  386.     PREDICT_START
  387.     mov    eax,8
  388.     mov    ebx,7
  389.     and    ebx,ecx
  390.     jz    predict_Y_normal_MMX.loop_aligned
  391.  
  392.     shl    ebx,3
  393.     mov    edi,64
  394.     sub    edi,ebx
  395.     and    ecx,byte -8
  396.     movd    mm7,ebx
  397.     movd    mm6,edi
  398.     mov    eax,16
  399.  
  400. predict_Y_normal_MMX.loop_unaligned:
  401.     movq    mm1,[ecx+8]
  402.     movq    mm0,[ecx]
  403.     movq    mm2,mm1
  404.     psrlq    mm0,mm7
  405.     movq    mm3,[ecx+16]
  406.     psllq    mm1,mm6
  407.     psrlq    mm2,mm7
  408.     por    mm0,mm1
  409.     psllq    mm3,mm6
  410.     por    mm2,mm3
  411.     movq    [edx],mm0
  412.     movq    [edx+8],mm2
  413.     add    ecx,esi
  414.     add    edx,esi
  415.     dec    eax
  416.     jne    predict_Y_normal_MMX.loop_unaligned
  417.     PREDICT_END
  418.     ret
  419.  
  420.     align 16
  421. predict_Y_normal_MMX.loop_aligned:
  422.     movq    mm0,[ecx]
  423.     movq    mm1,[ecx+8]
  424.     movq    mm2,[ecx+esi]
  425.     movq    mm3,[ecx+esi+8]
  426.     movq    [edx],mm0
  427.     movq    [edx+8],mm1
  428.     movq    [edx+esi],mm2
  429.     movq    [edx+esi+8],mm3
  430.     lea    ecx,[ecx+esi*2]
  431.     lea    edx,[edx+esi*2]
  432.     dec    eax
  433.     jne    predict_Y_normal_MMX.loop_aligned
  434.  
  435.     PREDICT_END
  436.     ret
  437.  
  438.  
  439.  
  440.  
  441.  
  442. ;**************************************************************************
  443. ;*
  444. ;*
  445. ;*
  446. ;*  Addition predictors
  447. ;*
  448. ;*
  449. ;*
  450. ;**************************************************************************
  451.  
  452. ;*********************************************************
  453. ;*
  454. ;*    Luminance - quadpel
  455. ;*
  456. ;*********************************************************
  457.  
  458.     align 16
  459. predict_add_Y_quadpel_MMX:
  460.     PREDICT_START
  461.     movq    mm6,[MMX_02w]
  462.  
  463.     pxor    mm7,mm7
  464.     mov    edi,16
  465. add_Y_quadpel_MMX.loop:
  466.     mov    eax,2
  467. add_Y_quadpel_MMX.loop2:
  468.     movq    mm0,[ecx]
  469.     movd    mm1,dword [ecx+8]
  470.     movq    mm4,mm0
  471.     psrlq    mm4,8
  472.     psllq    mm1,56
  473.     por    mm1,mm4
  474.  
  475.     movq    mm2,[ecx+esi]
  476.     movd    mm3,dword [ecx+esi+8]
  477.     movq    mm5,mm2
  478.     psrlq    mm5,8
  479.     psllq    mm3,56
  480.     por    mm3,mm5
  481.  
  482.     movq    mm4,mm0
  483.     punpcklbw mm0,mm7
  484.  
  485.     movq    mm5,mm1
  486.     punpcklbw mm1,mm7
  487.  
  488.     punpckhbw mm4,mm7
  489.     paddw    mm0,mm1        ;mm0: low total
  490.  
  491.     punpckhbw mm5,mm7
  492.     movq    mm1,mm2
  493.  
  494.     paddw    mm4,mm5        ;mm4: high total
  495.     punpcklbw mm2,mm7
  496.  
  497.     movq    mm5,mm3
  498.     punpcklbw mm3,mm7
  499.  
  500.     punpckhbw mm1,mm7
  501.     paddw    mm2,mm3
  502.  
  503.     punpckhbw mm5,mm7
  504.     paddw    mm0,mm2
  505.  
  506.     paddw    mm1,mm5
  507.     paddw    mm0,mm6
  508.  
  509.     paddw    mm4,mm1
  510.     psrlw    mm0,2
  511.  
  512.     movq    mm3,[edx]
  513.     paddw    mm4,mm6
  514.  
  515.     psrlw    mm4,2
  516.     movq    mm5,mm3
  517.  
  518.     pand    mm3,[MMX_feb]
  519.     packuswb    mm0,mm4
  520.  
  521.     por        mm5,mm0
  522.     psrlq    mm3,1
  523.  
  524.     pand    mm0,[MMX_feb]
  525.     psrlq    mm0,1
  526.     pand    mm5,[MMX_01b]
  527.     paddb    mm0,mm3
  528.     add        edx,8
  529.     paddb    mm0,mm5
  530.     add        ecx, 8
  531.     dec        eax
  532.  
  533.     movq    [edx-8],mm0
  534.     jne    add_Y_quadpel_MMX.loop2
  535.  
  536.     lea    ecx,[ecx+esi-16]
  537.     lea    edx,[edx+esi-16]
  538.  
  539.     dec    edi
  540.     jne    add_Y_quadpel_MMX.loop
  541.  
  542.     PREDICT_END
  543.     ret
  544.  
  545. ;*********************************************************
  546. ;*
  547. ;*    Luminance - half-pel Y
  548. ;*
  549. ;*********************************************************
  550.  
  551.     align 16
  552. predict_add_Y_halfpelY_MMX:
  553.     PREDICT_START
  554.     movq    mm6,[MMX_01b]
  555.     movq    mm7,[MMX_feb]
  556.     mov    edi,16
  557. predict_add_Y_halfpelY_MMX.loop:
  558.     movq    mm3,[ecx]
  559.     movq    mm0,mm7
  560.  
  561.     movq    mm1,[ecx+esi]
  562.     pand    mm0,mm3
  563.  
  564.     por        mm3,mm1
  565.     psrlq    mm0,1
  566.  
  567.     pand    mm3,mm6
  568.     pand    mm1,mm7
  569.  
  570.     psrlq    mm1,1
  571.     paddb    mm0,mm3
  572.  
  573.     movq    mm4,[edx]
  574.     paddb    mm0,mm1
  575.  
  576.     movq    mm2,mm0
  577.     pand    mm0,mm7
  578.  
  579.     psrlq    mm0,1
  580.     por    mm2,mm4
  581.  
  582.     pand    mm2,mm6
  583.     pand    mm4,mm7
  584.  
  585.     psrlq    mm4,1
  586.     paddb    mm0,mm2
  587.     
  588.     movq    mm1,[ecx+8]        ;[2]
  589.     paddb    mm4,mm0            ;[1]
  590.     
  591.     movq    mm0,[ecx+esi+8]        ;[2]
  592.     movq    mm3,mm1            ;[2]
  593.  
  594.     movq    [edx],mm4        ;[1]
  595.     por        mm3,mm0            ;[2]
  596.  
  597.     pand    mm3,mm6
  598.     pand    mm1,mm7
  599.  
  600.     pand    mm0,mm7
  601.     psrlq    mm1,1
  602.  
  603.     psrlq    mm0,1
  604.     paddb    mm1,mm3
  605.  
  606.     movq    mm4,[edx+8]
  607.     paddb    mm1,mm0
  608.  
  609.     movq    mm2,mm1
  610.     pand    mm1,mm7
  611.  
  612.     psrlq    mm1,1
  613.     por    mm2,mm4
  614.  
  615.     pand    mm2,mm6
  616.     pand    mm4,mm7
  617.  
  618.     psrlq    mm4,1
  619.     paddb    mm1,mm2
  620.     
  621.     paddb    mm4,mm1
  622.         
  623.     add    ecx,esi
  624.     dec    edi
  625.  
  626.     movq    [edx+8],mm4
  627.  
  628.     lea    edx,[edx+esi]
  629.     jne    predict_add_Y_halfpelY_MMX.loop
  630.  
  631.     PREDICT_END
  632.     ret
  633.  
  634. ;*********************************************************
  635. ;*
  636. ;*    Luminance - half-pel X
  637. ;*
  638. ;*********************************************************
  639.  
  640.     align 16
  641. predict_add_Y_halfpelX_MMX:
  642.     PREDICT_START
  643.     movq    mm6,[MMX_01b]
  644.     movq    mm7,[MMX_feb]
  645.     mov    edi,16
  646. predict_add_Y_halfpelX_MMX.loop:
  647.     movq    mm0,[ecx]
  648.  
  649.     movd    mm1,dword [ecx+8]
  650.     movq    mm2,mm0
  651.  
  652.     psrlq    mm2,8
  653.     movq    mm3,mm0
  654.  
  655.     psllq    mm1,56
  656.     pand    mm0,mm7
  657.  
  658.     por        mm1,mm2
  659.  
  660.     por        mm3,mm1
  661.     pand    mm1,mm7
  662.  
  663.     pand    mm3,mm6
  664.     psrlq    mm0,1
  665.  
  666.     psrlq    mm1,1
  667.     paddb    mm0,mm3
  668.  
  669.     movq    mm4,[edx]
  670.     paddb    mm0,mm1
  671.  
  672.     movq    mm2,mm0
  673.     pand    mm0,mm7
  674.  
  675.     psrlq    mm0,1
  676.     por    mm2,mm4
  677.  
  678.     pand    mm2,mm6
  679.     pand    mm4,mm7
  680.  
  681.     psrlq    mm4,1
  682.     paddb    mm0,mm2
  683.     
  684.     movq    mm1,[ecx+8]        ;[2]
  685.     paddb    mm4,mm0            ;[1]
  686.  
  687.     movd    mm0,dword [ecx+16]        ;[2]
  688.     movq    mm2,mm1            ;[2]
  689.  
  690.     movq    [edx],mm4        ;[1]
  691.     psrlq    mm2,8            ;[2]
  692.  
  693.     movq    mm3,mm1            ;[2]
  694.     psllq    mm0,56
  695.  
  696.     pand    mm1,mm7
  697.     por        mm0,mm2
  698.  
  699.     psrlq    mm1,1
  700.     por        mm3,mm0
  701.  
  702.     pand    mm3,mm6
  703.     pand    mm0,mm7
  704.  
  705.     psrlq    mm0,1
  706.     paddb    mm1,mm3
  707.  
  708.     movq    mm4,[edx+8]
  709.     paddb    mm1,mm0
  710.  
  711.     movq    mm2,mm1
  712.     pand    mm1,mm7
  713.  
  714.     psrlq    mm1,1
  715.     por    mm2,mm4
  716.  
  717.     pand    mm2,mm6
  718.     pand    mm4,mm7
  719.  
  720.     psrlq    mm4,1
  721.     paddb    mm1,mm2
  722.     
  723.     paddb    mm4,mm1
  724.     
  725.     add    ecx,esi
  726.     dec    edi
  727.  
  728.     movq    [edx+8],mm4
  729.  
  730.     lea    edx,[edx+esi]
  731.     jne    predict_add_Y_halfpelX_MMX.loop
  732.  
  733.     PREDICT_END
  734.     ret
  735.  
  736.  
  737.  
  738. ;*********************************************************
  739. ;*
  740. ;*    Luminance - normal
  741. ;*
  742. ;*********************************************************
  743.  
  744.     align 16
  745. predict_add_Y_normal_MMX:
  746.     PREDICT_START
  747.     movq    mm6,[MMX_01b]
  748.     movq    mm7,[MMX_feb]
  749.     mov    edi,16
  750.     mov    ebx,7
  751.     and    ebx,ecx
  752.     jz    add_Y_normal_MMX.loop_aligned
  753.  
  754. ;*** unaligned loop
  755.  
  756.     shl    ebx,3
  757.     mov    ebp,64
  758.     sub    ebp,ebx
  759.     and    ecx,byte -8
  760.     movd    mm5,ebx
  761.     movd    mm4,ebp
  762.  
  763. add_Y_normal_MMX.loop_unaligned:
  764.     movq    mm1,[ecx+8]
  765.     movq    mm0,[ecx]
  766.     movq    mm2,mm1
  767.     psrlq    mm0,mm5
  768.     movq    mm3,[ecx+16]
  769.     psllq    mm1,mm4
  770.     psrlq    mm2,mm5
  771.     por    mm0,mm1
  772.     psllq    mm3,mm4
  773.     por    mm2,mm3
  774.     movq    mm1,[edx]
  775.     movq    mm6,mm0
  776.     movq    mm3,[edx+8]
  777.     movq    mm7,mm2
  778.     pand    mm0,[MMX_feb]
  779.     por    mm6,mm1
  780.     pand    mm1,[MMX_feb]
  781.     por    mm7,mm3
  782.     psrlq    mm0,1
  783.     pand    mm2,[MMX_feb]
  784.     psrlq    mm1,1
  785.     pand    mm3,[MMX_feb]
  786.     psrlq    mm2,1
  787.     pand    mm6,[MMX_01b]
  788.     psrlq    mm3,1
  789.     pand    mm7,[MMX_01b]
  790.     paddb    mm0,mm1
  791.  
  792.     paddb    mm2,mm3
  793.     paddb    mm0,mm6
  794.  
  795.     paddb    mm2,mm7
  796.  
  797.     movq    [edx],mm0
  798.     add    ecx,esi
  799.  
  800.     movq    [edx+8],mm2
  801.     add    edx,esi
  802.  
  803.     dec    edi
  804.     jne    add_Y_normal_MMX.loop_unaligned
  805.  
  806.     PREDICT_END
  807.     ret
  808.  
  809. ;*** aligned loop
  810.  
  811. add_Y_normal_MMX.loop_aligned:
  812.     movq    mm0,[ecx]
  813.  
  814.     movq    mm1,[edx]
  815.     movq    mm2,mm0
  816.  
  817.     movq    mm3,[ecx+8]
  818.     por    mm2,mm1
  819.  
  820.     movq    mm4,[edx+8]
  821.     pand    mm2,mm6
  822.  
  823.     movq    mm5,mm3
  824.     pand    mm0,mm7
  825.  
  826.     pand    mm3,mm7
  827.     por    mm5,mm4
  828.  
  829.     pand    mm1,mm7
  830.     psrlw    mm0,1
  831.  
  832.     psrlw    mm1,1
  833.     pand    mm4,mm7
  834.  
  835.     psrlw    mm4,1
  836.     paddb    mm0,mm2
  837.  
  838.     psrlw    mm3,1
  839.     paddb    mm0,mm1
  840.  
  841.     pand    mm5,mm6
  842.     paddb    mm3,mm4
  843.  
  844.     movq    [edx],mm0
  845.     paddb    mm3,mm5
  846.  
  847.     movq    [edx+8],mm3
  848.  
  849.     add    ecx,esi
  850.     add    edx,esi
  851.  
  852.     dec    edi
  853.     jne    add_Y_normal_MMX.loop_aligned
  854.  
  855.     PREDICT_END
  856.     ret
  857.  
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867. ;**************************************************************************
  868.  
  869.  
  870. ;*********************************************************
  871. ;*
  872. ;*    Luminance - quadpel
  873. ;*
  874. ;*********************************************************
  875.  
  876.     align 16
  877. predict_C_quadpel_MMX:
  878.     PREDICT_START
  879.     movq    mm6,[MMX_02w]
  880.  
  881.     pxor    mm7,mm7
  882.     mov    edi,8
  883. predict_C_quadpel_MMX.loop:
  884.     movq    mm0,[ecx]
  885.     movd    mm1,dword [ecx+8]
  886.     movq    mm4,mm0
  887.     psrlq    mm4,8
  888.     psllq    mm1,56
  889.     por    mm1,mm4
  890.  
  891.     movq    mm2,[ecx+esi]
  892.     movd    mm3,dword [ecx+esi+8]
  893.     movq    mm5,mm2
  894.     psrlq    mm5,8
  895.     psllq    mm3,56
  896.     por    mm3,mm5
  897.  
  898.     movq    mm4,mm0
  899.     movq    mm5,mm1
  900.  
  901.     punpcklbw mm0,mm7
  902.     punpcklbw mm1,mm7
  903.     punpckhbw mm4,mm7
  904.     punpckhbw mm5,mm7
  905.  
  906.     paddw    mm0,mm1        ;mm0: low total
  907.     paddw    mm4,mm5        ;mm4: high total
  908.  
  909.     movq    mm1,mm2
  910.     movq    mm5,mm3
  911.  
  912.     punpcklbw mm2,mm7
  913.     punpcklbw mm3,mm7
  914.     punpckhbw mm1,mm7
  915.     punpckhbw mm5,mm7
  916.  
  917.     paddw    mm2,mm3
  918.     paddw    mm1,mm5
  919.  
  920.     paddw    mm0,mm2
  921.     paddw    mm4,mm1
  922.  
  923.     paddw    mm0,mm6
  924.     paddw    mm4,mm6
  925.  
  926.     psrlw    mm0,2
  927.     psrlw    mm4,2
  928.  
  929.     packuswb mm0,mm4
  930.  
  931.     movq    [edx],mm0
  932.  
  933.     add    ecx,esi
  934.     add    edx,esi
  935.  
  936.     dec    edi
  937.     jne    predict_C_quadpel_MMX.loop
  938.  
  939.     PREDICT_END
  940.     ret
  941.  
  942.  
  943. ;*********************************************************
  944. ;*
  945. ;*    Luminance - half-pel Y
  946. ;*
  947. ;*********************************************************
  948.  
  949.     align 16
  950. predict_C_halfpelY_MMX:
  951.     PREDICT_START
  952.     movq    mm6,[MMX_01b]
  953.     movq    mm7,[MMX_feb]
  954.     mov    edi,4
  955. predict_C_halfpelY_MMX.loop:
  956.     movq    mm0,[ecx]
  957.     movq    mm1,[ecx+esi]
  958.     movq    mm3,mm0
  959.     movq    mm2,[ecx+esi*2]
  960.     movq    mm4,mm1
  961.     por    mm3,mm1            ;mm3: carry for r0+r1
  962.     por    mm4,mm2            ;mm4: carry for r1+r2
  963.     pand    mm0,mm7
  964.     pand    mm1,mm7
  965.     psrlq    mm0,1
  966.     pand    mm2,mm7
  967.     psrlq    mm1,1
  968.     pand    mm3,mm6
  969.     psrlq    mm2,1
  970.     pand    mm4,mm6
  971.     paddb    mm0,mm3
  972.     paddb    mm2,mm4
  973.     paddb    mm0,mm1
  974.     paddb    mm1,mm2
  975.     lea    ecx,[ecx+esi*2]
  976.     dec    edi
  977.     movq    [edx],mm0
  978.     movq    [edx+esi],mm1
  979.  
  980.     lea    edx,[edx+esi*2]
  981.     jne    predict_C_halfpelY_MMX.loop
  982.  
  983.     PREDICT_END
  984.     ret
  985.  
  986. ;*********************************************************
  987. ;*
  988. ;*    Luminance - half-pel X
  989. ;*
  990. ;*********************************************************
  991.  
  992.     align 16
  993. predict_C_halfpelX_MMX:
  994.     PREDICT_START
  995.     movq    mm6,[MMX_01b]
  996.     movq    mm7,[MMX_feb]
  997.     mov    edi,4
  998. predict_C_halfpelX_MMX.loop:
  999.     movq    mm0,[ecx]
  1000.     movd    mm1,dword [ecx+8]
  1001.     movq    mm2,mm0
  1002.     movq    mm3,[ecx+esi]
  1003.     psrlq    mm2,8
  1004.     movd    mm4,dword [ecx+esi+8]
  1005.     psllq    mm1,56
  1006.     movq    mm5,mm3
  1007.     por    mm2,mm1
  1008.     psrlq    mm5,8
  1009.     movq    mm1,mm0
  1010.     psllq    mm4,56
  1011.     por    mm1,mm2
  1012.     por    mm5,mm4
  1013.     pand    mm1,mm6
  1014.     movq    mm4,mm3
  1015.     pand    mm0,mm7
  1016.     por    mm4,mm5
  1017.     pand    mm2,mm7
  1018.     pand    mm4,mm6
  1019.     psrlq    mm0,1
  1020.     pand    mm3,mm7
  1021.     psrlq    mm2,1
  1022.     pand    mm5,mm7
  1023.     paddb    mm0,mm2
  1024.     psrlq    mm3,1
  1025.     paddb    mm0,mm1
  1026.     paddb    mm3,mm4
  1027.     psrlq    mm5,1
  1028.     movq    [edx],mm0
  1029.     paddb    mm3,mm5
  1030.     movq    [edx+esi],mm3
  1031.     lea    ecx,[ecx+esi*2]
  1032.     lea    edx,[edx+esi*2]
  1033.     dec    edi
  1034.     jne    predict_C_halfpelX_MMX.loop
  1035.  
  1036.     PREDICT_END
  1037.     ret
  1038.  
  1039. ;*********************************************************
  1040. ;*
  1041. ;*    Luminance - normal
  1042. ;*
  1043. ;*********************************************************
  1044.  
  1045.     align 16
  1046. predict_C_normal_MMX:
  1047.     PREDICT_START
  1048.     movq    mm0,[ecx]
  1049.     lea    ebx,[edx+esi*2]
  1050.  
  1051.     movq    mm1,[ecx+esi]
  1052.     lea    eax,[ecx+esi*2]
  1053.  
  1054.     movq    [edx],mm0
  1055.     add    ebx,esi
  1056.  
  1057.     movq    mm2,[ecx+esi*2]
  1058.     add    eax,esi
  1059.  
  1060.     movq    [edx+esi],mm1
  1061.  
  1062.     movq    mm3,[eax]
  1063.     lea    eax,[eax+esi*2]
  1064.  
  1065.     movq    [edx+esi*2],mm2
  1066.  
  1067.     movq    mm4,[ecx+esi*4]
  1068.  
  1069.     movq    [ebx],mm3
  1070.     lea    ebx,[ebx+esi*2]
  1071.  
  1072.     movq    mm5,[eax]
  1073.  
  1074.     movq    [edx+esi*4],mm4
  1075.  
  1076.     movq    mm6,[eax+esi]
  1077.  
  1078.     movq    [ebx],mm5
  1079.  
  1080.     movq    mm7,[eax+esi*2]
  1081.  
  1082.     movq    [ebx+esi],mm6
  1083.  
  1084.     movq    [ebx+esi*2],mm7
  1085.  
  1086.     PREDICT_END
  1087.     ret
  1088.  
  1089.  
  1090.  
  1091.  
  1092.  
  1093. ;**************************************************************************
  1094. ;*
  1095. ;*
  1096. ;*
  1097. ;*  Addition predictors
  1098. ;*
  1099. ;*
  1100. ;*
  1101. ;**************************************************************************
  1102.  
  1103. ;*********************************************************
  1104. ;*
  1105. ;*    Luminance - quadpel
  1106. ;*
  1107. ;*********************************************************
  1108.  
  1109.     align 16
  1110. predict_add_C_quadpel_MMX:
  1111.     PREDICT_START
  1112.     movq    mm6,[MMX_02w]
  1113.  
  1114.     pxor    mm7,mm7
  1115.     mov    edi,8
  1116. add_C_quadpel_MMX.loop:
  1117.     movq    mm0,[ecx]
  1118.     movd    mm1,dword [ecx+8]
  1119.     movq    mm4,mm0
  1120.     psrlq    mm4,8
  1121.     psllq    mm1,56
  1122.     por    mm1,mm4
  1123.  
  1124.     movq    mm2,[ecx+esi]
  1125.     movd    mm3,dword [ecx+esi+8]
  1126.     movq    mm5,mm2
  1127.     psrlq    mm5,8
  1128.     psllq    mm3,56
  1129.     por    mm3,mm5
  1130.  
  1131.     movq    mm4,mm0
  1132.     punpcklbw mm0,mm7
  1133.  
  1134.     movq    mm5,mm1
  1135.     punpcklbw mm1,mm7
  1136.  
  1137.     punpckhbw mm4,mm7
  1138.     paddw    mm0,mm1        ;mm0: low total
  1139.  
  1140.     punpckhbw mm5,mm7
  1141.     movq    mm1,mm2
  1142.  
  1143.     paddw    mm4,mm5        ;mm4: high total
  1144.     punpcklbw mm2,mm7
  1145.  
  1146.     movq    mm5,mm3
  1147.     punpcklbw mm3,mm7
  1148.  
  1149.     punpckhbw mm1,mm7
  1150.     paddw    mm2,mm3
  1151.  
  1152.     punpckhbw mm5,mm7
  1153.     paddw    mm0,mm2
  1154.  
  1155.     paddw    mm1,mm5
  1156.     paddw    mm0,mm6
  1157.  
  1158.     paddw    mm4,mm1
  1159.     psrlw    mm0,2
  1160.  
  1161.     movq    mm3,[edx]
  1162.     paddw    mm4,mm6
  1163.  
  1164.     psrlw    mm4,2
  1165.     movq    mm5,mm3
  1166.  
  1167.     pand    mm3,[MMX_feb]
  1168.     packuswb    mm0,mm4
  1169.  
  1170.     por        mm5,mm0
  1171.     psrlq    mm3,1
  1172.  
  1173.     pand    mm0,[MMX_feb]
  1174.     psrlq    mm0,1
  1175.     pand    mm5,[MMX_01b]
  1176.     paddb    mm0,mm3
  1177.     add        ecx,esi
  1178.     paddb    mm0,mm5
  1179.  
  1180.     movq    [edx],mm0
  1181.  
  1182.     add    edx,esi
  1183.  
  1184.     dec    edi
  1185.     jne    add_C_quadpel_MMX.loop
  1186.  
  1187.     PREDICT_END
  1188.     ret
  1189.  
  1190. ;*********************************************************
  1191. ;*
  1192. ;*    Luminance - half-pel Y
  1193. ;*
  1194. ;*********************************************************
  1195.  
  1196.     align 16
  1197. predict_add_C_halfpelY_MMX:
  1198.     PREDICT_START
  1199.     movq    mm6,[MMX_01b]
  1200.     movq    mm7,[MMX_feb]
  1201.     mov    edi,8
  1202. predict_add_C_halfpelY_MMX.loop:
  1203.     movq    mm0,[ecx]
  1204.  
  1205.     movq    mm1,[ecx+esi]
  1206.     movq    mm3,mm0
  1207.  
  1208.     por        mm3,mm1
  1209.     pand    mm0,mm7
  1210.  
  1211.     pand    mm3,mm6
  1212.     psrlq    mm0,1
  1213.  
  1214.     pand    mm1,mm7
  1215.     paddb    mm0,mm3
  1216.  
  1217.     movq    mm4,[edx]
  1218.     psrlq    mm1,1
  1219.  
  1220.     paddb    mm0,mm1
  1221.  
  1222.     movq    mm2,mm0
  1223.     pand    mm0,mm7
  1224.  
  1225.     psrlq    mm0,1
  1226.     por        mm2,mm4
  1227.  
  1228.     pand    mm4,mm7
  1229.     pand    mm2,mm6
  1230.  
  1231.     psrlq    mm4,1
  1232.     paddb    mm0,mm2
  1233.     
  1234.     paddb    mm4,mm0
  1235.     
  1236.     add    ecx,esi
  1237.     dec    edi
  1238.  
  1239.     movq    [edx],mm4
  1240.  
  1241.     lea    edx,[edx+esi]
  1242.     jne    predict_add_C_halfpelY_MMX.loop
  1243.  
  1244.     PREDICT_END
  1245.     ret
  1246.  
  1247. ;*********************************************************
  1248. ;*
  1249. ;*    Luminance - half-pel X
  1250. ;*
  1251. ;*********************************************************
  1252.  
  1253.     align 16
  1254. predict_add_C_halfpelX_MMX:
  1255.     PREDICT_START
  1256.     movq    mm6,[MMX_01b]
  1257.     movq    mm7,[MMX_feb]
  1258.     mov    edi,8
  1259. predict_add_C_halfpelX_MMX.loop:
  1260.     movq    mm0,[ecx]
  1261.  
  1262.     movd    mm1,dword [ecx+8]
  1263.     movq    mm2,mm0
  1264.  
  1265.     movq    mm3,mm0
  1266.     psllq    mm1,56
  1267.  
  1268.     psrlq    mm2,8
  1269.     pand    mm0,mm7
  1270.  
  1271.     por        mm1,mm2
  1272.     psrlq    mm0,1
  1273.  
  1274.     por        mm3,mm1
  1275.     pand    mm1,mm7
  1276.  
  1277.     pand    mm3,mm6
  1278.  
  1279.     psrlq    mm1,1
  1280.     paddb    mm0,mm3
  1281.  
  1282.     movq    mm4,[edx]
  1283.     paddb    mm0,mm1
  1284.  
  1285.     movq    mm2,mm0
  1286.     pand    mm0,mm7
  1287.  
  1288.     psrlq    mm0,1
  1289.     por        mm2,mm4
  1290.  
  1291.     pand    mm2,mm6
  1292.     pand    mm4,mm7
  1293.  
  1294.     psrlq    mm4,1
  1295.     paddb    mm0,mm2
  1296.     
  1297.     paddb    mm4,mm0
  1298.     
  1299.     add    ecx,esi
  1300.     dec    edi
  1301.  
  1302.     movq    [edx],mm4
  1303.  
  1304.     lea    edx,[edx+esi]
  1305.     jne    predict_add_C_halfpelX_MMX.loop
  1306.  
  1307.     PREDICT_END
  1308.     ret
  1309.  
  1310.  
  1311.  
  1312. ;*********************************************************
  1313. ;*
  1314. ;*    Luminance - normal
  1315. ;*
  1316. ;*********************************************************
  1317.  
  1318.     align 16
  1319. predict_add_C_normal_MMX:
  1320.     PREDICT_START
  1321.     movq    mm6,[MMX_01b]
  1322.     movq    mm7,[MMX_feb]
  1323.     mov    edi,4
  1324. add_C_normal_MMX.loop:
  1325.     movq    mm0,[ecx]
  1326.  
  1327.     movq    mm1,[edx]
  1328.     movq    mm2,mm0
  1329.  
  1330.     movq    mm3,[ecx+esi]
  1331.     por    mm2,mm1
  1332.  
  1333.     movq    mm4,[edx+esi]
  1334.     pand    mm2,mm6
  1335.  
  1336.     movq    mm5,mm3
  1337.     pand    mm0,mm7
  1338.  
  1339.     pand    mm3,mm7
  1340.     por    mm5,mm4
  1341.  
  1342.     pand    mm1,mm7
  1343.     psrlw    mm0,1
  1344.  
  1345.     psrlw    mm1,1
  1346.     pand    mm4,mm7
  1347.  
  1348.     psrlw    mm4,1
  1349.     paddb    mm0,mm2
  1350.  
  1351.     psrlw    mm3,1
  1352.     paddb    mm0,mm1
  1353.  
  1354.     pand    mm5,mm6
  1355.     paddb    mm3,mm4
  1356.  
  1357.     movq    [edx],mm0
  1358.     paddb    mm3,mm5
  1359.  
  1360.     movq    [edx+esi],mm3
  1361.  
  1362.     lea    ecx,[ecx+esi*2]
  1363.     lea    edx,[edx+esi*2]
  1364.     dec    edi
  1365.     jne    add_C_normal_MMX.loop
  1366.  
  1367.     PREDICT_END
  1368.     ret
  1369.  
  1370.     end
  1371.