basic_prediction_mmx.c
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:15k
源码类别:

VC书籍

开发平台:

Visual C++

  1. /**************************************************************************
  2.  *                                                                        *
  3.  * This code has been developed by Eugene Kuznetsov. This software is an  *
  4.  * implementation of a part of one or more MPEG-4 Video tools as          *
  5.  * specified in ISO/IEC 14496-2 standard.  Those intending to use this    *
  6.  * software module in hardware or software products are advised that its  *
  7.  * use may infringe existing patents or copyrights, and any such use      *
  8.  * would be at such party's own risk.  The original developer of this     *
  9.  * software module and his/her company, and subsequent editors and their  *
  10.  * companies (including Project Mayo), will have no liability for use of  *
  11.  * this software or modifications or derivatives thereof.                 *
  12.  *                                                                        *
  13.  * Project Mayo gives users of the Codec a license to this software       *
  14.  * module or modifications thereof for use in hardware or software        *
  15.  * products claiming conformance to the MPEG-4 Video Standard as          *
  16.  * described in the Open DivX license.                                    *
  17.  *                                                                        *
  18.  * The complete Open DivX license can be found at                         *
  19.  * http://www.projectmayo.com/opendivx/license.php                        *
  20.  *                                                                        *
  21.  **************************************************************************/
  22. /**
  23. *  Copyright (C) 2001 - Project Mayo
  24.  *
  25.  * Eugene Kuznetsov
  26.  *
  27.  * DivX Advanced Research Center <darc@projectmayo.com>
  28. *
  29. **/
  30. #include "basic_prediction.h"
  31. // Purpose: specialized basic motion compensation routines
  32. void CopyBlock(unsigned char * Src, unsigned char * Dst, int Stride)
  33. {
  34. int dy;
  35. long *lpSrc = (long *) Src;
  36. long *lpDst = (long *) Dst;
  37. int lpStride = Stride >> 2;
  38. for (dy = 0; dy < 8; dy++) {
  39. lpDst[0] = lpSrc[0];
  40. lpDst[1] = lpSrc[1];
  41. lpSrc += lpStride;
  42. lpDst += lpStride;
  43. }
  44. }
  45. #define CopyBlockHorLoop 
  46. "movb (%%esi), %%aln" 
  47. "incl %%esin" 
  48. "movb (%%esi), %%cln" 
  49. "addl %%ecx, %%eaxn" 
  50. "incl %%eaxn" 
  51. "shrl $1, %%eaxn" 
  52. "movb %%al, (%%edi)n" 
  53. "incl %%edin"
  54. // input: esi
  55. // output: edi
  56. // modifies: eax, ebx, edx
  57. #define CopyBlockHorLoopFast 
  58. "movl (%%esi), %%edxn"
  59. "movl 1(%%esi), %%ebxn"
  60. "movl %%edx, %%eaxn"
  61. "xorl %%ebx, %%edxn"
  62. "shrl $1, %%edxn"
  63. "adcl %%ebx, %%eaxn"
  64. "rcrl $1, %%eaxn"
  65. "andl $0x808080, %%edxn"
  66. "addl %%edx, %%eaxn"
  67. "movl %%eax, (%%edi)n"
  68. "addl $4, %%esin"
  69. "addl $4, %%edin"
  70. #define CopyBlockVerLoopFast 
  71. "movl (%%esi), %%edxn"
  72. "movl (%%esi,%%ecx), %%ebxn"
  73. "movl %%edx, %%eaxn"
  74. "xorl %%ebx, %%edxn"
  75. "shrl $1, %%edxn"
  76. "adcl %%ebx, %%eaxn"
  77. "rcrl $1, %%eaxn"
  78. "andl $0x808080, %%edxn"
  79. "addl %%edx, %%eaxn"
  80. "movl %%eax, (%%edi)n"
  81. "addl $4, %%esin"
  82. "addl $4, %%edin"
  83. #define CopyBlockHorLoopRound 
  84. "movb (%%esi), %%aln" 
  85. "incl %%esin" 
  86. "movb (%%esi), %%cln" 
  87. "addl %%ecx, %%eaxn" 
  88. "shrl $1, %%eaxn" 
  89. "movb %%al, (%%edi)n" 
  90. "incl %%edin"
  91. #define CopyBlockVerLoop 
  92.     "movb (%%esi), %%aln" 
  93.     "movb (%%esi,%%ebx), %%cln" 
  94.     "addl %%ecx, %%eaxn" 
  95.     "incl %%eaxn" 
  96.     "shrl $1, %%eaxn" 
  97.     "movb %%al, (%%edi)n" 
  98.     "incl %%esin" 
  99.     "incl %%edin"
  100. #define CopyBlockVerLoopRound 
  101.     "movb (%%esi), %%aln" 
  102.     "movb (%%esi,%%ebx), %%cln" 
  103.     "addl %%ecx, %%eaxn" 
  104.     "shrl $1, %%eaxn" 
  105.     "movb %%al, (%%edi)n" 
  106.     "incl %%esin" 
  107.     "incl %%edin"
  108. #define CopyBlockHorVerLoop(STEP) 
  109.     "movb " #STEP "(%%esi), %%aln" 
  110.     "movb " #STEP "+1(%%esi), %%cln" 
  111.     "addl %%ecx, %%eaxn" 
  112.     "movb " #STEP "(%%esi, %%ebx), %%cln" 
  113.     "addl %%ecx, %%eaxn" 
  114.     "movb " #STEP "+1(%%esi, %%ebx), %%cln" 
  115.     "addl %%ecx, %%eaxn" 
  116.     "addl $2, %%eaxn" 
  117.     "shrl $2, %%eaxn" 
  118.     "movb %%al, " #STEP "(%%edi)n"
  119. #define CopyBlockHorVerLoopRound(STEP) 
  120.     "movb " #STEP "(%%esi), %%aln" 
  121.     "movb " #STEP "+1(%%esi), %%cln" 
  122.     "addl %%ecx, %%eaxn" 
  123.     "movb " #STEP "(%%esi, %%ebx), %%cln" 
  124.     "addl %%ecx, %%eaxn" 
  125.     "movb " #STEP "+1(%%esi, %%ebx), %%cln" 
  126.     "addl %%ecx, %%eaxn" 
  127.     "incl %%eaxn" 
  128.     "shrl $2, %%eaxn" 
  129.     "movb %%al, " #STEP "(%%edi)n"
  130. /**/
  131. void CopyBlockHor(unsigned char * Src, unsigned char * Dst, int Stride)
  132. {
  133. __asm__ (
  134. "movl %2, %%esin"
  135. "movl %3, %%edin"
  136. "pushl %%ebxn"
  137. "1:n"
  138. "pushl %%edxn"
  139. CopyBlockHorLoopFast
  140. CopyBlockHorLoopFast
  141. "popl %%edxn"
  142. "addl %%ecx, %%esin"
  143. "addl %%ecx, %%edin"
  144. "decl %%edxn"
  145. "jnz 1bn"
  146. "popl %%ebxn"
  147. :
  148. : "c"(Stride-8), "d"(8), "g" (Src), "g"(Dst)
  149. : "esi", "edi"
  150. );
  151. }
  152. void CopyBlockVer(unsigned char * Src, unsigned char * Dst, int Stride)
  153. {
  154. __asm__ (
  155. "movl %2, %%esin"
  156. "movl %3, %%edin"
  157. "pushl %%ebxn"
  158. "1:n"
  159. "pushl %%edxn"
  160. CopyBlockVerLoopFast
  161. CopyBlockVerLoopFast
  162. "popl %%edxn"
  163. "addl %%ecx, %%esin"
  164. "subl $8, %%esin"
  165. "addl %%ecx, %%edin"
  166. "subl $8, %%edin"
  167. "decl %%edxn"
  168. "jnz 1bn"
  169. "popl %%ebxn"
  170. :
  171. : "c"(Stride), "d"(8), "g" (Src), "g"(Dst)
  172. : "esi", "edi"
  173. );
  174. }
  175. /*
  176. void CopyBlockHor(unsigned char * Src, unsigned char * Dst, int Stride)
  177. {
  178. __asm__ (
  179. "pushl %%ebxn"
  180. "movl %1, %%ebxn"
  181. "movl %4, %%esin"
  182. "movl %5, %%edin"
  183. "1:n"
  184. CopyBlockHorLoop
  185. CopyBlockHorLoop
  186. CopyBlockHorLoop
  187. CopyBlockHorLoop
  188. CopyBlockHorLoop
  189. CopyBlockHorLoop
  190. CopyBlockHorLoop
  191. CopyBlockHorLoop
  192. "addl %%ebx, %%esin"
  193. "addl %%ebx, %%edin"
  194. "decl %%edxn"
  195. "jnz 1bn"
  196. "popl %%ebxn"
  197. :
  198. : "a"(0), "g"(Stride-8), "c"(0), "d"(8), "g" (Src), "g"(Dst)
  199. );
  200. }
  201. */
  202. void CopyBlockHorRound(unsigned char * Src, unsigned char * Dst, int Stride)
  203. {
  204. __asm__ (
  205. "movl %1, %%eaxn"
  206. "movl %4, %%esin"
  207. "movl %5, %%edin"
  208. "pushl %%ebxn"
  209. "movl %%eax, %%ebxn"
  210.         "xorl %%eax, %%eaxn"
  211. "1:n"
  212. CopyBlockHorLoopRound
  213. CopyBlockHorLoopRound
  214. CopyBlockHorLoopRound
  215. CopyBlockHorLoopRound
  216. CopyBlockHorLoopRound
  217. CopyBlockHorLoopRound
  218. CopyBlockHorLoopRound
  219. CopyBlockHorLoopRound
  220. "addl %%ebx, %%esin"
  221. "addl %%ebx, %%edin"
  222. "decl %%edxn"
  223. "jnz 1bn"
  224. "popl %%ebxn"
  225. :
  226. : "a"(0), "g"(Stride-8), "c"(0), "d"(8), "g" (Src), "g"(Dst)
  227. : "esi", "edi"
  228. );
  229. }
  230. /**/
  231. /*
  232. void CopyBlockVer(unsigned char * Src, unsigned char * Dst, int Stride)
  233. {
  234. __asm__ (
  235. "pushl %%ebxn"
  236. "movl %1, %%ebxn"
  237. "movl %4, %%esin"
  238. "movl %5, %%edin"
  239. "1:n"
  240. CopyBlockVerLoop
  241. CopyBlockVerLoop
  242. CopyBlockVerLoop
  243. CopyBlockVerLoop
  244. CopyBlockVerLoop
  245. CopyBlockVerLoop
  246. CopyBlockVerLoop
  247. CopyBlockVerLoop
  248. "addl %%ebx, %%esin"
  249. "subl $8, %%esin"
  250. "addl %%ebx, %%edin"
  251. "subl $8, %%edin"
  252. "decl %%edxn"
  253. "jnz 1bn"
  254. "popl %%ebxn"
  255. :
  256. : "a"(0), "g"(Stride), "c"(0), "d"(8), "g" (Src), "g"(Dst)
  257. );
  258. }
  259. */
  260. /**/
  261. void CopyBlockVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
  262. {
  263. __asm__ (
  264. "movl %1, %%eaxn"
  265. "movl %4, %%esin"
  266. "movl %5, %%edin"
  267. "pushl %%ebxn"
  268. "movl %%eax, %%ebxn"
  269.         "xorl %%eax, %%eaxn"
  270. "1:n"
  271. CopyBlockVerLoopRound
  272. CopyBlockVerLoopRound
  273. CopyBlockVerLoopRound
  274. CopyBlockVerLoopRound
  275. CopyBlockVerLoopRound
  276. CopyBlockVerLoopRound
  277. CopyBlockVerLoopRound
  278. CopyBlockVerLoopRound
  279. "addl %%ebx, %%esin"
  280. "subl $8, %%esin"
  281. "addl %%ebx, %%edin"
  282. "subl $8, %%edin"
  283. "decl %%edxn"
  284. "jnz 1bn"
  285. "popl %%ebxn"
  286. :
  287. : "a"(0), "g"(Stride), "c"(0), "d"(8), "g" (Src), "g"(Dst)
  288. : "esi", "edi"
  289. );
  290. }/**/
  291. void CopyBlockHorVer(unsigned char * Src, unsigned char * Dst, int Stride)
  292. {
  293. int dy, dx;
  294. for (dy = 0; dy < 8; dy++) {
  295. for (dx = 0; dx < 8; dx++) {
  296. Dst[dx] = (Src[dx] + Src[dx+1] + 
  297. Src[dx+Stride] + Src[dx+Stride+1] +2) >> 2; // horver interpolation with rounding
  298. }
  299. Src += Stride;
  300. Dst += Stride;
  301. }
  302. }
  303. /**/
  304. void CopyBlockHorVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
  305. {
  306. int dy, dx;
  307. for (dy = 0; dy < 8; dy++) {
  308. for (dx = 0; dx < 8; dx++) {
  309. Dst[dx] = (Src[dx] + Src[dx+1] + 
  310. Src[dx+Stride] + Src[dx+Stride+1] +1) >> 2; // horver interpolation with rounding
  311. }
  312. Src += Stride;
  313. Dst += Stride;
  314. }
  315. }
  316. /** *** **/
  317. void CopyMBlock(unsigned char * Src, unsigned char * Dst, int Stride)
  318. {
  319.     __asm__ 
  320.     (
  321.     "movl %0, %%eaxn"
  322.     "movl %2, %%esin"
  323.     "movl %3, %%edin"
  324.     "pushl %%ebxn"
  325.     "movl %%eax, %%ebxn"
  326.     "1:n"
  327.     
  328.     "movl (%%esi), %%eaxn"
  329.     "movl %%eax, (%%edi)n"
  330.     "addl $4, %%esin"
  331.     "addl $4, %%edin"
  332.     
  333.     "movl (%%esi), %%eaxn"
  334.     "movl %%eax, (%%edi)n"
  335.     "addl $4, %%esin"
  336.     "addl $4, %%edin"
  337.     
  338.     "movl (%%esi), %%eaxn"
  339.     "movl %%eax, (%%edi)n"
  340.     "addl $4, %%esin"
  341.     "addl $4, %%edin"
  342.     
  343.     "movl (%%esi), %%eaxn"
  344.     "movl %%eax, (%%edi)n"
  345.     "addl %%ebx, %%esin"
  346.     "addl %%ebx, %%edin"
  347.     "decl %%edxn"
  348.     "jnz 1bn"
  349.     "popl %%ebxn"
  350.     : 
  351.     : "g"(Stride-12), "d"(16), "g" (Src), "g" (Dst) 
  352.     : "esi", "edi"
  353.     );
  354. }
  355. /**/
  356. void CopyMBlockHor(unsigned char * Src, unsigned char * Dst, int Stride)
  357. {
  358. __asm__ (
  359. "movl %2, %%esin"
  360. "movl %3, %%edin"
  361. "pushl %%ebxn"
  362. "1:n"
  363. "pushl %%edxn"
  364. CopyBlockHorLoopFast
  365. CopyBlockHorLoopFast
  366. CopyBlockHorLoopFast
  367. CopyBlockHorLoopFast
  368. "popl %%edxn"
  369. "addl %%ecx, %%esin"
  370. "addl %%ecx, %%edin"
  371. "decl %%edxn"
  372. "jnz 1bn"
  373. "popl %%ebxn"
  374. :
  375. : "c"(Stride-16), "d"(16), "g" (Src), "g"(Dst)
  376. : "esi", "edi"
  377. );
  378. }
  379. void CopyMBlockVer(unsigned char * Src, unsigned char * Dst, int Stride)
  380. {
  381. __asm__ (
  382. "movl %2, %%esin"
  383. "movl %3, %%edin"
  384. "pushl %%ebxn"
  385. "1:n"
  386. "pushl %%edxn"
  387. CopyBlockVerLoopFast
  388. CopyBlockVerLoopFast
  389. CopyBlockVerLoopFast
  390. CopyBlockVerLoopFast
  391. "popl %%edxn"
  392. "addl %%ecx, %%esin"
  393. "subl $16, %%esin"
  394. "addl %%ecx, %%edin"
  395. "subl $16, %%edin"
  396. "decl %%edxn"
  397. "jnz 1bn"
  398. "popl %%ebxn"
  399. :
  400. : "c"(Stride), "d"(16), "g" (Src), "g"(Dst)
  401. : "esi", "edi"
  402. );
  403. }
  404. /*
  405. void CopyMBlockHor(unsigned char * Src, unsigned char * Dst, int Stride)
  406. {
  407.     __asm__ (
  408.     "pushl %%ebxn"
  409.     "movl %1, %%ebxn"
  410.     "movl %4, %%esin"
  411.     "movl %5, %%edin"
  412.     "1:n"
  413.     CopyBlockHorLoop
  414.     CopyBlockHorLoop
  415.     CopyBlockHorLoop
  416.     CopyBlockHorLoop
  417.     CopyBlockHorLoop
  418.     CopyBlockHorLoop
  419.     CopyBlockHorLoop
  420.     CopyBlockHorLoop
  421.     CopyBlockHorLoop
  422.     CopyBlockHorLoop
  423.     CopyBlockHorLoop
  424.     CopyBlockHorLoop
  425.     CopyBlockHorLoop
  426.     CopyBlockHorLoop
  427.     CopyBlockHorLoop
  428.     CopyBlockHorLoop
  429.     
  430.     "addl %%ebx, %%esin"
  431.     "addl %%ebx, %%edin"
  432.     "decl %%edxn"
  433.     "jnz 1bn"
  434.     "popl %%ebxn"
  435.     :
  436.     : "a"(0), "g"(Stride-16), "c"(0), "d"(16), "g" (Src), "g"(Dst)
  437.     );
  438. }
  439. */
  440. /*
  441. void CopyMBlockVer(unsigned char * Src, unsigned char * Dst, int Stride)
  442. {
  443.     __asm__ (
  444.     "pushl %%ebxn"
  445.     "movl %1, %%ebxn"
  446.     "movl %4, %%esin"
  447.     "movl %5, %%edin"
  448.     "1:n"
  449.     CopyBlockVerLoop
  450.     CopyBlockVerLoop
  451.     CopyBlockVerLoop
  452.     CopyBlockVerLoop
  453.     CopyBlockVerLoop
  454.     CopyBlockVerLoop
  455.     CopyBlockVerLoop
  456.     CopyBlockVerLoop
  457.     CopyBlockVerLoop
  458.     CopyBlockVerLoop
  459.     CopyBlockVerLoop
  460.     CopyBlockVerLoop
  461.     CopyBlockVerLoop
  462.     CopyBlockVerLoop
  463.     CopyBlockVerLoop
  464.     CopyBlockVerLoop
  465.     
  466.     "addl %%ebx, %%esin"
  467.     "subl $16, %%esin"
  468.     "addl %%ebx, %%edin"
  469.     "subl $16, %%edin"
  470.     "decl %%edxn"
  471.     "jnz 1bn"
  472.     "popl %%ebxn"
  473.     :
  474.     : "a"(0), "g"(Stride), "c"(0), "d"(16), "g" (Src), "g"(Dst)
  475.     );
  476. }
  477. */
  478. void CopyMBlockHorRound(unsigned char * Src, unsigned char * Dst, int Stride)
  479. {
  480.     __asm__ (
  481.     "movl %1, %%eaxn"
  482.     "movl %4, %%esin"
  483.     "movl %5, %%edin"
  484.     "pushl %%ebxn"
  485.     "movl %%eax, %%ebxn"
  486.     "xorl %%eax, %%eaxn"
  487.     "1:n"
  488.     CopyBlockHorLoopRound
  489.     CopyBlockHorLoopRound
  490.     CopyBlockHorLoopRound
  491.     CopyBlockHorLoopRound
  492.     CopyBlockHorLoopRound
  493.     CopyBlockHorLoopRound
  494.     CopyBlockHorLoopRound
  495.     CopyBlockHorLoopRound
  496.     CopyBlockHorLoopRound
  497.     CopyBlockHorLoopRound
  498.     CopyBlockHorLoopRound
  499.     CopyBlockHorLoopRound
  500.     CopyBlockHorLoopRound
  501.     CopyBlockHorLoopRound
  502.     CopyBlockHorLoopRound
  503.     CopyBlockHorLoopRound
  504.     
  505.     "addl %%ebx, %%esin"
  506.     "addl %%ebx, %%edin"
  507.     "decl %%edxn"
  508.     "jnz 1bn"
  509.     "popl %%ebxn"
  510.     :
  511.     : "a"(0), "g"(Stride-16), "c"(0), "d"(16), "g" (Src), "g"(Dst)
  512.     : "esi", "edi"
  513.     );
  514. }
  515. void CopyMBlockVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
  516. {
  517.     __asm__ (
  518.     "movl %1, %%eaxn"
  519.     "movl %4, %%esin"
  520.     "movl %5, %%edin"
  521.     "pushl %%ebxn"
  522.     "movl %%eax, %%ebxn"
  523.     "xorl %%eax, %%eaxn"
  524.     "1:n"
  525.     CopyBlockVerLoopRound
  526.     CopyBlockVerLoopRound
  527.     CopyBlockVerLoopRound
  528.     CopyBlockVerLoopRound
  529.     CopyBlockVerLoopRound
  530.     CopyBlockVerLoopRound
  531.     CopyBlockVerLoopRound
  532.     CopyBlockVerLoopRound
  533.     CopyBlockVerLoopRound
  534.     CopyBlockVerLoopRound
  535.     CopyBlockVerLoopRound
  536.     CopyBlockVerLoopRound
  537.     CopyBlockVerLoopRound
  538.     CopyBlockVerLoopRound
  539.     CopyBlockVerLoopRound
  540.     CopyBlockVerLoopRound
  541.     
  542.     "addl %%ebx, %%esin"
  543.     "subl $16, %%esin"
  544.     "addl %%ebx, %%edin"
  545.     "subl $16, %%edin"
  546.     "decl %%edxn"
  547.     "jnz 1bn"
  548.     "popl %%ebxn"
  549.     :
  550.     : "a"(0), "g"(Stride), "c"(0), "d"(16), "g" (Src), "g"(Dst)
  551.     : "esi", "edi"
  552.     );
  553. }
  554. /**/
  555. void CopyMBlockHorVer(unsigned char * Src, unsigned char * Dst, int Stride)
  556. {
  557.     __asm__
  558.     (
  559.     "movl %1, %%eaxn"
  560.     "movl %4, %%esin"
  561.     "movl %5, %%edin"
  562.     "pushl %%ebxn"
  563.     "movl %%eax, %%ebxn"
  564.     "xorl %%eax, %%eaxn"
  565.     "1:n"
  566.     CopyBlockHorVerLoop(0)
  567.     CopyBlockHorVerLoop(1)
  568.     CopyBlockHorVerLoop(2)
  569.     CopyBlockHorVerLoop(3)
  570.     CopyBlockHorVerLoop(4)
  571.     CopyBlockHorVerLoop(5)
  572.     CopyBlockHorVerLoop(6)
  573.     CopyBlockHorVerLoop(7)
  574.     CopyBlockHorVerLoop(8)
  575.     CopyBlockHorVerLoop(9)
  576.     CopyBlockHorVerLoop(10)
  577.     CopyBlockHorVerLoop(11)
  578.     CopyBlockHorVerLoop(12)
  579.     CopyBlockHorVerLoop(13)
  580.     CopyBlockHorVerLoop(14)
  581.     CopyBlockHorVerLoop(15)
  582.     "addl %%ebx, %%esin"
  583.     "addl %%ebx, %%edin"
  584.     "decl %%edxn"
  585.     "jnz 1bn"
  586.     "popl %%ebxn"
  587.     :
  588.     : "a"(0), "g"(Stride), "c" (0), "d" (16), "g" (Src), "g" (Dst)
  589.     : "esi", "edi"
  590.     );
  591. }
  592. void CopyMBlockHorVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
  593. {
  594.     __asm__
  595.     (
  596.     "movl %1, %%eaxn"
  597.     "movl %4, %%esin"
  598.     "movl %5, %%edin"
  599.     "pushl %%ebxn"
  600.     "movl %%eax, %%ebxn"
  601.     "xorl %%eax, %%eaxn"
  602.     "1:n"
  603.     CopyBlockHorVerLoopRound(0)
  604.     CopyBlockHorVerLoopRound(1)
  605.     CopyBlockHorVerLoopRound(2)
  606.     CopyBlockHorVerLoopRound(3)
  607.     CopyBlockHorVerLoopRound(4)
  608.     CopyBlockHorVerLoopRound(5)
  609.     CopyBlockHorVerLoopRound(6)
  610.     CopyBlockHorVerLoopRound(7)
  611.     CopyBlockHorVerLoopRound(8)
  612.     CopyBlockHorVerLoopRound(9)
  613.     CopyBlockHorVerLoopRound(10)
  614.     CopyBlockHorVerLoopRound(11)
  615.     CopyBlockHorVerLoopRound(12)
  616.     CopyBlockHorVerLoopRound(13)
  617.     CopyBlockHorVerLoopRound(14)
  618.     CopyBlockHorVerLoopRound(15)
  619.     "addl %%ebx, %%esin"
  620.     "addl %%ebx, %%edin"
  621.     "decl %%edxn"
  622.     "jnz 1bn"
  623.     "popl %%ebxn"
  624.     :
  625.     : "a"(0), "g"(Stride), "c" (0), "d" (16), "g" (Src), "g" (Dst)
  626.     : "esi", "edi"
  627.     );
  628. }