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_sse2.asm < prev    next >
Encoding:
Assembly Source File  |  2009-09-14  |  8.0 KB  |  411 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. SSE2_02b        dq    00202020202020202h,00202020202020202h
  23. SSE2_fcb        dq    0fcfcfcfcfcfcfcfch,0fcfcfcfcfcfcfcfch
  24. SSE2_02w        dq    00002000200020002h
  25.  
  26.         global _g_VDMPEGPredict_sse2
  27.  
  28.         extern predict_C_normal_ISSE : near
  29.         extern predict_C_halfpelX_ISSE : near
  30.         extern predict_C_halfpelY_ISSE : near
  31.         extern predict_C_quadpel_ISSE : near
  32.         extern predict_add_C_normal_ISSE : near
  33.         extern predict_add_C_halfpelX_ISSE : near
  34.         extern predict_add_C_halfpelY_ISSE : near
  35.         extern predict_add_C_quadpel_ISSE : near
  36.  
  37. _g_VDMPEGPredict_sse2    dd    predict_Y_normal_SSE2
  38.             dd    predict_Y_halfpelX_SSE2
  39.             dd    predict_Y_halfpelY_SSE2
  40.             dd    predict_Y_quadpel_SSE2
  41.             dd    predict_C_normal_ISSE
  42.             dd    predict_C_halfpelX_ISSE
  43.             dd    predict_C_halfpelY_ISSE
  44.             dd    predict_C_quadpel_ISSE
  45.             dd    predict_add_Y_normal_SSE2
  46.             dd    predict_add_Y_halfpelX_SSE2
  47.             dd    predict_add_Y_halfpelY_SSE2
  48.             dd    predict_add_Y_quadpel_SSE2
  49.             dd    predict_add_C_normal_ISSE
  50.             dd    predict_add_C_halfpelX_ISSE
  51.             dd    predict_add_C_halfpelY_ISSE
  52.             dd    predict_add_C_quadpel_ISSE
  53.  
  54.     segment    .text
  55.  
  56. %macro PREDICT_START 0
  57.         push    ebp
  58.         push    edi
  59.         push    esi
  60.         push    ebx
  61.         mov    edx,[esp+4+16]
  62.         mov    ecx,[esp+8+16]
  63.         mov    esi,[esp+12+16]    
  64. %endmacro
  65.  
  66. %macro PREDICT_END 0
  67.         pop    ebx
  68.         pop    esi
  69.         pop    edi
  70.         pop    ebp
  71. %endmacro
  72.  
  73.  
  74. ;*********************************************************
  75. ;*
  76. ;*    Luminance - quadpel
  77. ;*
  78. ;*********************************************************
  79.  
  80.     align 16
  81.  
  82. predict_Y_quadpel_SSE2:
  83.     PREDICT_START
  84.     movdqa    xmm6, oword [SSE2_02b]
  85.     movdqa    xmm7, oword [SSE2_fcb]
  86.     mov    edi,16
  87.     
  88.     movdqu    xmm0,[ecx]
  89.     movdqu    xmm1,[ecx+1]
  90.     add    ecx,esi
  91.     
  92.     movdqa    xmm3,xmm7
  93.     pandn    xmm3,xmm0
  94.     movdqa    xmm5,xmm7
  95.     pandn    xmm5,xmm1
  96.  
  97.     paddb    xmm3,xmm5
  98.     paddb    xmm3,xmm6
  99.     
  100.     pand    xmm0,xmm7
  101.     pand    xmm1,xmm7
  102.     pavgb    xmm0,xmm1
  103.     
  104.     ;entry:
  105.     ; xmm0: last row high sum
  106.     ; xmm3: last row low sum + rounder
  107.     
  108. predict_Y_quadpel_SSE2.loop:
  109.     movdqu    xmm1,[ecx]    ;xmm1 = p3
  110.     movdqu    xmm2,[ecx+1]    ;xmm2 = p4
  111.     add    ecx,esi
  112.     
  113.     movdqa    xmm4,xmm7
  114.     pandn    xmm4,xmm1    ;xmm4 = p3 low bits
  115.     movdqa    xmm5,xmm7
  116.     pandn    xmm5,xmm2    ;xmm5 = p4 low bits
  117.     pand    xmm1,xmm7    ;xmm1 = p3 high bits
  118.     pand    xmm2,xmm7    ;xmm2 = p4 high bits
  119.     pavgb    xmm1,xmm2    ;xmm1 = p3+p4 high bits
  120.     paddb    xmm4,xmm5
  121.     
  122.     pavgb    xmm0,xmm1    ;xmm0 = pout high bits
  123.     paddb    xmm3,xmm4    ;xmm3 = (pout low bits << 2) + rounder
  124.     
  125.     psrlq    xmm3,2
  126.     paddb    xmm4,xmm6    ;xmm4 = next loop low sum    
  127.  
  128.     movdqa    xmm5,xmm7
  129.     pandn    xmm5,xmm3
  130.     paddb    xmm0,xmm5
  131.     movdqa    xmm3,xmm4    ;xmm3 = next loop low sum
  132.     movdqa    [edx],xmm0
  133.     movdqa    xmm0,xmm1    ;xmm0 = next loop high sum
  134.  
  135.     add    edx,esi
  136.  
  137.     dec    edi
  138.     jne    predict_Y_quadpel_SSE2.loop
  139.  
  140.     PREDICT_END
  141.     ret
  142.  
  143.  
  144. ;*********************************************************
  145. ;*
  146. ;*    Luminance - half-pel Y
  147. ;*
  148. ;*********************************************************
  149.  
  150.     align 16
  151. predict_Y_halfpelY_SSE2:
  152.     PREDICT_START
  153.     mov    edi,8
  154.     mov    eax,esi
  155.     movdqu    xmm0,[ecx]
  156.     add    eax,eax
  157. predict_Y_halfpelY_SSE2.loop:
  158.     prefetcht0 [ecx+eax]
  159.     movdqu    xmm2,[ecx+esi]
  160.  
  161.     movdqu    xmm4,[ecx+eax]
  162.     pavgb    xmm0,xmm2
  163.  
  164.     movdqa    [edx],xmm0
  165.     pavgb    xmm2,xmm4
  166.  
  167.     movdqa    [edx+esi],xmm2
  168.     movdqa    xmm0,xmm4
  169.  
  170.     add    ecx,eax
  171.     add    edx,eax
  172.     
  173.     dec    edi
  174.     jne    predict_Y_halfpelY_SSE2.loop
  175.  
  176.     PREDICT_END
  177.     ret
  178.  
  179. ;*********************************************************
  180. ;*
  181. ;*    Luminance - half-pel X
  182. ;*
  183. ;*********************************************************
  184.  
  185.     align 16
  186. predict_Y_halfpelX_SSE2:
  187.     PREDICT_START
  188.     mov    edi,8
  189.     mov    eax,esi
  190.     add    eax,eax
  191.  
  192. predict_Y_halfpelX_SSE2.loop:
  193.     movdqu    xmm0,[ecx]
  194.     movdqu    xmm1,[ecx+1]
  195.     movdqu    xmm2,[ecx+esi]
  196.     movdqu    xmm3,[ecx+esi+1]
  197.     pavgb    xmm0,xmm1
  198.     pavgb    xmm2,xmm3
  199.     movdqa    [edx],xmm0
  200.     movdqa    [edx+esi],xmm2
  201.     
  202.     add    edx,eax
  203.     add    ecx,eax
  204.  
  205.     dec    edi
  206.     jne    predict_Y_halfpelX_SSE2.loop
  207.  
  208.     PREDICT_END
  209.     ret
  210.  
  211. ;*********************************************************
  212. ;*
  213. ;*    Luminance - normal
  214. ;*
  215. ;*********************************************************
  216.  
  217.     align 16
  218. predict_Y_normal_SSE2:
  219.     PREDICT_START
  220.     mov    edi,8
  221.     mov    eax,esi
  222.     add    eax,eax
  223.  
  224. predict_Y_normal_SSE2.loop:
  225.     movdqu    xmm0,[ecx]
  226.     movdqu    xmm2,[ecx+esi]
  227.     movdqa    [edx],xmm0
  228.     movdqa    [edx+esi],xmm2
  229.     add    ecx,eax
  230.     add    edx,eax
  231.     dec    edi
  232.     jne    predict_Y_normal_SSE2.loop
  233.  
  234.     PREDICT_END
  235.     ret
  236.  
  237.  
  238.  
  239. ;*********************************************************
  240. ;*
  241. ;*    Luminance - quadpel
  242. ;*
  243. ;*********************************************************
  244.  
  245.     align 16
  246.  
  247.     
  248. predict_add_Y_quadpel_SSE2:
  249.     PREDICT_START
  250.     movdqa    xmm6, [SSE2_02b]
  251.     movdqa    xmm7, [SSE2_fcb]
  252.     mov    edi,16
  253.     
  254.     movdqu    xmm0,[ecx]
  255.     movdqu    xmm1,[ecx+1]
  256.     add    ecx,esi
  257.     
  258.     movdqa    xmm3,xmm7
  259.     pandn    xmm3,xmm0
  260.     movdqa    xmm5,xmm7
  261.     pandn    xmm5,xmm1
  262.  
  263.     paddb    xmm3,xmm5
  264.     paddb    xmm3,xmm6
  265.     
  266.     pand    xmm0,xmm7
  267.     pand    xmm1,xmm7
  268.     pavgb    xmm0,xmm1
  269.     
  270.     ;entry:
  271.     ; xmm0: last row high sum
  272.     ; xmm3: last row low sum + rounder
  273.     
  274. add_Y_quadpel_SSE2.loop:
  275.     movdqu    xmm1,[ecx]    ;xmm1 = p3
  276.     movdqu    xmm2,[ecx+1]    ;xmm2 = p4
  277.     add    ecx,esi
  278.     
  279.     movdqa    xmm4,xmm7
  280.     pandn    xmm4,xmm1    ;xmm4 = p3 low bits
  281.     movdqa    xmm5,xmm7
  282.     pandn    xmm5,xmm2    ;xmm5 = p4 low bits
  283.     pand    xmm1,xmm7    ;xmm1 = p3 high bits
  284.     pand    xmm2,xmm7    ;xmm2 = p4 high bits
  285.     pavgb    xmm1,xmm2    ;xmm1 = p3+p4 high bits
  286.     paddb    xmm4,xmm5
  287.     
  288.     pavgb    xmm0,xmm1    ;xmm0 = pout high bits
  289.     paddb    xmm3,xmm4    ;xmm3 = (pout low bits << 2) + rounder
  290.     
  291.     psrlq    xmm3,2
  292.     paddb    xmm4,xmm6    ;xmm4 = next loop low sum    
  293.  
  294.     movdqa    xmm5,xmm7
  295.     pandn    xmm5,xmm3
  296.     paddb    xmm0,xmm5
  297.     pavgb    xmm0,[edx]
  298.     movdqa    xmm3,xmm4    ;xmm3 = next loop low sum
  299.     movdqa    [edx],xmm0
  300.     movdqa    xmm0,xmm1    ;xmm0 = next loop high sum
  301.  
  302.     add    edx,esi
  303.  
  304.     dec    edi
  305.     jne    add_Y_quadpel_SSE2.loop
  306.     
  307.     PREDICT_END
  308.     ret
  309.     
  310. ;*********************************************************
  311. ;*
  312. ;*    Luminance - half-pel Y
  313. ;*
  314. ;*********************************************************
  315.  
  316.     align 16
  317. predict_add_Y_halfpelY_SSE2:
  318.     PREDICT_START
  319.     movdqu    xmm0,[ecx]
  320.     add    ecx,esi
  321.     mov    eax,esi
  322.     add    eax,eax
  323.     mov    edi,8
  324. predict_add_Y_halfpelY_SSE2.loop:
  325.     movdqu    xmm1,[ecx]
  326.     movdqu    xmm2,[ecx+esi]
  327.     pavgb    xmm0,xmm1
  328.     pavgb    xmm1,xmm2
  329.     pavgb    xmm0,[edx]
  330.     pavgb    xmm1,[edx+esi]
  331.         
  332.     add    ecx,eax
  333.  
  334.     movdqa    [edx],xmm0
  335.     movdqa    [edx+esi],xmm1
  336.     add    edx,eax
  337.     movdqa    xmm0,xmm2
  338.     dec    edi
  339.     jne    predict_add_Y_halfpelY_SSE2.loop
  340.  
  341.     PREDICT_END
  342.     ret
  343.  
  344. ;*********************************************************
  345. ;*
  346. ;*    Luminance - half-pel X
  347. ;*
  348. ;*********************************************************
  349.  
  350.     align 16
  351. predict_add_Y_halfpelX_SSE2:
  352.     PREDICT_START
  353.     mov    edi,8
  354.     mov    eax,esi
  355.     add    eax,eax
  356. predict_add_Y_halfpelX_SSE2.loop:
  357.     movdqu    xmm0,[ecx]
  358.     movdqu    xmm2,[ecx+esi]
  359.     movdqu    xmm1,[ecx+1]
  360.     movdqu    xmm3,[ecx+esi+1]
  361.     pavgb    xmm0,xmm1
  362.     pavgb    xmm2,xmm3
  363.     pavgb    xmm0,[edx]
  364.     pavgb    xmm2,[edx+esi]
  365.  
  366.     add    ecx,eax
  367.     movdqa    [edx],xmm0
  368.     movdqa    [edx+esi],xmm2
  369.     add    edx,eax
  370.     dec    edi
  371.     jne    predict_add_Y_halfpelX_SSE2.loop
  372.  
  373.     PREDICT_END
  374.     ret
  375.  
  376.  
  377.  
  378. ;*********************************************************
  379. ;*
  380. ;*    Luminance - normal
  381. ;*
  382. ;*********************************************************
  383.  
  384.     align 16
  385. predict_add_Y_normal_SSE2:
  386.     PREDICT_START
  387.     mov    edi,8
  388.     mov    eax,esi
  389.     add    eax,eax
  390.  
  391. add_Y_normal_SSE2.loop:
  392.     movdqu    xmm0,[ecx]
  393.     movdqu    xmm2,[ecx+esi]
  394.     pavgb    xmm0,[edx]
  395.     pavgb    xmm2,[edx+esi]
  396.     movdqa    [edx],xmm0
  397.     movdqa    [edx+esi],xmm2
  398.  
  399.     add    ecx,eax
  400.     add    edx,eax
  401.  
  402.     dec    edi
  403.     jne    add_Y_normal_SSE2.loop
  404.  
  405.     PREDICT_END
  406.     ret
  407.  
  408.  
  409.  
  410.     end
  411.