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

多媒体编程

开发平台:

Visual C++

  1. .686
  2. .model flat
  3. .mmx
  4. .xmm
  5. .const
  6. __uvmin DD 0d01502f9r ; -1e+010
  7. __uvmax DD 0501502f9r ; +1e+010
  8. .code
  9. ;
  10. ; memsetd
  11. ;
  12. @memsetd@12 proc public
  13. push edi
  14. mov edi, ecx
  15. mov eax, edx
  16. mov ecx, [esp+4+4]
  17. cld
  18. rep stosd
  19. pop edi
  20. ret 4
  21. @memsetd@12 endp
  22. ;
  23. ; SaturateColor
  24. ;
  25. @SaturateColor_sse2@4 proc public
  26. pxor xmm0, xmm0
  27. movdqa xmm1, [ecx]
  28. packssdw xmm1, xmm0
  29. packuswb xmm1, xmm0
  30. punpcklbw xmm1, xmm0
  31. punpcklwd xmm1, xmm0
  32. movdqa [ecx], xmm1
  33. ret
  34. @SaturateColor_sse2@4 endp
  35. @SaturateColor_asm@4 proc public
  36. push esi
  37. mov esi, ecx
  38. xor eax, eax
  39. mov edx, 000000ffh
  40. mov ecx, [esi]
  41. cmp ecx, eax
  42. cmovl ecx, eax
  43. cmp ecx, edx
  44. cmovg ecx, edx
  45. mov [esi], ecx
  46. mov ecx, [esi+4]
  47. cmp ecx, eax
  48. cmovl ecx, eax
  49. cmp ecx, edx
  50. cmovg ecx, edx
  51. mov [esi+4], ecx
  52. mov ecx, [esi+8]
  53. cmp ecx, eax
  54. cmovl ecx, eax
  55. cmp ecx, edx
  56. cmovg ecx, edx
  57. mov [esi+8], ecx
  58. mov ecx, [esi+12]
  59. cmp ecx, eax
  60. cmovl ecx, eax
  61. cmp ecx, edx
  62. cmovg ecx, edx
  63. mov [esi+12], ecx
  64. pop esi
  65. ret
  66. @SaturateColor_asm@4 endp
  67. ;
  68. ; swizzling
  69. ;
  70. punpck macro op, sd0, sd2, s1, s3, d1, d3
  71. movdqa @CatStr(xmm, %d1), @CatStr(xmm, %sd0)
  72. pshufd @CatStr(xmm, %d3), @CatStr(xmm, %sd2), 0e4h
  73. @CatStr(punpckl, op) @CatStr(xmm, %sd0), @CatStr(xmm, %s1)
  74. @CatStr(punpckh, op) @CatStr(xmm, %d1), @CatStr(xmm, %s1)
  75. @CatStr(punpckl, op) @CatStr(xmm, %sd2), @CatStr(xmm, %s3)
  76. @CatStr(punpckh, op) @CatStr(xmm, %d3), @CatStr(xmm, %s3)
  77. endm
  78. punpcknb macro
  79. movdqa xmm4, xmm0
  80. pshufd xmm5, xmm1, 0e4h
  81. psllq xmm1, 4
  82. psrlq xmm4, 4
  83. movdqa xmm6, xmm7
  84. pand xmm0, xmm7
  85. pandn xmm6, xmm1
  86. por xmm0, xmm6
  87. movdqa xmm6, xmm7
  88. pand xmm4, xmm7
  89. pandn xmm6, xmm5
  90. por xmm4, xmm6
  91. movdqa xmm1, xmm4
  92. movdqa xmm4, xmm2
  93. pshufd xmm5, xmm3, 0e4h
  94. psllq xmm3, 4
  95. psrlq xmm4, 4
  96. movdqa xmm6, xmm7
  97. pand xmm2, xmm7
  98. pandn xmm6, xmm3
  99. por xmm2, xmm6
  100. movdqa xmm6, xmm7
  101. pand xmm4, xmm7
  102. pandn xmm6, xmm5
  103. por xmm4, xmm6
  104. movdqa xmm3, xmm4
  105. punpck bw, 0, 2, 1, 3, 4, 6
  106. endm
  107. ;
  108. ; unSwizzleBlock32
  109. ;
  110. @unSwizzleBlock32_sse2@12 proc public
  111. push ebx
  112. mov ebx, [esp+4+4]
  113. lea eax, [ebx*2]
  114. add eax, ebx
  115. movdqa xmm0, [ecx+16*0]
  116. movdqa xmm1, [ecx+16*1]
  117. movdqa xmm2, [ecx+16*2]
  118. movdqa xmm3, [ecx+16*3]
  119. punpck qdq, 0, 2, 1, 3, 4, 6
  120. movdqa [edx], xmm0
  121. movdqa [edx+16], xmm2
  122. movdqa [edx+ebx], xmm4
  123. movdqa [edx+ebx+16], xmm6
  124. movdqa xmm0, [ecx+16*4]
  125. movdqa xmm1, [ecx+16*5]
  126. movdqa xmm2, [ecx+16*6]
  127. movdqa xmm3, [ecx+16*7]
  128. punpck qdq, 0, 2, 1, 3, 4, 6
  129. movdqa [edx+ebx*2], xmm0
  130. movdqa [edx+ebx*2+16], xmm2
  131. movdqa [edx+eax], xmm4
  132. movdqa [edx+eax+16], xmm6
  133. lea edx, [edx+ebx*4]
  134. movdqa xmm0, [ecx+16*8]
  135. movdqa xmm1, [ecx+16*9]
  136. movdqa xmm2, [ecx+16*10]
  137. movdqa xmm3, [ecx+16*11]
  138. punpck qdq, 0, 2, 1, 3, 4, 6
  139. movdqa [edx], xmm0
  140. movdqa [edx+16], xmm2
  141. movdqa [edx+ebx], xmm4
  142. movdqa [edx+ebx+16], xmm6
  143. movdqa xmm0, [ecx+16*12]
  144. movdqa xmm1, [ecx+16*13]
  145. movdqa xmm2, [ecx+16*14]
  146. movdqa xmm3, [ecx+16*15]
  147. punpck qdq, 0, 2, 1, 3, 4, 6
  148. movdqa [edx+ebx*2], xmm0
  149. movdqa [edx+ebx*2+16], xmm2
  150. movdqa [edx+eax], xmm4
  151. movdqa [edx+eax+16], xmm6
  152. pop ebx
  153. ret 4
  154. @unSwizzleBlock32_sse2@12 endp
  155. ;
  156. ; unSwizzleBlock16
  157. ;
  158. @unSwizzleBlock16_sse2@12 proc public
  159. push ebx
  160. mov ebx, [esp+4+4]
  161. mov eax, 4
  162. align 16
  163. @@:
  164. movdqa xmm0, [ecx+16*0]
  165. movdqa xmm1, [ecx+16*1]
  166. movdqa xmm2, [ecx+16*2]
  167. movdqa xmm3, [ecx+16*3]
  168. punpck wd, 0, 2, 1, 3, 4, 6
  169. punpck dq, 0, 4, 2, 6, 1, 3
  170. punpck wd, 0, 4, 1, 3, 2, 6
  171. movdqa [edx], xmm0
  172. movdqa [edx+16], xmm2
  173. movdqa [edx+ebx], xmm4
  174. movdqa [edx+ebx+16], xmm6
  175. add ecx, 64
  176. lea edx, [edx+ebx*2]
  177. dec eax
  178. jnz @B
  179. pop ebx
  180. ret 4
  181. @unSwizzleBlock16_sse2@12 endp
  182. ;
  183. ; unSwizzleBlock8
  184. ;
  185. @unSwizzleBlock8_sse2@12 proc public
  186. push ebx
  187. mov ebx, [esp+4+4]
  188. mov eax, 2
  189. align 16
  190. @@:
  191. ; col 0, 2
  192. movdqa xmm0, [ecx+16*0]
  193. movdqa xmm1, [ecx+16*1]
  194. movdqa xmm4, [ecx+16*2]
  195. movdqa xmm5, [ecx+16*3]
  196. punpck bw,  0, 4, 1, 5, 2, 6
  197. punpck wd,  0, 2, 4, 6, 1, 3
  198. punpck bw,  0, 2, 1, 3, 4, 6
  199. punpck qdq, 0, 2, 4, 6, 1, 3
  200. pshufd xmm1, xmm1, 0b1h
  201. pshufd xmm3, xmm3, 0b1h
  202. movdqa [edx], xmm0
  203. movdqa [edx+ebx], xmm2
  204. lea edx, [edx+ebx*2]
  205. movdqa [edx], xmm1
  206. movdqa [edx+ebx], xmm3
  207. lea edx, [edx+ebx*2]
  208. ; col 1, 3
  209. movdqa xmm0, [ecx+16*4]
  210. movdqa xmm1, [ecx+16*5]
  211. movdqa xmm4, [ecx+16*6]
  212. movdqa xmm5, [ecx+16*7]
  213. punpck bw,  0, 4, 1, 5, 2, 6
  214. punpck wd,  0, 2, 4, 6, 1, 3
  215. punpck bw,  0, 2, 1, 3, 4, 6
  216. punpck qdq, 0, 2, 4, 6, 1, 3
  217. pshufd xmm0, xmm0, 0b1h
  218. pshufd xmm2, xmm2, 0b1h
  219. movdqa [edx], xmm0
  220. movdqa [edx+ebx], xmm2
  221. lea edx, [edx+ebx*2]
  222. movdqa [edx], xmm1
  223. movdqa [edx+ebx], xmm3
  224. lea edx, [edx+ebx*2]
  225. add ecx, 128
  226. dec eax
  227. jnz @B
  228. pop ebx
  229. ret 4
  230. @unSwizzleBlock8_sse2@12 endp
  231. ;
  232. ; unSwizzleBlock4
  233. ;
  234. @unSwizzleBlock4_sse2@12 proc public
  235. push ebx
  236. mov         eax, 0f0f0f0fh
  237. movd        xmm7, eax 
  238. pshufd      xmm7, xmm7, 0
  239. mov ebx, [esp+4+4]
  240. mov eax, 2
  241. align 16
  242. @@:
  243. ; col 0, 2
  244. movdqa xmm0, [ecx+16*0]
  245. movdqa xmm1, [ecx+16*1]
  246. movdqa xmm4, [ecx+16*2]
  247. movdqa xmm3, [ecx+16*3]
  248. punpck dq, 0, 4, 1, 3, 2, 6
  249. punpck dq, 0, 2, 4, 6, 1, 3
  250. punpcknb
  251. punpck bw, 0, 2, 4, 6, 1, 3
  252. punpck wd, 0, 2, 1, 3, 4, 6
  253. pshufd xmm0, xmm0, 0d8h
  254. pshufd xmm2, xmm2, 0d8h
  255. pshufd xmm4, xmm4, 0d8h
  256. pshufd xmm6, xmm6, 0d8h
  257. punpck qdq, 0, 2, 4, 6, 1, 3
  258. pshuflw xmm1, xmm1, 0b1h
  259. pshuflw xmm3, xmm3, 0b1h
  260. pshufhw xmm1, xmm1, 0b1h
  261. pshufhw xmm3, xmm3, 0b1h
  262. movdqa [edx], xmm0
  263. movdqa [edx+ebx], xmm2
  264. lea edx, [edx+ebx*2]
  265. movdqa [edx], xmm1
  266. movdqa [edx+ebx], xmm3
  267. lea edx, [edx+ebx*2]
  268. ; col 1, 3
  269. movdqa xmm0, [ecx+16*4]
  270. movdqa xmm1, [ecx+16*5]
  271. movdqa xmm4, [ecx+16*6]
  272. movdqa xmm3, [ecx+16*7]
  273. punpck dq, 0, 4, 1, 3, 2, 6
  274. punpck dq, 0, 2, 4, 6, 1, 3
  275. punpcknb
  276. punpck bw, 0, 2, 4, 6, 1, 3
  277. punpck wd, 0, 2, 1, 3, 4, 6
  278. pshufd xmm0, xmm0, 0d8h
  279. pshufd xmm2, xmm2, 0d8h
  280. pshufd xmm4, xmm4, 0d8h
  281. pshufd xmm6, xmm6, 0d8h
  282. punpck qdq, 0, 2, 4, 6, 1, 3
  283. pshuflw xmm0, xmm0, 0b1h
  284. pshuflw xmm2, xmm2, 0b1h
  285. pshufhw xmm0, xmm0, 0b1h
  286. pshufhw xmm2, xmm2, 0b1h
  287. movdqa [edx], xmm0
  288. movdqa [edx+ebx], xmm2
  289. lea edx, [edx+ebx*2]
  290. movdqa [edx], xmm1
  291. movdqa [edx+ebx], xmm3
  292. lea edx, [edx+ebx*2]
  293. add ecx, 128
  294. dec eax
  295. jnz @B
  296. pop ebx
  297. ret 4
  298. @unSwizzleBlock4_sse2@12 endp
  299. ;
  300. ; unSwizzleBlock8HP
  301. ;
  302. @unSwizzleBlock8HP_sse2@12 proc public
  303. push ebx
  304. mov ebx, [esp+4+4]
  305. mov eax, 4
  306. align 16
  307. @@:
  308. movdqa xmm0, [ecx+16*0]
  309. movdqa xmm1, [ecx+16*1]
  310. movdqa xmm2, [ecx+16*2]
  311. movdqa xmm3, [ecx+16*3]
  312. punpck qdq, 0, 2, 1, 3, 4, 6
  313. psrld xmm0, 24
  314. psrld xmm2, 24
  315. psrld xmm4, 24
  316. psrld xmm6, 24
  317. packssdw xmm0, xmm2
  318. packssdw xmm4, xmm6
  319. packuswb xmm0, xmm4
  320. movlps qword ptr [edx], xmm0
  321. movhps qword ptr [edx+ebx], xmm0
  322. add ecx, 64
  323. lea edx, [edx+ebx*2]
  324. dec eax
  325. jnz @B
  326. pop ebx
  327. ret 4
  328. @unSwizzleBlock8HP_sse2@12 endp
  329. ;
  330. ; unSwizzleBlock4HLP
  331. ;
  332. @unSwizzleBlock4HLP_sse2@12 proc public
  333. push ebx
  334. mov         eax, 0f0f0f0fh
  335. movd        xmm7, eax 
  336. pshufd      xmm7, xmm7, 0
  337. mov ebx, [esp+4+4]
  338. mov eax, 4
  339. align 16
  340. @@:
  341. movdqa xmm0, [ecx+16*0]
  342. movdqa xmm1, [ecx+16*1]
  343. movdqa xmm2, [ecx+16*2]
  344. movdqa xmm3, [ecx+16*3]
  345. punpck qdq, 0, 2, 1, 3, 4, 6
  346. psrld xmm0, 24
  347. psrld xmm2, 24
  348. psrld xmm4, 24
  349. psrld xmm6, 24
  350. packssdw xmm0, xmm2
  351. packssdw xmm4, xmm6
  352. packuswb xmm0, xmm4
  353. pand xmm0, xmm7
  354. movlps qword ptr [edx], xmm0
  355. movhps qword ptr [edx+ebx], xmm0
  356. add ecx, 64
  357. lea edx, [edx+ebx*2]
  358. dec eax
  359. jnz @B
  360. pop ebx
  361. ret 4
  362. @unSwizzleBlock4HLP_sse2@12 endp
  363. ;
  364. ; unSwizzleBlock4HHP
  365. ;
  366. @unSwizzleBlock4HHP_sse2@12 proc public
  367. push ebx
  368. mov ebx, [esp+4+4]
  369. mov eax, 4
  370. align 16
  371. @@:
  372. movdqa xmm0, [ecx+16*0]
  373. movdqa xmm1, [ecx+16*1]
  374. movdqa xmm2, [ecx+16*2]
  375. movdqa xmm3, [ecx+16*3]
  376. punpck qdq, 0, 2, 1, 3, 4, 6
  377. psrld xmm0, 28
  378. psrld xmm2, 28
  379. psrld xmm4, 28
  380. psrld xmm6, 28
  381. packssdw xmm0, xmm2
  382. packssdw xmm4, xmm6
  383. packuswb xmm0, xmm4
  384. movlps qword ptr [edx], xmm0
  385. movhps qword ptr [edx+ebx], xmm0
  386. add ecx, 64
  387. lea edx, [edx+ebx*2]
  388. dec eax
  389. jnz @B
  390. pop ebx
  391. ret 4
  392. @unSwizzleBlock4HHP_sse2@12 endp
  393. ;
  394. ; unSwizzleBlock4P
  395. ;
  396. @unSwizzleBlock4P_sse2@12 proc public
  397. push esi
  398. push edi
  399. mov         eax, 0f0f0f0fh
  400. movd        xmm7, eax 
  401. pshufd      xmm7, xmm7, 0
  402. mov esi, [esp+4+8]
  403. lea edi, [esi*2]
  404. add edi, esi
  405. ; col 0
  406. movdqa xmm0, [ecx+16*0]
  407. movdqa xmm1, [ecx+16*1]
  408. movdqa xmm2, [ecx+16*2]
  409. movdqa xmm3, [ecx+16*3]
  410. punpck bw, 0, 2, 1, 3, 4, 6
  411. punpck wd, 0, 4, 2, 6, 1, 3
  412. punpck bw, 0, 4, 1, 3, 2, 6
  413. movdqa xmm1, xmm7
  414. pandn xmm1, xmm0
  415. pand xmm0, xmm7
  416. pshufd xmm1, xmm1, 0b1h
  417. psrlq xmm1, 4
  418. movdqa xmm3, xmm7
  419. pandn xmm3, xmm2
  420. pand xmm2, xmm7
  421. pshufd xmm3, xmm3, 0b1h
  422. psrlq xmm3, 4
  423. movdqa [edx], xmm0
  424. movdqa [edx+16], xmm2
  425. movdqa [edx+esi*2], xmm1
  426. movdqa [edx+esi*2+16], xmm3
  427. movdqa xmm1, xmm7
  428. pandn xmm1, xmm4
  429. pand xmm4, xmm7
  430. pshufd xmm1, xmm1, 0b1h
  431. psrlq xmm1, 4
  432. movdqa xmm3, xmm7
  433. pandn xmm3, xmm6
  434. pand xmm6, xmm7
  435. pshufd xmm3, xmm3, 0b1h
  436. psrlq xmm3, 4
  437. movdqa [edx+esi], xmm4
  438. movdqa [edx+esi+16], xmm6
  439. movdqa [edx+edi], xmm1
  440. movdqa [edx+edi+16], xmm3
  441. lea edx, [edx+esi*4]
  442. ; col 1
  443. movdqa xmm0, [ecx+16*4]
  444. movdqa xmm1, [ecx+16*5]
  445. movdqa xmm2, [ecx+16*6]
  446. movdqa xmm3, [ecx+16*7]
  447. punpck bw, 0, 2, 1, 3, 4, 6
  448. punpck wd, 0, 4, 2, 6, 1, 3
  449. punpck bw, 0, 4, 1, 3, 2, 6
  450. movdqa xmm1, xmm7
  451. pandn xmm1, xmm0
  452. pand xmm0, xmm7
  453. pshufd xmm0, xmm0, 0b1h
  454. psrlq xmm1, 4
  455. movdqa xmm3, xmm7
  456. pandn xmm3, xmm2
  457. pand xmm2, xmm7
  458. pshufd xmm2, xmm2, 0b1h
  459. psrlq xmm3, 4
  460. movdqa [edx], xmm0
  461. movdqa [edx+16], xmm2
  462. movdqa [edx+esi*2], xmm1
  463. movdqa [edx+esi*2+16], xmm3
  464. movdqa xmm1, xmm7
  465. pandn xmm1, xmm4
  466. pand xmm4, xmm7
  467. pshufd xmm4, xmm4, 0b1h
  468. psrlq xmm1, 4
  469. movdqa xmm3, xmm7
  470. pandn xmm3, xmm6
  471. pand xmm6, xmm7
  472. pshufd xmm6, xmm6, 0b1h
  473. psrlq xmm3, 4
  474. movdqa [edx+esi], xmm4
  475. movdqa [edx+esi+16], xmm6
  476. movdqa [edx+edi], xmm1
  477. movdqa [edx+edi+16], xmm3
  478. lea edx, [edx+esi*4]
  479. ; col 2
  480. movdqa xmm0, [ecx+16*8]
  481. movdqa xmm1, [ecx+16*9]
  482. movdqa xmm2, [ecx+16*10]
  483. movdqa xmm3, [ecx+16*11]
  484. punpck bw, 0, 2, 1, 3, 4, 6
  485. punpck wd, 0, 4, 2, 6, 1, 3
  486. punpck bw, 0, 4, 1, 3, 2, 6
  487. movdqa xmm1, xmm7
  488. pandn xmm1, xmm0
  489. pand xmm0, xmm7
  490. pshufd xmm1, xmm1, 0b1h
  491. psrlq xmm1, 4
  492. movdqa xmm3, xmm7
  493. pandn xmm3, xmm2
  494. pand xmm2, xmm7
  495. pshufd xmm3, xmm3, 0b1h
  496. psrlq xmm3, 4
  497. movdqa [edx], xmm0
  498. movdqa [edx+16], xmm2
  499. movdqa [edx+esi*2], xmm1
  500. movdqa [edx+esi*2+16], xmm3
  501. movdqa xmm1, xmm7
  502. pandn xmm1, xmm4
  503. pand xmm4, xmm7
  504. pshufd xmm1, xmm1, 0b1h
  505. psrlq xmm1, 4
  506. movdqa xmm3, xmm7
  507. pandn xmm3, xmm6
  508. pand xmm6, xmm7
  509. pshufd xmm3, xmm3, 0b1h
  510. psrlq xmm3, 4
  511. movdqa [edx+esi], xmm4
  512. movdqa [edx+esi+16], xmm6
  513. movdqa [edx+edi], xmm1
  514. movdqa [edx+edi+16], xmm3
  515. lea edx, [edx+esi*4]
  516. ; col 3
  517. movdqa xmm0, [ecx+16*12]
  518. movdqa xmm1, [ecx+16*13]
  519. movdqa xmm2, [ecx+16*14]
  520. movdqa xmm3, [ecx+16*15]
  521. punpck bw, 0, 2, 1, 3, 4, 6
  522. punpck wd, 0, 4, 2, 6, 1, 3
  523. punpck bw, 0, 4, 1, 3, 2, 6
  524. movdqa xmm1, xmm7
  525. pandn xmm1, xmm0
  526. pand xmm0, xmm7
  527. pshufd xmm0, xmm0, 0b1h
  528. psrlq xmm1, 4
  529. movdqa xmm3, xmm7
  530. pandn xmm3, xmm2
  531. pand xmm2, xmm7
  532. pshufd xmm2, xmm2, 0b1h
  533. psrlq xmm3, 4
  534. movdqa [edx], xmm0
  535. movdqa [edx+16], xmm2
  536. movdqa [edx+esi*2], xmm1
  537. movdqa [edx+esi*2+16], xmm3
  538. movdqa xmm1, xmm7
  539. pandn xmm1, xmm4
  540. pand xmm4, xmm7
  541. pshufd xmm4, xmm4, 0b1h
  542. psrlq xmm1, 4
  543. movdqa xmm3, xmm7
  544. pandn xmm3, xmm6
  545. pand xmm6, xmm7
  546. pshufd xmm6, xmm6, 0b1h
  547. psrlq xmm3, 4
  548. movdqa [edx+esi], xmm4
  549. movdqa [edx+esi+16], xmm6
  550. movdqa [edx+edi], xmm1
  551. movdqa [edx+edi+16], xmm3
  552. ; lea edx, [edx+esi*4]
  553. pop edi
  554. pop esi
  555. ret 4
  556. @unSwizzleBlock4P_sse2@12 endp
  557. ;
  558. ; swizzling
  559. ;
  560. ;
  561. ; SwizzleBlock32
  562. ;
  563. @SwizzleBlock32_sse2@16 proc public
  564. push esi
  565. push edi
  566. mov edi, ecx
  567. mov esi, edx
  568. mov edx, [esp+4+8]
  569. mov ecx, 4
  570. mov eax, [esp+8+8]
  571. cmp eax, 0ffffffffh
  572. jnz SwizzleBlock32_sse2@WM
  573. align 16
  574. @@:
  575. movdqa xmm0, [esi]
  576. movdqa xmm4, [esi+16]
  577. movdqa xmm1, [esi+edx]
  578. movdqa xmm5, [esi+edx+16]
  579. punpck qdq, 0, 4, 1, 5, 2, 6
  580. movdqa [edi+16*0], xmm0
  581. movdqa [edi+16*1], xmm2
  582. movdqa [edi+16*2], xmm4
  583. movdqa [edi+16*3], xmm6
  584. lea esi, [esi+edx*2]
  585. add edi, 64
  586. dec ecx
  587. jnz @B
  588. pop edi
  589. pop esi
  590. ret 8
  591. SwizzleBlock32_sse2@WM:
  592. movd xmm7, eax
  593. pshufd xmm7, xmm7, 0
  594. align 16
  595. @@:
  596. movdqa xmm0, [esi]
  597. movdqa xmm4, [esi+16]
  598. movdqa xmm1, [esi+edx]
  599. movdqa xmm5, [esi+edx+16]
  600. punpck qdq, 0, 4, 1, 5, 2, 6
  601. movdqa xmm3, xmm7
  602. pshufd xmm5, xmm7, 0e4h
  603. pandn xmm3, [edi+16*0]
  604. pand xmm0, xmm7
  605. por xmm0, xmm3
  606. movdqa [edi+16*0], xmm0
  607. pandn xmm5, [edi+16*1]
  608. pand xmm2, xmm7
  609. por xmm2, xmm5
  610. movdqa [edi+16*1], xmm2
  611. movdqa xmm3, xmm7
  612. pshufd xmm5, xmm7, 0e4h
  613. pandn xmm3, [edi+16*2]
  614. pand xmm4, xmm7
  615. por xmm4, xmm3
  616. movdqa [edi+16*2], xmm4
  617. pandn xmm5, [edi+16*3]
  618. pand xmm6, xmm7
  619. por xmm6, xmm5
  620. movdqa [edi+16*3], xmm6
  621. lea esi, [esi+edx*2]
  622. add edi, 64
  623. dec ecx
  624. jnz @B
  625. pop edi
  626. pop esi
  627. ret 8
  628. @SwizzleBlock32_sse2@16 endp
  629. ;
  630. ; SwizzleBlock16
  631. ;
  632. @SwizzleBlock16_sse2@12 proc public
  633. push ebx
  634. mov ebx, [esp+4+4]
  635. mov eax, 4
  636. align 16
  637. @@:
  638. movdqa xmm0, [edx]
  639. movdqa xmm1, [edx+16]
  640. movdqa xmm2, [edx+ebx]
  641. movdqa xmm3, [edx+ebx+16]
  642. punpck wd, 0, 2, 1, 3, 4, 6
  643. punpck qdq, 0, 4, 2, 6, 1, 5
  644. movdqa [ecx+16*0], xmm0
  645. movdqa [ecx+16*1], xmm1
  646. movdqa [ecx+16*2], xmm4
  647. movdqa [ecx+16*3], xmm5
  648. lea edx, [edx+ebx*2]
  649. add ecx, 64
  650. dec eax
  651. jnz @B
  652. pop ebx
  653. ret 4
  654. @SwizzleBlock16_sse2@12 endp
  655. ;
  656. ; SwizzleBlock8
  657. ;
  658. @SwizzleBlock8_sse2@12 proc public
  659. push ebx
  660. mov ebx, [esp+4+4]
  661. mov eax, 2
  662. align 16
  663. @@:
  664. ; col 0, 2
  665. movdqa xmm0, [edx]
  666. movdqa xmm2, [edx+ebx]
  667. lea edx, [edx+ebx*2]
  668. pshufd xmm1, [edx], 0b1h
  669. pshufd xmm3, [edx+ebx], 0b1h
  670. lea edx, [edx+ebx*2]
  671. punpck bw, 0, 2, 1, 3, 4, 6
  672. punpck wd, 0, 2, 4, 6, 1, 3
  673. punpck qdq, 0, 1, 2, 3, 4, 5
  674. movdqa [ecx+16*0], xmm0
  675. movdqa [ecx+16*1], xmm4
  676. movdqa [ecx+16*2], xmm1
  677. movdqa [ecx+16*3], xmm5
  678. ; col 1, 3
  679. pshufd xmm0, [edx], 0b1h
  680. pshufd xmm2, [edx+ebx], 0b1h
  681. lea edx, [edx+ebx*2]
  682. movdqa xmm1, [edx]
  683. movdqa xmm3, [edx+ebx]
  684. lea edx, [edx+ebx*2]
  685. punpck bw, 0, 2, 1, 3, 4, 6
  686. punpck wd, 0, 2, 4, 6, 1, 3
  687. punpck qdq, 0, 1, 2, 3, 4, 5
  688. movdqa [ecx+16*4], xmm0
  689. movdqa [ecx+16*5], xmm4
  690. movdqa [ecx+16*6], xmm1
  691. movdqa [ecx+16*7], xmm5
  692. add ecx, 128
  693. dec eax
  694. jnz @B
  695. pop ebx
  696. ret 4
  697. @SwizzleBlock8_sse2@12 endp
  698. ;
  699. ; SwizzleBlock4
  700. ;
  701. @SwizzleBlock4_sse2@12 proc public
  702. push ebx
  703. mov         eax, 0f0f0f0fh
  704. movd        xmm7, eax 
  705. pshufd      xmm7, xmm7, 0
  706. mov ebx, [esp+4+4]
  707. mov eax, 2
  708. align 16
  709. @@:
  710. ; col 0, 2
  711. movdqa xmm0, [edx]
  712. movdqa xmm2, [edx+ebx]
  713. lea edx, [edx+ebx*2]
  714. movdqa xmm1, [edx]
  715. movdqa xmm3, [edx+ebx]
  716. lea edx, [edx+ebx*2]
  717. pshuflw xmm1, xmm1, 0b1h
  718. pshuflw xmm3, xmm3, 0b1h
  719. pshufhw xmm1, xmm1, 0b1h
  720. pshufhw xmm3, xmm3, 0b1h
  721. punpcknb
  722. punpck bw, 0, 2, 4, 6, 1, 3
  723. punpck bw, 0, 2, 1, 3, 4, 6
  724. punpck qdq, 0, 4, 2, 6, 1, 3
  725. movdqa [ecx+16*0], xmm0
  726. movdqa [ecx+16*1], xmm1
  727. movdqa [ecx+16*2], xmm4
  728. movdqa [ecx+16*3], xmm3
  729. ; col 1, 3
  730. movdqa xmm0, [edx]
  731. movdqa xmm2, [edx+ebx]
  732. lea edx, [edx+ebx*2]
  733. movdqa xmm1, [edx]
  734. movdqa xmm3, [edx+ebx]
  735. lea edx, [edx+ebx*2]
  736. pshuflw xmm0, xmm0, 0b1h
  737. pshuflw xmm2, xmm2, 0b1h
  738. pshufhw xmm0, xmm0, 0b1h
  739. pshufhw xmm2, xmm2, 0b1h
  740. punpcknb
  741. punpck bw, 0, 2, 4, 6, 1, 3
  742. punpck bw, 0, 2, 1, 3, 4, 6
  743. punpck qdq, 0, 4, 2, 6, 1, 3
  744. movdqa [ecx+16*4], xmm0
  745. movdqa [ecx+16*5], xmm1
  746. movdqa [ecx+16*6], xmm4
  747. movdqa [ecx+16*7], xmm3
  748. add ecx, 128
  749. dec eax
  750. jnz @B
  751. pop ebx
  752. ret 4
  753. @SwizzleBlock4_sse2@12 endp
  754. ;
  755. ; swizzling with unaligned reads
  756. ;
  757. ;
  758. ; SwizzleBlock32u
  759. ;
  760. @SwizzleBlock32u_sse2@16 proc public
  761. push esi
  762. push edi
  763. mov edi, ecx
  764. mov esi, edx
  765. mov edx, [esp+4+8]
  766. mov ecx, 4
  767. mov eax, [esp+8+8]
  768. cmp eax, 0ffffffffh
  769. jnz SwizzleBlock32u_sse2@WM
  770. align 16
  771. @@:
  772. movdqu xmm0, [esi]
  773. movdqu xmm4, [esi+16]
  774. movdqu xmm1, [esi+edx]
  775. movdqu xmm5, [esi+edx+16]
  776. punpck qdq, 0, 4, 1, 5, 2, 6
  777. movdqa [edi+16*0], xmm0
  778. movdqa [edi+16*1], xmm2
  779. movdqa [edi+16*2], xmm4
  780. movdqa [edi+16*3], xmm6
  781. lea esi, [esi+edx*2]
  782. add edi, 64
  783. dec ecx
  784. jnz @B
  785. pop edi
  786. pop esi
  787. ret 8
  788. SwizzleBlock32u_sse2@WM:
  789. movd xmm7, eax
  790. pshufd xmm7, xmm7, 0
  791. align 16
  792. @@:
  793. movdqu xmm0, [esi]
  794. movdqu xmm4, [esi+16]
  795. movdqu xmm1, [esi+edx]
  796. movdqu xmm5, [esi+edx+16]
  797. punpck qdq, 0, 4, 1, 5, 2, 6
  798. movdqa xmm3, xmm7
  799. pshufd xmm5, xmm7, 0e4h
  800. pandn xmm3, [edi+16*0]
  801. pand xmm0, xmm7
  802. por xmm0, xmm3
  803. movdqa [edi+16*0], xmm0
  804. pandn xmm5, [edi+16*1]
  805. pand xmm2, xmm7
  806. por xmm2, xmm5
  807. movdqa [edi+16*1], xmm2
  808. movdqa xmm3, xmm7
  809. pshufd xmm5, xmm7, 0e4h
  810. pandn xmm3, [edi+16*2]
  811. pand xmm4, xmm7
  812. por xmm4, xmm3
  813. movdqa [edi+16*2], xmm4
  814. pandn xmm5, [edi+16*3]
  815. pand xmm6, xmm7
  816. por xmm6, xmm5
  817. movdqa [edi+16*3], xmm6
  818. lea esi, [esi+edx*2]
  819. add edi, 64
  820. dec ecx
  821. jnz @B
  822. pop edi
  823. pop esi
  824. ret 8
  825. @SwizzleBlock32u_sse2@16 endp
  826. ;
  827. ; SwizzleBlock16u
  828. ;
  829. @SwizzleBlock16u_sse2@12 proc public
  830. push ebx
  831. mov ebx, [esp+4+4]
  832. mov eax, 4
  833. align 16
  834. @@:
  835. movdqu xmm0, [edx]
  836. movdqu xmm1, [edx+16]
  837. movdqu xmm2, [edx+ebx]
  838. movdqu xmm3, [edx+ebx+16]
  839. punpck wd, 0, 2, 1, 3, 4, 6
  840. punpck qdq, 0, 4, 2, 6, 1, 5
  841. movdqa [ecx+16*0], xmm0
  842. movdqa [ecx+16*1], xmm1
  843. movdqa [ecx+16*2], xmm4
  844. movdqa [ecx+16*3], xmm5
  845. lea edx, [edx+ebx*2]
  846. add ecx, 64
  847. dec eax
  848. jnz @B
  849. pop ebx
  850. ret 4
  851. @SwizzleBlock16u_sse2@12 endp
  852. ;
  853. ; SwizzleBlock8u
  854. ;
  855. @SwizzleBlock8u_sse2@12 proc public
  856. push ebx
  857. mov ebx, [esp+4+4]
  858. mov eax, 2
  859. align 16
  860. @@:
  861. ; col 0, 2
  862. movdqu xmm0, [edx]
  863. movdqu xmm2, [edx+ebx]
  864. lea edx, [edx+ebx*2]
  865. movdqu xmm1, [edx]
  866. movdqu xmm3, [edx+ebx]
  867. pshufd xmm1, xmm1, 0b1h
  868. pshufd xmm3, xmm3, 0b1h
  869. lea edx, [edx+ebx*2]
  870. punpck bw, 0, 2, 1, 3, 4, 6
  871. punpck wd, 0, 2, 4, 6, 1, 3
  872. punpck qdq, 0, 1, 2, 3, 4, 5
  873. movdqa [ecx+16*0], xmm0
  874. movdqa [ecx+16*1], xmm4
  875. movdqa [ecx+16*2], xmm1
  876. movdqa [ecx+16*3], xmm5
  877. ; col 1, 3
  878. movdqu xmm0, [edx]
  879. movdqu xmm2, [edx+ebx]
  880. pshufd xmm0, xmm0, 0b1h
  881. pshufd xmm2, xmm2, 0b1h
  882. lea edx, [edx+ebx*2]
  883. movdqu xmm1, [edx]
  884. movdqu xmm3, [edx+ebx]
  885. lea edx, [edx+ebx*2]
  886. punpck bw, 0, 2, 1, 3, 4, 6
  887. punpck wd, 0, 2, 4, 6, 1, 3
  888. punpck qdq, 0, 1, 2, 3, 4, 5
  889. movdqa [ecx+16*4], xmm0
  890. movdqa [ecx+16*5], xmm4
  891. movdqa [ecx+16*6], xmm1
  892. movdqa [ecx+16*7], xmm5
  893. add ecx, 128
  894. dec eax
  895. jnz @B
  896. pop ebx
  897. ret 4
  898. @SwizzleBlock8u_sse2@12 endp
  899. ;
  900. ; SwizzleBlock4u
  901. ;
  902. @SwizzleBlock4u_sse2@12 proc public
  903. push ebx
  904. mov         eax, 0f0f0f0fh
  905. movd        xmm7, eax 
  906. pshufd      xmm7, xmm7, 0
  907. mov ebx, [esp+4+4]
  908. mov eax, 2
  909. align 16
  910. @@:
  911. ; col 0, 2
  912. movdqu xmm0, [edx]
  913. movdqu xmm2, [edx+ebx]
  914. lea edx, [edx+ebx*2]
  915. movdqu xmm1, [edx]
  916. movdqu xmm3, [edx+ebx]
  917. lea edx, [edx+ebx*2]
  918. pshuflw xmm1, xmm1, 0b1h
  919. pshuflw xmm3, xmm3, 0b1h
  920. pshufhw xmm1, xmm1, 0b1h
  921. pshufhw xmm3, xmm3, 0b1h
  922. punpcknb
  923. punpck bw, 0, 2, 4, 6, 1, 3
  924. punpck bw, 0, 2, 1, 3, 4, 6
  925. punpck qdq, 0, 4, 2, 6, 1, 3
  926. movdqa [ecx+16*0], xmm0
  927. movdqa [ecx+16*1], xmm1
  928. movdqa [ecx+16*2], xmm4
  929. movdqa [ecx+16*3], xmm3
  930. ; col 1, 3
  931. movdqu xmm0, [edx]
  932. movdqu xmm2, [edx+ebx]
  933. lea edx, [edx+ebx*2]
  934. movdqu xmm1, [edx]
  935. movdqu xmm3, [edx+ebx]
  936. lea edx, [edx+ebx*2]
  937. pshuflw xmm0, xmm0, 0b1h
  938. pshuflw xmm2, xmm2, 0b1h
  939. pshufhw xmm0, xmm0, 0b1h
  940. pshufhw xmm2, xmm2, 0b1h
  941. punpcknb
  942. punpck bw, 0, 2, 4, 6, 1, 3
  943. punpck bw, 0, 2, 1, 3, 4, 6
  944. punpck qdq, 0, 4, 2, 6, 1, 3
  945. movdqa [ecx+16*4], xmm0
  946. movdqa [ecx+16*5], xmm1
  947. movdqa [ecx+16*6], xmm4
  948. movdqa [ecx+16*7], xmm3
  949. add ecx, 128
  950. dec eax
  951. jnz @B
  952. pop ebx
  953. ret 4
  954. @SwizzleBlock4u_sse2@12 endp
  955. end