blit_mmx.asm
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:18k
源码类别:

Windows CE

开发平台:

C/C++

  1. ;*****************************************************************************
  2. ;*
  3. ;* This program is free software ; you can redistribute it and/or modify
  4. ;* it under the terms of the GNU General Public License as published by
  5. ;* the Free Software Foundation; either version 2 of the License, or
  6. ;* (at your option) any later version.
  7. ;*
  8. ;* This program is distributed in the hope that it will be useful,
  9. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. ;* GNU General Public License for more details.
  12. ;*
  13. ;* You should have received a copy of the GNU General Public License
  14. ;* along with this program; if not, write to the Free Software
  15. ;* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16. ;*
  17. ;* $Id: blit_mmx.asm 323 2005-11-01 20:52:32Z picard $
  18. ;*
  19. ;* The Core Pocket Media Player
  20. ;* Copyright (c) 2004-2005 Gabor Kovacs
  21. ;*
  22. ;*****************************************************************************
  23. BITS 32
  24. SECTION .data
  25. OFFSET_COL equ 8
  26. align 8
  27. const_b254 dd 0xfefefefe,0xfefefefe
  28. SECTION .text
  29. %macro func 2
  30. %define %1 _%1@%2
  31. global %1
  32. align 16
  33. %1:
  34. %endmacro
  35. %macro _prefetch 2
  36. %if s%1=smmx2
  37. prefetchnta [%2+256]
  38. %elif s%1=s3dnow
  39. prefetch [%2+256]
  40. %endif
  41. %endmacro
  42. ; caps, in, src, in2, src2, tmp1, tmp2
  43. %macro avg 7
  44. %if s%1=smmx
  45. movq %6,%3
  46. movq %7,%5
  47. pxor %6,%2
  48. pxor %7,%4
  49. por %2,%6
  50. por %4,%7
  51. pand %6,[const_b254]
  52. pand %7,[const_b254]
  53. psrlq %6,1
  54. psrlq %7,1
  55. psubb %2,%6
  56. psubb %4,%7
  57. %elif s%1=smmx2
  58. pavgb %2,%3
  59. pavgb %4,%5
  60. %elif s%1=s3dnow
  61. pavgusb %2,%3
  62. pavgusb %4,%5
  63. %else
  64. %error not supported caps %1
  65. %endif
  66. %endmacro
  67. %macro save 3
  68. %if s%1=smmx2
  69.   movntq %2,%3
  70. %else
  71. movq %2,%3
  72. %endif
  73. %endmacro
  74. %define savg 2
  75. %define smmx2 3
  76. %define s3dnow 4
  77. %define snone 5
  78. %define smmx 6
  79. %define srgb32 7
  80. %define srgb24 8
  81. %define sbgr32 9
  82. %define sbgr24 10
  83. %define syuy2 11
  84. %define srgb 12
  85. %define srgb16 13
  86. %define sbgr16 14
  87. %define syuy2_color 15
  88. ;eax tmp/Col
  89. ;ebx SrcPitch/2
  90. ;ecx SrcPtr[1]
  91. ;edx StrPtr[2]
  92. ;esi SrcPtr[0]
  93. ;edi DstPtr
  94. ;ebp Width/2
  95. ;---------------------------------------------------------------------
  96. ; caps, type, mode
  97. %macro blit_pack_single_yuy2 3
  98. mov al,[esi]
  99. add esi,2
  100. mov [edi],al
  101. mov al,[ecx]
  102. %if %2=2
  103. add al,[ecx+ebx]
  104. rcr al,1
  105. %endif
  106. add ecx,1
  107. mov [edi+1],al
  108. mov al,[esi-1]
  109. add edi,4
  110. mov [edi-2],al
  111. mov al,[edx]
  112. %if %2=2
  113. add al,[edx+ebx]
  114. rcr al,1
  115. %endif
  116. add edx,1
  117. mov [edi-1],al
  118. %endmacro
  119. ; caps, type, mode, i
  120. %macro blit_pack_block_yuy2 4
  121. movq mm0,[esi-16]
  122. movq mm2,[ecx]
  123. movq mm3,[edx]
  124. movq mm1,[esi-8]
  125. %if %2=2
  126. avg %1,mm2,[ecx+ebx],mm3,[edx+ebx],mm4,mm5
  127. %endif
  128. _prefetch %1,esi
  129. movq mm5,mm0
  130. movq mm4,mm2
  131. punpcklbw mm2,mm3
  132. punpckhbw mm4,mm3
  133. movq mm3,mm1
  134.     punpcklbw mm0,mm2
  135.     punpcklbw mm1,mm4
  136.     punpckhbw mm5,mm2
  137.     punpckhbw mm3,mm4
  138. %if %2=2
  139. _prefetch %1,ecx+ebx
  140. %endif
  141. save %1,[edi],mm0
  142. add ecx,8
  143. save %1,[edi+8],mm5
  144. add edx,8
  145. save %1,[edi+16],mm1
  146. add esi,16
  147. save %1,[edi+24],mm3
  148. add edi,32
  149. %if %2=2
  150. _prefetch %1,edx+ebx
  151. %endif
  152. %endmacro
  153. ;---------------------------------------------------------------------
  154. ; caps, type, mode
  155. %macro blit_pack_single_yuy2_color 3
  156. movzx eax,word [esi]
  157. add esi,2
  158. movd mm0,eax
  159. mov al,[ecx]
  160. %if %2=2
  161. add al,[ecx+ebx]
  162. rcr al,1
  163. %endif
  164. add ecx,1
  165. movd mm2,eax
  166. mov al,[edx]
  167. %if %2=2
  168. add al,[edx+ebx]
  169. rcr al,1
  170. %endif
  171. add edx,1
  172. movd mm3,eax
  173. mov eax,[esp]
  174. pxor mm7,mm7
  175. punpcklbw mm0,mm7
  176. punpcklbw mm2,mm7
  177. punpcklbw mm3,mm7
  178. psllw  mm0,5
  179. psllw  mm2,5
  180. psllw  mm3,5
  181. pmulhw mm0,[eax+8*0]
  182. pmulhw mm2,[eax+8*2]
  183. pmulhw mm3,[eax+8*4]
  184. paddsw mm0,[eax+8*1]
  185. paddsw mm2,[eax+8*3]
  186. paddsw mm3,[eax+8*5]
  187. packuswb mm0,mm0
  188. packuswb mm2,mm2
  189. packuswb mm3,mm3
  190. punpcklbw mm2,mm3
  191.     punpcklbw mm0,mm2
  192. movd [edi],mm0
  193. add edi,4
  194. %endmacro
  195. ; caps, type, mode, i
  196. %macro blit_pack_block_yuy2_color 4
  197. movq mm0,[esi-16]
  198. movq mm2,[ecx]
  199. movq mm3,[edx]
  200. movq mm1,[esi-8]
  201. %if %2=2
  202. avg %1,mm2,[ecx+ebx],mm3,[edx+ebx],mm4,mm5
  203. %endif
  204. _prefetch %1,esi
  205. movq mm6,[eax+8*0]
  206. pxor mm7,mm7
  207. movq mm4,mm0
  208. movq mm5,mm1
  209. punpcklbw mm0,mm7
  210. punpcklbw mm1,mm7
  211. psllw  mm0,5
  212. psllw  mm1,5
  213. pmulhw mm0,mm6
  214. pmulhw mm1,mm6
  215. punpckhbw mm4,mm7
  216. punpckhbw mm5,mm7
  217. movq mm7,[eax+8*1]
  218. psllw  mm4,5
  219. psllw  mm5,5
  220. pmulhw mm4,mm6
  221. pmulhw mm5,mm6
  222. paddsw mm0,mm7
  223. paddsw mm1,mm7
  224. paddsw mm4,mm7
  225. paddsw mm5,mm7
  226. packuswb mm0,mm4
  227. packuswb mm1,mm5
  228. %if %2=2
  229. _prefetch %1,ecx+ebx
  230. %endif
  231. pxor mm7,mm7
  232. movq mm4,mm2
  233. movq mm5,mm3
  234. punpcklbw mm2,mm7
  235. punpcklbw mm3,mm7
  236. punpckhbw mm4,mm7
  237. punpckhbw mm5,mm7
  238. movq mm6,[eax+8*2]
  239. movq mm7,[eax+8*4]
  240. psllw  mm2,5
  241. psllw  mm3,5
  242. pmulhw mm2,mm6
  243. pmulhw mm3,mm7
  244. psllw  mm4,5
  245. psllw  mm5,5
  246. pmulhw mm4,mm6
  247. pmulhw mm5,mm7
  248. movq mm6,[eax+8*3]
  249. movq mm7,[eax+8*5]
  250. paddsw mm2,mm6
  251. paddsw mm3,mm7
  252. paddsw mm4,mm6
  253. paddsw mm5,mm7
  254. packuswb mm2,mm4
  255. packuswb mm3,mm5
  256. movq mm5,mm0
  257. movq mm4,mm2
  258. punpcklbw mm2,mm3
  259. punpckhbw mm4,mm3
  260. movq mm3,mm1
  261.     punpcklbw mm0,mm2
  262.     punpcklbw mm1,mm4
  263.     punpckhbw mm5,mm2
  264.     punpckhbw mm3,mm4
  265. %if %2=2
  266. _prefetch %1,edx+ebx
  267. %endif
  268. save %1,[edi],mm0
  269. add ecx,8
  270. save %1,[edi+8],mm5
  271. add edx,8
  272. save %1,[edi+16],mm1
  273. add esi,16
  274. save %1,[edi+24],mm3
  275. add edi,32
  276. %endmacro
  277. ;---------------------------------------------------------------------
  278. ;input
  279. ; mm0 y(8)
  280. ; mm1 u(4)
  281. ; mm2 v(4)
  282. ; mm7 0
  283. ;output
  284. ; mm0 g
  285. ; mm1 b
  286. ; mm2 r
  287. %macro yuv_rgb 0
  288. movq mm5,mm0
  289. movq mm3,[eax+8]
  290. punpcklbw mm0,mm7
  291. movq mm4,[eax+16+8]
  292. punpckhbw mm5,mm7
  293. movq mm6,[eax+32+8]
  294. punpcklbw mm1,mm7
  295. paddsw mm0,mm3
  296. punpcklbw mm2,mm7
  297. paddsw mm5,mm3
  298. movq mm7,[eax]
  299. psllw mm0,7
  300. paddsw mm1,mm4
  301. psllw mm5,7
  302. paddsw mm2,mm6
  303. psllw mm1,7
  304. psllw mm2,7
  305. pmulhw mm0,mm7
  306. movq mm6,[eax+16]
  307. pmulhw mm5,mm7
  308. movq mm7,[eax+32]
  309. movq mm3,mm1
  310. movq mm4,mm2
  311. punpckldq mm1,mm1
  312. punpckldq mm2,mm2
  313. pmulhw mm1,mm6
  314. pmulhw mm2,mm7
  315. punpckhdq mm3,mm3
  316. punpckhdq mm4,mm4
  317. pmulhw mm3,mm6
  318. pmulhw mm4,mm7
  319. movq mm6,mm1
  320. movq mm7,mm2
  321. punpcklwd mm1,mm1
  322. punpcklwd mm2,mm2
  323. punpckhwd mm6,mm6
  324. punpckhwd mm7,mm7
  325. paddsw mm1,mm0 ;y*y_mul+u*u_mul_lo
  326. paddsw mm2,mm0      ;y*y_mul           +v*v_mul_lo
  327. paddsw mm0,mm6
  328. paddsw mm0,mm7      ;y*y_mul+u*u_mul_hi+v*v_mul_hi
  329. psraw mm1,4
  330. psraw mm2,4
  331. psraw mm0,4
  332. movq mm6,mm3
  333. movq mm7,mm4
  334. punpcklwd mm3,mm3
  335. punpcklwd mm4,mm4
  336. punpckhwd mm6,mm6
  337. punpckhwd mm7,mm7
  338. paddsw mm3,mm5 ;y*y_mul+u*u_mul_lo
  339. paddsw mm4,mm5      ;y*y_mul           +v*v_mul_lo
  340. paddsw mm5,mm6
  341. paddsw mm5,mm7      ;y*y_mul+u*u_mul_hi+v*v_mul_hi
  342. psraw mm3,4
  343. psraw mm4,4
  344. psraw mm5,4
  345. packuswb mm1,mm3    ;b
  346. packuswb mm2,mm4 ;r
  347. packuswb mm0,mm5    ;g
  348. %endmacro
  349. ; caps, type, mode
  350. %macro blit_pack_single_rgb 3
  351. movzx eax,word [esi]
  352. add esi,2
  353. pxor mm7,mm7
  354. movd mm0,eax
  355. %if %2=2
  356. mov al,[ecx]
  357. add al,[ecx+ebx]
  358. rcr al,1
  359. %else
  360. movzx eax,byte [ecx]
  361. %endif
  362. add ecx,1
  363. movd mm1,eax
  364. %if %2=2
  365. mov al,[edx]
  366. add al,[edx+ebx]
  367. rcr al,1
  368. %else
  369. movzx eax,byte [edx]
  370. %endif
  371. add edx,1
  372. movd mm2,eax
  373. mov eax,[esp]
  374. yuv_rgb
  375. pxor mm7,mm7
  376. %if (s%3=srgb32) || (s%3=srgb24)
  377. punpcklbw mm2,mm7 ;0r0r0r0r (0)
  378. punpcklbw mm1,mm0 ;gbgbgbgb (0)
  379. punpcklwd mm1,mm2 ;0rgb0rgb (0)
  380. %else
  381. punpcklbw mm1,mm7 ;0b0b0b0b (0)
  382. punpcklbw mm2,mm0 ;grgrgrgr (0)
  383. punpcklwd mm2,mm1 ;0bgr0bgr (0)
  384. %endif
  385. %if s%3=srgb32
  386. save %1,[edi],mm1
  387. add edi,8
  388. %endif
  389. %if s%3=sbgr32
  390. save %1,[edi],mm2
  391. add edi,8
  392. %endif
  393. %if (s%3=srgb24) || (s%3=sbgr24)
  394. %if s%3=srgb24
  395. movq mm2,mm1
  396. %else
  397. movq mm1,mm2
  398. %endif
  399. punpckhdq mm2,mm7 ;00000bgr (1)
  400. punpckldq mm1,mm7 ;00000bgr (0)
  401. psllq mm2,24 ;00bgr000 (1)
  402. por mm2,mm1 ;00bgrbgr
  403. movd eax,mm2
  404. psrlq mm2,32
  405. mov [edi],eax
  406. movd eax,mm2
  407. mov [edi+4],ax
  408. add edi,6
  409. %endif
  410. %endmacro
  411. ; caps, type, mode, i
  412. %macro blit_pack_block_rgb 4
  413. movq mm0,[esi-16]
  414. movd mm1,[ecx]
  415. pxor mm7,mm7
  416. movd mm2,[edx]
  417. %if %2=2
  418. avg %1,mm1,[ecx+ebx],mm2,[edx+ebx],mm4,mm5
  419. %endif
  420. %if (%4=0)
  421. _prefetch %1,esi
  422. %endif
  423. yuv_rgb
  424. %if (%2=2) 
  425. %if (%4=0)
  426. _prefetch %1,edx+ebx
  427. %else
  428. _prefetch %1,ecx+ebx
  429. %endif
  430. %endif
  431. pxor mm7,mm7
  432. %if (s%3=srgb32) || (s%3=srgb24)
  433. movq mm3,mm2
  434. movq mm4,mm1
  435. punpcklbw mm2,mm7 ;0r0r0r0r (0)
  436. punpckhbw mm3,mm7 ;0r0r0r0r (1)
  437. punpcklbw mm1,mm0 ;gbgbgbgb (0)
  438. punpckhbw mm4,mm0 ;gbgbgbgb (1)
  439. movq mm7,mm1
  440. movq mm0,mm4
  441. punpcklwd mm1,mm2 ;0rgb0rgb (0)
  442. punpckhwd mm7,mm2 ;0rgb0rgb (1)
  443. punpcklwd mm4,mm3 ;0rgb0rgb (2)
  444. punpckhwd mm0,mm3 ;0rgb0rgb (3)
  445. %else
  446. movq mm3,mm1
  447. movq mm4,mm2
  448. punpcklbw mm1,mm7 ;0b0b0b0b (0)
  449. punpckhbw mm3,mm7 ;0b0b0b0b (1)
  450. punpcklbw mm2,mm0 ;grgrgrgr (0)
  451. punpckhbw mm4,mm0 ;grgrgrgr (1)
  452. movq mm7,mm2
  453. movq mm0,mm4
  454. punpcklwd mm2,mm1 ;0bgr0bgr (0)
  455. punpckhwd mm7,mm1 ;0bgr0bgr (1)
  456. punpcklwd mm4,mm3 ;0bgr0bgr (2)
  457. punpckhwd mm0,mm3 ;0bgr0bgr (3)
  458. movq mm1,mm2
  459. %endif
  460. %if (s%3=srgb32) || (s%3=sbgr32)
  461. save %1,[edi],mm1
  462. add ecx,4
  463. save %1,[edi+8],mm7
  464. add edx,4
  465. save %1,[edi+16],mm4
  466. add esi,8
  467. save %1,[edi+24],mm0
  468. add edi,32
  469. %else
  470. pxor mm6,mm6
  471. movq mm3,mm7 ;0ddd0ccc
  472. movq mm5,mm4 ;0fff0eee
  473. pslld mm0,8  ;hhh0ggg0
  474. psrld mm5,8 ;00ffxxxx
  475. punpckhdq mm6,mm1 ;0bbb0000
  476. punpckhdq mm5,mm0 ;hhh000ff
  477. psllq mm0,32 ;ggg00000
  478. pslld mm3,16 ;xxxxcc00
  479. psrlq mm6,8 ;00bbb000
  480. punpckldq mm1,mm3 ;cc000aaa
  481. punpckldq mm3,mm4 ;0eeexxxx
  482. pslld mm4,24 ;f000xxxx
  483. psrlq mm0,24 ;000ggg00
  484. por mm1,mm6 ;ccbbbaaa
  485. punpckldq mm6,mm7 ;0cccxxxx
  486. pslld mm7,8 ;ddd0xxxx
  487. por mm5,mm0 ;hhhgggff
  488. psrld mm6,16 ;000cxxxx
  489. punpckhdq mm7,mm3 ;0eeeddd0
  490. punpckhdq mm6,mm4 ;f000000c
  491. save %1,[edi],mm1
  492. por mm7,mm6 ;feeedddc
  493. add ecx,4
  494. add edx,4
  495. save %1,[edi+8],mm7
  496. add esi,8
  497. save %1,[edi+16],mm5
  498. add edi,24
  499. %endif
  500. %endmacro
  501. ;---------------------------------------------------------------------
  502. ;caps, mode, type, align, repeat, name
  503. %macro blit_pack_line 6
  504. %%small:
  505. add ebp,ebp
  506. %%smallstart:
  507. %if (s%6=srgb) || (s%6=syuy2_color)
  508. push eax
  509. %endif
  510. %%smallloop:
  511. blit_pack_single_%6 %1,%3,%2
  512. sub ebp,2
  513. jne %%smallloop
  514. %if (s%6=srgb) || (s%6=syuy2_color)
  515. pop eax
  516. %endif
  517. ret
  518. blit_i420_%2_%3_%1:
  519. cmp ebp,8+%4
  520. jl %%small
  521. %%large4:
  522. lea ebp,[esi+ebp*2]
  523. %if %4==4
  524. test edi,4
  525. je %%noalign4
  526. %if (s%6=srgb) || (s%6=syuy2_color)
  527. push eax
  528. %endif
  529. blit_pack_single_%6 %1,%3,%2
  530. %if (s%6=srgb) || (s%6=syuy2_color)
  531. pop eax
  532. %endif
  533. %%noalign4:
  534. %endif
  535. add esi,16
  536. %%move4:
  537. %assign i 0
  538. %rep %5
  539. blit_pack_block_%6 %1,%3,%2,i
  540. %assign i i+1 
  541. %endrep
  542. cmp esi,ebp
  543. jbe %%move4
  544. sub esi,16
  545. sub ebp,esi
  546. je  %%end
  547. jmp %%smallstart
  548. %%end:
  549. ret
  550. %endmacro
  551. %macro blit_pack_inner 3
  552. sub dword [esp+24+28],2
  553. jle %%noloop3
  554. %%loop3:
  555. call blit_i420_%2_1_%1
  556. mov ebp,[esp] ;-Width/2
  557. %if %3==6
  558. lea edi,[edi+ebp*4]
  559. lea edi,[edi+ebp*2]
  560. %else
  561. lea edi,[edi+ebp*%3]
  562. %endif
  563. lea esi,[esi+ebp*2]
  564. add ecx,ebp
  565. add edx,ebp
  566. mov ebp,[esp+4] ;Width/2
  567. add edi,[esp+12+28] ;DstPitch
  568. lea esi,[esi+ebx*2]
  569. call blit_i420_%2_2_%1
  570. mov ebp,[esp] ;-Width/2
  571. %if %3==6
  572. lea edi,[edi+ebp*4]
  573. lea edi,[edi+ebp*2]
  574. %else
  575. lea edi,[edi+ebp*%3]
  576. %endif
  577. lea esi,[esi+ebp*2]
  578. add ecx,ebp
  579. add edx,ebp
  580. mov ebp,[esp+4] ;Width/2
  581. add edi,[esp+12+28] ;DstPitch
  582. lea esi,[esi+ebx*2] ;
  583. add ecx,ebx
  584. add edx,ebx
  585. sub dword [esp+24+28],2
  586. jg %%loop3
  587. %%noloop3
  588. call blit_i420_%2_1_%1
  589. mov ebp,[esp] ;-Width/2
  590. %if %3==6
  591. lea edi,[edi+ebp*4]
  592. lea edi,[edi+ebp*2]
  593. %else
  594. lea edi,[edi+ebp*%3]
  595. %endif
  596. lea esi,[esi+ebp*2]
  597. add ecx,ebp
  598. add edx,ebp
  599. mov ebp,[esp+4] ;Width/2
  600. add edi,[esp+12+28] ;DstPitch
  601. lea esi,[esi+ebx*2]
  602. cmp dword [esp+24+28],0
  603. jne %%nolast3
  604. call blit_i420_%2_1_%1
  605. %%nolast3:
  606. add esp,8
  607. emms
  608. pop ebp
  609. pop ebx
  610. pop edi
  611. pop esi
  612. ret 32
  613. %endmacro
  614. ;caps, mode, align, block, name, color
  615. %macro blit_pack 6
  616. blit_pack_line %1,%2,1,%3,%4,%5
  617. blit_pack_line %1,%2,2,%3,%4,%5
  618. %if %6
  619. blit_pack_line %1,%2_color,1,%3,%4,%5_color
  620. blit_pack_line %1,%2_color,2,%3,%4,%5_color
  621. %endif
  622. func blit_i420_%2_%1,32
  623. push esi
  624. push edi
  625. push ebx
  626. push ebp
  627. mov ebx,[esp+16+20] ;SrcPitch
  628. mov edi,[esp+4+20]  ;DstPtr
  629. mov esi,[esp+8+20]  ;SrcPtr
  630. mov ebp,[esp+20+20] ;Width
  631. mov edi,[edi]
  632. sar ebx,1
  633. sar ebp,1
  634. xor eax,eax
  635. push ebp
  636. sub eax,ebp
  637. push eax
  638. mov eax,[esp+0+28] ;this
  639. mov ecx,[esi+4] ;u
  640. mov edx,[esi+8] ;v
  641. mov esi,[esi] ;y
  642. add eax,OFFSET_COL
  643. %if %6
  644. cmp dword [eax],2048+(2048<<16)
  645. jne %%color
  646. cmp dword [eax+8],0
  647. jne %%color
  648. cmp dword [eax+8*2],2048+(2048<<16)
  649. jne %%color
  650. cmp dword [eax+8*3],0
  651. jne %%color
  652. cmp dword [eax+8*4],2048+(2048<<16)
  653. jne %%color
  654. cmp dword [eax+8*5],0
  655. jne %%color
  656. jmp %%nocolor
  657. %%color:
  658. blit_pack_inner %1,%2_color,%3
  659. %%nocolor
  660. %endif
  661. blit_pack_inner %1,%2,%3
  662. %endmacro
  663. %macro blit_plane_rgb 3
  664. func blit_%2_%3_%1,32
  665. push esi
  666. push edi
  667. push ebx
  668. push ebp
  669. mov eax,[esp+12+20] ;DstPitch
  670. mov ebx,[esp+16+20] ;SrcPitch
  671. mov edi,[esp+4+20]  ;DstPtr
  672. mov esi,[esp+8+20]  ;SrcPtr
  673. mov ebp,[esp+20+20] ;Width
  674. mov edx,[esp+24+20] ;Height
  675. mov edi,[edi]
  676. mov esi,[esi]
  677. %if (s%2=srgb32) || (s%2=sbgr32)
  678. shl ebp,2
  679. %endif
  680. %if (s%2=srgb24) || (s%2=sbgr24)
  681. lea ebp,[ebp+ebp*2]
  682. %endif
  683. %if (s%2=srgb16) || (s%2=sbgr16)
  684. shl ebp,2
  685. %endif
  686. %%loopy6:
  687. _prefetch %1,esi
  688. mov ecx,ebp
  689. cmp ebp,32+4
  690. jl %%small6
  691. push ebp
  692. add ebp,esi
  693. %if (s%2=srgb16) || (s%2=sbgr16)
  694. test edi,2
  695. je %%noalignw6
  696. movsw
  697. %%noalignw6:
  698. %endif
  699. test edi,4
  700. je %%noalignd6
  701. movsd
  702. %%noalignd6:
  703. add esi,32
  704. %%move6:
  705. movq mm0,[esi-32]
  706. movq mm1,[esi-24]
  707. movq mm2,[esi-16]
  708. movq mm3,[esi-8]
  709. add esi,32
  710. _prefetch %1,esi
  711. save %1,[edi+0],mm0
  712. save %1,[edi+8],mm1
  713. save %1,[edi+16],mm2
  714. save %1,[edi+24],mm3
  715. add edi,32
  716. cmp esi,ebp
  717. jbe %%move6
  718. sub esi,32
  719. mov ecx,ebp
  720. pop ebp
  721. sub ecx,esi
  722. %%small6:
  723. rep movsb
  724. add edi,eax
  725. add esi,ebx
  726. sub edi,ebp
  727. sub esi,ebp
  728. dec edx
  729. jne %%loopy6
  730. emms
  731. pop ebp
  732. pop ebx
  733. pop edi
  734. pop esi
  735. ret 32
  736. %endmacro
  737. %macro blit 1
  738. ;This,DstPtr,SrcPtr,DstPitch,SrcPitch,Width,Height,Src2SrcLast
  739. ; edi dst
  740. ; esi src
  741. ; eax dstpitch
  742. ; ebx srcpitch
  743. ; ebp width
  744. ; edx height
  745. ; ecx mul,ofs
  746. blit_plane_yuv_%1:
  747. cmp word [ecx],2048
  748. jne %%jmpcolor
  749. cmp word [ecx+8],0
  750. je  %%loopy
  751. %%jmpcolor:
  752. jmp %%color
  753. %%loopy:
  754. _prefetch %1,esi
  755. mov ecx,ebp
  756. cmp ebp,32+4
  757. jl %%small
  758. push ebp
  759. add ebp,esi
  760. test edi,2
  761. je %%noalignw
  762. movsw
  763. %%noalignw:
  764. test edi,4
  765. je %%noalignd
  766. movsd
  767. %%noalignd:
  768. add esi,32
  769. %%move:
  770. movq mm0,[esi-32]
  771. movq mm1,[esi-24]
  772. movq mm2,[esi-16]
  773. movq mm3,[esi-8]
  774. add esi,32
  775. _prefetch %1,esi
  776. save %1,[edi+0],mm0
  777. save %1,[edi+8],mm1
  778. save %1,[edi+16],mm2
  779. save %1,[edi+24],mm3
  780. add edi,32
  781. cmp esi,ebp
  782. jbe %%move
  783. sub esi,32
  784. mov ecx,ebp
  785. pop ebp
  786. sub ecx,esi
  787. %%small:
  788. rep movsb
  789. add edi,eax
  790. add esi,ebx
  791. sub edi,ebp
  792. sub esi,ebp
  793. dec edx
  794. jne %%loopy
  795. ret
  796. %%color:
  797. movq mm5,[ecx]
  798. movq mm6,[ecx+8]
  799. pxor mm7,mm7
  800. %%loopy2:
  801. _prefetch %1,esi
  802. cmp ebp,16+4
  803. jge %%large2
  804. mov ecx,ebp
  805. jmp %%small2
  806. %%large2:
  807. push ebp
  808. add ebp,esi
  809. test edi,4
  810. je %%noalignd2
  811. movd mm0,[esi]
  812. add esi,4
  813. punpcklbw mm0,mm7
  814. psllw  mm0,5
  815. pmulhw mm0,mm5
  816. paddsw mm0,mm6
  817. packuswb mm0,mm0
  818. movd [edi],mm0
  819. add edi,4
  820. %%noalignd2:
  821. add esi,16
  822. %%move2:
  823. movq mm0,[esi-16]
  824. movq mm2,[esi-8]
  825. _prefetch %1,esi
  826. add esi,16
  827. movq mm1,mm0
  828. movq mm3,mm2
  829. punpcklbw mm0,mm7
  830. punpcklbw mm2,mm7
  831. psllw  mm0,5
  832. psllw  mm2,5
  833. pmulhw mm0,mm5
  834. pmulhw mm2,mm5
  835. punpckhbw mm1,mm7
  836. punpckhbw mm3,mm7
  837. psllw  mm1,5
  838. psllw  mm3,5
  839. pmulhw mm1,mm5
  840. pmulhw mm3,mm5
  841. paddsw mm0,mm6
  842. paddsw mm2,mm6
  843. paddsw mm1,mm6
  844. paddsw mm3,mm6
  845. packuswb mm0,mm1
  846. packuswb mm2,mm3
  847. save %1,[edi+0],mm0
  848. save %1,[edi+8],mm2
  849. add edi,16
  850. cmp esi,ebp
  851. jbe %%move2
  852. sub esi,16
  853. mov ecx,ebp
  854. pop ebp
  855. sub ecx,esi
  856. %%small2:
  857. or ecx,ecx
  858. jle %%nosmall2
  859. push eax
  860. %%smallloop2:
  861. movzx eax,byte [esi]
  862. add esi,1
  863. movd mm0,eax
  864. punpcklbw mm0,mm7
  865. psllw  mm0,5
  866. pmulhw mm0,mm5
  867. paddsw mm0,mm6
  868. packuswb mm0,mm0
  869. movd eax,mm0
  870. mov [edi],al
  871. add edi,1
  872. dec ecx
  873. jne %%smallloop2
  874. pop eax
  875. %%nosmall2:
  876. add edi,eax
  877. add esi,ebx
  878. sub edi,ebp
  879. sub esi,ebp
  880. dec edx
  881. jne %%loopy2
  882. ret
  883. func blit_i420_i420_%1,32
  884. push esi
  885. push edi
  886. push ebx
  887. push ebp
  888. mov eax,[esp+12+20] ;DstPitch
  889. mov ebx,[esp+16+20] ;SrcPitch
  890. mov ecx,[esp+0+20]  ;this
  891. mov edi,[esp+4+20]  ;DstPtr
  892. mov esi,[esp+8+20]  ;SrcPtr
  893. mov ebp,[esp+20+20] ;Width
  894. mov edx,[esp+24+20] ;Height
  895. mov edi,[edi] ;y
  896. mov esi,[esi] ;y
  897. add ecx,OFFSET_COL
  898. call blit_plane_yuv_%1
  899. sar eax,1
  900. sar ebx,1
  901. mov ecx,[esp+0+20]  ;this
  902. mov edi,[esp+4+20]  ;DstPtr
  903. mov esi,[esp+8+20]  ;SrcPtr
  904. mov ebp,[esp+20+20] ;Width
  905. mov edx,[esp+24+20] ;Height
  906. sar ebp,1
  907. sar edx,1
  908. mov edi,[edi+4] ;u
  909. mov esi,[esi+4] ;u
  910. add ecx,OFFSET_COL+8*2
  911. call blit_plane_yuv_%1
  912. mov ecx,[esp+0+20]  ;this
  913. mov edi,[esp+4+20]  ;DstPtr
  914. mov esi,[esp+8+20]  ;SrcPtr
  915. mov ebp,[esp+20+20] ;Width
  916. mov edx,[esp+24+20] ;Height
  917. sar ebp,1
  918. sar edx,1
  919. mov edi,[edi+8] ;v
  920. mov esi,[esi+8] ;v
  921. add ecx,OFFSET_COL+8*4
  922. call blit_plane_yuv_%1
  923. emms
  924. pop ebp
  925. pop ebx
  926. pop edi
  927. pop esi
  928. ret 32
  929. blit_plane_rgb %1,rgb32,rgb32
  930. blit_plane_rgb %1,rgb24,rgb24
  931. blit_plane_rgb %1,rgb16,rgb16
  932. ;blit_plane_rgb %1,rgb32,rgb24
  933. ;blit_plane_rgb %1,rgb24,rgb32
  934. ;blit_plane_rgb %1,rgb32,bgr32
  935. ;blit_plane_rgb %1,rgb24,bgr24
  936. ;blit_plane_rgb %1,rgb32,bgr24
  937. ;blit_plane_rgb %1,rgb24,bgr32
  938. blit_pack %1,yuy2,4,1,yuy2,1
  939. blit_pack %1,rgb32,8,2,rgb,0
  940. blit_pack %1,rgb24,6,2,rgb,0
  941. blit_pack %1,bgr32,8,2,rgb,0
  942. blit_pack %1,bgr24,6,2,rgb,0
  943. %endmacro
  944. blit mmx2
  945. blit mmx
  946. blit 3dnow