processingSSE2.inl
上传用户:fengshi120
上传日期:2014-07-17
资源大小:6155k
文件大小:9k
源码类别:

3D图形编程

开发平台:

C/C++

  1. /*************************************************************************** 
  2. *
  3. * Copyright 2000 by David Demirdjian.   All rights reserved. 
  4. *  
  5. * Developed  by David Demirdjian
  6. *  
  7. * Permission to use, copy, or modify this software and  its documentation 
  8. * for  educational  and  research purposes only and without fee  is hereby 
  9. * granted, provided  that this copyright notice and the original authors's 
  10. * names appear  on all copies and supporting documentation.  If individual 
  11. * files are  separated from  this  distribution directory  structure, this 
  12. * copyright notice must be included.  For any other uses of this software, 
  13. * in original or  modified form, including but not limited to distribution 
  14. * in whole or in  part, specific  prior permission  must be  obtained from 
  15. * MIT.  These programs shall not  be  used, rewritten, or  adapted as  the 
  16. * basis  of  a  commercial  software  or  hardware product  without  first 
  17. * obtaining appropriate  licenses from David Demirdjian.  The author makes 
  18. * no representations about the suitability of this software for any purpose.  
  19. * It is provided "as is" without express or implied warranty. 
  20. *  
  21. **************************************************************************/
  22. #include "stereoMatching.h"
  23. #include "processingmmx.h"
  24. // ************************************************************
  25. // ************************************************************
  26. // *** List of functions (SSE2) for image processing
  27. // ************************************************************
  28. // ************************************************************
  29. // Src1, Src2 and Dest suppose to point on 16-bytes memory block
  30. inline int ImgSubandAdd_sse2(const unsigned char *Src1, const unsigned char *Src2, 
  31.  const unsigned char *Src3, unsigned char *Dest, int l)
  32. {
  33. if (l < 8) return 0;              // image size must be at least 8 bytes 
  34.   __asm 
  35.   {
  36.         mov eax, Src1     
  37.         mov ebx, Src2
  38. mov edx, Src3
  39.         mov edi, Dest    
  40.         mov ecx, l   
  41.         shr ecx, 4
  42. align 16
  43. inner_loop:
  44. movdqa xmm1,[eax] // xmm1=src1
  45. movdqa xmm2,[ebx] // mm2=src2
  46. movdqa xmm4,xmm1 // mm4=mm1
  47. psubusb xmm4,xmm2 // mm4 = src1 - src2
  48. movdqu xmm3,[edx] // mm3=src3
  49. psubusb xmm2,xmm1 // mm2 = src2 - src1
  50.         
  51. movdqa xmm5,xmm1 // mm5=src1
  52. por xmm2,xmm4 // mm2=|src1-src2|
  53.         psubusb xmm5,xmm3 // mm4=src1-src3
  54.         psubusb xmm3,xmm1   // mm3=src3-src1
  55. por xmm3,xmm5 // mm3=|src1-src3|
  56. paddusb xmm2,xmm3 // mm2 = |src1-src2|+|src1-src3|
  57.         movdqa    [edi], xmm2  
  58.         add eax,16        
  59.         add ebx,16    
  60.         add edx,16    
  61.         add edi,16
  62.         dec ecx      
  63.         jnz inner_loop    
  64.         emms   
  65.   }
  66.   return 1;
  67. }
  68. #define macro_add_sse2 __asm 
  69. {
  70. __asm  paddusw xmm3, [edx]
  71. __asm  paddusw xmm2, [edx+16]
  72. __asm add edx, edi
  73. }
  74. inline void avg_Col_5_sse2(ushort* im, uchar* im_out, int dataSize, int width)
  75. {
  76. __asm {
  77. mov edi, width
  78. shl edi, 1  // edi = 2*width
  79. mov eax, dataSize
  80. mov ecx, im_out
  81. mov ebx, im
  82. sub ebx, edi
  83. sub ebx, edi // ebx = ebx-4*width
  84. test eax, eax // Is there anything to do?" 
  85. jz end_sum_loop // Jump out if necessary 
  86. row_sum_loop:
  87. test eax, eax // Is there anything to do? 
  88. jz end_sum_loop // Jump out if necessary 
  89. mov edx, ebx
  90. add ebx, 32
  91. // 1
  92. movdqa xmm3, [edx] // xmm3 = 8 words of im
  93. movdqa xmm2, [edx+16] // xmm3 = 8 words of im
  94. add edx, edi
  95. macro_add_sse2
  96. macro_add_sse2
  97. macro_add_sse2
  98. macro_add_sse2
  99. // divide results by ...
  100. psrlw xmm3, 3
  101. psrlw xmm2, 3
  102. // convert [xmm2 xmm3] as 8 words
  103. packuswb xmm3,xmm2
  104. movdqa [ecx], xmm3
  105. sub eax, 16 // Update the number of points left 
  106. add ecx, 16 // Update output pointer 
  107. jmp row_sum_loop // Loop 
  108. //Cleanup 
  109. end_sum_loop:
  110. emms 
  111. }
  112. }
  113. inline void avg_Col_7_sse2(ushort* im, uchar* im_out, int dataSize, int width)
  114. {
  115. __asm {
  116. mov edi, width
  117. shl edi, 1  // edi = 2*width
  118. mov eax, dataSize
  119. mov ecx, im_out
  120. mov ebx, im
  121. sub ebx, edi
  122. sub ebx, edi
  123. sub ebx, edi // ebx = ebx-4*width
  124. test eax, eax // Is there anything to do?" 
  125. jz end_sum_loop // Jump out if necessary 
  126. row_sum_loop:
  127. test eax, eax // Is there anything to do? 
  128. jz end_sum_loop // Jump out if necessary 
  129. mov edx, ebx
  130. add ebx, 32
  131. // 1
  132. movdqa xmm3, [edx] // xmm3 = 8 words of im
  133. movdqa xmm2, [edx+16] // xmm3 = 8 words of im
  134. add edx, edi
  135. macro_add_sse2
  136. macro_add_sse2
  137. macro_add_sse2
  138. macro_add_sse2
  139. macro_add_sse2
  140. macro_add_sse2
  141. // divide results by ...
  142. psrlw xmm3, 3
  143. psrlw xmm2, 3
  144. // convert [xmm2 xmm3] as 8 words
  145. packuswb xmm3,xmm2
  146. movdqa [ecx], xmm3
  147. sub eax, 16 // Update the number of points left 
  148. add ecx, 16 // Update output pointer 
  149. jmp row_sum_loop // Loop 
  150. //Cleanup 
  151. end_sum_loop:
  152. emms 
  153. }
  154. }
  155. inline void avg_Col_9_sse2(ushort* im, uchar* im_out, int dataSize, int width)
  156. {
  157. __asm {
  158. mov edi, width
  159. shl edi, 1  // edi = 2*width
  160. mov eax, dataSize
  161. mov ecx, im_out
  162. mov ebx, im
  163. sub ebx, edi
  164. sub ebx, edi
  165. sub ebx, edi
  166. sub ebx, edi // ebx = ebx-4*width
  167. test eax, eax // Is there anything to do?" 
  168. jz end_sum_loop // Jump out if necessary 
  169. row_sum_loop:
  170. test eax, eax // Is there anything to do? 
  171. jz end_sum_loop // Jump out if necessary 
  172. mov edx, ebx
  173. add ebx, 32
  174. // 1
  175. movdqa xmm3, [edx] // xmm3 = 8 words of im
  176. movdqa xmm2, [edx+16] // xmm3 = 8 words of im
  177. add edx, edi
  178. macro_add_sse2
  179. macro_add_sse2
  180. macro_add_sse2
  181. macro_add_sse2
  182. macro_add_sse2
  183. macro_add_sse2
  184. macro_add_sse2
  185. macro_add_sse2
  186. // divide results by ...
  187. psrlw xmm3, 3
  188. psrlw xmm2, 3
  189. // convert [xmm2 xmm3] as 8 words
  190. packuswb xmm3,xmm2
  191. movdqa [ecx], xmm3
  192. sub eax, 16 // Update the number of points left 
  193. add ecx, 16 // Update output pointer 
  194. jmp row_sum_loop // Loop 
  195. //Cleanup 
  196. end_sum_loop:
  197. emms 
  198. }
  199. }
  200. inline void avg_Col_11_sse2(ushort* im, uchar* im_out, int dataSize, int width)
  201. {
  202. __asm {
  203. mov edi, width
  204. shl edi, 1  // edi = 2*width
  205. mov eax, dataSize
  206. mov ecx, im_out
  207. mov ebx, im
  208. sub ebx, edi
  209. sub ebx, edi
  210. sub ebx, edi
  211. sub ebx, edi
  212. sub ebx, edi // ebx = ebx-4*width
  213. test eax, eax // Is there anything to do?" 
  214. jz end_sum_loop // Jump out if necessary 
  215. row_sum_loop:
  216. test eax, eax // Is there anything to do? 
  217. jz end_sum_loop // Jump out if necessary 
  218. mov edx, ebx
  219. add ebx, 32
  220. // 1
  221. movdqa xmm3, [edx] // xmm3 = 8 words of im
  222. movdqa xmm2, [edx+16] // xmm3 = 8 words of im
  223. add edx, edi
  224. macro_add_sse2
  225. macro_add_sse2
  226. macro_add_sse2
  227. macro_add_sse2
  228. macro_add_sse2
  229. macro_add_sse2
  230. macro_add_sse2
  231. macro_add_sse2
  232. macro_add_sse2
  233. macro_add_sse2
  234. // divide results by ...
  235. psrlw xmm3, 3
  236. psrlw xmm2, 3
  237. // convert [xmm2 xmm3] as 8 words
  238. packuswb xmm3,xmm2
  239. movdqa [ecx], xmm3
  240. sub eax, 16 // Update the number of points left 
  241. add ecx, 16 // Update output pointer 
  242. jmp row_sum_loop // Loop 
  243. //Cleanup 
  244. end_sum_loop:
  245. emms 
  246. }
  247. }
  248. inline void avg_Col_13_sse2(ushort* im, uchar* im_out, int dataSize, int width)
  249. {
  250. __asm {
  251. mov edi, width
  252. shl edi, 1  // edi = 2*width
  253. mov eax, dataSize
  254. mov ecx, im_out
  255. mov ebx, im
  256. sub ebx, edi
  257. sub ebx, edi
  258. sub ebx, edi
  259. sub ebx, edi
  260. sub ebx, edi
  261. sub ebx, edi // ebx = ebx-4*width
  262. test eax, eax // Is there anything to do?" 
  263. jz end_sum_loop // Jump out if necessary 
  264. row_sum_loop:
  265. test eax, eax // Is there anything to do? 
  266. jz end_sum_loop // Jump out if necessary 
  267. mov edx, ebx
  268. add ebx, 32
  269. // 1
  270. movdqa xmm3, [edx] // xmm3 = 8 words of im
  271. movdqa xmm2, [edx+16] // xmm3 = 8 words of im
  272. add edx, edi
  273. macro_add_sse2
  274. macro_add_sse2
  275. macro_add_sse2
  276. macro_add_sse2
  277. macro_add_sse2
  278. macro_add_sse2
  279. macro_add_sse2
  280. macro_add_sse2
  281. macro_add_sse2
  282. macro_add_sse2
  283. macro_add_sse2
  284. macro_add_sse2
  285. // divide results by ...
  286. psrlw xmm3, 3
  287. psrlw xmm2, 3
  288. // convert [xmm2 xmm3] as 8 words
  289. packuswb xmm3,xmm2
  290. movdqa [ecx], xmm3
  291. sub eax, 16 // Update the number of points left 
  292. add ecx, 16 // Update output pointer 
  293. jmp row_sum_loop // Loop 
  294. //Cleanup 
  295. end_sum_loop:
  296. emms 
  297. }
  298. }
  299. // apply vertical mask 1/16*[1 1 1 ... 1]^T to 'im'
  300. // result in 'im_out'
  301. inline void avg_Col_sse2(ushort* im, uchar* im_out, int dataSize, int width, int sizeMask)
  302. {
  303. switch (sizeMask)
  304. {
  305. case 5: avg_Col_5_sse2(im,im_out,dataSize,width);
  306. break;
  307. case 7: avg_Col_7_sse2(im,im_out,dataSize,width);
  308. break;
  309. case 9: avg_Col_9_sse2(im,im_out,dataSize,width);
  310. break;
  311. case 11: avg_Col_11_sse2(im,im_out,dataSize,width);
  312. break;
  313. case 13: avg_Col_13_sse2(im,im_out,dataSize,width);
  314. break;
  315. case 15: avg_Col_15(im,im_out,dataSize,width);
  316. break;
  317. case 17: avg_Col_17(im,im_out,dataSize,width);
  318. break;
  319. default: if (sizeMask<5) avg_Col_5_sse2(im,im_out,dataSize,width);
  320.  else if (sizeMask>17) avg_Col_17(im,im_out,dataSize,width);
  321. }
  322. }