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_isse.asm next >
Encoding:
Assembly Source File  |  2009-09-14  |  17.1 KB  |  1,060 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. ISSE_01b        dq    00101010101010101h
  23. ISSE_02b        dq    00202020202020202h
  24. ISSE_fcb        dq    0fcfcfcfcfcfcfcfch
  25. ISSE_feb        dq    0fefefefefefefefeh
  26. ISSE_02w        dq    00002000200020002h
  27. ISSE_04w        dq    00004000400040004h
  28.  
  29.         global    _g_VDMPEGPredict_isse
  30.  
  31.         global     predict_C_normal_ISSE
  32.         global     predict_C_halfpelX_ISSE
  33.         global     predict_C_halfpelY_ISSE
  34.         global     predict_C_quadpel_ISSE
  35.         global     predict_add_C_normal_ISSE
  36.         global     predict_add_C_halfpelX_ISSE
  37.         global     predict_add_C_halfpelY_ISSE
  38.         global     predict_add_C_quadpel_ISSE
  39.  
  40. _g_VDMPEGPredict_isse    dd    predict_Y_normal_ISSE
  41.             dd    predict_Y_halfpelX_ISSE
  42.             dd    predict_Y_halfpelY_ISSE
  43.             dd    predict_Y_quadpel_ISSE
  44.             dd    predict_C_normal_ISSE
  45.             dd    predict_C_halfpelX_ISSE
  46.             dd    predict_C_halfpelY_ISSE
  47.             dd    predict_C_quadpel_ISSE
  48.             dd    predict_add_Y_normal_ISSE
  49.             dd    predict_add_Y_halfpelX_ISSE
  50.             dd    predict_add_Y_halfpelY_ISSE
  51.             dd    predict_add_Y_quadpel_ISSE
  52.             dd    predict_add_C_normal_ISSE
  53.             dd    predict_add_C_halfpelX_ISSE
  54.             dd    predict_add_C_halfpelY_ISSE
  55.             dd    predict_add_C_quadpel_ISSE
  56.  
  57.  
  58.     align 16
  59. predict_Y_halfpelX_table    dq     0,64
  60.                 dq     8,56
  61.                 dq    16,48
  62.                 dq    24,40
  63.                 dq    32,32
  64.                 dq    40,24
  65.                 dq    48,16
  66.                 dq    56, 8
  67.                 dq    64, 0
  68.  
  69.     segment    .text
  70.  
  71. %macro PREDICT_START 0
  72.         push    ebp
  73.         push    edi
  74.         push    esi
  75.         push    ebx
  76.         mov    edx,[esp+4+16]
  77.         mov    ecx,[esp+8+16]
  78.         mov    esi,[esp+12+16]    
  79. %endmacro
  80.  
  81. %macro PREDICT_END 0
  82.         pop    ebx
  83.         pop    esi
  84.         pop    edi
  85.         pop    ebp
  86. %endmacro
  87.  
  88.  
  89.  
  90. ;*********************************************************
  91. ;*
  92. ;*    Luminance - quadpel
  93. ;*
  94. ;*********************************************************
  95.  
  96.     align 16
  97.  
  98. predict_Y_quadpel_ISSE:
  99.     PREDICT_START
  100.     movq    mm6,[ISSE_02w]
  101.  
  102.     pxor    mm7,mm7
  103.     mov    edi,16
  104. predict_Y_quadpel_ISSE.loop:
  105.     mov    eax,2
  106. predict_Y_quadpel_ISSE.loop_2:
  107.     movq    mm0,[ecx]
  108.     prefetcht0 [ecx+esi]
  109.  
  110.     movd    mm1,dword [ecx+8]
  111.     movq    mm4,mm0
  112.  
  113.     movq    mm2,[ecx+esi]
  114.     psrlq    mm4,8
  115.  
  116.     movd    mm3,dword [ecx+esi+8]
  117.     psllq    mm1,56
  118.  
  119.     por    mm1,mm4
  120.     movq    mm5,mm2
  121.  
  122.     psrlq    mm5,8
  123.     movq    mm4,mm0
  124.  
  125.     psllq    mm3,56
  126.     punpcklbw mm0,mm7
  127.  
  128.     por    mm3,mm5
  129.     punpckhbw mm4,mm7
  130.  
  131.     movq    mm5,mm1
  132.     punpcklbw mm1,mm7
  133.  
  134.     punpckhbw mm5,mm7
  135.     paddw    mm0,mm1        ;mm0: low total
  136.     movq    mm1,mm2
  137.  
  138.     paddw    mm4,mm5        ;mm4: high total
  139.     movq    mm5,mm3
  140.  
  141.     punpcklbw mm2,mm7
  142.     add    edx,8
  143.  
  144.     punpcklbw mm3,mm7
  145.     paddw    mm0,mm2
  146.  
  147.     punpckhbw mm1,mm7
  148.     paddw    mm0,mm3
  149.  
  150.     punpckhbw mm5,mm7
  151.     paddw    mm4,mm1
  152.     
  153.     paddw    mm4,mm5
  154.     paddw    mm0,mm6
  155.  
  156.     paddw    mm4,mm6
  157.     psrlw    mm0,2
  158.  
  159.     psrlw    mm4,2
  160.     add    ecx,8
  161.  
  162.     packuswb mm0,mm4
  163.  
  164.     movq    [edx-8],mm0
  165.  
  166.     dec    eax
  167.     jne    predict_Y_quadpel_ISSE.loop_2
  168.  
  169.     lea    ecx,[ecx+esi-16]
  170.     lea    edx,[edx+esi-16]
  171.  
  172.     dec    edi
  173.     jne    predict_Y_quadpel_ISSE.loop
  174.  
  175.     PREDICT_END
  176.     ret
  177.  
  178.  
  179. ;*********************************************************
  180. ;*
  181. ;*    Luminance - half-pel Y
  182. ;*
  183. ;*********************************************************
  184.  
  185.     align 16
  186. predict_Y_halfpelY_ISSE:
  187.     PREDICT_START
  188.     movq    mm6,[ISSE_01b]
  189.     movq    mm7,[ISSE_feb]
  190.     mov    edi,8
  191.     mov    ebx,7
  192.     and    ebx,ecx
  193.     jz    predict_Y_halfpelY_ISSE.start_aligned
  194.  
  195.     shl    ebx,3
  196.     mov    edi,64
  197.     sub    edi,ebx
  198.     and    ecx,byte -8
  199.     movd    mm7,ebx
  200.     movd    mm6,edi
  201.     mov    edi,16
  202.  
  203. predict_Y_halfpelY_ISSE.loop_unaligned:
  204.     prefetcht0 [ecx+esi]
  205.     movq    mm0,[ecx]
  206.     movq    mm1,[ecx+8]
  207.  
  208.     psrlq    mm0,mm7
  209.     movq    mm2,mm1
  210.     psllq    mm1,mm6
  211.  
  212.     movq    mm3,[ecx+16]
  213.     psrlq    mm2,mm7
  214.     psllq    mm3,mm6
  215.  
  216.     por    mm0,mm1
  217.     movq    mm4,[ecx+esi]
  218.     por    mm2,mm3
  219.  
  220.     movq    mm1,[ecx+esi+8]
  221.     psrlq    mm4,mm7
  222.     movq    mm5,mm1
  223.  
  224.     psllq    mm1,mm6
  225.     movq    mm3,[ecx+esi+16]
  226.     psrlq    mm5,mm7
  227.  
  228.     psllq    mm3,mm6
  229.     por    mm4,mm1
  230.     pavgb    mm0,mm4
  231.  
  232.     movq    [edx],mm0
  233.     por    mm5,mm3
  234.     pavgb    mm2,mm5
  235.  
  236.     movq    [edx+8],mm2
  237.     add    ecx,esi
  238.     add    edx,esi
  239.  
  240.     dec    edi
  241.     jne    predict_Y_halfpelY_ISSE.loop_unaligned
  242.     PREDICT_END
  243.     ret
  244.  
  245. predict_Y_halfpelY_ISSE.start_aligned:
  246.     movq    mm0,[ecx]
  247.     movq    mm1,[ecx+8]
  248.  
  249. predict_Y_halfpelY_ISSE.loop_aligned:
  250.     prefetcht0 [ecx+esi*2]
  251.     movq    mm2,[ecx+esi]
  252.     dec    edi
  253.  
  254.     movq    mm3,[ecx+esi+8]
  255.     pavgb    mm0,mm2
  256.  
  257.     movq    mm4,[ecx+esi*2]
  258.     pavgb    mm1,mm3
  259.  
  260.     movq    [edx],mm0
  261.     pavgb    mm2,mm4
  262.  
  263.     movq    mm5,[ecx+esi*2+8]
  264.     movq    mm0,mm4
  265.  
  266.     movq    [edx+8],mm1
  267.     pavgb    mm3,mm5
  268.  
  269.     movq    [edx+esi],mm2
  270.     movq    mm1,mm5
  271.  
  272.     movq    [edx+esi+8],mm3
  273.  
  274.     lea    ecx,[ecx+esi*2]
  275.     lea    edx,[edx+esi*2]
  276.  
  277.     jne    predict_Y_halfpelY_ISSE.loop_aligned
  278.     PREDICT_END
  279.     ret
  280.  
  281. ;*********************************************************
  282. ;*
  283. ;*    Luminance - half-pel X
  284. ;*
  285. ;*********************************************************
  286.  
  287.     align 16
  288. predict_Y_halfpelX_ISSE:
  289.     PREDICT_START
  290.     mov    edi,16
  291.     mov    ebx,ecx
  292.     and    ebx,7
  293.     shl    ebx,4
  294.     and    ecx,byte -8
  295.     sub    edx,esi
  296.     add    ebx,predict_Y_halfpelX_table
  297.     movq    mm7,qword [ebx+0]
  298.     movq    mm6,[ISSE_feb]
  299.  
  300. predict_Y_halfpelX_ISSE.loop:
  301.     movq    mm0,[ecx]            ;left
  302.     add    edx,esi
  303.  
  304.     movq    mm1,[ecx+8]            ;left
  305.     movq    mm2,mm0                ;left
  306.  
  307.     psrlq    mm0,mm7                ;left
  308.     movq    mm3,mm1                ;left
  309.  
  310.     psrlq    mm2,qword [ebx+16]        ;left
  311.     movq    mm4,mm3                ;right
  312.  
  313.     psllq    mm3,qword [ebx+24]        ;left
  314.     movq    mm5,mm4                ;right
  315.  
  316.     psllq    mm1,qword [ebx+8]        ;left
  317.     por    mm2,mm3                ;left
  318.  
  319.     movq    mm3,[ecx+16]            ;right
  320.     por    mm0,mm1                ;left
  321.  
  322.     psrlq    mm5,qword [ebx+16]        ;right
  323.     movq    mm1,mm3                ;right
  324.  
  325.     psllq    mm1,qword [ebx+24]        ;right
  326.     psrlq    mm4,mm7                ;right
  327.  
  328.     psllq    mm3,qword [ebx+8]        ;right
  329.     por    mm5,mm1                ;right
  330.     por    mm4,mm3                ;right
  331.  
  332.     pavgb    mm0,mm2                ;left
  333.     pavgb    mm4,mm5                ;right
  334.     add    ecx,esi
  335.  
  336.     dec    edi
  337.     movq    [edx],mm0            ;left
  338.     movq    [edx+8],mm4            ;right
  339.     jne    predict_Y_halfpelX_ISSE.loop
  340.  
  341.     PREDICT_END
  342.     ret
  343.  
  344. ;*********************************************************
  345. ;*
  346. ;*    Luminance - normal
  347. ;*
  348. ;*********************************************************
  349.  
  350.     align 16
  351. predict_Y_normal_ISSE:
  352.     PREDICT_START
  353.     mov    eax,8
  354.     mov    ebx,7
  355.     and    ebx,ecx
  356.     jz    predict_Y_normal_ISSE.loop_aligned
  357.  
  358.     shl    ebx,3
  359.     mov    edi,64
  360.     sub    edi,ebx
  361.     and    ecx,byte -8
  362.     movd    mm7,ebx
  363.     movd    mm6,edi
  364.     mov    eax,16
  365.  
  366. predict_Y_normal_ISSE.loop_unaligned:
  367.     movq    mm1,[ecx+8]
  368.     movq    mm0,[ecx]
  369.     movq    mm2,mm1
  370.     psrlq    mm0,mm7
  371.     movq    mm3,[ecx+16]
  372.     psllq    mm1,mm6
  373.     psrlq    mm2,mm7
  374.     por    mm0,mm1
  375.     psllq    mm3,mm6
  376.     por    mm2,mm3
  377.     movq    [edx],mm0
  378.     movq    [edx+8],mm2
  379.     add    ecx,esi
  380.     add    edx,esi
  381.     dec    eax
  382.     jne    predict_Y_normal_ISSE.loop_unaligned
  383.     PREDICT_END
  384.     ret
  385.  
  386.     align 16
  387. predict_Y_normal_ISSE.loop_aligned:
  388.     movq    mm0,[ecx]
  389.     movq    mm1,[ecx+8]
  390.     movq    mm2,[ecx+esi]
  391.     movq    mm3,[ecx+esi+8]
  392.     movq    [edx],mm0
  393.     movq    [edx+8],mm1
  394.     movq    [edx+esi],mm2
  395.     movq    [edx+esi+8],mm3
  396.     lea    ecx,[ecx+esi*2]
  397.     lea    edx,[edx+esi*2]
  398.     dec    eax
  399.     jne    predict_Y_normal_ISSE.loop_aligned
  400.  
  401.     PREDICT_END
  402.     ret
  403.  
  404.  
  405.  
  406.  
  407.  
  408. ;**************************************************************************
  409. ;*
  410. ;*
  411. ;*
  412. ;*  Addition predictors
  413. ;*
  414. ;*
  415. ;*
  416. ;**************************************************************************
  417.  
  418. ;*********************************************************
  419. ;*
  420. ;*    Luminance - quadpel
  421. ;*
  422. ;*********************************************************
  423.  
  424.     align 16
  425. predict_add_Y_quadpel_ISSE:
  426.     PREDICT_START
  427.     movq    mm6,[ISSE_04w]
  428.  
  429.     pxor    mm7,mm7
  430.     mov    edi,16
  431. add_Y_quadpel_ISSE.loop:
  432.     mov    eax,2
  433. add_Y_quadpel_ISSE.loop2:
  434.     movq    mm0,[ecx]
  435.     prefetcht0 [edx]
  436.  
  437.     movd    mm1,dword [ecx+8]
  438.     movq    mm4,mm0
  439.  
  440.     movq    mm2,[ecx+esi]
  441.     psrlq    mm4,8
  442.  
  443.     movd    mm3,dword [ecx+esi+8]
  444.     psllq    mm1,56
  445.  
  446.     por    mm1,mm4
  447.     movq    mm5,mm2
  448.  
  449.     psrlq    mm5,8
  450.     movq    mm4,mm0
  451.  
  452.     psllq    mm3,56
  453.     punpcklbw mm0,mm7
  454.  
  455.     por    mm3,mm5
  456.     punpckhbw mm4,mm7
  457.  
  458.     movq    mm5,mm1
  459.     punpcklbw mm1,mm7
  460.  
  461.     punpckhbw mm5,mm7
  462.     paddw    mm0,mm1        ;mm0: low total
  463.  
  464.     paddw    mm4,mm5        ;mm4: high total
  465.     movq    mm1,mm2
  466.  
  467.     movq    mm5,mm3
  468.     punpcklbw mm2,mm7
  469.  
  470.     punpcklbw mm3,mm7
  471.     add    edx,8
  472.  
  473.     punpckhbw mm1,mm7
  474.     paddw    mm2,mm3
  475.  
  476.     movq    mm3,[edx-8]
  477.     punpckhbw mm5,mm7
  478.  
  479.     paddw    mm1,mm5
  480.     paddw    mm0,mm2
  481.  
  482.     movq    mm5,mm3
  483.     paddw    mm4,mm1
  484.  
  485.     punpcklbw mm3,mm7
  486.     add    ecx,8
  487.  
  488.     paddw    mm0,mm6
  489.     paddw    mm4,mm6
  490.  
  491.     psllw    mm3,2
  492.     punpckhbw mm5,mm7
  493.  
  494.     psllw    mm5,2
  495.     paddw    mm0,mm3
  496.  
  497.     paddw    mm4,mm5
  498.     psrlw    mm0,3
  499.  
  500.     psrlw    mm4,3
  501.     dec    eax
  502.  
  503.     packuswb mm0,mm4
  504.  
  505.     movq    [edx-8],mm0
  506.     jne    add_Y_quadpel_ISSE.loop2
  507.  
  508.     lea    ecx,[ecx+esi-16]
  509.     lea    edx,[edx+esi-16]
  510.  
  511.     dec    edi
  512.     jne    add_Y_quadpel_ISSE.loop
  513.  
  514.     PREDICT_END
  515.     ret
  516.  
  517. ;*********************************************************
  518. ;*
  519. ;*    Luminance - half-pel Y
  520. ;*
  521. ;*********************************************************
  522.  
  523.     align 16
  524. predict_add_Y_halfpelY_ISSE:
  525.     PREDICT_START
  526.     movq    mm6,[ISSE_01b]
  527.     movq    mm7,[ISSE_feb]
  528.     movq    mm0,[ecx]
  529.     movq    mm1,[ecx+8]
  530.     add    ecx,esi
  531.     mov    edi,16
  532. predict_add_Y_halfpelY_ISSE.loop:
  533.     movq    mm2,[ecx]
  534.     movq    mm3,[ecx+8]
  535.     pavgb    mm0,mm2
  536.     pavgb    mm1,mm3
  537.     pavgb    mm0,[edx]
  538.     pavgb    mm1,[edx+8]
  539.         
  540.     add    ecx,esi
  541.     dec    edi
  542.  
  543.     movq    [edx],mm0
  544.     movq    mm0,mm2
  545.     movq    [edx+8],mm1
  546.     movq    mm1,mm3
  547.  
  548.     lea    edx,[edx+esi]
  549.     jne    predict_add_Y_halfpelY_ISSE.loop
  550.  
  551.     PREDICT_END
  552.     ret
  553.  
  554. ;*********************************************************
  555. ;*
  556. ;*    Luminance - half-pel X
  557. ;*
  558. ;*********************************************************
  559.  
  560.     align 16
  561. predict_add_Y_halfpelX_ISSE:
  562.     PREDICT_START
  563.     movq    mm6,[ISSE_01b]
  564.     movq    mm7,[ISSE_feb]
  565.     mov    edi,16
  566. predict_add_Y_halfpelX_ISSE.loop:
  567.     movq    mm0,[ecx]
  568.     movq    mm1,[ecx+8]
  569.     pavgb    mm0,[ecx+1]
  570.     pavgb    mm1,[ecx+9]
  571.     pavgb    mm0,[edx]
  572.     pavgb    mm1,[edx+8]
  573.  
  574.     add    ecx,esi
  575.     dec    edi
  576.  
  577.     movq    [edx],mm0
  578.     movq    [edx+8],mm1
  579.  
  580.     lea    edx,[edx+esi]
  581.     jne    predict_add_Y_halfpelX_ISSE.loop
  582.     PREDICT_END
  583.     ret
  584.  
  585.  
  586.  
  587. ;*********************************************************
  588. ;*
  589. ;*    Luminance - normal
  590. ;*
  591. ;*********************************************************
  592.  
  593.     align 16
  594. predict_add_Y_normal_ISSE:
  595.     PREDICT_START
  596.     movq    mm6,[ISSE_01b]
  597.     movq    mm7,[ISSE_feb]
  598.     mov    edi,16
  599.     mov    ebx,7
  600.     and    ebx,ecx
  601.     jz    add_Y_normal_ISSE.loop_aligned
  602.  
  603. ;*** unaligned loop
  604.  
  605.     shl    ebx,3
  606.     mov    ebp,64
  607.     sub    ebp,ebx
  608.     and    ecx,byte -8
  609.     movd    mm5,ebx
  610.     movd    mm4,ebp
  611.  
  612. add_Y_normal_ISSE.loop_unaligned:
  613.     prefetcht0 [edx]
  614.     movq    mm1,[ecx+8]
  615.     movq    mm0,[ecx]
  616.  
  617.     movq    mm2,mm1
  618.     psrlq    mm0,mm5
  619.     psllq    mm1,mm4
  620.  
  621.     por    mm0,mm1
  622.     movq    mm3,[ecx+16]
  623.     psrlq    mm2,mm5
  624.  
  625.     pavgb    mm0,[edx]
  626.     psllq    mm3,mm4
  627.     por    mm2,mm3
  628.  
  629.     movq    [edx],mm0
  630.  
  631.     pavgb    mm2,[edx+8]
  632.     add    ecx,esi
  633.     dec    edi
  634.  
  635.     movq    [edx+8],mm2
  636.     lea    edx,[edx+esi]
  637.     jne    add_Y_normal_ISSE.loop_unaligned
  638.     PREDICT_END
  639.     ret
  640.  
  641. ;*** aligned loop
  642.  
  643. add_Y_normal_ISSE.loop_aligned:
  644.     prefetcht0 [ecx+esi]
  645.     prefetcht0 [edx+esi]
  646.     movq    mm0,[ecx]
  647.     movq    mm1,[ecx+8]
  648.     pavgb    mm0,[edx]
  649.     pavgb    mm1,[edx+8]
  650.     movq    [edx],mm0
  651.     movq    [edx+8],mm1
  652.  
  653.     movq    mm2,[ecx+esi]
  654.     movq    mm3,[ecx+esi+8]
  655.     pavgb    mm2,[edx+esi]
  656.     pavgb    mm3,[edx+esi+8]
  657.     movq    [edx+esi],mm2
  658.     movq    [edx+esi+8],mm3
  659.  
  660.     lea    ecx,[ecx+esi*2]
  661.     lea    edx,[edx+esi*2]
  662.  
  663.     sub    edi,2
  664.     jne    add_Y_normal_ISSE.loop_aligned
  665.     PREDICT_END
  666.     ret
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679. ;*********************************************************
  680. ;*
  681. ;*    Luminance - quadpel
  682. ;*
  683. ;*********************************************************
  684.  
  685.     align 16
  686. predict_C_quadpel_ISSE:
  687.     PREDICT_START
  688.     movq    mm6,[ISSE_02w]
  689.  
  690.     pxor    mm7,mm7
  691.     mov    edi,8
  692. predict_C_quadpel_ISSE.loop:
  693.     movq    mm0,[ecx]
  694.     movd    mm1,dword [ecx+8]
  695.     movq    mm4,mm0
  696.     psrlq    mm4,8
  697.     psllq    mm1,56
  698.     por    mm1,mm4
  699.  
  700.     movq    mm2,[ecx+esi]
  701.     movd    mm3,dword [ecx+esi+8]
  702.     movq    mm5,mm2
  703.     psrlq    mm5,8
  704.     psllq    mm3,56
  705.     por    mm3,mm5
  706.  
  707.     movq    mm4,mm0
  708.     movq    mm5,mm1
  709.  
  710.     punpcklbw mm0,mm7
  711.     punpcklbw mm1,mm7
  712.     punpckhbw mm4,mm7
  713.     punpckhbw mm5,mm7
  714.  
  715.     paddw    mm0,mm1        ;mm0: low total
  716.     paddw    mm4,mm5        ;mm4: high total
  717.  
  718.     movq    mm1,mm2
  719.     movq    mm5,mm3
  720.  
  721.     punpcklbw mm2,mm7
  722.     punpcklbw mm3,mm7
  723.     punpckhbw mm1,mm7
  724.     punpckhbw mm5,mm7
  725.  
  726.     paddw    mm2,mm3
  727.     paddw    mm1,mm5
  728.  
  729.     paddw    mm0,mm2
  730.     paddw    mm4,mm1
  731.  
  732.     paddw    mm0,mm6
  733.     paddw    mm4,mm6
  734.  
  735.     psrlw    mm0,2
  736.     psrlw    mm4,2
  737.  
  738.     packuswb mm0,mm4
  739.  
  740.     movq    [edx],mm0
  741.  
  742.     add    ecx,esi
  743.     add    edx,esi
  744.  
  745.     dec    edi
  746.     jne    predict_C_quadpel_ISSE.loop
  747.  
  748.     PREDICT_END
  749.     ret
  750.  
  751.  
  752. ;*********************************************************
  753. ;*
  754. ;*    Luminance - half-pel Y
  755. ;*
  756. ;*********************************************************
  757.  
  758.     align 16
  759. predict_C_halfpelY_ISSE:
  760.     PREDICT_START
  761.     movq    mm0,[ecx]
  762.     mov    edi,4
  763.  
  764. predict_C_halfpelY_ISSE.loop:
  765.     movq    mm2,[ecx+esi]
  766.     movq    mm4,[ecx+esi*2]
  767.     dec    edi
  768.  
  769.     pavgb    mm0,mm2
  770.     pavgb    mm2,mm4
  771.     lea    ecx,[ecx+esi*2]
  772.  
  773.     movq    [edx],mm0
  774.     movq    mm0,mm4
  775.  
  776.     movq    [edx+esi],mm2
  777.     lea    edx,[edx+esi*2]
  778.     jne    predict_C_halfpelY_ISSE.loop
  779.     PREDICT_END
  780.     ret
  781.  
  782. ;*********************************************************
  783. ;*
  784. ;*    Luminance - half-pel X
  785. ;*
  786. ;*********************************************************
  787.  
  788.     align 16
  789. predict_C_halfpelX_ISSE:
  790.     PREDICT_START
  791.     movq    mm6,[ISSE_01b]
  792.     movq    mm7,[ISSE_feb]
  793.     mov    edi,4
  794. predict_C_halfpelX_ISSE.loop:
  795.     movq    mm0,[ecx]
  796.     movq    mm2,[ecx+esi]
  797.  
  798.     pavgb    mm0,[ecx+1]
  799.  
  800.     movq    [edx],mm0
  801.  
  802.     pavgb    mm2,[ecx+esi+1]
  803.  
  804.     movq    [edx+esi],mm2
  805.     lea    ecx,[ecx+esi*2]
  806.     dec    edi
  807.  
  808.     lea    edx,[edx+esi*2]
  809.     jne    predict_C_halfpelX_ISSE.loop
  810.     PREDICT_END
  811.     ret
  812.  
  813. ;*********************************************************
  814. ;*
  815. ;*    Luminance - normal
  816. ;*
  817. ;*********************************************************
  818.  
  819.     align 16
  820. predict_C_normal_ISSE:
  821.     PREDICT_START
  822.     movq    mm0,[ecx]
  823.     lea    ebx,[edx+esi*2]
  824.  
  825.     movq    mm1,[ecx+esi]
  826.     lea    eax,[ecx+esi*2]
  827.  
  828.     movq    [edx],mm0
  829.     add    ebx,esi
  830.  
  831.     movq    mm2,[ecx+esi*2]
  832.     add    eax,esi
  833.  
  834.     movq    [edx+esi],mm1
  835.  
  836.     movq    mm3,[eax]
  837.     lea    eax,[eax+esi*2]
  838.  
  839.     movq    [edx+esi*2],mm2
  840.  
  841.     movq    mm4,[ecx+esi*4]
  842.  
  843.     movq    [ebx],mm3
  844.     lea    ebx,[ebx+esi*2]
  845.  
  846.     movq    mm5,[eax]
  847.  
  848.     movq    [edx+esi*4],mm4
  849.  
  850.     movq    mm6,[eax+esi]
  851.  
  852.     movq    [ebx],mm5
  853.  
  854.     movq    mm7,[eax+esi*2]
  855.  
  856.     movq    [ebx+esi],mm6
  857.  
  858.     movq    [ebx+esi*2],mm7
  859.     PREDICT_END
  860.     ret
  861.  
  862.  
  863.  
  864.  
  865.  
  866. ;**************************************************************************
  867. ;*
  868. ;*
  869. ;*
  870. ;*  Addition predictors
  871. ;*
  872. ;*
  873. ;*
  874. ;**************************************************************************
  875.  
  876. ;*********************************************************
  877. ;*
  878. ;*    Luminance - quadpel
  879. ;*
  880. ;*********************************************************
  881.  
  882.     align 16
  883. predict_add_C_quadpel_ISSE:
  884.     PREDICT_START
  885.     movq    mm6,[ISSE_04w]
  886.  
  887.     pxor    mm7,mm7
  888.     mov    edi,8
  889. add_C_quadpel_ISSE.loop:
  890.     movq    mm0,[ecx]
  891.     movd    mm1,dword [ecx+8]
  892.     movq    mm4,mm0
  893.     psrlq    mm4,8
  894.     psllq    mm1,56
  895.     por    mm1,mm4
  896.  
  897.     movq    mm2,[ecx+esi]
  898.     movd    mm3,dword [ecx+esi+8]
  899.     movq    mm5,mm2
  900.     psrlq    mm5,8
  901.     psllq    mm3,56
  902.     por    mm3,mm5
  903.  
  904.     movq    mm4,mm0
  905.     movq    mm5,mm1
  906.  
  907.     punpcklbw mm0,mm7
  908.     punpcklbw mm1,mm7
  909.     punpckhbw mm4,mm7
  910.     punpckhbw mm5,mm7
  911.  
  912.     paddw    mm0,mm1        ;mm0: low total
  913.     paddw    mm4,mm5        ;mm4: high total
  914.  
  915.     movq    mm1,mm2
  916.     movq    mm5,mm3
  917.  
  918.     punpcklbw mm2,mm7
  919.     punpcklbw mm3,mm7
  920.     punpckhbw mm1,mm7
  921.     punpckhbw mm5,mm7
  922.  
  923.     paddw    mm2,mm3
  924.     paddw    mm1,mm5
  925.  
  926.     movq    mm3,[edx]
  927.     paddw    mm0,mm2
  928.  
  929.     movq    mm5,mm3
  930.     paddw    mm4,mm1
  931.  
  932.     punpcklbw mm3,mm7
  933.     paddw    mm0,mm6
  934.  
  935.     punpckhbw mm5,mm7
  936.     paddw    mm4,mm6
  937.  
  938.     psllw    mm3,2
  939.     psllw    mm5,2
  940.  
  941.     paddw    mm0,mm3
  942.     paddw    mm4,mm5
  943.  
  944.     psrlw    mm0,3
  945.     psrlw    mm4,3
  946.  
  947.     packuswb mm0,mm4
  948.  
  949.     movq    [edx],mm0
  950.  
  951.     add    ecx,esi
  952.     add    edx,esi
  953.  
  954.     dec    edi
  955.     jne    add_C_quadpel_ISSE.loop
  956.  
  957.     PREDICT_END
  958.     ret
  959.  
  960. ;*********************************************************
  961. ;*
  962. ;*    Luminance - half-pel Y
  963. ;*
  964. ;*********************************************************
  965.  
  966.     align 16
  967. predict_add_C_halfpelY_ISSE:
  968.     PREDICT_START
  969.     movq    mm6,[ISSE_01b]
  970.  
  971.     mov    edi,8
  972. predict_add_C_halfpelY_ISSE.loop:
  973.     movq    mm0,[ecx]
  974.     pavgb    mm0,[ecx+esi]
  975.     pavgb    mm0,[edx]
  976.     add    ecx,esi
  977.     dec    edi
  978.  
  979.     movq    [edx],mm0
  980.  
  981.     lea    edx,[edx+esi]
  982.     jne    predict_add_C_halfpelY_ISSE.loop
  983.     PREDICT_END
  984.     ret
  985.  
  986. ;*********************************************************
  987. ;*
  988. ;*    Luminance - half-pel X
  989. ;*
  990. ;*********************************************************
  991.  
  992.     align 16
  993. predict_add_C_halfpelX_ISSE:
  994.     PREDICT_START
  995.     movq    mm6,[ISSE_01b]
  996.     movq    mm7,[ISSE_feb]
  997.     mov    edi,8
  998. predict_add_C_halfpelX_ISSE.loop:
  999.     movq    mm0,[ecx]
  1000.     pavgb    mm0,[ecx+1]
  1001.     pavgb    mm0,[edx]
  1002.     
  1003.     add    ecx,esi
  1004.     dec    edi
  1005.  
  1006.     movq    [edx],mm0
  1007.  
  1008.     lea    edx,[edx+esi]
  1009.     jne    predict_add_C_halfpelX_ISSE.loop
  1010.     PREDICT_END
  1011.     ret
  1012.  
  1013.  
  1014.  
  1015. ;*********************************************************
  1016. ;*
  1017. ;*    Luminance - normal
  1018. ;*
  1019. ;*********************************************************
  1020.  
  1021.     align 16
  1022. predict_add_C_normal_ISSE:
  1023.     PREDICT_START
  1024.     movq    mm0,[ecx]
  1025.     movq    mm1,[ecx+esi]
  1026.     movq    mm2,[ecx+esi*2]
  1027.     pavgb    mm0,[edx]
  1028.     movq    mm4,[ecx+esi*4]
  1029.     pavgb    mm1,[edx+esi]
  1030.     pavgb    mm2,[edx+esi*2]
  1031.     pavgb    mm4,[edx+esi*4]
  1032.     movq    [edx],mm0
  1033.     movq    [edx+esi],mm1
  1034.     movq    [edx+esi*2],mm2
  1035.     movq    [edx+esi*4],mm4
  1036.  
  1037.     lea    ecx,[ecx+esi*2]
  1038.     lea    edx,[edx+esi*2]
  1039.  
  1040.     movq    mm3,[ecx+esi]
  1041.     movq    mm6,[ecx+esi*4]
  1042.     pavgb    mm3,[edx+esi]
  1043.     pavgb    mm6,[edx+esi*4]
  1044.     movq    [edx+esi],mm3
  1045.     movq    [edx+esi*4],mm6
  1046.  
  1047.     lea    ecx,[ecx+esi]
  1048.     lea    edx,[edx+esi]
  1049.  
  1050.     movq    mm5,[ecx+esi*2]
  1051.     movq    mm7,[ecx+esi*4]
  1052.     pavgb    mm5,[edx+esi*2]
  1053.     pavgb    mm7,[edx+esi*4]
  1054.     movq    [edx+esi*2],mm5
  1055.     movq    [edx+esi*4],mm7
  1056.     PREDICT_END
  1057.     ret
  1058.  
  1059.     end
  1060.