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

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  *  Based on Intel's AP-942
  21.  *
  22.  */
  23. #include "stdafx.h"
  24. #include "libmpeg2.h"
  25. __declspec(align(16)) static BYTE const_1_16_bytes[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
  26. static void MC_put_o_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  27. {
  28. __asm
  29. {
  30. mov edx, ref
  31. mov ecx, dest
  32. mov esi, height
  33. mov eax, stride
  34. lea edi, [eax+eax]
  35. MC_put_o_16_sse2_loop:
  36. movdqu xmm0, [edx]
  37. movdqu xmm1, [edx+eax] 
  38. movdqa [ecx], xmm0
  39. movdqa [ecx+eax], xmm1 
  40. add edx, edi
  41. add ecx, edi
  42. sub esi, 2
  43. jg MC_put_o_16_sse2_loop
  44. }
  45. }
  46. static void MC_put_o_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  47. {
  48. __asm
  49. {
  50. mov edx, ref
  51. mov ecx, dest
  52. mov esi, height
  53. mov eax, stride
  54. lea edi, [eax+eax]
  55. MC_put_o_8_sse2_loop:
  56. movlpd xmm0, [edx]
  57. movhpd xmm0, [edx+eax] 
  58. movlpd [ecx], xmm0
  59. movhpd [ecx+eax], xmm0 
  60. add edx, edi
  61. add ecx, edi
  62. sub esi, 2
  63. jg MC_put_o_8_sse2_loop
  64. }
  65. }
  66. static void MC_put_x_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  67. {
  68. __asm
  69. {
  70. mov edx, ref
  71. mov ecx, dest
  72. mov eax, stride
  73. mov esi, height
  74. lea edi, [eax+eax]
  75. MC_put_x_16_sse2_loop:
  76. movdqu xmm0, [edx]
  77. movdqu xmm1, [edx+1]
  78. movdqu xmm2, [edx+eax]
  79. movdqu xmm3, [edx+eax+1]
  80. pavgb xmm0, xmm1
  81. pavgb xmm2, xmm3
  82. movdqa [ecx], xmm0
  83. movdqa [ecx+eax], xmm2
  84. add edx, edi
  85. add ecx, edi
  86. sub esi, 2
  87. jg MC_put_x_16_sse2_loop
  88. }
  89. }
  90. static void MC_put_x_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  91. {
  92. __asm
  93. {
  94. mov edx, ref
  95. mov ecx, dest
  96. mov eax, stride
  97. mov esi, height
  98. lea edi, [eax+eax]
  99. MC_put_x_8_sse2_loop:
  100. movlpd xmm0, [edx]
  101. movlpd xmm1, [edx+1]
  102. movhpd xmm0, [edx+eax]
  103. movhpd xmm1, [edx+eax+1]
  104. pavgb xmm0, xmm1
  105. movlpd [ecx], xmm0
  106. movhpd [ecx+eax], xmm0
  107. add edx, edi
  108. add ecx, edi
  109. sub esi, 2
  110. jg MC_put_x_8_sse2_loop
  111. }
  112. }
  113. static void MC_put_y_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  114. {
  115. __asm
  116. {
  117. mov edx, ref
  118. mov ecx, dest
  119. mov eax, stride
  120. mov esi, height
  121. lea edi, [eax+eax]
  122. movdqu xmm0, [edx] 
  123. MC_put_y_16_sse2_loop:
  124. movdqu xmm1, [edx+eax] 
  125. movdqu xmm2, [edx+edi] 
  126. pavgb xmm0, xmm1 
  127. pavgb xmm1, xmm2 
  128. movdqa [ecx], xmm0 
  129. movdqa [ecx+eax], xmm1 
  130. movdqa xmm0, xmm2 
  131. add edx, edi 
  132. add ecx, edi
  133. sub esi, 2
  134. jg MC_put_y_16_sse2_loop
  135. }
  136. }
  137. static void MC_put_y_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  138. {
  139. __asm
  140. {
  141. mov edx, ref
  142. mov ecx, dest
  143. mov eax, stride
  144. mov esi, height
  145. lea edi, [eax+eax]
  146. movhpd xmm0, [edx] 
  147. movlpd xmm0, [edx+eax] 
  148. MC_put_y_8_sse2_loop:
  149. movhpd xmm1, [edx+eax] 
  150. movlpd xmm1, [edx+edi] 
  151. pavgb xmm0, xmm1 
  152. movhpd [ecx], xmm0 
  153. movlpd [ecx+eax], xmm0 
  154. movdqa xmm0, xmm1 
  155. add edx, edi 
  156. add ecx, edi
  157. sub esi, 2
  158. jg MC_put_y_8_sse2_loop
  159. }
  160. }
  161. static void MC_put_xy_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  162. {
  163. /*
  164. __asm
  165. {
  166. mov edx, ref 
  167. mov ecx, dest
  168. mov eax, stride 
  169. mov esi, height 
  170. lea edi, [eax+eax] 
  171. movdqa xmm7, [const_1_16_bytes] 
  172. movdqu xmm0, [edx] 
  173. movdqu xmm1, [edx+1]
  174. pavgb xmm0, xmm1 
  175. MC_put_xy_16_sse2_loop:
  176. movdqu xmm2, [edx+eax] 
  177. movdqu xmm3, [edx+eax+1] 
  178. movdqu xmm4, [edx+edi] 
  179. movdqu xmm5, [edx+edi+1] 
  180. pavgb xmm2, xmm3 
  181. pavgb xmm5, xmm4 
  182. psubusb xmm2, xmm7 
  183. movdqa xmm1, xmm0 
  184. movdqa xmm0, xmm2 
  185. pavgb xmm1, xmm2 
  186. pavgb xmm2, xmm5
  187. movdqa [ecx], xmm1
  188. movdqa [ecx+eax], xmm2
  189. add edx, edi
  190. add ecx, edi
  191. sub esi, 2
  192. jg MC_put_xy_16_sse2_loop
  193. }
  194. */
  195. __asm
  196. {
  197. mov edx, ref 
  198. mov ecx, dest
  199. mov eax, stride 
  200. mov esi, height 
  201. lea edi, [eax+eax] 
  202. movdqa xmm7, [const_1_16_bytes] 
  203. movdqu xmm0, [edx] 
  204. movdqu xmm1, [edx+1] 
  205. MC_put_xy_16_sse2_loop:
  206. movdqu xmm2, [edx+eax] 
  207. movdqu xmm3, [edx+eax+1] 
  208. movdqu xmm4, [edx+edi] 
  209. movdqu xmm5, [edx+edi+1] 
  210. pavgb xmm0, xmm1 
  211. pavgb xmm2, xmm3 
  212. movdqa xmm1, xmm5 
  213. pavgb xmm5, xmm4 
  214. psubusb xmm2, xmm7 
  215. pavgb xmm0, xmm2 
  216. pavgb xmm2, xmm5
  217. movdqa [ecx], xmm0
  218. movdqa xmm0, xmm4
  219. movdqa [ecx+eax], xmm2
  220. add edx, edi
  221. add ecx, edi
  222. sub esi, 2
  223. jg MC_put_xy_16_sse2_loop
  224. }
  225. }
  226. static void MC_put_xy_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  227. {
  228. __asm
  229. {
  230. mov edx, ref
  231. mov ecx, dest
  232. mov eax, stride
  233. mov esi, height
  234. lea edi, [eax+eax]
  235. movdqa xmm7, [const_1_16_bytes] 
  236. movhpd xmm0, [edx] 
  237. movlpd xmm0, [edx+eax] 
  238. movhpd xmm2, [edx+1] 
  239. movlpd xmm2, [edx+eax+1] 
  240. MC_put_xy_8_sse2_loop:
  241. movhpd xmm1, [edx+eax] 
  242. movlpd xmm1, [edx+edi] 
  243. movhpd xmm3, [edx+eax+1] 
  244. movlpd xmm3, [edx+edi+1] 
  245. pavgb xmm0, xmm1 
  246. pavgb xmm2, xmm3 
  247. psubusb xmm0, xmm7 
  248. pavgb xmm0, xmm1 
  249. movhpd [ecx], xmm0 
  250. movlpd [ecx+eax], xmm0 
  251. movdqa xmm0, xmm1 
  252. movdqa xmm2, xmm3 
  253. add edx, edi 
  254. add ecx, edi
  255. sub esi, 2
  256. jg MC_put_xy_8_sse2_loop
  257. }
  258. }
  259. static void MC_avg_o_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  260. {
  261. __asm
  262. {
  263. mov edx, ref
  264. mov ecx, dest
  265. mov esi, height
  266. mov eax, stride
  267. lea edi, [eax+eax]
  268. MC_avg_o_16_sse2_loop:
  269. movdqu xmm0, [edx]
  270. movdqu xmm1, [edx+eax] 
  271. movdqa xmm2, [ecx]
  272. movdqa xmm3, [ecx+eax]
  273. pavgb xmm0, xmm2
  274. pavgb xmm1, xmm3
  275. movdqa [ecx], xmm0
  276. movdqa [ecx+eax], xmm1 
  277. add edx, edi
  278. add ecx, edi
  279. sub esi, 2
  280. jg MC_avg_o_16_sse2_loop
  281. }
  282. }
  283. static void MC_avg_o_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  284. {
  285. __asm
  286. {
  287. mov edx, ref
  288. mov ecx, dest
  289. mov esi, height
  290. mov eax, stride
  291. lea edi, [eax+eax]
  292. MC_avg_o_16_sse2_loop:
  293. movlpd xmm0, [edx]
  294. movhpd xmm0, [edx+eax] 
  295. movlpd xmm1, [ecx]
  296. movhpd xmm1, [ecx+eax]
  297. pavgb xmm0, xmm1
  298. movlpd [ecx], xmm0
  299. movhpd [ecx+eax], xmm0
  300. add edx, edi
  301. add ecx, edi
  302. sub esi, 2
  303. jg MC_avg_o_16_sse2_loop
  304. }
  305. }
  306. static void MC_avg_x_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  307. {
  308. __asm
  309. {
  310. mov edx, ref
  311. mov ecx, dest
  312. mov eax, stride
  313. mov esi, height
  314. lea edi, [eax+eax]
  315. MC_avg_x_16_sse2_loop:
  316. movdqu xmm0, [edx]
  317. movdqu xmm1, [edx+1]
  318. movdqu xmm2, [edx+eax]
  319. movdqu xmm3, [edx+eax+1]
  320. pavgb xmm0, xmm1
  321. pavgb xmm2, xmm3
  322. movdqa xmm4, [ecx]
  323. movdqa xmm5, [ecx+eax]
  324. pavgb xmm0, xmm4
  325. pavgb xmm2, xmm5
  326. movdqa [ecx], xmm0
  327. movdqa [ecx+eax], xmm2
  328. add edx, edi
  329. add ecx, edi
  330. sub esi, 2
  331. jg MC_avg_x_16_sse2_loop
  332. }
  333. }
  334. static void MC_avg_x_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  335. {
  336. __asm
  337. {
  338. mov edx, ref
  339. mov ecx, dest
  340. mov eax, stride
  341. mov esi, height
  342. lea edi, [eax+eax]
  343. MC_avg_x_8_sse2_loop:
  344. movlpd xmm0, [edx]
  345. movlpd xmm1, [edx+1]
  346. movhpd xmm0, [edx+eax]
  347. movhpd xmm1, [edx+eax+1]
  348. pavgb xmm0, xmm1
  349. movlpd xmm2, [ecx]
  350. movhpd xmm2, [ecx+eax]
  351. pavgb xmm0, xmm2
  352. movlpd [ecx], xmm0
  353. movhpd [ecx+eax], xmm0
  354. add edx, edi
  355. add ecx, edi
  356. sub esi, 2
  357. jg MC_avg_x_8_sse2_loop
  358. }
  359. }
  360. static void MC_avg_y_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  361. {
  362. __asm
  363. {
  364. mov edx, ref
  365. mov ecx, dest
  366. mov eax, stride
  367. mov esi, height
  368. lea edi, [eax+eax]
  369. movdqu xmm0, [edx] 
  370. MC_avg_y_16_sse2_loop:
  371. movdqu xmm1, [edx+eax] 
  372. movdqu xmm2, [edx+edi] 
  373. pavgb xmm0, xmm1 
  374. pavgb xmm1, xmm2 
  375. movdqa xmm3, [ecx] 
  376. movdqa xmm4, [ecx+eax] 
  377. pavgb xmm0, xmm3
  378. pavgb xmm1, xmm4
  379. movdqa [ecx], xmm0 
  380. movdqa xmm0, xmm2 
  381. movdqa [ecx+eax], xmm1 
  382. add edx, edi 
  383. add ecx, edi
  384. sub esi, 2
  385. jg MC_avg_y_16_sse2_loop
  386. }
  387. }
  388. static void MC_avg_y_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  389. {
  390. __asm
  391. {
  392. mov edx, ref
  393. mov ecx, dest
  394. mov eax, stride
  395. mov esi, height
  396. lea edi, [eax+eax]
  397. movhpd xmm0, [edx] 
  398. movlpd xmm0, [edx+eax] 
  399. MC_put_y_8_sse2_loop:
  400. movhpd xmm1, [edx+eax] 
  401. movlpd xmm1, [edx+edi] 
  402. pavgb xmm0, xmm1 
  403. movhpd xmm2, [ecx] 
  404. movlpd xmm2, [ecx+eax] 
  405. pavgb xmm0, xmm2
  406. movhpd [ecx], xmm0 
  407. movlpd [ecx+eax], xmm0 
  408. movdqa xmm0, xmm1 
  409. add edx, edi 
  410. add ecx, edi
  411. sub esi, 2
  412. jg MC_put_y_8_sse2_loop
  413. }
  414. }
  415. static void MC_avg_xy_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  416. {
  417. __asm
  418. {
  419. mov edx, ref 
  420. mov ecx, dest
  421. mov eax, stride 
  422. mov esi, height 
  423. lea edi, [eax+eax] 
  424. movdqa xmm7, [const_1_16_bytes] 
  425. movdqu xmm0, [edx] 
  426. movdqu xmm1, [edx+1] 
  427. MC_avg_xy_16_sse2_loop:
  428. movdqu xmm2, [edx+eax] 
  429. movdqu xmm3, [edx+eax+1] 
  430. movdqu xmm4, [edx+edi] 
  431. movdqu xmm5, [edx+edi+1] 
  432. pavgb xmm0, xmm1 
  433. pavgb xmm2, xmm3 
  434. movdqa xmm1, xmm5 
  435. pavgb xmm5, xmm4 
  436. psubusb xmm2, xmm7 
  437. pavgb xmm0, xmm2 
  438. pavgb xmm2, xmm5
  439. movdqa xmm5, [ecx]
  440. movdqa xmm6, [ecx+eax]
  441. pavgb xmm0, xmm5 
  442. pavgb xmm2, xmm6
  443. movdqa [ecx], xmm0
  444. movdqa xmm0, xmm4
  445. movdqa [ecx+eax], xmm2
  446. add edx, edi
  447. add ecx, edi
  448. sub esi, 2
  449. jg MC_avg_xy_16_sse2_loop
  450. }
  451. }
  452. static void MC_avg_xy_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
  453. {
  454. __asm
  455. {
  456. mov edx, ref
  457. mov ecx, dest
  458. mov eax, stride
  459. mov esi, height
  460. lea edi, [eax+eax]
  461. movdqa xmm7, [const_1_16_bytes] 
  462. movhpd xmm0, [edx] 
  463. movlpd xmm0, [edx+eax] 
  464. movhpd xmm2, [edx+1] 
  465. movlpd xmm2, [edx+eax+1] 
  466. MC_avg_xy_8_sse2_loop:
  467. movhpd xmm1, [edx+eax] 
  468. movlpd xmm1, [edx+edi] 
  469. movhpd xmm3, [edx+eax+1] 
  470. movlpd xmm3, [edx+edi+1] 
  471. pavgb xmm0, xmm1 
  472. pavgb xmm2, xmm3 
  473. psubusb xmm0, xmm7 
  474. pavgb xmm0, xmm2 
  475. movhpd xmm4, [ecx]
  476. movlpd xmm4, [ecx+eax]
  477. pavgb xmm0, xmm4 
  478. movhpd [ecx], xmm0 
  479. movlpd [ecx+eax], xmm0 
  480. movdqa xmm0, xmm1 
  481. movdqa xmm2, xmm3 
  482. add edx, edi 
  483. add ecx, edi
  484. sub esi, 2
  485. jg MC_avg_xy_8_sse2_loop
  486. }
  487. }
  488. mpeg2_mc_t mpeg2_mc_sse2 = 
  489. {
  490. {MC_put_o_16_sse2, MC_put_x_16_sse2, MC_put_y_16_sse2, MC_put_xy_16_sse2,
  491. MC_put_o_8_sse2,  MC_put_x_8_sse2,  MC_put_y_8_sse2,  MC_put_xy_8_sse2},
  492. {MC_avg_o_16_sse2, MC_avg_x_16_sse2, MC_avg_y_16_sse2, MC_avg_xy_16_sse2,
  493. MC_avg_o_8_sse2,  MC_avg_x_8_sse2,  MC_avg_y_8_sse2,  MC_avg_xy_8_sse2}
  494. };