interpolate_sse2.asm
上传用户:sunbaby
上传日期:2013-05-31
资源大小:242k
文件大小:15k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. ;/*****************************************************************************
  2. ; *
  3. ; *  T264 AVC CODEC
  4. ; *
  5. ; *  Copyright(C) 2004-2005 llcc <lcgate1@yahoo.com.cn>
  6. ; *               2004-2005 visionany <visionany@yahoo.com.cn>
  7. ; * 2005.1.13 CloudWu Add function T264_pia_u_wxh_mmx/sse
  8. ; *
  9. ; *  This program is free software ; you can redistribute it and/or modify
  10. ; *  it under the terms of the GNU General Public License as published by
  11. ; *  the Free Software Foundation ; either version 2 of the License, or
  12. ; *  (at your option) any later version.
  13. ; *
  14. ; *  This program is distributed in the hope that it will be useful,
  15. ; *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
  16. ; *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. ; *  GNU General Public License for more details.
  18. ; *
  19. ; *  You should have received a copy of the GNU General Public License
  20. ; *  along with this program ; if not, write to the Free Software
  21. ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  22. ; *
  23. ; ****************************************************************************/
  24. bits 32
  25. ; ideal from xvid
  26. ; modify by Thomascatlee@163.com
  27. ; for GCC
  28. %macro cglobal 1
  29. %ifdef NOPREFIX
  30. global %1
  31. %else
  32. global _%1
  33. %define %1 _%1
  34. %endif
  35. %endmacro
  36. section .rodata data align=16
  37. align 16
  38.     sse2_20 times 8 dw 20
  39.     sse2_5n times 8 dw -5
  40.     sse2_16 times 8 dw 16
  41. section .text
  42. ;======================================================
  43. ;
  44. ; void
  45. ; interpolate_halfpel_h_sse2(uint8_t* src, int32_t src_stride, uint8_t* dst, int32_t dst_stride, int32_t width, int32_t height)
  46. ;
  47. ;======================================================
  48. align 16
  49. cglobal interpolate_halfpel_h_sse2
  50. interpolate_halfpel_h_sse2
  51.     
  52.     push ebx
  53.     push esi
  54.     push edi
  55.     push ebp
  56.     
  57.     mov esi, [esp + 16 + 4]     ; src
  58.     mov eax, [esp + 16 + 8]     ; src_stride
  59.     mov edi, [esp + 16 + 12]    ; dst
  60.     mov ebx, [esp + 16 + 16]    ; dst_stride
  61.     mov ebp, [esp + 16 + 20]    ; width
  62.     
  63.     pxor xmm7, xmm7
  64.     xor edx, edx
  65. .looprow
  66.     xor ecx, ecx
  67. .loopcol
  68.     movq xmm4, [esi + ecx - 2]    ; src - 2
  69.     movq xmm5, [esi + ecx - 1]    ; src - 1
  70.     movq xmm0, [esi + ecx + 0]    ; src
  71.     movq xmm1, [esi + ecx + 1]    ; src + 1
  72.     movq xmm2, [esi + ecx + 2]    ; src + 2
  73.     movq xmm3, [esi + ecx + 3]    ; src + 3
  74.     
  75.     punpcklbw xmm5, xmm7          ; src - 1
  76.     punpcklbw xmm4, xmm7          ; src - 2
  77.     punpcklbw xmm0, xmm7          ; src
  78.     punpcklbw xmm1, xmm7          ; src + 1
  79.     punpcklbw xmm2, xmm7          ; src + 2
  80.     punpcklbw xmm3, xmm7          ; src + 3
  81.     paddw  xmm4, [sse2_16]        ; (src - 2) + 16
  82.     paddw  xmm5, xmm2             ; (src - 1) + (src + 2)
  83.     paddw  xmm0, xmm1             ; (src + 0) + (src + 1)
  84.     
  85.     pmullw xmm5, [sse2_5n]        ; ((src - 1) + (src + 2)) * -5
  86.     pmullw xmm0, [sse2_20]        ; ((src + 0) + (src + 1)) * 20
  87.     paddw  xmm4, xmm3             ; (src - 2) + (src + 3)
  88.     paddw  xmm4, xmm5             ;                       - 5 * (src - 1)
  89.     paddw  xmm0, xmm4             ; all
  90.     
  91.     psraw  xmm0, 5
  92.     
  93.     ; pack
  94.     packuswb xmm0, xmm0
  95.     movq [edi + ecx], xmm0
  96.     
  97.     add ecx, 8
  98.     cmp ecx, ebp
  99.     jl .loopcol
  100.     inc edx
  101.     add esi, eax
  102.     add edi, ebx
  103.     cmp edx, [esp + 16 + 24]    ; height
  104.     jl .looprow
  105.     
  106.     pop ebp
  107.     pop edi
  108.     pop esi
  109.     pop ebx
  110.     
  111.     ret
  112. ;======================================================
  113. ;
  114. ; void
  115. ; interpolate_halfpel_v_sse2(uint8_t* src, int32_t src_stride, uint8_t* dst, int32_t dst_stride, int32_t width, int32_t height)
  116. ;
  117. ;======================================================
  118. align 16
  119. cglobal interpolate_halfpel_v_sse2
  120. interpolate_halfpel_v_sse2
  121.     
  122.     push ebx
  123.     push esi
  124.     push edi
  125.     push ebp
  126.     
  127.     mov esi, [esp + 16 + 4]     ; src
  128.     mov eax, [esp + 16 + 8]     ; src_stride
  129.     mov edi, [esp + 16 + 12]    ; dst
  130.     mov ebp, [esp + 16 + 20]    ; width
  131.     
  132.     pxor xmm7, xmm7
  133.     xor edx, edx
  134. .looprow
  135.     xor ebx, ebx
  136. .loopcol
  137.     
  138.     lea  ecx, [esi + ebx]
  139.     movq xmm0, [ecx]    ; src
  140.     sub  ecx, eax
  141.     movq xmm4, [ecx]    ; src - stride
  142.     sub  ecx, eax
  143.     movq xmm5, [ecx]    ; src - 2 * stride
  144.     lea  ecx, [esi + eax]
  145.     add  ecx, ebx
  146.     movq xmm1, [ecx]    ; src + stride
  147.     add  ecx, eax
  148.     movq xmm2, [ecx]    ; src + 2 * stride
  149.     add  ecx, eax
  150.     movq xmm3, [ecx]    ; src + 3 * stride
  151.     punpcklbw xmm0, xmm7          ; src
  152.     punpcklbw xmm4, xmm7          ; src - 1
  153.     punpcklbw xmm5, xmm7          ; src - 2
  154.     punpcklbw xmm1, xmm7          ; src + 1
  155.     punpcklbw xmm2, xmm7          ; src + 2
  156.     punpcklbw xmm3, xmm7          ; src + 3
  157.     paddw  xmm5, [sse2_16]        ; (src - 2) + 16
  158.     paddw  xmm4, xmm2             ; (src - 1) + (src + 2)
  159.     paddw  xmm0, xmm1             ; (src + 0) + (src + 1)
  160.     
  161.     pmullw xmm4, [sse2_5n]        ; ((src - 1) + (src + 2)) * -5
  162.     pmullw xmm0, [sse2_20]        ; ((src + 0) + (src + 1)) * 20
  163.     paddw  xmm5, xmm3             ; (src - 2) + (src + 3)
  164.     paddw  xmm5, xmm4             ;                       - 5 * (src - 1)
  165.     paddw  xmm0, xmm5             ; all
  166.     
  167.     psraw  xmm0, 5
  168.     
  169.     ; pack
  170.     packuswb xmm0, xmm0
  171.     movq [edi + ebx], xmm0
  172.     
  173.     add ebx, 8
  174.     cmp ebx, ebp
  175.     jl .loopcol
  176.     inc edx
  177.     add esi, eax
  178.     add edi, [esp + 16 + 16]
  179.     cmp edx, [esp + 16 + 24]    ; height
  180.     jl .looprow
  181.     
  182.     pop ebp
  183.     pop edi
  184.     pop esi
  185.     pop ebx
  186.     
  187.     ret
  188. ;======================================================
  189. ;
  190. ; void
  191. ; interpolate_halfpel_hv_sse2(uint8_t* src, int32_t src_stride, uint8_t* dst, int32_t dst_stride, int32_t width, int32_t height)
  192. ;
  193. ;======================================================
  194. align 16
  195. cglobal interpolate_halfpel_hv_sse2
  196. interpolate_halfpel_hv_sse2
  197.     
  198.     ret
  199.     
  200. ;=======================PIA=================================
  201. %macro new_pia16b_sse2 0
  202.     movdqu  xmm0, [eax] ; p1
  203.     movdqu  xmm1, [eax + ebx] ;
  204.     lea eax, [eax+2*ebx]
  205.     
  206.     movdqu  xmm5, [ecx] ; p2
  207.     movdqu  xmm6, [ecx + edx];
  208.     lea ecx, [ecx+2*edx]
  209.     pavgb xmm0, xmm5
  210.     pavgb   xmm1, xmm6
  211.     
  212.     movdqa  [esi], xmm0
  213.     movdqa  [esi + edi], xmm1
  214.     
  215.     lea esi, [esi+2*edi]
  216. %endmacro
  217. ; %1 = src1, %2 = src2, %3 = src1_stride, %4 = src2_stride, %5 = dst, %6 = dst stride
  218. %macro pia16b_sse 6
  219.     movq mm0, [%1]
  220.     movq mm1, [%2]
  221.     pavgb mm0,mm1
  222. movq [%5],mm0
  223.     movq mm0, [%1 + 8]
  224.     movq mm1, [%2 + 8]
  225.     pavgb mm0,mm1
  226. movq [%5 + 8],mm0
  227. add %1,%3
  228. add %2,%4
  229. add %5,%6    
  230. %endmacro
  231. ; %1 = src1, %2 = src2, %3 = src1_stride, %4 = src2_stride, %5 = dst, %6 = dst stride
  232. %macro pia8b_sse 6
  233.     movq mm0, [%1]
  234.     movq mm1, [%2]
  235.     pavgb mm0,mm1
  236. movq [%5],mm0
  237. add %1,%3
  238. add %2,%4
  239. add %5,%6    
  240. %endmacro
  241. ; %1 = src1, %2 = src2, %3 = src1_stride, %4 = src2_stride, %5 = dst, %6 = dst stride
  242. %macro pia4b_mmx 6
  243.     movd mm0, [%1]
  244.     movd mm1, [%2]
  245.     pavgb mm0,mm1
  246. movd [%5],mm0
  247. add %1,%3
  248. add %2,%4
  249. add %5,%6    
  250. %endmacro
  251. ;======================================================
  252. ;
  253. ; void 
  254. ; T264_pia_u_4x4_mmx(uint8_t* p1, uint8_t* p2, int32_t p1_stride, int32_t p2_stride, uint8_t* dst, int32_t dst_stride);
  255. ;
  256. ;======================================================
  257. align 16
  258. cglobal T264_pia_u_4x4_mmx
  259. T264_pia_u_4x4_mmx    
  260.     push ebx
  261.     push esi
  262.     push edi
  263.    
  264.     mov esi, [esp + 4 + 12]     ; p1 
  265.     mov ebx, [esp + 8 + 12] ; p2
  266. mov eax, [esp + 12 + 12]    ; 
  267. mov edx, [esp + 16 + 12]    ; 
  268. mov edi, [esp + 20 + 12]    ; 
  269. mov ecx, [esp + 24 + 12]    ; 
  270. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  271. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  272. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  273. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  274. EMMS
  275.     pop edi
  276.     pop esi
  277.     pop ebx
  278.     ret
  279. ;======================================================
  280. ;
  281. ; void 
  282. ; T264_pia_u_4x8_mmx(uint8_t* p1, uint8_t* p2, int32_t p1_stride, int32_t p2_stride, uint8_t* dst, int32_t dst_stride);
  283. ;
  284. ;======================================================
  285. align 16
  286. cglobal T264_pia_u_4x8_mmx
  287. T264_pia_u_4x8_mmx    
  288.     push ebx
  289.     push esi
  290.     push edi
  291.    
  292.     mov esi, [esp + 4 + 12]     ; p1 
  293.     mov ebx, [esp + 8 + 12] ; p2
  294. mov eax, [esp + 12 + 12]    ; 
  295. mov edx, [esp + 16 + 12]    ; 
  296. mov edi, [esp + 20 + 12]    ; 
  297. mov ecx, [esp + 24 + 12]    ; 
  298. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  299. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  300. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  301. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  302. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  303. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  304. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  305. pia4b_mmx esi,ebx,eax,edx,edi,ecx
  306. EMMS
  307.     pop edi
  308.     pop esi
  309.     pop ebx
  310.     ret
  311. ;======================================================
  312. ;
  313. ; void 
  314. ; T264_pia_u_8x4_sse(uint8_t* p1, uint8_t* p2, int32_t p1_stride, int32_t p2_stride, uint8_t* dst, int32_t dst_stride);
  315. ;
  316. ;======================================================
  317. align 16
  318. cglobal T264_pia_u_8x4_sse
  319. T264_pia_u_8x4_sse    
  320.     push ebx
  321.     push esi
  322.     push edi
  323.    
  324.     mov esi, [esp + 4 + 12]     ; p1 
  325.     mov ebx, [esp + 8 + 12] ; p2
  326. mov eax, [esp + 12 + 12]    ; 
  327. mov edx, [esp + 16 + 12]    ; 
  328. mov edi, [esp + 20 + 12]    ; 
  329. mov ecx, [esp + 24 + 12]    ; 
  330. pia8b_sse esi , ebx , eax , edx , edi , ecx
  331. pia8b_sse esi,ebx,eax,edx,edi,ecx
  332. pia8b_sse esi,ebx,eax,edx,edi,ecx
  333. pia8b_sse esi,ebx,eax,edx,edi,ecx
  334.     pop edi
  335.     pop esi
  336.     pop ebx
  337.     ret
  338. ;======================================================
  339. ;
  340. ; void 
  341. ; T264_pia_u_8x8_sse(uint8_t* p1, uint8_t* p2, int32_t p1_stride, int32_t p2_stride, uint8_t* dst, int32_t dst_stride);
  342. ;
  343. ;======================================================
  344. align 16
  345. cglobal T264_pia_u_8x8_sse
  346. T264_pia_u_8x8_sse    
  347.     push ebx
  348.     push esi
  349.     push edi
  350.    
  351.     mov esi, [esp + 4 + 12]     ; p1 
  352.     mov ebx, [esp + 8 + 12] ; p2
  353. mov eax, [esp + 12 + 12]    ; 
  354. mov edx, [esp + 16 + 12]    ; 
  355. mov edi, [esp + 20 + 12]    ; 
  356. mov ecx, [esp + 24 + 12]    ; 
  357. pia8b_sse esi,ebx,eax,edx,edi,ecx
  358. pia8b_sse esi,ebx,eax,edx,edi,ecx
  359. pia8b_sse esi,ebx,eax,edx,edi,ecx
  360. pia8b_sse esi,ebx,eax,edx,edi,ecx
  361. pia8b_sse esi,ebx,eax,edx,edi,ecx
  362. pia8b_sse esi,ebx,eax,edx,edi,ecx
  363. pia8b_sse esi,ebx,eax,edx,edi,ecx
  364. pia8b_sse esi,ebx,eax,edx,edi,ecx
  365.     pop edi
  366.     pop esi
  367.     pop ebx
  368.     ret
  369. ;======================================================
  370. ;
  371. ; void 
  372. ; T264_pia_u_8x16_sse(uint8_t* p1, uint8_t* p2, int32_t p1_stride, int32_t p2_stride, uint8_t* dst, int32_t dst_stride);
  373. ;
  374. ;======================================================
  375. align 16
  376. cglobal T264_pia_u_8x16_sse
  377. T264_pia_u_8x16_sse    
  378.     push ebx
  379.     push esi
  380.     push edi
  381.    
  382.     mov esi, [esp + 4 + 12]     ; p1 
  383.     mov ebx, [esp + 8 + 12] ; p2
  384. mov eax, [esp + 12 + 12]    ; 
  385. mov edx, [esp + 16 + 12]    ; 
  386. mov edi, [esp + 20 + 12]    ; 
  387. mov ecx, [esp + 24 + 12]    ; 
  388. pia8b_sse esi,ebx,eax,edx,edi,ecx
  389. pia8b_sse esi,ebx,eax,edx,edi,ecx
  390. pia8b_sse esi,ebx,eax,edx,edi,ecx
  391. pia8b_sse esi,ebx,eax,edx,edi,ecx
  392. pia8b_sse esi,ebx,eax,edx,edi,ecx
  393. pia8b_sse esi,ebx,eax,edx,edi,ecx
  394. pia8b_sse esi,ebx,eax,edx,edi,ecx
  395. pia8b_sse esi,ebx,eax,edx,edi,ecx
  396. pia8b_sse esi,ebx,eax,edx,edi,ecx
  397. pia8b_sse esi,ebx,eax,edx,edi,ecx
  398. pia8b_sse esi,ebx,eax,edx,edi,ecx
  399. pia8b_sse esi,ebx,eax,edx,edi,ecx
  400. pia8b_sse esi,ebx,eax,edx,edi,ecx
  401. pia8b_sse esi,ebx,eax,edx,edi,ecx
  402. pia8b_sse esi,ebx,eax,edx,edi,ecx
  403. pia8b_sse esi,ebx,eax,edx,edi,ecx
  404.     pop edi
  405.     pop esi
  406.     pop ebx
  407.     ret
  408. ;======================================================
  409. ;
  410. ; void 
  411. ; T264_pia_u_16x8_sse(uint8_t* p1, uint8_t* p2, int32_t p1_stride, int32_t p2_stride, uint8_t* dst, int32_t dst_stride);
  412. ;
  413. ;======================================================
  414. align 16
  415. cglobal T264_pia_u_16x8_sse
  416. T264_pia_u_16x8_sse    
  417.     push ebx
  418.     push esi
  419.     push edi
  420.    
  421.     mov esi, [esp + 4 + 12]     ; p1 
  422.     mov ebx, [esp + 8 + 12] ; p2
  423. mov eax, [esp + 12 + 12]    ; 
  424. mov edx, [esp + 16 + 12]    ; 
  425. mov edi, [esp + 20 + 12]    ; 
  426. mov ecx, [esp + 24 + 12]    ; 
  427. pia16b_sse esi,ebx,eax,edx,edi,ecx
  428. pia16b_sse esi,ebx,eax,edx,edi,ecx
  429. pia16b_sse esi,ebx,eax,edx,edi,ecx
  430. pia16b_sse esi,ebx,eax,edx,edi,ecx
  431. pia16b_sse esi,ebx,eax,edx,edi,ecx
  432. pia16b_sse esi,ebx,eax,edx,edi,ecx
  433. pia16b_sse esi,ebx,eax,edx,edi,ecx
  434. pia16b_sse esi,ebx,eax,edx,edi,ecx
  435.     pop edi
  436.     pop esi
  437.     pop ebx
  438.     ret
  439. ;======================================================
  440. ;
  441. ; void 
  442. ; T264_pia_u_16x16_sse(uint8_t* p1, uint8_t* p2, int32_t p1_stride, int32_t p2_stride, uint8_t* dst, int32_t dst_stride);
  443. ;
  444. ;======================================================
  445. align 16
  446. cglobal T264_pia_u_16x16_sse
  447. T264_pia_u_16x16_sse    
  448.     push ebx
  449.     push esi
  450.     push edi
  451.    
  452.     mov esi, [esp + 4 + 12]     ; p1 
  453.     mov ebx, [esp + 8 + 12] ; p2
  454. mov eax, [esp + 12 + 12]    ; 
  455. mov edx, [esp + 16 + 12]    ; 
  456. mov edi, [esp + 20 + 12]    ; 
  457. mov ecx, [esp + 24 + 12]    ; 
  458. pia16b_sse esi,ebx,eax,edx,edi,ecx
  459. pia16b_sse esi,ebx,eax,edx,edi,ecx
  460. pia16b_sse esi,ebx,eax,edx,edi,ecx
  461. pia16b_sse esi,ebx,eax,edx,edi,ecx
  462. pia16b_sse esi,ebx,eax,edx,edi,ecx
  463. pia16b_sse esi,ebx,eax,edx,edi,ecx
  464. pia16b_sse esi,ebx,eax,edx,edi,ecx
  465. pia16b_sse esi,ebx,eax,edx,edi,ecx
  466. pia16b_sse esi,ebx,eax,edx,edi,ecx
  467. pia16b_sse esi,ebx,eax,edx,edi,ecx
  468. pia16b_sse esi,ebx,eax,edx,edi,ecx
  469. pia16b_sse esi,ebx,eax,edx,edi,ecx
  470. pia16b_sse esi,ebx,eax,edx,edi,ecx
  471. pia16b_sse esi,ebx,eax,edx,edi,ecx
  472. pia16b_sse esi,ebx,eax,edx,edi,ecx
  473. pia16b_sse esi,ebx,eax,edx,edi,ecx
  474.     pop edi
  475.     pop esi
  476.     pop ebx
  477.     ret
  478.     
  479. ;======================================================
  480. ;
  481. ; void 
  482. ; T264_pia_u_16x16_sse2(uint8_t* p1, uint8_t* p2, int32_t p1_stride, int32_t p2_stride, uint8_t* dst, int32_t dst_stride);
  483. ;
  484. ;======================================================
  485. align 16
  486. cglobal T264_pia_u_16x16_sse2
  487. T264_pia_u_16x16_sse2
  488.     push ebx
  489.     push esi
  490.     push edi
  491.     
  492.     mov eax, [esp + 4 + 12] ; p1
  493.     mov ecx, [esp + 8 + 12] ; p2
  494.     mov ebx, [esp + 12+ 12] ; p1_stride
  495.     mov edx, [esp + 16+ 12] ; p2_stride
  496.     mov esi, [esp + 20+ 12] ; dst
  497.     mov edi, [esp + 24+ 12] ; dst_stride
  498.     
  499.     new_pia16b_sse2
  500.     new_pia16b_sse2
  501.     new_pia16b_sse2
  502.     new_pia16b_sse2
  503.     new_pia16b_sse2
  504.     new_pia16b_sse2
  505.     new_pia16b_sse2
  506.     new_pia16b_sse2
  507.     
  508.     pop edi
  509.     pop esi
  510.     pop ebx
  511.     
  512.     ret    
  513.     
  514. ;======================================================
  515. ;
  516. ; void 
  517. ; T264_pia_u_16x8_sse2(uint8_t* p1, uint8_t* p2, int32_t p1_stride, int32_t p2_stride, uint8_t* dst, int32_t dst_stride);
  518. ;
  519. ;======================================================
  520. align 16
  521. cglobal T264_pia_u_16x8_sse2
  522. T264_pia_u_16x8_sse2
  523.     push ebx
  524.     push esi
  525.     push edi
  526.     
  527.     mov eax, [esp + 4 + 12] ; p1
  528.     mov ecx, [esp + 8 + 12] ; p2
  529.     mov ebx, [esp + 12+ 12] ; p1_stride
  530.     mov edx, [esp + 16+ 12] ; p2_stride
  531.     mov esi, [esp + 20+ 12] ; dst
  532.     mov edi, [esp + 24+ 12] ; dst_stride
  533.     
  534.     new_pia16b_sse2
  535.     new_pia16b_sse2
  536.     new_pia16b_sse2
  537.     new_pia16b_sse2
  538.     
  539.     pop edi
  540.     pop esi
  541.     pop ebx
  542.     
  543.     ret