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

多媒体编程

开发平台:

Visual C++

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