a_yuv2rgb.asm
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:42k
源码类别:

多媒体编程

开发平台:

Visual C++

  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. .686
  18. .mmx
  19. .xmm
  20. .model flat
  21. extern _YUV_Y_table: dword
  22. extern _YUV_U_table: dword
  23. extern _YUV_V_table: dword
  24. extern _YUV_clip_table: byte
  25. extern _YUV_clip_table16: byte
  26. .const
  27. align 16
  28. MMX_10w dq 00010001000100010h
  29. MMX_80w dq 00080008000800080h
  30. MMX_00FFw dq 000FF00FF00FF00FFh
  31. MMX_FF00w dq 0FF00FF00FF00FF00h
  32. MMX_Ublucoeff dq 00081008100810081h
  33. MMX_Vredcoeff dq 00066006600660066h
  34. MMX_Ugrncoeff dq 0FFE7FFE7FFE7FFE7h
  35. MMX_Vgrncoeff dq 0FFCCFFCCFFCCFFCCh
  36. MMX_Ycoeff dq 0004A004A004A004Ah
  37. MMX_rbmask dq 07c1f7c1f7c1f7c1fh
  38. MMX_grnmask dq 003e003e003e003e0h
  39. MMX_grnmask2 dq 000f800f800f800f8h
  40. MMX_clip dq 07c007c007c007c00h
  41. MMX_Ucoeff0 dq 000810000FFE70081h
  42. MMX_Ucoeff1 dq 0FFE700810000FFE7h
  43. MMX_Ucoeff2 dq 00000FFE700810000h
  44. MMX_Vcoeff0 dq 000000066FFCC0000h
  45. MMX_Vcoeff1 dq 0FFCC00000066FFCCh
  46. MMX_Vcoeff2 dq 00066FFCC00000066h
  47. .code
  48. public _asm_YUVtoRGB32_row
  49. public _asm_YUVtoRGB24_row
  50. public _asm_YUVtoRGB16_row
  51. public _asm_YUVtoRGB32_row_MMX
  52. public _asm_YUVtoRGB24_row_MMX
  53. public _asm_YUVtoRGB16_row_MMX
  54. public _asm_YUVtoRGB32_row_ISSE
  55. public _asm_YUVtoRGB24_row_ISSE
  56. public _asm_YUVtoRGB16_row_ISSE
  57. ; asm_YUVtoRGB_row(
  58. ; Pixel *ARGB1_pointer,
  59. ; Pixel *ARGB2_pointer,
  60. ; YUVPixel *Y1_pointer,
  61. ; YUVPixel *Y2_pointer,
  62. ; YUVPixel *U_pointer,
  63. ; YUVPixel *V_pointer,
  64. ; long width
  65. ; );
  66. ARGB1_pointer equ [esp+ 4+16]
  67. ARGB2_pointer equ [esp+ 8+16]
  68. Y1_pointer equ [esp+12+16]
  69. Y2_pointer equ [esp+16+16]
  70. U_pointer equ [esp+20+16]
  71. V_pointer equ [esp+24+16]
  72. count equ [esp+28+16]
  73. _asm_YUVtoRGB32_row:
  74. push ebx
  75. push esi
  76. push edi
  77. push ebp
  78. mov eax,count
  79. mov ebp,eax
  80. mov ebx,eax
  81. shl ebx,3
  82. add eax,eax
  83. add ARGB1_pointer,ebx
  84. add ARGB2_pointer,ebx
  85. add Y1_pointer,eax
  86. add Y2_pointer,eax
  87. add U_pointer,ebp
  88. add V_pointer,ebp
  89. neg ebp
  90. mov esi,U_pointer ;[C]
  91. mov edi,V_pointer ;[C]
  92. xor edx,edx ;[C]
  93. xor ecx,ecx ;[C]
  94. jmp short col_loop_start
  95. col_loop:
  96. mov ch,[_YUV_clip_table+ebx-3f00h] ;[4] edx = [0][0][red][green]
  97. mov esi,U_pointer ;[C]
  98. shl ecx,8 ;[4] edx = [0][red][green][0]
  99. mov edi,V_pointer ;[C]
  100. mov cl,[_YUV_clip_table+edx-3f00h] ;[4] edx = [0][r][g][b] !!
  101. xor edx,edx ;[C]
  102. mov [eax+ebp*8-4],ecx ;[4] 
  103. xor ecx,ecx ;[C]
  104. col_loop_start:
  105. mov cl,[esi + ebp] ;[C] eax = U
  106. mov dl,[edi + ebp] ;[C] ebx = V
  107. mov eax,Y1_pointer ;[1] 
  108. xor ebx,ebx ;[1] 
  109. mov esi,[_YUV_U_table + ecx*4] ;[C] eax = [b impact][u-g impact]
  110. mov ecx,[_YUV_V_table + edx*4] ;[C] ebx = [r impact][v-g impact]
  111. mov edi,esi ;[C]
  112. mov bl,[eax + ebp*2] ;[1] ebx = Y1 value
  113. shr esi,16 ;[C] eax = blue impact
  114. add edi,ecx ;[C] edi = [junk][g impact]
  115. mov ebx,[_YUV_Y_table + ebx*4] ;[1] ebx = Y impact
  116. and ecx,0ffff0000h ;[C]
  117. mov edx,ebx ;[1] edx = Y impact
  118. add esi,ecx ;[C] eax = [r impact][b impact]
  119. and edi,0000ffffh ;[C]
  120. add ebx,esi ;[1] ebx = [red][blue]
  121. mov ecx,ebx ;[1] edi = [red][blue]
  122. and edx,0000ffffh ;[1] ecx = green
  123. shr ebx,16 ;[1] ebx = red
  124. and ecx,0000ffffh ;[1] edi = blue
  125. mov dl,[_YUV_clip_table+edx+edi-3f00h] ;[1] edx = [0][0][junk][green]
  126. mov eax,Y1_pointer ;[2] 
  127. mov dh,[_YUV_clip_table+ebx-3f00h] ;[1] edx = [0][0][red][green]
  128. xor ebx,ebx ;[2] 
  129. shl edx,8 ;[1] edx = [0][red][green][0]
  130. mov bl,[eax + ebp*2 + 1] ;[2] ebx = Y1 value
  131. mov eax,ARGB1_pointer ;[1] 
  132. mov dl,[_YUV_clip_table+ecx-3f00h] ;[1] edx = [0][r][g][b] !!
  133. mov ebx,[_YUV_Y_table + ebx*4] ;[2] ebx = Y impact
  134. mov ecx,0000ffffh ;[2] 
  135. and ecx,ebx ;[2]
  136. add ebx,esi ;[2] ebx = [red][blue]
  137. mov [eax+ebp*8],edx ;[1] 
  138. mov edx,ebx ;[2]
  139. shr ebx,16 ;[2] ebx = red
  140. mov eax,Y2_pointer ;[3] 
  141. and edx,0000ffffh ;[2]
  142. mov cl,[_YUV_clip_table+ecx+edi-3f00h] ;[2] edx = [0][0][junk][green]
  143. mov al,[eax + ebp*2] ;[3] ebx = Y1 value
  144. mov ch,[_YUV_clip_table+ebx-3f00h] ;[2] edx = [0][0][red][green]
  145. shl ecx,8 ;[2] edx = [0][red][green][0]
  146. and eax,000000ffh ;[3] 
  147. mov cl,[_YUV_clip_table+edx-3f00h] ;[2] edx = [0][r][g][b] !!
  148. mov edx,ARGB1_pointer ;[2] 
  149. mov ebx,[_YUV_Y_table + eax*4] ;[3] ebx = Y impact
  150. mov eax,0000ffffh
  151. and eax,ebx ;[3] edi = [red][blue]
  152. add ebx,esi ;[3] ebx = [red][blue]
  153. mov [edx+ebp*8+4],ecx ;[2] 
  154. mov edx,ebx ;[3]
  155. shr ebx,16 ;[3] ebx = red
  156. mov ecx,Y2_pointer ;[4] 
  157. and edx,0000ffffh ;[3] ecx = green
  158. mov al,[_YUV_clip_table+eax+edi-3f00h] ;[3] edx = [0][0][junk][green]
  159. mov cl,[ecx + ebp*2+1] ;[4] ebx = Y1 value
  160. mov ah,[_YUV_clip_table+ebx-3f00h] ;[3] edx = [0][0][red][green]
  161. shl eax,8 ;[3] edx = [0][red][green][0]
  162. and ecx,000000ffh ;[4] 
  163. mov al,[_YUV_clip_table+edx-3f00h] ;[3] edx = [0][r][g][b] !!
  164. mov edx,ARGB2_pointer ;[3] 
  165. mov ebx,[_YUV_Y_table + ecx*4] ;[4] ebx = Y impact
  166. mov ecx,0000ffffh ;[4]
  167. and ecx,ebx ;[4] ecx = [0][Y-impact]
  168. add ebx,esi ;[4] ebx = [red][blue]
  169. mov [edx+ebp*8],eax ;[3] 
  170. mov edx,ebx ;[4] edx = [red][blue]
  171. shr ebx,16 ;[4] ebx = red
  172. mov cl,[_YUV_clip_table+ecx+edi-3f00h] ;[4] edx = [0][0][junk][green]
  173. and edx,0000ffffh ;[4] edx = blue
  174. mov eax,ARGB2_pointer ;[4] 
  175. inc ebp
  176. jnz col_loop
  177. mov ch,[_YUV_clip_table+ebx-3f00h] ;[4] edx = [0][0][red][green]
  178. shl ecx,8 ;[4] edx = [0][red][green][0]
  179. mov cl,[_YUV_clip_table+edx-3f00h] ;[4] edx = [0][r][g][b] !!
  180. mov [eax+ebp*8-4],ecx ;[4] 
  181. pop ebp
  182. pop edi
  183. pop esi
  184. pop ebx
  185. ret
  186. ;MMX_test dq 7060504030201000h
  187. _asm_YUVtoRGB32_row_MMX:
  188. push ebx
  189. push esi
  190. push edi
  191. push ebp
  192. mov eax,count
  193. mov ebp,eax
  194. mov ebx,eax
  195. shl ebx,3
  196. add eax,eax
  197. add ARGB1_pointer,ebx
  198. add ARGB2_pointer,ebx
  199. add Y1_pointer,eax
  200. add Y2_pointer,eax
  201. add U_pointer,ebp
  202. add V_pointer,ebp
  203. neg ebp
  204. mov esi,U_pointer
  205. mov edi,V_pointer
  206. mov ecx,Y1_pointer
  207. mov edx,Y2_pointer
  208. mov eax,ARGB1_pointer
  209. mov ebx,ARGB2_pointer
  210. col_loop_MMX:
  211. movd mm0, dword ptr [esi+ebp] ;U (byte)
  212. pxor mm7,mm7
  213. movd mm1, dword ptr [edi+ebp] ;V (byte)
  214. punpcklbw mm0,mm7 ;U (word)
  215. psubw mm0,MMX_80w
  216. punpcklbw mm1,mm7 ;V (word)
  217. psubw mm1,MMX_80w
  218. movq mm2,mm0
  219. pmullw mm2,MMX_Ugrncoeff
  220. movq mm3,mm1
  221. pmullw mm3,MMX_Vgrncoeff
  222. pmullw mm0,MMX_Ublucoeff
  223. pmullw mm1,MMX_Vredcoeff
  224. paddw mm2,mm3
  225. ;mm0: blue
  226. ;mm1: red
  227. ;mm2: green
  228. movq mm6,[ecx+ebp*2] ;Y
  229. pand mm6,MMX_00FFw
  230. psubw mm6,MMX_10w
  231. pmullw mm6,MMX_Ycoeff
  232. movq mm4,mm6
  233. paddw mm6,mm0 ;mm6: <B3><B2><B1><B0>
  234. movq mm5,mm4
  235. paddw mm4,mm1 ;mm4: <R3><R2><R1><R0>
  236. paddw mm5,mm2 ;mm5: <G3><G2><G1><G0>
  237. psraw mm6,6
  238. psraw mm4,6
  239. packuswb mm6,mm6 ;mm6: B3B2B1B0B3B2B1B0
  240. psraw mm5,6
  241. packuswb mm4,mm4 ;mm4: R3R2R1R0R3R2R1R0
  242. punpcklbw mm6,mm4 ;mm6: R3B3R2B2R1B1R0B0
  243. packuswb mm5,mm5 ;mm5: G3G2G1G0G3G2G1G0
  244. punpcklbw mm5,mm5 ;mm5: G3G3G2G2G1G1G0G0
  245. movq mm4,mm6
  246. punpcklbw mm6,mm5 ;mm6: G1R1G1B2G0R0G0B0
  247. punpckhbw mm4,mm5 ;mm4: G3R3G3B3G2R2G2B2
  248. movq mm7,[ecx+ebp*2] ;Y
  249. psrlw mm7,8
  250. psubw mm7,MMX_10w
  251. pmullw mm7,MMX_Ycoeff
  252. movq mm3,mm7
  253. paddw mm7,mm0 ;mm7: final blue
  254. movq mm5,mm3
  255. paddw mm3,mm1 ;mm3: final red
  256. paddw mm5,mm2 ;mm5: final green
  257. psraw mm7,6
  258. psraw mm3,6
  259. packuswb mm7,mm7 ;mm7: B3B2B1B0B3B2B1B0
  260. psraw mm5,6
  261. packuswb mm3,mm3 ;mm3: R3R2R1R0R3R2R1R0
  262. punpcklbw mm7,mm3 ;mm7: R3B3R2B2R1B1R0B0
  263. packuswb mm5,mm5 ;mm5: G3G2G1G0G3G2G1G0
  264. punpcklbw mm5,mm5 ;mm5: G3G3G2G2G1G1G0G0
  265. movq mm3,mm7
  266. punpcklbw mm7,mm5 ;mm7: G1R1G1B2G0R0G0B0
  267. punpckhbw mm3,mm5 ;mm3: G3R3G3B3G2R2G2B2
  268. ;mm3 P7:P5
  269. ;mm4 P6:P4
  270. ;mm6 P2:P0
  271. ;mm7 P3:P1
  272. movq mm5,mm6
  273. punpckldq mm5,mm7 ;P1:P0
  274. punpckhdq mm6,mm7 ;P3:P2
  275. movq mm7,mm4
  276. punpckldq mm4,mm3 ;P5:P4
  277. punpckhdq mm7,mm3 ;P7:P6
  278. movq [eax+ebp*8],mm5
  279. movq [eax+ebp*8+8],mm6
  280. movq [eax+ebp*8+16],mm4
  281. movq [eax+ebp*8+24],mm7
  282. movq mm6,[edx+ebp*2] ;Y
  283. pand mm6,MMX_00FFw
  284. psubw mm6,MMX_10w
  285. pmullw mm6,MMX_Ycoeff
  286. movq mm4,mm6
  287. paddw mm6,mm0 ;mm6: <B3><B2><B1><B0>
  288. movq mm5,mm4
  289. paddw mm4,mm1 ;mm4: <R3><R2><R1><R0>
  290. paddw mm5,mm2 ;mm5: <G3><G2><G1><G0>
  291. psraw mm6,6
  292. psraw mm4,6
  293. packuswb mm6,mm6 ;mm6: B3B2B1B0B3B2B1B0
  294. psraw mm5,6
  295. packuswb mm4,mm4 ;mm4: R3R2R1R0R3R2R1R0
  296. punpcklbw mm6,mm4 ;mm6: R3B3R2B2R1B1R0B0
  297. packuswb mm5,mm5 ;mm5: G3G2G1G0G3G2G1G0
  298. punpcklbw mm5,mm5 ;mm5: G3G3G2G2G1G1G0G0
  299. movq mm4,mm6
  300. punpcklbw mm6,mm5 ;mm6: G1R1G1B2G0R0G0B0
  301. punpckhbw mm4,mm5 ;mm4: G3R3G3B3G2R2G2B2
  302. movq mm7,[edx+ebp*2] ;Y
  303. psrlw mm7,8
  304. psubw mm7,MMX_10w
  305. pmullw mm7,MMX_Ycoeff
  306. movq mm3,mm7
  307. paddw mm7,mm0 ;mm7: final blue
  308. movq mm5,mm3
  309. paddw mm3,mm1 ;mm3: final red
  310. paddw mm5,mm2 ;mm5: final green
  311. psraw mm7,6
  312. psraw mm3,6
  313. packuswb mm7,mm7 ;mm7: B3B2B1B0B3B2B1B0
  314. psraw mm5,6
  315. packuswb mm3,mm3 ;mm3: R3R2R1R0R3R2R1R0
  316. punpcklbw mm7,mm3 ;mm7: R3B3R2B2R1B1R0B0
  317. packuswb mm5,mm5 ;mm5: G3G2G1G0G3G2G1G0
  318. punpcklbw mm5,mm5 ;mm5: G3G3G2G2G1G1G0G0
  319. movq mm3,mm7
  320. punpcklbw mm7,mm5 ;mm7: G1R1G1B2G0R0G0B0
  321. punpckhbw mm3,mm5 ;mm3: G3R3G3B3G2R2G2B2
  322. ;mm3 P7:P5
  323. ;mm4 P6:P4
  324. ;mm6 P2:P0
  325. ;mm7 P3:P1
  326. movq mm5,mm6
  327. punpckldq mm5,mm7 ;P1:P0
  328. punpckhdq mm6,mm7 ;P3:P2
  329. movq mm7,mm4
  330. punpckldq mm4,mm3 ;P5:P4
  331. punpckhdq mm7,mm3 ;P7:P6
  332. movq [ebx+ebp*8   ],mm5
  333. movq [ebx+ebp*8+ 8],mm6
  334. movq [ebx+ebp*8+16],mm4
  335. movq [ebx+ebp*8+24],mm7
  336. add ebp,4
  337. jnz col_loop_MMX
  338. pop ebp
  339. pop edi
  340. pop esi
  341. pop ebx
  342. ret
  343. ;**************************************************************************
  344. ;
  345. ; asm_YUVtoRGB24_row(
  346. ; Pixel *ARGB1_pointer,
  347. ; Pixel *ARGB2_pointer,
  348. ; YUVPixel *Y1_pointer,
  349. ; YUVPixel *Y2_pointer,
  350. ; YUVPixel *U_pointer,
  351. ; YUVPixel *V_pointer,
  352. ; long width
  353. ; );
  354. ARGB1_pointer equ [esp+ 4+16]
  355. ARGB2_pointer equ [esp+ 8+16]
  356. Y1_pointer equ [esp+12+16]
  357. Y2_pointer equ [esp+16+16]
  358. U_pointer equ [esp+20+16]
  359. V_pointer equ [esp+24+16]
  360. count equ [esp+28+16]
  361. _asm_YUVtoRGB24_row:
  362. push ebx
  363. push esi
  364. push edi
  365. push ebp
  366. mov eax,count
  367. mov ebp,eax
  368. add eax,eax
  369. add Y1_pointer,eax
  370. add Y2_pointer,eax
  371. add U_pointer,ebp
  372. add V_pointer,ebp
  373. neg ebp
  374. mov esi,U_pointer ;[C]
  375. mov edi,V_pointer ;[C]
  376. xor edx,edx ;[C]
  377. xor ecx,ecx ;[C]
  378. col_loop24:
  379. mov esi,U_pointer
  380. mov edi,V_pointer
  381. xor eax,eax
  382. xor ebx,ebx
  383. mov al,[esi + ebp] ;eax = U
  384. mov bl,[edi + ebp] ;ebx = V
  385. mov eax,[_YUV_U_table + eax*4] ;eax = [b impact][u-g impact]
  386. mov edi,[_YUV_V_table + ebx*4] ;edi = [r impact][v-g impact]
  387. mov ecx,eax ;[C]
  388. mov esi,Y1_pointer ;[1]
  389. mov edx,edi ;[C]
  390. xor ebx,ebx ;[1]
  391. shr eax,16 ;[C] eax = blue impact
  392. mov bl,[esi + ebp*2] ;[1] ebx = Y1 value
  393. and edi,0ffff0000h ;[C] edi = [r impact][0]
  394. add ecx,edx ;[C] ecx = [junk][g impact]
  395. add eax,edi ;[C] eax = [r impact][b impact]
  396. mov ebx,[_YUV_Y_table + ebx*4] ;[1] ebx = Y impact
  397. ;eax = [r][b]
  398. ;ecx = [g]
  399. mov esi,ebx ;[1]
  400. add ebx,eax ;[1] ebx = [red][blue]
  401. add esi,ecx ;[1] edx = [junk][green]
  402. mov edi,ebx ;[1] edi = [red][blue]
  403. shr ebx,16 ;[1] ebx = red
  404. and esi,0000ffffh ;[1] ecx = green
  405. and edi,0000ffffh ;edi = blue
  406. xor edx,edx
  407. mov bh,[_YUV_clip_table+ebx-3f00h] ;bh = red
  408. mov dl,[_YUV_clip_table+esi-3f00h] ;dl = green
  409. mov esi,Y1_pointer ;[2]
  410. mov bl,[_YUV_clip_table+edi-3f00h] ;bl = blue
  411. mov edi,ARGB1_pointer ;[1]
  412. mov [edi+2],bh ;[1]
  413. mov [edi+0],bl ;[1]
  414. xor ebx,ebx ;[2]
  415. mov [edi+1],dl ;[1]
  416. mov bl,[esi + ebp*2 + 1] ;[2] ebx = Y1 value
  417. mov esi,ecx ;[2]
  418. mov ebx,[_YUV_Y_table + ebx*4] ;[2] ebx = Y impact
  419. mov edi,0000ffffh ;[2]
  420. add esi,ebx ;[2] edx = [junk][green]
  421. add ebx,eax ;[2] ebx = [red][blue]
  422. and edi,ebx ;[2] edi = blue
  423. and esi,0000ffffh ;[2] ecx = green
  424. shr ebx,16 ;ebx = red
  425. xor edx,edx
  426. mov bh,[_YUV_clip_table+ebx-3f00h] ;bh = red
  427. mov dl,[_YUV_clip_table+esi-3f00h] ;dl = green
  428. mov esi,Y2_pointer ;[3]
  429. mov bl,[_YUV_clip_table+edi-3f00h] ;bl = blue
  430. mov edi,ARGB1_pointer ;[2]
  431. mov [edi+5],bh ;[2]
  432. mov [edi+4],dl ;[2]
  433. mov [edi+3],bl ;[2]
  434. xor ebx,ebx ;[3]
  435. mov bl,[esi + ebp*2] ;[3] ebx = Y1 value
  436. mov edi,ecx ;[2]
  437. mov ebx,[_YUV_Y_table + ebx*4] ;[3] ebx = Y impact
  438. mov esi,0000ffffh ;[3]
  439. add edi,ebx ;[3] edx = [junk][green]
  440. add ebx,eax ;[3] ebx = [red][blue]
  441. and esi,ebx ;[3] edi = blue
  442. and edi,0000ffffh ;ecx = green
  443. shr ebx,16 ;ebx = red
  444. xor edx,edx
  445. mov dl,[_YUV_clip_table+edi-3f00h] ;dl = green
  446. mov edi,ARGB2_pointer ;[3]
  447. mov bh,[_YUV_clip_table+ebx-3f00h] ;bh = red
  448. mov bl,[_YUV_clip_table+esi-3f00h] ;bl = blue
  449. mov esi,Y2_pointer ;[4]
  450. mov [edi+2],bh
  451. mov [edi+0],bl
  452. xor ebx,ebx ;[4]
  453. mov [edi+1],dl
  454. mov bl,[esi + ebp*2 + 1] ;[4] ebx = Y1 value
  455. mov edi,0000ffffh ;[4]
  456. mov ebx,[_YUV_Y_table + ebx*4] ;[4] ebx = Y impact
  457. xor edx,edx
  458. add ecx,ebx ;[4] ecx = [junk][green]
  459. add ebx,eax ;ebx = [red][blue]
  460. and edi,ebx ;edi = blue
  461. and ecx,0000ffffh ;ecx = green
  462. shr ebx,16 ;ebx = red
  463. mov esi,ARGB2_pointer
  464. mov bl,[_YUV_clip_table+ebx-3f00h] ;bh = red
  465. mov dl,[_YUV_clip_table+ecx-3f00h] ;dl = green
  466. mov al,[_YUV_clip_table+edi-3f00h] ;bl = blue
  467. mov [esi+5],bl
  468. mov [esi+4],dl
  469. mov ecx,ARGB1_pointer
  470. mov [esi+3],al
  471. add esi,6
  472. mov ARGB2_pointer,esi
  473. add ecx,6
  474. mov ARGB1_pointer,ecx
  475. inc ebp
  476. jnz col_loop24
  477. pop ebp
  478. pop edi
  479. pop esi
  480. pop ebx
  481. ret
  482. _asm_YUVtoRGB24_row_MMX:
  483. push ebx
  484. push esi
  485. push edi
  486. push ebp
  487. mov eax,count
  488. mov ebp,eax
  489. add eax,eax
  490. add Y1_pointer,eax
  491. add Y2_pointer,eax
  492. add U_pointer,ebp
  493. add V_pointer,ebp
  494. neg ebp
  495. mov esi,U_pointer
  496. mov edi,V_pointer
  497. mov ecx,Y1_pointer
  498. mov edx,Y2_pointer
  499. mov eax,ARGB1_pointer
  500. mov ebx,ARGB2_pointer
  501. col_loop_MMX24:
  502. movd mm0, dword ptr [esi+ebp] ;U (byte)
  503. pxor mm7,mm7
  504. movd mm1, dword ptr [edi+ebp] ;V (byte)
  505. punpcklbw mm0,mm7 ;U (word)
  506. movd mm2, dword ptr [ecx+ebp*2] ;Y low
  507. punpcklbw mm1,mm7 ;V (word)
  508. movd mm3, dword ptr [edx+ebp*2] ;Y high
  509. punpcklbw mm2,mm7 ;Y1 (word)
  510. psubw mm2,MMX_10w
  511. punpcklbw mm3,mm7 ;Y2 (word)
  512. psubw mm3,MMX_10w
  513. psubw mm0,MMX_80w
  514. psubw mm1,MMX_80w
  515. ;group 1
  516. pmullw mm2,MMX_Ycoeff ;[lazy]
  517. movq mm6,mm0
  518. pmullw mm3,MMX_Ycoeff ;[lazy]
  519. movq mm7,mm1
  520. punpcklwd mm6,mm6 ;mm6 = U1U1U0U0
  521. movq mm4,mm2 ;mm4 = Y3Y2Y1Y0 [high]
  522. punpckldq mm6,mm6 ;mm6 = U0U0U0U0
  523. movq mm5,mm3 ;mm3 = Y3Y2Y1Y0 [low]
  524. punpcklwd mm7,mm7 ;mm7 = V1V1V0V0
  525. punpckldq mm7,mm7 ;mm7 = V0V0V0V0
  526. pmullw mm6,MMX_Ucoeff0
  527. punpcklwd mm4,mm4 ;mm4 = Y1Y1Y0Y0 [high]
  528. pmullw mm7,MMX_Vcoeff0
  529. punpcklwd mm5,mm5 ;mm5 = Y1Y1Y0Y0 [low]
  530. punpcklwd mm4,mm2 ;mm4 = Y1Y0Y0Y0
  531. punpcklwd mm5,mm3 ;mm5 = Y1Y0Y0Y0
  532. paddw mm4,mm6
  533. paddw mm5,mm6
  534. paddw mm4,mm7
  535. paddw mm5,mm7
  536. psraw mm4,6
  537. psraw mm5,6
  538. packuswb mm4,mm4
  539. packuswb mm5,mm5
  540. ;group 2
  541. movd dword ptr [eax+0],mm4 ;[lazy write]
  542. movq mm4,mm0
  543. movd dword ptr [ebx+0],mm5 ;[lazy write]
  544. movq mm5,mm1
  545. punpcklwd mm4,mm4 ;mm6 = U1U1U0U0
  546. movq mm6,mm2 ;mm4 = Y3Y2Y1Y0 [high]
  547. punpcklwd mm5,mm5 ;mm6 = V1V1V0V0
  548. movq mm7,mm3 ;mm3 = Y3Y2Y1Y0 [low]
  549. pmullw mm4,MMX_Ucoeff1
  550. psrlq mm6,16 ;mm4 = 00Y3Y2Y1 [high]
  551. pmullw mm5,MMX_Vcoeff1
  552. psrlq mm7,16 ;mm4 = 00Y3Y2Y1 [low]
  553. punpcklwd mm6,mm6 ;mm4 = Y2Y2Y1Y1 [high]
  554. punpcklwd mm7,mm7 ;mm5 = Y2Y2Y1Y1 [high]
  555. paddw mm6,mm4
  556. paddw mm7,mm4
  557. paddw mm6,mm5
  558. paddw mm7,mm5
  559. psraw mm6,6
  560. psraw mm7,6
  561. packuswb mm6,mm6
  562. packuswb mm7,mm7
  563. ;group 3
  564. movd dword ptr [eax+4],mm6 ;[lazy write]
  565. movq mm6,mm0
  566. movd dword ptr [ebx+4],mm7 ;[lazy write]
  567. movq mm7,mm1
  568. movq mm4,mm2 ;mm4 = Y3Y2Y1Y0 [high]
  569. punpcklwd mm6,mm6 ;mm6 = U1U1U0U0
  570. movq mm5,mm3 ;mm3 = Y3Y2Y1Y0 [low]
  571. punpckhdq mm6,mm6 ;mm6 = U1U1U1U1
  572. punpcklwd mm7,mm7 ;mm7 = V1V1V0V0
  573. punpckhdq mm7,mm7 ;mm7 = V1V1V1V1
  574. pmullw mm6,MMX_Ucoeff2
  575. punpckhwd mm2,mm2 ;mm2 = Y3Y3Y2Y2 [high]
  576. pmullw mm7,MMX_Vcoeff2
  577. punpckhwd mm3,mm3 ;mm3 = Y3Y3Y2Y2 [low]
  578. punpckhdq mm4,mm2 ;mm4 = Y3Y3Y3Y2 [high]
  579. punpckhdq mm5,mm3 ;mm5 = Y3Y3Y3Y2 [low]
  580. paddw mm4,mm6
  581. paddw mm5,mm6
  582. paddw mm4,mm7
  583. paddw mm5,mm7
  584. psraw mm4,6
  585. psraw mm5,6
  586. ;next 3 groups
  587. movd mm2, dword ptr [ecx+ebp*2+4] ;Y low
  588. packuswb mm4,mm4 ;[lazy]
  589. movd mm3, dword ptr [edx+ebp*2+4] ;Y high
  590. packuswb mm5,mm5 ;[lazy]
  591. movd dword ptr [eax+8],mm4 ;[lazy write]
  592. pxor mm7,mm7
  593. movd dword ptr [ebx+8],mm5 ;[lazy write]
  594. punpcklbw mm2,mm7 ;U (word)
  595. psubw mm2,MMX_10w
  596. punpcklbw mm3,mm7 ;V (word)
  597. psubw mm3,MMX_10w
  598. ;group 1
  599. pmullw mm2,MMX_Ycoeff ;[init]
  600. movq mm6,mm0
  601. pmullw mm3,MMX_Ycoeff ;[init]
  602. punpckhwd mm6,mm6 ;mm6 = U3U3U2U2
  603. movq mm7,mm1
  604. punpckldq mm6,mm6 ;mm6 = U2U2U2U2
  605. movq mm4,mm2 ;mm4 = Y3Y2Y1Y0 [high]
  606. punpckhwd mm7,mm7 ;mm7 = V3V3V2V2
  607. movq mm5,mm3 ;mm3 = Y3Y2Y1Y0 [low]
  608. punpckldq mm7,mm7 ;mm7 = V2V2V2V2
  609. pmullw mm6,MMX_Ucoeff0
  610. punpcklwd mm4,mm4 ;mm4 = Y1Y1Y0Y0 [high]
  611. pmullw mm7,MMX_Vcoeff0
  612. punpcklwd mm5,mm5 ;mm5 = Y1Y1Y0Y0 [low]
  613. punpcklwd mm4,mm2 ;mm4 = Y1Y0Y0Y0
  614. punpcklwd mm5,mm3 ;mm5 = Y1Y0Y0Y0
  615. paddw mm4,mm6
  616. paddw mm5,mm6
  617. paddw mm4,mm7
  618. paddw mm5,mm7
  619. psraw mm4,6
  620. psraw mm5,6
  621. packuswb mm4,mm4
  622. packuswb mm5,mm5
  623. ;group 2
  624. movd dword ptr [eax+12],mm4
  625. movq mm6,mm0
  626. movd dword ptr [ebx+12],mm5
  627. movq mm7,mm1
  628. punpckhwd mm6,mm6 ;mm6 = U3U3U2U2
  629. movq mm4,mm2 ;mm4 = Y3Y2Y1Y0 [high]
  630. punpckhwd mm7,mm7 ;mm6 = V3V3V2V2
  631. movq mm5,mm3 ;mm3 = Y3Y2Y1Y0 [low]
  632. pmullw mm6,MMX_Ucoeff1
  633. psrlq mm4,16 ;mm4 = 00Y3Y2Y1 [high]
  634. pmullw mm7,MMX_Vcoeff1
  635. psrlq mm5,16 ;mm4 = 00Y3Y2Y1 [low]
  636. punpcklwd mm4,mm4 ;mm4 = Y2Y2Y1Y1 [high]
  637. punpcklwd mm5,mm5 ;mm5 = Y2Y2Y1Y1 [high]
  638. paddw mm4,mm6
  639. paddw mm5,mm6
  640. paddw mm4,mm7
  641. paddw mm5,mm7
  642. psraw mm4,6
  643. psraw mm5,6
  644. packuswb mm4,mm4
  645. packuswb mm5,mm5
  646. ;group 3
  647. movq mm6,mm2 ;mm4 = Y3Y2Y1Y0 [high]
  648. punpckhwd mm0,mm0 ;mm6 = U3U3U2U2
  649. movq mm7,mm3 ;mm3 = Y3Y2Y1Y0 [low]
  650. punpckhdq mm0,mm0 ;mm6 = U3U3U3U3
  651. movd dword ptr [eax+16],mm4 ;[lazy write]
  652. punpckhwd mm1,mm1 ;mm7 = V3V3V2V2
  653. movd dword ptr [ebx+16],mm5 ;[lazy write]
  654. punpckhdq mm1,mm1 ;mm7 = V3V3V3V3
  655. pmullw mm0,MMX_Ucoeff2
  656. punpckhwd mm2,mm2 ;mm2 = Y3Y3Y2Y2 [high]
  657. pmullw mm1,MMX_Vcoeff2
  658. punpckhwd mm3,mm3 ;mm3 = Y3Y3Y2Y2 [low]
  659. punpckhdq mm6,mm2 ;mm4 = Y3Y3Y3Y2 [high]
  660. punpckhdq mm7,mm3 ;mm5 = Y3Y3Y3Y2 [low]
  661. paddw mm6,mm0
  662. paddw mm7,mm0
  663. paddw mm6,mm1
  664. paddw mm7,mm1
  665. psraw mm6,6
  666. psraw mm7,6
  667. packuswb mm6,mm6
  668. packuswb mm7,mm7
  669. movd dword ptr [eax+20],mm6
  670. add eax,24
  671. movd dword ptr [ebx+20],mm7
  672. add ebx,24
  673. ;done
  674. add ebp,4
  675. jnz col_loop_MMX24
  676. pop ebp
  677. pop edi
  678. pop esi
  679. pop ebx
  680. ret
  681. ;**************************************************************************
  682. _asm_YUVtoRGB16_row:
  683. push ebx
  684. push esi
  685. push edi
  686. push ebp
  687. mov eax,count
  688. mov ebp,eax
  689. mov ebx,eax
  690. shl ebx,2
  691. add ARGB1_pointer,ebx
  692. add ARGB2_pointer,ebx
  693. add eax,eax
  694. add Y1_pointer,eax
  695. add Y2_pointer,eax
  696. add U_pointer,ebp
  697. add V_pointer,ebp
  698. neg ebp
  699. mov esi,U_pointer ;[C]
  700. mov edi,V_pointer ;[C]
  701. xor edx,edx ;[C]
  702. xor ecx,ecx ;[C]
  703. col_loop16:
  704. mov esi,U_pointer
  705. mov edi,V_pointer
  706. xor eax,eax
  707. xor ebx,ebx
  708. mov al,[esi + ebp] ;eax = U
  709. mov bl,[edi + ebp] ;ebx = V
  710. mov eax,[_YUV_U_table + eax*4] ;eax = [b impact][u-g impact]
  711. mov edi,[_YUV_V_table + ebx*4] ;edi = [r impact][v-g impact]
  712. mov ecx,eax ;[C]
  713. mov esi,Y1_pointer ;[1]
  714. mov edx,edi ;[C]
  715. xor ebx,ebx ;[1]
  716. shr eax,16 ;[C] eax = blue impact
  717. mov bl,[esi + ebp*2] ;[1] ebx = Y1 value
  718. and edi,0ffff0000h ;[C] edi = [r impact][0]
  719. add ecx,edx ;[C] ecx = [junk][g impact]
  720. add eax,edi ;[C] eax = [r impact][b impact]
  721. mov ebx,[_YUV_Y_table + ebx*4] ;[1] ebx = Y impact
  722. ;eax = [r][b]
  723. ;ecx = [g]
  724. mov esi,ebx ;[1]
  725. add ebx,eax ;[1] ebx = [red][blue]
  726. add esi,ecx ;[1] edx = [junk][green]
  727. mov edi,ebx ;[1] edi = [red][blue]
  728. shr ebx,16 ;[1] ebx = red
  729. and esi,0000ffffh ;[1] ecx = green
  730. and edi,0000ffffh ;edi = blue
  731. xor edx,edx
  732. mov bh,[_YUV_clip_table16+ebx-3f00h] ;bh = red
  733. mov dl,[_YUV_clip_table16+esi-3f00h] ;dl = green
  734. mov bl,[_YUV_clip_table16+edi-3f00h] ;bl = blue
  735. xor dh,dh ;[1]
  736. ;565fix shl bh,2 ;[1]
  737. shl bh,3 ;[1]
  738. mov edi,ARGB1_pointer ;[1]
  739. ;565fix shl edx,5 ;[1]
  740. shl edx,6 ;[1]
  741. mov esi,Y1_pointer ;[2]
  742. add edx,ebx ;[1]
  743. xor ebx,ebx ;[2]
  744. mov [edi+ebp*4+0],dl ;[1]
  745. mov bl,[esi + ebp*2 + 1] ;[2] ebx = Y1 value
  746. mov [edi+ebp*4+1],dh ;[1]
  747. mov esi,ecx ;[2]
  748. mov ebx,[_YUV_Y_table + ebx*4] ;[2] ebx = Y impact
  749. mov edi,0000ffffh ;[2]
  750. add esi,ebx ;[2] edx = [junk][green]
  751. add ebx,eax ;[2] ebx = [red][blue]
  752. and edi,ebx ;[2] edi = blue
  753. and esi,0000ffffh ;[2] ecx = green
  754. shr ebx,16 ;ebx = red
  755. xor edx,edx
  756. mov bh,[_YUV_clip_table16+ebx-3f00h] ;bh = red
  757. mov dl,[_YUV_clip_table16+esi-3f00h] ;dl = green
  758. mov bl,[_YUV_clip_table16+edi-3f00h] ;bl = blue
  759. ;565fix shl edx,5 ;[2]
  760. shl edx,6 ;[2]
  761. mov edi,ARGB1_pointer ;[2]
  762. ;565fix shl bh,2 ;[2]
  763. shl bh,3 ;[2]
  764. mov esi,Y2_pointer ;[3]
  765. add edx,ebx ;[2]
  766. xor ebx,ebx ;[3]
  767. mov [edi+ebp*4+2],dl ;[2]
  768. mov bl,[esi + ebp*2] ;[3] ebx = Y1 value
  769. mov [edi+ebp*4+3],dh ;[2]
  770. mov edi,ecx ;[2]
  771. mov ebx,[_YUV_Y_table + ebx*4] ;[3] ebx = Y impact
  772. mov esi,0000ffffh ;[3]
  773. add edi,ebx ;[3] edx = [junk][green]
  774. add ebx,eax ;[3] ebx = [red][blue]
  775. and esi,ebx ;[3] edi = blue
  776. and edi,0000ffffh ;ecx = green
  777. shr ebx,16 ;ebx = red
  778. xor edx,edx
  779. mov dl,[_YUV_clip_table16+edi-3f00h] ;dl = green
  780. mov edi,ARGB2_pointer ;[3]
  781. ;565fix shl edx,5
  782. shl edx,6
  783. mov bh,[_YUV_clip_table16+ebx-3f00h] ;bh = red
  784. mov bl,[_YUV_clip_table16+esi-3f00h] ;bl = blue
  785. mov esi,Y2_pointer ;[4]
  786. ;565fix shl bh,2 ;[3]
  787. shl bh,3 ;[3]
  788. nop
  789. add edx,ebx ;[3]
  790. xor ebx,ebx ;[4]
  791. mov [edi+ebp*4+0],dl ;[3]
  792. mov bl,[esi + ebp*2 + 1] ;[4] ebx = Y1 value
  793. mov [edi+ebp*4+1],dh ;[3]
  794. mov edi,0000ffffh ;[4]
  795. mov ebx,[_YUV_Y_table + ebx*4] ;[4] ebx = Y impact
  796. xor edx,edx
  797. add ecx,ebx ;[4] ecx = [junk][green]
  798. add ebx,eax ;ebx = [red][blue]
  799. and edi,ebx ;edi = blue
  800. and ecx,0000ffffh ;ecx = green
  801. shr ebx,16 ;ebx = red
  802. mov esi,ARGB2_pointer
  803. mov dl,[_YUV_clip_table16+ecx-3f00h] ;dl = green
  804. mov al,[_YUV_clip_table16+edi-3f00h] ;bl = blue
  805. ;565fix shl edx,5
  806. shl edx,6
  807. mov ah,[_YUV_clip_table16+ebx-3f00h] ;bh = red
  808. ;565fix shl ah,2
  809. shl ah,3
  810. add eax,edx
  811. mov [esi+ebp*4+2],al
  812. mov [esi+ebp*4+3],ah
  813. inc ebp
  814. jnz col_loop16
  815. pop ebp
  816. pop edi
  817. pop esi
  818. pop ebx
  819. ret
  820. _asm_YUVtoRGB16_row_MMX:
  821. push ebx
  822. push esi
  823. push edi
  824. push ebp
  825. mov eax,count
  826. mov ebp,eax
  827. mov ebx,eax
  828. shl ebx,2
  829. add eax,eax
  830. add ARGB1_pointer,ebx
  831. add ARGB2_pointer,ebx
  832. add Y1_pointer,eax
  833. add Y2_pointer,eax
  834. add U_pointer,ebp
  835. add V_pointer,ebp
  836. neg ebp
  837. mov esi,U_pointer
  838. mov edi,V_pointer
  839. mov ecx,Y1_pointer
  840. mov edx,Y2_pointer
  841. mov eax,ARGB1_pointer
  842. mov ebx,ARGB2_pointer
  843. col_loop_MMX16:
  844. movd mm0, dword ptr [esi+ebp] ;[0       ] U (byte)
  845. pxor mm7,mm7 ;[0      7] 
  846. movd mm1, dword ptr [edi+ebp] ;[01     7] V (byte)
  847. punpcklbw mm0,mm7 ;[01     7] U (word)
  848. psubw mm0,MMX_80w ;[01     7] 
  849. punpcklbw mm1,mm7 ;[01     7] V (word)
  850. psubw mm1,MMX_80w ;[01      ] 
  851. movq mm2,mm0 ;[012     ] 
  852. pmullw mm2,MMX_Ugrncoeff ;[012     ] 
  853. movq mm3,mm1 ;[0123    ] 
  854. ;mm0: blue
  855. ;mm1: red
  856. ;mm2: green
  857. movq mm6,[ecx+ebp*2] ;[0123  6 ] [1] Y
  858. ;<-->
  859. pmullw mm3,MMX_Vgrncoeff ;[0123    ] 
  860. movq mm7,mm6 ;[012   67] [2] Y
  861. pmullw mm0,MMX_Ublucoeff ;[0123    ] 
  862. psrlw mm7,8 ;[012   67] [2]
  863. pmullw mm1,MMX_Vredcoeff ;[0123    ] 
  864. ;<-->
  865. pand mm6,MMX_00FFw ;[012   67] [1]
  866. paddw mm2,mm3 ;[012   6 ] [C]
  867. psubw mm6,MMX_10w ;[012   67] [1]
  868. pmullw mm6,MMX_Ycoeff ;[012   67] [1]
  869. psubw mm7,MMX_10w ;[012   67] [2]
  870. movq mm4,mm6 ;[012 4 67] [1]
  871. pmullw mm7,MMX_Ycoeff ;[012   67] [2]
  872. movq mm5,mm6 ;[012 4567] [1]
  873. paddw mm6,mm0 ;[012 4 67] [1] mm6: <B3><B2><B1><B0>
  874. paddw mm4,mm1 ;[012 4567] [1] mm4: <R3><R2><R1><R0>
  875. paddw mm5,mm2 ;[012 4567] [1] mm5: <G3><G2><G1><G0>
  876. psraw mm4,6 ;[012 4567] [1]
  877. movq mm3,mm7 ;[01234567] [2]
  878. psraw mm5,4 ;[01234567] [1]
  879. paddw mm7,mm0 ;[01234567] [2] mm6: <B3><B2><B1><B0>
  880. psraw mm6,6 ;[01234567] [1]
  881. paddsw mm5,MMX_clip
  882. packuswb mm6,mm6 ;[01234567] [1] mm6: B3B2B1B0B3B2B1B0
  883. psubusw mm5,MMX_clip
  884. packuswb mm4,mm4 ;[01234567] [1] mm4: R3R2R1R0R3R2R1R0
  885. pand mm5,MMX_grnmask ;[01234567] [1] mm7: <G3><G2><G1><G0>
  886. psrlq mm6,2 ;[01234567] [1]
  887. punpcklbw mm6,mm4 ;[0123 567] [1] mm4: R3B3R2B2R1B1R0B0
  888. movq mm4,[edx+ebp*2] ;[01234567] [3] Y
  889. psrlw mm6,1 ;[01234567] [1]
  890. pand mm6,MMX_rbmask ;[01234567] [1] mm6: <RB3><RB2><RB1><RB0>
  891. por mm6,mm5 ;[01234 67] [1] mm6: P6P4P2P0
  892. movq mm5,mm3 ;[01234567] [2]
  893. paddw mm3,mm1 ;[01234567] [2] mm4: <R3><R2><R1><R0>
  894. paddw mm5,mm2 ;[01234567] [2] mm5: <G3><G2><G1><G0>
  895. pand mm4,MMX_00FFw ;[01234567] [3]
  896. psraw mm3,6 ;[01234567] [2]
  897. psubw mm4,MMX_10w ;[01234567] [3]
  898. psraw mm5,4 ;[01234567] [2]
  899. pmullw mm4,MMX_Ycoeff ;[01234567] [3]
  900. psraw mm7,6 ;[01234567] [2]
  901. paddsw mm5,MMX_clip
  902. packuswb mm3,mm3 ;[01234567] [2] mm4: R3R2R1R0R3R2R1R0
  903. psubusw mm5,MMX_clip
  904. packuswb mm7,mm7 ;[01234567] [2] mm6: B3B2B1B0B3B2B1B0
  905. pand mm5,MMX_grnmask ;[012 4567] [2] mm7: <G3><G2><G1><G0>
  906. psrlq mm7,2 ;[01234567] [2]
  907. punpcklbw mm7,mm3 ;[012 4567] [2] mm6: R3B3R2B2R1B1R0B0
  908. movq mm3,[edx+ebp*2] ;[01234567] [4] Y
  909. psrlw mm7,1 ;[01234567] [2]
  910. pand mm7,MMX_rbmask ;[01234567] [2] mm6: <RB3><RB2><RB1><RB0>
  911. psrlw mm3,8 ;[01234567] [4]
  912. por mm7,mm5 ;[01234567] [2] mm7: P7P5P3P1
  913. movq mm5,mm6 ;[01234567] [A]
  914. psubw mm3,MMX_10w ;[01234567] [4]
  915. punpcklwd mm6,mm7 ;[01234567] [A] mm4: P3P2P1P0
  916. pmullw mm3,MMX_Ycoeff ;[0123456 ] [4]
  917. punpckhwd mm5,mm7 ;[0123456 ] [A} mm5: P7P6P5P4
  918. movq [eax+ebp*4   ],mm6 ;[012345  ] [A]
  919. movq mm6,mm4 ;[0123456 ] [3]
  920. movq [eax+ebp*4+ 8],mm5 ;[0123456 ] [A]
  921. paddw mm6,mm0 ;[01234 6 ] [3] mm6: <B3><B2><B1><B0>
  922. movq mm5,mm4 ;[0123456 ] [3]
  923. paddw mm4,mm1 ;[0123456 ] [3] mm4: <R3><R2><R1><R0>
  924. paddw mm5,mm2 ;[0123456 ] [3] mm5: <G3><G2><G1><G0>
  925. psraw mm4,6 ;[0123456 ] [3]
  926. movq mm7,mm3 ;[01234567] [4]
  927. psraw mm5,4 ;[01234567] [3]
  928. paddw mm7,mm0 ;[01234567] [4] mm6: <B3><B2><B1><B0>
  929. psraw mm6,6 ;[01234567] [3]
  930. movq mm0,mm3 ;[01234567] [4]
  931. packuswb mm4,mm4 ;[01234567] [3] mm4: R3R2R1R0R3R2R1R0
  932. packuswb mm6,mm6 ;[01 34567] [3] mm6: B3B2B1B0B3B2B1B0
  933. paddw mm3,mm1 ;[01234567] [4] mm4: <R3><R2><R1><R0>
  934. psrlq mm6,2
  935. paddw mm0,mm2 ;[01 34567] [4] mm5: <G3><G2><G1><G0>
  936. paddsw mm5,MMX_clip
  937. punpcklbw mm6,mm4 ;[01 3 567] [3] mm6: B3B3B2B2B1B1B0B0
  938. psubusw mm5,MMX_clip
  939. psrlw mm6,1 ;[01 3 567] [3]
  940. pand mm6,MMX_rbmask ;[01 3 567] [3] mm6: <B3><B2><B1><B0>
  941. psraw mm3,6 ;[01 3 567] [4]
  942. pand mm5,MMX_grnmask ;[01 3 567] [3] mm7: <G3><G2><G1><G0>
  943. psraw mm0,4 ;[01 3 567] [4]
  944. por mm6,mm5 ;[01 3  67] [3] mm4: P6P4P2P0
  945. psraw mm7,6 ;[01 3  67] [4]
  946. paddsw mm0,MMX_clip
  947. packuswb mm3,mm3 ;[01 3  67] [4] mm4: R3R2R1R0R3R2R1R0
  948. psubusw mm0,MMX_clip
  949. packuswb mm7,mm7 ;[01 3  67] mm6: B3B2B1B0B3B2B1B0
  950. pand mm0,MMX_grnmask ;[01    67] mm7: <G3><G2><G1><G0>
  951. psrlq mm7,2
  952. punpcklbw mm7,mm3 ;[01    67] mm6: R3B3R2B2R1B1R0B0
  953. movq mm1,mm6
  954. psrlw mm7,1
  955. add ebp,4
  956. pand mm7,MMX_rbmask ;[01    67] mm6: <B3><B2><B1><B0>
  957. por mm0,mm7 ;[01    67] mm0: P7P5P3P1
  958. punpcklwd mm6,mm0 ;[01    6 ] mm4: P3P2P1P0
  959. punpckhwd mm1,mm0 ;[ 1    6 ] mm5: P7P6P5P4
  960. movq [ebx+ebp*4-16],mm6
  961. movq [ebx+ebp*4- 8],mm1
  962. jnz col_loop_MMX16
  963. pop ebp
  964. pop edi
  965. pop esi
  966. pop ebx
  967. ret
  968. ;--------------------------------------------------------------------------
  969. _asm_YUVtoRGB32_row_ISSE:
  970. push ebx
  971. push esi
  972. push edi
  973. push ebp
  974. mov eax,count
  975. mov ebp,eax
  976. mov ebx,eax
  977. shl ebx,3
  978. add eax,eax
  979. add ARGB1_pointer,ebx
  980. add ARGB2_pointer,ebx
  981. add Y1_pointer,eax
  982. add Y2_pointer,eax
  983. add U_pointer,ebp
  984. add V_pointer,ebp
  985. neg ebp
  986. mov esi,U_pointer
  987. mov edi,V_pointer
  988. mov ecx,Y1_pointer
  989. mov edx,Y2_pointer
  990. mov eax,ARGB1_pointer
  991. mov ebx,ARGB2_pointer
  992. col_loop_SSE:
  993. prefetchnta [esi+ebp+32]
  994. prefetchnta [edi+ebp+32]
  995. prefetchnta [ecx+ebp*2+32]
  996. prefetchnta [edx+ebp*2+32]
  997. movd mm0, dword ptr [esi+ebp] ;U (byte)
  998. pxor mm7,mm7
  999. movd mm1, dword ptr [edi+ebp] ;V (byte)
  1000. punpcklbw mm0,mm7 ;U (word)
  1001. psubw mm0,MMX_80w
  1002. punpcklbw mm1,mm7 ;V (word)
  1003. psubw mm1,MMX_80w
  1004. movq mm2,mm0
  1005. pmullw mm2,MMX_Ugrncoeff
  1006. movq mm3,mm1
  1007. pmullw mm3,MMX_Vgrncoeff
  1008. pmullw mm0,MMX_Ublucoeff
  1009. pmullw mm1,MMX_Vredcoeff
  1010. paddw mm2,mm3
  1011. ;mm0: blue
  1012. ;mm1: red
  1013. ;mm2: green
  1014. movq mm6,[ecx+ebp*2] ;Y
  1015. pand mm6,MMX_00FFw
  1016. psubw mm6,MMX_10w
  1017. pmullw mm6,MMX_Ycoeff
  1018. movq mm4,mm6
  1019. paddw mm6,mm0 ;mm6: <B3><B2><B1><B0>
  1020. movq mm5,mm4
  1021. paddw mm4,mm1 ;mm4: <R3><R2><R1><R0>
  1022. paddw mm5,mm2 ;mm5: <G3><G2><G1><G0>
  1023. psraw mm6,6
  1024. psraw mm4,6
  1025. packuswb mm6,mm6 ;mm6: B3B2B1B0B3B2B1B0
  1026. psraw mm5,6
  1027. packuswb mm4,mm4 ;mm4: R3R2R1R0R3R2R1R0
  1028. punpcklbw mm6,mm4 ;mm6: R3B3R2B2R1B1R0B0
  1029. packuswb mm5,mm5 ;mm5: G3G2G1G0G3G2G1G0
  1030. punpcklbw mm5,mm5 ;mm5: G3G3G2G2G1G1G0G0
  1031. movq mm4,mm6
  1032. punpcklbw mm6,mm5 ;mm6: G1R1G1B2G0R0G0B0
  1033. punpckhbw mm4,mm5 ;mm4: G3R3G3B3G2R2G2B2
  1034. movq mm7,[ecx+ebp*2] ;Y
  1035. psrlw mm7,8
  1036. psubw mm7,MMX_10w
  1037. pmullw mm7,MMX_Ycoeff
  1038. movq mm3,mm7
  1039. paddw mm7,mm0 ;mm7: final blue
  1040. movq mm5,mm3
  1041. paddw mm3,mm1 ;mm3: final red
  1042. paddw mm5,mm2 ;mm5: final green
  1043. psraw mm7,6
  1044. psraw mm3,6
  1045. packuswb mm7,mm7 ;mm7: B3B2B1B0B3B2B1B0
  1046. psraw mm5,6
  1047. packuswb mm3,mm3 ;mm3: R3R2R1R0R3R2R1R0
  1048. punpcklbw mm7,mm3 ;mm7: R3B3R2B2R1B1R0B0
  1049. packuswb mm5,mm5 ;mm5: G3G2G1G0G3G2G1G0
  1050. punpcklbw mm5,mm5 ;mm5: G3G3G2G2G1G1G0G0
  1051. movq mm3,mm7
  1052. punpcklbw mm7,mm5 ;mm7: G1R1G1B2G0R0G0B0
  1053. punpckhbw mm3,mm5 ;mm3: G3R3G3B3G2R2G2B2
  1054. ;mm3 P7:P5
  1055. ;mm4 P6:P4
  1056. ;mm6 P2:P0
  1057. ;mm7 P3:P1
  1058. movq mm5,mm6
  1059. punpckldq mm5,mm7 ;P1:P0
  1060. punpckhdq mm6,mm7 ;P3:P2
  1061. movq mm7,mm4
  1062. punpckldq mm4,mm3 ;P5:P4
  1063. punpckhdq mm7,mm3 ;P7:P6
  1064. movntq [eax+ebp*8],mm5
  1065. movntq [eax+ebp*8+8],mm6
  1066. movntq [eax+ebp*8+16],mm4
  1067. movntq [eax+ebp*8+24],mm7
  1068. movq mm6,[edx+ebp*2] ;Y
  1069. pand mm6,MMX_00FFw
  1070. psubw mm6,MMX_10w
  1071. pmullw mm6,MMX_Ycoeff
  1072. movq mm4,mm6
  1073. paddw mm6,mm0 ;mm6: <B3><B2><B1><B0>
  1074. movq mm5,mm4
  1075. paddw mm4,mm1 ;mm4: <R3><R2><R1><R0>
  1076. paddw mm5,mm2 ;mm5: <G3><G2><G1><G0>
  1077. psraw mm6,6
  1078. psraw mm4,6
  1079. packuswb mm6,mm6 ;mm6: B3B2B1B0B3B2B1B0
  1080. psraw mm5,6
  1081. packuswb mm4,mm4 ;mm4: R3R2R1R0R3R2R1R0
  1082. punpcklbw mm6,mm4 ;mm6: R3B3R2B2R1B1R0B0
  1083. packuswb mm5,mm5 ;mm5: G3G2G1G0G3G2G1G0
  1084. punpcklbw mm5,mm5 ;mm5: G3G3G2G2G1G1G0G0
  1085. movq mm4,mm6
  1086. punpcklbw mm6,mm5 ;mm6: G1R1G1B2G0R0G0B0
  1087. punpckhbw mm4,mm5 ;mm4: G3R3G3B3G2R2G2B2
  1088. movq mm7,[edx+ebp*2] ;Y
  1089. psrlw mm7,8
  1090. psubw mm7,MMX_10w
  1091. pmullw mm7,MMX_Ycoeff
  1092. movq mm3,mm7
  1093. paddw mm7,mm0 ;mm7: final blue
  1094. movq mm5,mm3
  1095. paddw mm3,mm1 ;mm3: final red
  1096. paddw mm5,mm2 ;mm5: final green
  1097. psraw mm7,6
  1098. psraw mm3,6
  1099. packuswb mm7,mm7 ;mm7: B3B2B1B0B3B2B1B0
  1100. psraw mm5,6
  1101. packuswb mm3,mm3 ;mm3: R3R2R1R0R3R2R1R0
  1102. punpcklbw mm7,mm3 ;mm7: R3B3R2B2R1B1R0B0
  1103. packuswb mm5,mm5 ;mm5: G3G2G1G0G3G2G1G0
  1104. punpcklbw mm5,mm5 ;mm5: G3G3G2G2G1G1G0G0
  1105. movq mm3,mm7
  1106. punpcklbw mm7,mm5 ;mm7: G1R1G1B2G0R0G0B0
  1107. punpckhbw mm3,mm5 ;mm3: G3R3G3B3G2R2G2B2
  1108. ;mm3 P7:P5
  1109. ;mm4 P6:P4
  1110. ;mm6 P2:P0
  1111. ;mm7 P3:P1
  1112. movq mm5,mm6
  1113. punpckldq mm5,mm7 ;P1:P0
  1114. punpckhdq mm6,mm7 ;P3:P2
  1115. movq mm7,mm4
  1116. punpckldq mm4,mm3 ;P5:P4
  1117. punpckhdq mm7,mm3 ;P7:P6
  1118. movntq [ebx+ebp*8   ],mm5
  1119. movntq [ebx+ebp*8+ 8],mm6
  1120. movntq [ebx+ebp*8+16],mm4
  1121. movntq [ebx+ebp*8+24],mm7
  1122. add ebp,4
  1123. jnz col_loop_SSE
  1124. pop ebp
  1125. pop edi
  1126. pop esi
  1127. pop ebx
  1128. ret
  1129. _asm_YUVtoRGB24_row_ISSE:
  1130. push ebx
  1131. push esi
  1132. push edi
  1133. push ebp
  1134. mov eax,count
  1135. mov ebp,eax
  1136. add eax,eax
  1137. add Y1_pointer,eax
  1138. add Y2_pointer,eax
  1139. add U_pointer,ebp
  1140. add V_pointer,ebp
  1141. neg ebp
  1142. mov esi,U_pointer
  1143. mov edi,V_pointer
  1144. mov ecx,Y1_pointer
  1145. mov edx,Y2_pointer
  1146. mov eax,ARGB1_pointer
  1147. mov ebx,ARGB2_pointer
  1148. movd mm0,esp
  1149. sub esp,20
  1150. and esp,-8
  1151. movd dword ptr [esp+16],mm0
  1152. col_loop_ISSE24:
  1153. prefetchnta [esi+ebp+32]
  1154. prefetchnta [edi+ebp+32]
  1155. prefetchnta [ecx+ebp*2+32]
  1156. prefetchnta [edx+ebp*2+32]
  1157. movd mm0, dword ptr [esi+ebp] ;U (byte)
  1158. pxor mm7,mm7
  1159. movd mm1, dword ptr [edi+ebp] ;V (byte)
  1160. punpcklbw mm0,mm7 ;U (word)
  1161. movd mm2, dword ptr [ecx+ebp*2] ;Y low
  1162. punpcklbw mm1,mm7 ;V (word)
  1163. movd mm3, dword ptr [edx+ebp*2] ;Y high
  1164. punpcklbw mm2,mm7 ;Y1 (word)
  1165. psubw mm2,MMX_10w
  1166. punpcklbw mm3,mm7 ;Y2 (word)
  1167. psubw mm3,MMX_10w
  1168. psubw mm0,MMX_80w
  1169. psubw mm1,MMX_80w
  1170. movq [esp+0],mm0
  1171. movq [esp+8],mm1
  1172. ;group 1
  1173. pmullw mm2,MMX_Ycoeff ;[lazy]
  1174. pmullw mm3,MMX_Ycoeff ;[lazy]
  1175. pshufw mm6,mm0,00000000b ;mm6 = U0U0U0U0
  1176. pshufw mm7,mm1,00000000b ;mm7 = V0V0V0V0
  1177. pmullw mm6,MMX_Ucoeff0
  1178. pshufw mm4,mm2,01000000b ;mm4 = Y1Y0Y0Y0 [high]
  1179. pmullw mm7,MMX_Vcoeff0
  1180. pshufw mm5,mm3,01000000b ;mm4 = Y1Y0Y0Y0 [low]
  1181. paddw mm4,mm6
  1182. paddw mm5,mm6
  1183. paddw mm4,mm7
  1184. paddw mm5,mm7
  1185. psraw mm4,6
  1186. psraw mm5,6
  1187. ;group 2
  1188. pshufw mm6,[esp+0],01010000b ;mm6 = U1U1U0U0
  1189. pshufw mm7,[esp+8],01010000b ;mm7 = V1V1V0V0
  1190. pmullw mm6,MMX_Ucoeff1
  1191. pshufw mm0,mm2,10100101b ;mm0 = Y2Y2Y1Y1 [high]
  1192. pmullw mm7,MMX_Vcoeff1
  1193. pshufw mm1,mm3,10100101b ;mm1 = Y2Y2Y1Y1 [low]
  1194. paddw mm0,mm6
  1195. paddw mm1,mm6
  1196. paddw mm0,mm7
  1197. paddw mm1,mm7
  1198. psraw mm0,6
  1199. psraw mm1,6
  1200. packuswb mm4,mm0
  1201. packuswb mm5,mm1
  1202. ;group 3
  1203. pshufw mm6,[esp+0],01010101b ;mm6 = U1U1U1U1
  1204. pshufw mm7,[esp+8],01010101b ;mm7 = V1V1V1V1
  1205. movntq [eax],mm4 ;[lazy write]
  1206. movntq [ebx],mm5 ;[lazy write]
  1207. pmullw mm6,MMX_Ucoeff2
  1208. pshufw mm4,mm2,11111110b ;mm4 = Y3Y3Y3Y2 [high]
  1209. pmullw mm7,MMX_Vcoeff2
  1210. pshufw mm5,mm3,11111110b ;mm5 = Y3Y3Y3Y2 [low]
  1211. paddw mm4,mm6
  1212. paddw mm5,mm6
  1213. paddw mm4,mm7
  1214. paddw mm5,mm7
  1215. psraw mm4,6
  1216. psraw mm5,6
  1217. ;next 3 groups
  1218. movd mm2, dword ptr [ecx+ebp*2+4] ;Y low
  1219. pxor mm7,mm7
  1220. movd mm3, dword ptr [edx+ebp*2+4] ;Y high
  1221. punpcklbw mm2,mm7 ;U (word)
  1222. psubw mm2,MMX_10w
  1223. punpcklbw mm3,mm7 ;V (word)
  1224. psubw mm3,MMX_10w
  1225. ;group 1
  1226. pmullw mm2,MMX_Ycoeff ;[init]
  1227. pmullw mm3,MMX_Ycoeff ;[init]
  1228. pshufw mm6,[esp+0],10101010b ;mm6 = U2U2U2U2
  1229. pshufw mm7,[esp+8],10101010b ;mm7 = V2V2V2V2
  1230. pmullw mm6,MMX_Ucoeff0
  1231. pshufw mm0,mm2,01000000b ;mm0 = Y1Y0Y0Y0 [high]
  1232. pmullw mm7,MMX_Vcoeff0
  1233. pshufw mm1,mm3,01000000b ;mm1 = Y1Y0Y0Y0 [low]
  1234. paddw mm0,mm6
  1235. paddw mm1,mm6
  1236. paddw mm0,mm7
  1237. paddw mm1,mm7
  1238. psraw mm0,6
  1239. psraw mm1,6
  1240. packuswb mm4,mm0
  1241. packuswb mm5,mm1
  1242. ;group 2
  1243. pshufw mm6,[esp+0],11111010b ;mm6 = U3U3U2U2
  1244. pshufw mm7,[esp+8],11111010b ;mm7 = V3V3V2V2
  1245. movntq [eax+8],mm4
  1246. movntq [ebx+8],mm5
  1247. pmullw mm6,MMX_Ucoeff1
  1248. pshufw mm4,mm2,10100101b ;mm4 = Y2Y2Y1Y1 [high]
  1249. pmullw mm7,MMX_Vcoeff1
  1250. pshufw mm5,mm3,10100101b ;mm5 = Y2Y2Y1Y1 [low]
  1251. paddw mm4,mm6
  1252. paddw mm5,mm6
  1253. paddw mm4,mm7
  1254. paddw mm5,mm7
  1255. psraw mm4,6
  1256. psraw mm5,6
  1257. ;group 3
  1258. pshufw mm0,[esp+0],11111111b ;mm6 = U3U3U3U3
  1259. pshufw mm1,[esp+8],11111111b ;mm7 = V3V3V3V3
  1260. pmullw mm0,MMX_Ucoeff2
  1261. pshufw mm2,mm2,11111110b ;mm6 = Y3Y3Y3Y2 [high]
  1262. pmullw mm1,MMX_Vcoeff2
  1263. pshufw mm3,mm3,11111110b ;mm7 = Y3Y3Y3Y2 [low]
  1264. paddw mm2,mm0
  1265. paddw mm3,mm0
  1266. paddw mm2,mm1
  1267. paddw mm3,mm1
  1268. psraw mm2,6
  1269. psraw mm3,6
  1270. packuswb mm4,mm2
  1271. packuswb mm5,mm3
  1272. movntq [eax+16],mm4
  1273. add eax,24
  1274. movntq [ebx+16],mm5
  1275. add ebx,24
  1276. ;done
  1277. add ebp,4
  1278. jnz col_loop_ISSE24
  1279. mov esp,[esp+16]
  1280. pop ebp
  1281. pop edi
  1282. pop esi
  1283. pop ebx
  1284. ret
  1285. _asm_YUVtoRGB16_row_ISSE:
  1286. push ebx
  1287. push esi
  1288. push edi
  1289. push ebp
  1290. mov eax,count
  1291. mov ebp,eax
  1292. mov ebx,eax
  1293. shl ebx,2
  1294. add eax,eax
  1295. add ARGB1_pointer,ebx
  1296. add ARGB2_pointer,ebx
  1297. add Y1_pointer,eax
  1298. add Y2_pointer,eax
  1299. add U_pointer,ebp
  1300. add V_pointer,ebp
  1301. neg ebp
  1302. mov esi,U_pointer
  1303. mov edi,V_pointer
  1304. mov ecx,Y1_pointer
  1305. mov edx,Y2_pointer
  1306. mov eax,ARGB1_pointer
  1307. mov ebx,ARGB2_pointer
  1308. col_loop_ISSE16:
  1309. prefetchnta [esi+ebp+32]
  1310. prefetchnta [edi+ebp+32]
  1311. movd mm0, dword ptr [esi+ebp] ;[0       ] U (byte)
  1312. pxor mm7,mm7 ;[0      7] 
  1313. movd mm1, dword ptr [edi+ebp] ;[01     7] V (byte)
  1314. punpcklbw mm0,mm7 ;[01     7] U (word)
  1315. psubw mm0,MMX_80w ;[01     7] 
  1316. punpcklbw mm1,mm7 ;[01     7] V (word)
  1317. psubw mm1,MMX_80w ;[01      ] 
  1318. movq mm2,mm0 ;[012     ] 
  1319. pmullw mm2,MMX_Ugrncoeff ;[012     ] 
  1320. movq mm3,mm1 ;[0123    ] 
  1321. ;mm0: blue
  1322. ;mm1: red
  1323. ;mm2: green
  1324. prefetchnta [ecx+ebp*2+32]
  1325. prefetchnta [edx+ebp*2+32]
  1326. movq mm6,[ecx+ebp*2] ;[0123  6 ] [1] Y
  1327. ;<-->
  1328. pmullw mm3,MMX_Vgrncoeff ;[0123    ] 
  1329. movq mm7,mm6 ;[012   67] [2] Y
  1330. pmullw mm0,MMX_Ublucoeff ;[0123    ] 
  1331. psrlw mm7,8 ;[012   67] [2]
  1332. pmullw mm1,MMX_Vredcoeff ;[0123    ] 
  1333. ;<-->
  1334. pand mm6,MMX_00FFw ;[012   67] [1]
  1335. paddw mm2,mm3 ;[012   6 ] [C]
  1336. psubw mm6,MMX_10w ;[012   67] [1]
  1337. pmullw mm6,MMX_Ycoeff ;[012   67] [1]
  1338. psubw mm7,MMX_10w ;[012   67] [2]
  1339. movq mm4,mm6 ;[012 4 67] [1]
  1340. pmullw mm7,MMX_Ycoeff ;[012   67] [2]
  1341. movq mm5,mm6 ;[012 4567] [1]
  1342. paddw mm6,mm0 ;[012 4 67] [1] mm6: <B3><B2><B1><B0>
  1343. paddw mm4,mm1 ;[012 4567] [1] mm4: <R3><R2><R1><R0>
  1344. paddw mm5,mm2 ;[012 4567] [1] mm5: <G3><G2><G1><G0>
  1345. psraw mm4,6 ;[012 4567] [1]
  1346. movq mm3,mm7 ;[01234567] [2]
  1347. psraw mm5,4 ;[01234567] [1]
  1348. paddw mm7,mm0 ;[01234567] [2] mm6: <B3><B2><B1><B0>
  1349. psraw mm6,6 ;[01234567] [1]
  1350. paddsw mm5,MMX_clip
  1351. packuswb mm6,mm6 ;[01234567] [1] mm6: B3B2B1B0B3B2B1B0
  1352. psubusw mm5,MMX_clip
  1353. packuswb mm4,mm4 ;[01234567] [1] mm4: R3R2R1R0R3R2R1R0
  1354. pand mm5,MMX_grnmask ;[01234567] [1] mm7: <G3><G2><G1><G0>
  1355. psrlq mm6,2 ;[01234567] [1]
  1356. punpcklbw mm6,mm4 ;[0123 567] [1] mm4: R3B3R2B2R1B1R0B0
  1357. movq mm4,[edx+ebp*2] ;[01234567] [3] Y
  1358. psrlw mm6,1 ;[01234567] [1]
  1359. pand mm6,MMX_rbmask ;[01234567] [1] mm6: <RB3><RB2><RB1><RB0>
  1360. por mm6,mm5 ;[01234 67] [1] mm6: P6P4P2P0
  1361. movq mm5,mm3 ;[01234567] [2]
  1362. paddw mm3,mm1 ;[01234567] [2] mm4: <R3><R2><R1><R0>
  1363. paddw mm5,mm2 ;[01234567] [2] mm5: <G3><G2><G1><G0>
  1364. pand mm4,MMX_00FFw ;[01234567] [3]
  1365. psraw mm3,6 ;[01234567] [2]
  1366. psubw mm4,MMX_10w ;[01234567] [3]
  1367. psraw mm5,4 ;[01234567] [2]
  1368. pmullw mm4,MMX_Ycoeff ;[01234567] [3]
  1369. psraw mm7,6 ;[01234567] [2]
  1370. paddsw mm5,MMX_clip
  1371. packuswb mm3,mm3 ;[01234567] [2] mm4: R3R2R1R0R3R2R1R0
  1372. psubusw mm5,MMX_clip
  1373. packuswb mm7,mm7 ;[01234567] [2] mm6: B3B2B1B0B3B2B1B0
  1374. pand mm5,MMX_grnmask ;[012 4567] [2] mm7: <G3><G2><G1><G0>
  1375. psrlq mm7,2 ;[01234567] [2]
  1376. punpcklbw mm7,mm3 ;[012 4567] [2] mm6: R3B3R2B2R1B1R0B0
  1377. movq mm3,[edx+ebp*2] ;[01234567] [4] Y
  1378. psrlw mm7,1 ;[01234567] [2]
  1379. pand mm7,MMX_rbmask ;[01234567] [2] mm6: <RB3><RB2><RB1><RB0>
  1380. psrlw mm3,8 ;[01234567] [4]
  1381. por mm7,mm5 ;[01234567] [2] mm7: P7P5P3P1
  1382. movq mm5,mm6 ;[01234567] [A]
  1383. psubw mm3,MMX_10w ;[01234567] [4]
  1384. punpcklwd mm6,mm7 ;[01234567] [A] mm4: P3P2P1P0
  1385. pmullw mm3,MMX_Ycoeff ;[0123456 ] [4]
  1386. punpckhwd mm5,mm7 ;[0123456 ] [A} mm5: P7P6P5P4
  1387. movntq [eax+ebp*4   ],mm6 ;[012345  ] [A]
  1388. movq mm6,mm4 ;[0123456 ] [3]
  1389. movntq [eax+ebp*4+ 8],mm5 ;[0123456 ] [A]
  1390. paddw mm6,mm0 ;[01234 6 ] [3] mm6: <B3><B2><B1><B0>
  1391. movq mm5,mm4 ;[0123456 ] [3]
  1392. paddw mm4,mm1 ;[0123456 ] [3] mm4: <R3><R2><R1><R0>
  1393. paddw mm5,mm2 ;[0123456 ] [3] mm5: <G3><G2><G1><G0>
  1394. psraw mm4,6 ;[0123456 ] [3]
  1395. movq mm7,mm3 ;[01234567] [4]
  1396. psraw mm5,4 ;[01234567] [3]
  1397. paddw mm7,mm0 ;[01234567] [4] mm6: <B3><B2><B1><B0>
  1398. psraw mm6,6 ;[01234567] [3]
  1399. movq mm0,mm3 ;[01234567] [4]
  1400. packuswb mm4,mm4 ;[01234567] [3] mm4: R3R2R1R0R3R2R1R0
  1401. packuswb mm6,mm6 ;[01 34567] [3] mm6: B3B2B1B0B3B2B1B0
  1402. paddw mm3,mm1 ;[01234567] [4] mm4: <R3><R2><R1><R0>
  1403. psrlq mm6,2
  1404. paddw mm0,mm2 ;[01 34567] [4] mm5: <G3><G2><G1><G0>
  1405. paddsw mm5,MMX_clip
  1406. punpcklbw mm6,mm4 ;[01 3 567] [3] mm6: B3B3B2B2B1B1B0B0
  1407. psubusw mm5,MMX_clip
  1408. psrlw mm6,1 ;[01 3 567] [3]
  1409. pand mm6,MMX_rbmask ;[01 3 567] [3] mm6: <B3><B2><B1><B0>
  1410. psraw mm3,6 ;[01 3 567] [4]
  1411. pand mm5,MMX_grnmask ;[01 3 567] [3] mm7: <G3><G2><G1><G0>
  1412. psraw mm0,4 ;[01 3 567] [4]
  1413. por mm6,mm5 ;[01 3  67] [3] mm4: P6P4P2P0
  1414. psraw mm7,6 ;[01 3  67] [4]
  1415. paddsw mm0,MMX_clip
  1416. packuswb mm3,mm3 ;[01 3  67] [4] mm4: R3R2R1R0R3R2R1R0
  1417. psubusw mm0,MMX_clip
  1418. packuswb mm7,mm7 ;[01 3  67] mm6: B3B2B1B0B3B2B1B0
  1419. pand mm0,MMX_grnmask ;[01    67] mm7: <G3><G2><G1><G0>
  1420. psrlq mm7,2
  1421. punpcklbw mm7,mm3 ;[01    67] mm6: R3B3R2B2R1B1R0B0
  1422. movq mm1,mm6
  1423. psrlw mm7,1
  1424. add ebp,4
  1425. pand mm7,MMX_rbmask ;[01    67] mm6: <B3><B2><B1><B0>
  1426. por mm0,mm7 ;[01    67] mm0: P7P5P3P1
  1427. punpcklwd mm6,mm0 ;[01    6 ] mm4: P3P2P1P0
  1428. punpckhwd mm1,mm0 ;[ 1    6 ] mm5: P7P6P5P4
  1429. movntq [ebx+ebp*4-16],mm6
  1430. movntq [ebx+ebp*4- 8],mm1
  1431. jnz col_loop_ISSE16
  1432. pop ebp
  1433. pop edi
  1434. pop esi
  1435. pop ebx
  1436. ret
  1437. end