basic_prediction_mmx.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:23k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. **/
  2. #include "basic_prediction.h"
  3. void CopyBlock(unsigned char * Src, unsigned char * Dst, int Stride)
  4. {
  5. int dy;
  6. long *lpSrc = (long *) Src;
  7. long *lpDst = (long *) Dst;
  8. int lpStride = Stride >> 2;
  9. for (dy = 0; dy < 8; dy++) {
  10. lpDst[0] = lpSrc[0];
  11. lpDst[1] = lpSrc[1];
  12. lpSrc += lpStride;
  13. lpDst += lpStride;
  14. }
  15. }
  16. /**/
  17. void CopyBlockHor(unsigned char * Src, unsigned char * Dst, int Stride)
  18. {
  19. _asm {
  20.  xor eax, eax
  21.  mov ebx, Stride
  22.  sub ebx, 7
  23.  xor ecx, ecx
  24.  mov edx, 8
  25.  mov esi, dword ptr [Src]
  26.  mov edi, dword ptr [Dst]
  27. start_again10:
  28.  // 0
  29.  mov al, [esi]
  30.  inc esi
  31.  mov cl, [esi]
  32.  add eax, ecx
  33.  inc eax
  34.  shr eax, 1
  35.  mov [edi], al
  36.  inc edi
  37.  // 1
  38.  mov al, [esi]
  39.  inc esi
  40.  mov cl, [esi]
  41.  add eax, ecx
  42.  inc eax
  43.  shr eax, 1
  44.  mov [edi], al
  45.  inc edi
  46.  // 2
  47.  mov al, [esi]
  48.  inc esi
  49.  mov cl, [esi]
  50.  add eax, ecx
  51.  inc eax
  52.  shr eax, 1
  53.  mov [edi], al
  54.  inc edi
  55.  // 3
  56.  mov al, [esi]
  57.  inc esi
  58.  mov cl, [esi]
  59.  add eax, ecx
  60.  inc eax
  61.  shr eax, 1
  62.  mov [edi], al
  63.  inc edi
  64.  // 4
  65.  mov al, [esi]
  66.  inc esi
  67.  mov cl, [esi]
  68.  add eax, ecx
  69.  inc eax
  70.  shr eax, 1
  71.  mov [edi], al
  72.  inc edi
  73.  // 5
  74.  mov al, [esi]
  75.  inc esi
  76.  mov cl, [esi]
  77.  add eax, ecx
  78.  inc eax
  79.  shr eax, 1
  80.  mov [edi], al
  81.  inc edi
  82.  // 6
  83.  mov al, [esi]
  84.  inc esi
  85.  mov cl, [esi]
  86.  add eax, ecx
  87.  inc eax
  88.  shr eax, 1
  89.  mov [edi], al
  90.  inc edi
  91.  // 7
  92.  mov al, [esi]
  93.  mov cl, [esi+1]
  94.  add eax, ecx
  95.  inc eax
  96.  shr eax, 1
  97.  mov [edi], al
  98.  add esi, ebx
  99.  add edi, ebx
  100.  dec edx
  101.  jnz start_again10
  102. }
  103. }
  104. /**/
  105. void CopyBlockVer(unsigned char * Src, unsigned char * Dst, int Stride)
  106. {
  107. _asm {
  108.  xor eax, eax
  109.  mov ebx, Stride
  110.  xor ecx, ecx
  111.  mov edx, 8
  112.  mov esi, dword ptr [Src]
  113.  mov edi, dword ptr [Dst]
  114. start_again10:
  115.  // 0
  116.  mov al, [esi]
  117.  mov cl, [esi+ebx]
  118.  add eax, ecx
  119.  inc eax
  120.  shr eax, 1
  121.  mov [edi], al
  122.  inc esi
  123.  inc edi
  124.  // 1
  125.  mov al, [esi]
  126.  mov cl, [esi+ebx]
  127.  add eax, ecx
  128.  inc eax
  129.  shr eax, 1
  130.  mov [edi], al
  131.  inc esi
  132.  inc edi
  133.  // 2
  134.  //xor eax, eax
  135.  mov al, [esi]
  136.  mov cl, [esi+ebx]
  137.  add eax, ecx
  138.  inc eax
  139.  shr eax, 1
  140.  mov [edi], al
  141.  inc esi
  142.  inc edi
  143.  // 3
  144.  //xor eax, eax
  145.  mov al, [esi]
  146.  mov cl, [esi+ebx]
  147.  add eax, ecx
  148.  inc eax
  149.  shr eax, 1
  150.  mov [edi], al
  151.  inc esi
  152.  inc edi
  153.  // 4
  154.  mov al, [esi]
  155.  mov cl, [esi+ebx]
  156.  add eax, ecx
  157.  inc eax
  158.  shr eax, 1
  159.  mov [edi], al
  160.  inc esi
  161.  inc edi
  162.  // 5
  163.  mov al, [esi]
  164.  mov cl, [esi+ebx]
  165.  add eax, ecx
  166.  inc eax
  167.  shr eax, 1
  168.  mov [edi], al
  169.  inc esi
  170.  inc edi
  171.  // 6
  172.  mov al, [esi]
  173.  mov cl, [esi+ebx]
  174.  add eax, ecx
  175.  inc eax
  176.  shr eax, 1
  177.  mov [edi], al
  178.  inc esi
  179.  inc edi
  180.  // 7
  181.  mov al, [esi]
  182.  mov cl, [esi+ebx]
  183.  add eax, ecx
  184.  inc eax
  185.  shr eax, 1
  186.  mov [edi], al
  187.  add esi, ebx
  188.  sub esi, 7
  189.  add edi, ebx
  190.  sub edi, 7
  191.  dec edx
  192.  jnz start_again10
  193. }
  194. }
  195. /**/
  196. void CopyBlockHorVer(unsigned char * Src, unsigned char * Dst, int Stride)
  197. {
  198. int dy, dx;
  199. for (dy = 0; dy < 8; dy++) {
  200. for (dx = 0; dx < 8; dx++) {
  201. Dst[dx] = (Src[dx] + Src[dx+1] + 
  202. Src[dx+Stride] + Src[dx+Stride+1] +2) >> 2; // horver interpolation with rounding
  203. }
  204. Src += Stride;
  205. Dst += Stride;
  206. }
  207. }
  208. /**/
  209. void CopyBlockHorRound(unsigned char * Src, unsigned char * Dst, int Stride)
  210. {
  211. _asm {
  212.  xor eax, eax
  213.  mov ebx, Stride
  214.  sub ebx, 7
  215.  xor ecx, ecx
  216.  mov edx, 8
  217.  mov esi, dword ptr [Src]
  218.  mov edi, dword ptr [Dst]
  219. start_again1:
  220.  // 0
  221.  mov al, [esi]
  222.  inc esi
  223.  mov cl, [esi]
  224.  add eax, ecx
  225.  shr eax, 1
  226.  mov [edi], al
  227.  inc edi
  228.  // 1
  229.  mov al, [esi]
  230.  inc esi
  231.  mov cl, [esi]
  232.  add eax, ecx
  233.  shr eax, 1
  234.  mov [edi], al
  235.  inc edi
  236.  // 2
  237.  //xor eax, eax
  238.  mov al, [esi]
  239.  inc esi
  240.  mov cl, [esi]
  241.  add eax, ecx
  242.  shr eax, 1
  243.  mov [edi], al
  244.  inc edi
  245.  // 3
  246.  //xor eax, eax
  247.  mov al, [esi]
  248.  inc esi
  249.  mov cl, [esi]
  250.  add eax, ecx
  251.  shr eax, 1
  252.  mov [edi], al
  253.  inc edi
  254.  // 4
  255.  mov al, [esi]
  256.  inc esi
  257.  mov cl, [esi]
  258.  add eax, ecx
  259.  shr eax, 1
  260.  mov [edi], al
  261.  inc edi
  262.  // 5
  263.  mov al, [esi]
  264.  inc esi
  265.  mov cl, [esi]
  266.  add eax, ecx
  267.  shr eax, 1
  268.  mov [edi], al
  269.  inc edi
  270.  // 6
  271.  mov al, [esi]
  272.  inc esi
  273.  mov cl, [esi]
  274.  add eax, ecx
  275.  shr eax, 1
  276.  mov [edi], al
  277.  inc edi
  278.  // 7
  279.  mov al, [esi]
  280.  mov cl, [esi+1]
  281.  add eax, ecx
  282.  shr eax, 1
  283.  mov [edi], al
  284.  add esi, ebx
  285.  add edi, ebx
  286.  dec edx
  287.  jnz start_again1
  288. }
  289. /**/
  290. void CopyBlockVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
  291. {
  292. _asm {
  293.  xor eax, eax
  294.  mov ebx, Stride
  295.  xor ecx, ecx
  296.  mov edx, 8
  297.  mov esi, dword ptr [Src]
  298.  mov edi, dword ptr [Dst]
  299. start_again1:
  300.  // 0
  301.  mov al, [esi]
  302.  mov cl, [esi+ebx]
  303.  add eax, ecx
  304.  shr eax, 1
  305.  mov [edi], al
  306.  inc esi
  307.  inc edi
  308.  // 1
  309.  mov al, [esi]
  310.  mov cl, [esi+ebx]
  311.  add eax, ecx
  312.  shr eax, 1
  313.  mov [edi], al
  314.  inc esi
  315.  inc edi
  316.  // 2
  317.  //xor eax, eax
  318.  mov al, [esi]
  319.  mov cl, [esi+ebx]
  320.  add eax, ecx
  321.  shr eax, 1
  322.  mov [edi], al
  323.  inc esi
  324.  inc edi
  325.  // 3
  326.  //xor eax, eax
  327.  mov al, [esi]
  328.  mov cl, [esi+ebx]
  329.  add eax, ecx
  330.  shr eax, 1
  331.  mov [edi], al
  332.  inc esi
  333.  inc edi
  334.  // 4
  335.  mov al, [esi]
  336.  mov cl, [esi+ebx]
  337.  add eax, ecx
  338.  shr eax, 1
  339.  mov [edi], al
  340.  inc esi
  341.  inc edi
  342.  // 5
  343.  mov al, [esi]
  344.  mov cl, [esi+ebx]
  345.  add eax, ecx
  346.  shr eax, 1
  347.  mov [edi], al
  348.  inc esi
  349.  inc edi
  350.  // 6
  351.  mov al, [esi]
  352.  mov cl, [esi+ebx]
  353.  add eax, ecx
  354.  shr eax, 1
  355.  mov [edi], al
  356.  inc esi
  357.  inc edi
  358.  // 7
  359.  mov al, [esi]
  360.  mov cl, [esi+ebx]
  361.  add eax, ecx
  362.  shr eax, 1
  363.  mov [edi], al
  364.  add esi, ebx
  365.  sub esi, 7
  366.  add edi, ebx
  367.  sub edi, 7
  368.  dec edx
  369.  jnz start_again1
  370. }
  371. }
  372. /**/
  373. void CopyBlockHorVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
  374. {
  375. int dy, dx;
  376. for (dy = 0; dy < 8; dy++) {
  377. for (dx = 0; dx < 8; dx++) {
  378. Dst[dx] = (Src[dx] + Src[dx+1] + 
  379. Src[dx+Stride] + Src[dx+Stride+1] +1) >> 2; // horver interpolation with rounding
  380. }
  381. Src += Stride;
  382. Dst += Stride;
  383. }
  384. }
  385. /** *** **/
  386. void CopyMBlock(unsigned char * Src, unsigned char * Dst, int Stride)
  387. {
  388. _asm {
  389.  mov ebx, Stride
  390.  sub ebx, 12
  391.  mov edx, 16
  392.  mov esi, dword ptr [Src]
  393.  mov edi, dword ptr [Dst]
  394. start_again:
  395.  mov eax, [esi]
  396.  mov [edi], eax
  397.  add esi, 4
  398.  add edi, 4
  399.  mov eax, [esi]
  400.  mov [edi], eax
  401.  add esi, 4
  402.  add edi, 4
  403.  mov eax, [esi]
  404.  mov [edi], eax
  405.  add esi, 4
  406.  add edi, 4
  407.  mov eax, [esi]
  408.  mov [edi], eax
  409.  add esi, ebx
  410.  add edi, ebx
  411.  dec edx
  412.  jnz start_again
  413. }
  414. }
  415. /**/
  416. void CopyMBlockHor(unsigned char * Src, unsigned char * Dst, int Stride)
  417. {
  418. _asm {
  419.  xor eax, eax
  420.  mov ebx, Stride
  421.  sub ebx, 15
  422.  xor ecx, ecx
  423.  mov edx, 16
  424.  mov esi, dword ptr [Src]
  425.  mov edi, dword ptr [Dst]
  426. start_again0:
  427.  // 0
  428.  mov al, [esi]
  429.  inc esi
  430.  mov cl, [esi]
  431.  add eax, ecx
  432.  inc eax
  433.  shr eax, 1
  434.  mov [edi], al
  435.  inc edi
  436.  // 1
  437.  mov al, [esi]
  438.  inc esi
  439.  mov cl, [esi]
  440.  add eax, ecx
  441.  inc eax
  442.  shr eax, 1
  443.  mov [edi], al
  444.  inc edi
  445.  // 2
  446.  mov al, [esi]
  447.  inc esi
  448.  mov cl, [esi]
  449.  add eax, ecx
  450.  inc eax
  451.  shr eax, 1
  452.  mov [edi], al
  453.  inc edi
  454.  // 3
  455.  //xor eax, eax
  456.  mov al, [esi]
  457.  inc esi
  458.  mov cl, [esi]
  459.  add eax, ecx
  460.  inc eax
  461.  shr eax, 1
  462.  mov [edi], al
  463.  inc edi
  464.  // 4
  465.  mov al, [esi]
  466.  inc esi
  467.  mov cl, [esi]
  468.  add eax, ecx
  469.  inc eax
  470.  shr eax, 1
  471.  mov [edi], al
  472.  inc edi
  473.  // 5
  474.  mov al, [esi]
  475.  inc esi
  476.  mov cl, [esi]
  477.  add eax, ecx
  478.  inc eax
  479.  shr eax, 1
  480.  mov [edi], al
  481.  inc edi
  482.  // 6
  483.  mov al, [esi]
  484.  inc esi
  485.  mov cl, [esi]
  486.  add eax, ecx
  487.  inc eax
  488.  shr eax, 1
  489.  mov [edi], al
  490.  inc edi
  491.  // 7
  492.  mov al, [esi]
  493.  inc esi
  494.  mov cl, [esi]
  495.  add eax, ecx
  496.  inc eax
  497.  shr eax, 1
  498.  mov [edi], al
  499.  inc edi
  500.  // 8
  501.  mov al, [esi]
  502.  inc esi
  503.  mov cl, [esi]
  504.  add eax, ecx
  505.  inc eax
  506.  shr eax, 1
  507.  mov [edi], al
  508.  inc edi
  509.  // 9
  510.  mov al, [esi]
  511.  inc esi
  512.  mov cl, [esi]
  513.  add eax, ecx
  514.  inc eax
  515.  shr eax, 1
  516.  mov [edi], al
  517.  inc edi
  518.  // 10
  519.  mov al, [esi]
  520.  inc esi
  521.  mov cl, [esi]
  522.  add eax, ecx
  523.  inc eax
  524.  shr eax, 1
  525.  mov [edi], al
  526.  inc edi
  527.  // 11
  528.  mov al, [esi]
  529.  inc esi
  530.  mov cl, [esi]
  531.  add eax, ecx
  532.  inc eax
  533.  shr eax, 1
  534.  mov [edi], al
  535.  inc edi
  536.  //12
  537.  mov al, [esi]
  538.  inc esi
  539.  mov cl, [esi]
  540.  add eax, ecx
  541.  inc eax
  542.  shr eax, 1
  543.  mov [edi], al
  544.  inc edi
  545.  //13 
  546.  mov al, [esi]
  547.  inc esi
  548.  mov cl, [esi]
  549.  add eax, ecx
  550.  inc eax
  551.  shr eax, 1
  552.  mov [edi], al
  553.  inc edi
  554.  //14
  555.  mov al, [esi]
  556.  inc esi
  557.  mov cl, [esi]
  558.  add eax, ecx
  559.  inc eax
  560.  shr eax, 1
  561.  mov [edi], al
  562.  inc edi
  563.  //15
  564.  mov al, [esi]
  565.  mov cl, [esi+1]
  566.  add eax, ecx
  567.  inc eax
  568.  shr eax, 1
  569.  mov [edi], al
  570.  add esi, ebx
  571.  add edi, ebx
  572.  dec edx
  573.  jnz start_again0
  574. }
  575. }
  576. /**/
  577. void CopyMBlockVer(unsigned char * Src, unsigned char * Dst, int Stride)
  578. {
  579. _asm {
  580.  xor eax, eax
  581.  mov ebx, Stride
  582.  xor ecx, ecx
  583.  mov edx, 16
  584.  mov esi, dword ptr [Src]
  585.  mov edi, dword ptr [Dst]
  586. start_again0:
  587.  // 0
  588.  mov al, [esi]
  589.  mov cl, [esi+ebx]
  590.  add eax, ecx
  591.  inc eax
  592.  shr eax, 1
  593.  mov [edi], al
  594.  inc esi
  595.  inc edi
  596.  // 1
  597.  mov al, [esi]
  598.  mov cl, [esi+ebx]
  599.  add eax, ecx
  600.  inc eax
  601.  shr eax, 1
  602.  mov [edi], al
  603.  inc esi
  604.  inc edi
  605.  // 2
  606.  mov al, [esi]
  607.  mov cl, [esi+ebx]
  608.  add eax, ecx
  609.  inc eax
  610.  shr eax, 1
  611.  mov [edi], al
  612.  inc esi
  613.  inc edi
  614.  // 3
  615.  //xor eax, eax
  616.  mov al, [esi]
  617.  mov cl, [esi+ebx]
  618.  add eax, ecx
  619.  inc eax
  620.  shr eax, 1
  621.  mov [edi], al
  622.  inc esi
  623.  inc edi
  624.  // 4
  625.  mov al, [esi]
  626.  mov cl, [esi+ebx]
  627.  add eax, ecx
  628.  inc eax
  629.  shr eax, 1
  630.  mov [edi], al
  631.  inc esi
  632.  inc edi
  633.  // 5
  634.  mov al, [esi]
  635.  mov cl, [esi+ebx]
  636.  add eax, ecx
  637.  inc eax
  638.  shr eax, 1
  639.  mov [edi], al
  640.  inc esi
  641.  inc edi
  642.  // 6
  643.  mov al, [esi]
  644.  mov cl, [esi+ebx]
  645.  add eax, ecx
  646.  inc eax
  647.  shr eax, 1
  648.  mov [edi], al
  649.  inc esi
  650.  inc edi
  651.  // 7
  652.  mov al, [esi]
  653.  mov cl, [esi+ebx]
  654.  add eax, ecx
  655.  inc eax
  656.  shr eax, 1
  657.  mov [edi], al
  658.  inc esi
  659.  inc edi
  660.  // 8
  661.  mov al, [esi]
  662.  mov cl, [esi+ebx]
  663.  add eax, ecx
  664.  inc eax
  665.  shr eax, 1
  666.  mov [edi], al
  667.  inc esi
  668.  inc edi
  669.  // 9
  670.  mov al, [esi]
  671.  mov cl, [esi+ebx]
  672.  add eax, ecx
  673.  inc eax
  674.  shr eax, 1
  675.  mov [edi], al
  676.  inc esi
  677.  inc edi
  678.  // 10
  679.  mov al, [esi]
  680.  mov cl, [esi+ebx]
  681.  add eax, ecx
  682.  inc eax
  683.  shr eax, 1
  684.  mov [edi], al
  685.  inc esi
  686.  inc edi
  687.  // 11
  688.  mov al, [esi]
  689.  mov cl, [esi+ebx]
  690.  add eax, ecx
  691.  inc eax
  692.  shr eax, 1
  693.  mov [edi], al
  694.  inc esi
  695.  inc edi
  696.  //12
  697.  mov al, [esi]
  698.  mov cl, [esi+ebx]
  699.  add eax, ecx
  700.  inc eax
  701.  shr eax, 1
  702.  mov [edi], al
  703.  inc esi
  704.  inc edi
  705.  //13 
  706.  mov al, [esi]
  707.  mov cl, [esi+ebx]
  708.  add eax, ecx
  709.  inc eax
  710.  shr eax, 1
  711.  mov [edi], al
  712.  inc esi
  713.  inc edi
  714.  //14
  715.  mov al, [esi]
  716.  mov cl, [esi+ebx]
  717.  add eax, ecx
  718.  inc eax
  719.  shr eax, 1
  720.  mov [edi], al
  721.  inc esi
  722.  inc edi
  723.  //15
  724.  mov al, [esi]
  725.  mov cl, [esi+ebx]
  726.  add eax, ecx
  727.  inc eax
  728.  shr eax, 1
  729.  mov [edi], al
  730.  add esi, ebx
  731.  sub esi, 15
  732.  add edi, ebx
  733.  sub edi, 15
  734.  dec edx
  735.  jnz start_again0
  736. }
  737. }
  738. /**/
  739. void CopyMBlockHorVer(unsigned char * Src, unsigned char * Dst, int Stride)
  740. {
  741. _asm {
  742.  xor eax, eax
  743.  mov ebx, Stride
  744.  xor ecx, ecx
  745.  mov edx, 16
  746.  mov esi, dword ptr [Src]
  747.  mov edi, dword ptr [Dst]
  748. start_again1:
  749.  // 0
  750.  //xor eax, eax
  751.  mov al, [esi]
  752.  mov cl, [esi+1]
  753.  add eax, ecx
  754.  mov cl, [esi+ebx]
  755.  add eax, ecx
  756.  mov cl, [esi+ebx+1]
  757.  add eax, ecx
  758.  add eax, 2
  759.  shr eax, 2
  760.  mov [edi], al
  761.  // 1
  762.  //xor eax, eax
  763.  mov al, [esi+1]
  764.  mov cl, [esi+2]
  765.  add eax, ecx
  766.  mov cl, [esi+ebx+1]
  767.  add eax, ecx
  768.  mov cl, [esi+ebx+2]
  769.  add eax, ecx
  770.  add eax, 2
  771.  shr eax, 2
  772.  mov [edi+1], al
  773.  // 2
  774.  mov al, [esi+2]
  775.  mov cl, [esi+3]
  776.  add eax, ecx
  777.  mov cl, [esi+ebx+2]
  778.  add eax, ecx
  779.  mov cl, [esi+ebx+3]
  780.  add eax, ecx
  781.  add eax, 2
  782.  shr eax, 2
  783.  mov [edi+2], al
  784.  // 3
  785.  mov al, [esi+3]
  786.  mov cl, [esi+4]
  787.  add eax, ecx
  788.  mov cl, [esi+ebx+3]
  789.  add eax, ecx
  790.  mov cl, [esi+ebx+4]
  791.  add eax, ecx
  792.  add eax, 2
  793.  shr eax, 2
  794.  mov [edi+3], al
  795.  // 4
  796.  //xor eax, eax
  797.  mov al, [esi+4]
  798.  mov cl, [esi+5]
  799.  add eax, ecx
  800.  mov cl, [esi+ebx+4]
  801.  add eax, ecx
  802.  mov cl, [esi+ebx+5]
  803.  add eax, ecx
  804.  add eax, 2
  805.  shr eax, 2
  806.  mov [edi+4], al
  807.  // 5
  808.  //xor eax, eax
  809.  mov al, [esi+5]
  810.  mov cl, [esi+6]
  811.  add eax, ecx
  812.  mov cl, [esi+ebx+5]
  813.  add eax, ecx
  814.  mov cl, [esi+ebx+6]
  815.  add eax, ecx
  816.  add eax, 2
  817.  shr eax, 2
  818.  mov [edi+5], al
  819.  // 6
  820.  mov al, [esi+6]
  821.  mov cl, [esi+7]
  822.  add eax, ecx
  823.  mov cl, [esi+ebx+6]
  824.  add eax, ecx
  825.  mov cl, [esi+ebx+7]
  826.  add eax, ecx
  827.  add eax, 2
  828.  shr eax, 2
  829.  mov [edi+6], al
  830.  // 7
  831.  mov al, [esi+7]
  832.  mov cl, [esi+8]
  833.  add eax, ecx
  834.  mov cl, [esi+ebx+7]
  835.  add eax, ecx
  836.  mov cl, [esi+ebx+8]
  837.  add eax, ecx
  838.  add eax, 2
  839.  shr eax, 2
  840.  mov [edi+7], al
  841.  // 8
  842.  mov al, [esi+8]
  843.  mov cl, [esi+9]
  844.  add eax, ecx
  845.  mov cl, [esi+ebx+8]
  846.  add eax, ecx
  847.  mov cl, [esi+ebx+9]
  848.  add eax, ecx
  849.  add eax, 2
  850.  shr eax, 2
  851.  mov [edi+8], al
  852.  // 9
  853.  mov al, [esi+9]
  854.  mov cl, [esi+10]
  855.  add eax, ecx
  856.  mov cl, [esi+ebx+9]
  857.  add eax, ecx
  858.  mov cl, [esi+ebx+10]
  859.  add eax, ecx
  860.  add eax, 2
  861.  shr eax, 2
  862.  mov [edi+9], al
  863.  // 10
  864.  mov al, [esi+10]
  865.  mov cl, [esi+11]
  866.  add eax, ecx
  867.  mov cl, [esi+ebx+10]
  868.  add eax, ecx
  869.  mov cl, [esi+ebx+11]
  870.  add eax, ecx
  871.  add eax, 2
  872.  shr eax, 2
  873.  mov [edi+10], al
  874.  // 11
  875.  mov al, [esi+11]
  876.  mov cl, [esi+12]
  877.  add eax, ecx
  878.  mov cl, [esi+ebx+11]
  879.  add eax, ecx
  880.  mov cl, [esi+ebx+12]
  881.  add eax, ecx
  882.  add eax, 2
  883.  shr eax, 2
  884.  mov [edi+11], al
  885.  //12
  886.  mov al, [esi+12]
  887.  mov cl, [esi+13]
  888.  add eax, ecx
  889.  mov cl, [esi+ebx+12]
  890.  add eax, ecx
  891.  mov cl, [esi+ebx+13]
  892.  add eax, ecx
  893.  add eax, 2
  894.  shr eax, 2
  895.  mov [edi+12], al
  896.  //13 
  897.  //xor eax, eax
  898.  mov al, [esi+13]
  899.  mov cl, [esi+14]
  900.  add eax, ecx
  901.  mov cl, [esi+ebx+13]
  902.  add eax, ecx
  903.  mov cl, [esi+ebx+14]
  904.  add eax, ecx
  905.  add eax, 2
  906.  shr eax, 2
  907.  mov [edi+13], al
  908.  //14
  909.  mov al, [esi+14]
  910.  mov cl, [esi+15]
  911.  add eax, ecx
  912.  mov cl, [esi+ebx+14]
  913.  add eax, ecx
  914.  mov cl, [esi+ebx+15]
  915.  add eax, ecx
  916.  add eax, 2
  917.  shr eax, 2
  918.  mov [edi+14], al
  919.  //15
  920.  mov al, [esi+15]
  921.  mov cl, [esi+16]
  922.  add eax, ecx
  923.  mov cl, [esi+ebx+15]
  924.  add eax, ecx
  925.  mov cl, [esi+ebx+16]
  926.  add eax, ecx
  927.  add eax, 2
  928.  shr eax, 2
  929.  mov [edi+15], al
  930.  add esi, ebx
  931.  add edi, ebx
  932.  dec edx
  933.  jnz start_again1
  934. }
  935. }
  936. /**/
  937. void CopyMBlockHorRound(unsigned char * Src, unsigned char * Dst, int Stride)
  938. {
  939. _asm {
  940.  xor eax, eax
  941.  mov ebx, Stride
  942.  sub ebx, 15
  943.  xor ecx, ecx
  944.  mov edx, 16
  945.  mov esi, dword ptr [Src]
  946.  mov edi, dword ptr [Dst]
  947. start_again:
  948.  // 0
  949.  mov al, [esi]
  950.  inc esi
  951.  mov cl, [esi]
  952.  add eax, ecx
  953.  shr eax, 1
  954.  mov [edi], al
  955.  inc edi
  956.  // 1
  957.  mov al, [esi]
  958.  inc esi
  959.  mov cl, [esi]
  960.  add eax, ecx
  961.  shr eax, 1
  962.  mov [edi], al
  963.  inc edi
  964.  // 2
  965.  mov al, [esi]
  966.  inc esi
  967.  mov cl, [esi]
  968.  add eax, ecx
  969.  shr eax, 1
  970.  mov [edi], al
  971.  inc edi
  972.  // 3
  973.  //xor eax, eax
  974.  mov al, [esi]
  975.  inc esi
  976.  mov cl, [esi]
  977.  add eax, ecx
  978.  shr eax, 1
  979.  mov [edi], al
  980.  inc edi
  981.  // 4
  982.  mov al, [esi]
  983.  inc esi
  984.  mov cl, [esi]
  985.  add eax, ecx
  986.  shr eax, 1
  987.  mov [edi], al
  988.  inc edi
  989.  // 5
  990.  mov al, [esi]
  991.  inc esi
  992.  mov cl, [esi]
  993.  add eax, ecx
  994.  shr eax, 1
  995.  mov [edi], al
  996.  inc edi
  997.  // 6
  998.  mov al, [esi]
  999.  inc esi
  1000.  mov cl, [esi]
  1001.  add eax, ecx
  1002.  shr eax, 1
  1003.  mov [edi], al
  1004.  inc edi
  1005.  // 7
  1006.  mov al, [esi]
  1007.  inc esi
  1008.  mov cl, [esi]
  1009.  add eax, ecx
  1010.  shr eax, 1
  1011.  mov [edi], al
  1012.  inc edi
  1013.  // 8
  1014.  mov al, [esi]
  1015.  inc esi
  1016.  mov cl, [esi]
  1017.  add eax, ecx
  1018.  shr eax, 1
  1019.  mov [edi], al
  1020.  inc edi
  1021.  // 9
  1022.  mov al, [esi]
  1023.  inc esi
  1024.  mov cl, [esi]
  1025.  add eax, ecx
  1026.  shr eax, 1
  1027.  mov [edi], al
  1028.  inc edi
  1029.  // 10
  1030.  mov al, [esi]
  1031.  inc esi
  1032.  mov cl, [esi]
  1033.  add eax, ecx
  1034.  shr eax, 1
  1035.  mov [edi], al
  1036.  inc edi
  1037.  // 11
  1038.  mov al, [esi]
  1039.  inc esi
  1040.  mov cl, [esi]
  1041.  add eax, ecx
  1042.  shr eax, 1
  1043.  mov [edi], al
  1044.  inc edi
  1045.  //12
  1046.  mov al, [esi]
  1047.  inc esi
  1048.  mov cl, [esi]
  1049.  add eax, ecx
  1050.  shr eax, 1
  1051.  mov [edi], al
  1052.  inc edi
  1053.  //13 
  1054.  mov al, [esi]
  1055.  inc esi
  1056.  mov cl, [esi]
  1057.  add eax, ecx
  1058.  shr eax, 1
  1059.  mov [edi], al
  1060.  inc edi
  1061.  //14
  1062.  mov al, [esi]
  1063.  inc esi
  1064.  mov cl, [esi]
  1065.  add eax, ecx
  1066.  shr eax, 1
  1067.  mov [edi], al
  1068.  inc edi
  1069.  //15
  1070.  mov al, [esi]
  1071.  mov cl, [esi+1]
  1072.  add eax, ecx
  1073.  shr eax, 1
  1074.  mov [edi], al
  1075.  add esi, ebx
  1076.  add edi, ebx
  1077.  dec edx
  1078.  jnz start_again
  1079. }
  1080. }
  1081. /**/
  1082. void CopyMBlockVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
  1083. {
  1084. _asm {
  1085.  xor eax, eax
  1086.  mov ebx, Stride
  1087.  xor ecx, ecx
  1088.  mov edx, 16
  1089.  mov esi, dword ptr [Src]
  1090.  mov edi, dword ptr [Dst]
  1091. start_again:
  1092.  // 0
  1093.  mov al, [esi]
  1094.  mov cl, [esi+ebx]
  1095.  add eax, ecx
  1096.  shr eax, 1
  1097.  mov [edi], al
  1098.  inc esi
  1099.  inc edi
  1100.  // 1
  1101.  mov al, [esi]
  1102.  mov cl, [esi+ebx]
  1103.  add eax, ecx
  1104.  shr eax, 1
  1105.  mov [edi], al
  1106.  inc esi
  1107.  inc edi
  1108.  // 2
  1109.  mov al, [esi]
  1110.  mov cl, [esi+ebx]
  1111.  add eax, ecx
  1112.  shr eax, 1
  1113.  mov [edi], al
  1114.  inc esi
  1115.  inc edi
  1116.  // 3
  1117.  //xor eax, eax
  1118.  mov al, [esi]
  1119.  mov cl, [esi+ebx]
  1120.  add eax, ecx
  1121.  shr eax, 1
  1122.  mov [edi], al
  1123.  inc esi
  1124.  inc edi
  1125.  // 4
  1126.  mov al, [esi]
  1127.  mov cl, [esi+ebx]
  1128.  add eax, ecx
  1129.  shr eax, 1
  1130.  mov [edi], al
  1131.  inc esi
  1132.  inc edi
  1133.  // 5
  1134.  mov al, [esi]
  1135.  mov cl, [esi+ebx]
  1136.  add eax, ecx
  1137.  shr eax, 1
  1138.  mov [edi], al
  1139.  inc esi
  1140.  inc edi
  1141.  // 6
  1142.  mov al, [esi]
  1143.  mov cl, [esi+ebx]
  1144.  add eax, ecx
  1145.  shr eax, 1
  1146.  mov [edi], al
  1147.  inc esi
  1148.  inc edi
  1149.  // 7
  1150.  mov al, [esi]
  1151.  mov cl, [esi+ebx]
  1152.  add eax, ecx
  1153.  shr eax, 1
  1154.  mov [edi], al
  1155.  inc esi
  1156.  inc edi
  1157.  // 8
  1158.  mov al, [esi]
  1159.  mov cl, [esi+ebx]
  1160.  add eax, ecx
  1161.  shr eax, 1
  1162.  mov [edi], al
  1163.  inc esi
  1164.  inc edi
  1165.  // 9
  1166.  mov al, [esi]
  1167.  mov cl, [esi+ebx]
  1168.  add eax, ecx
  1169.  shr eax, 1
  1170.  mov [edi], al
  1171.  inc esi
  1172.  inc edi
  1173.  // 10
  1174.  mov al, [esi]
  1175.  mov cl, [esi+ebx]
  1176.  add eax, ecx
  1177.  shr eax, 1
  1178.  mov [edi], al
  1179.  inc esi
  1180.  inc edi
  1181.  // 11
  1182.  mov al, [esi]
  1183.  mov cl, [esi+ebx]
  1184.  add eax, ecx
  1185.  shr eax, 1
  1186.  mov [edi], al
  1187.  inc esi
  1188.  inc edi
  1189.  //12
  1190.  mov al, [esi]
  1191.  mov cl, [esi+ebx]
  1192.  add eax, ecx
  1193.  shr eax, 1
  1194.  mov [edi], al
  1195.  inc esi
  1196.  inc edi
  1197.  //13 
  1198.  mov al, [esi]
  1199.  mov cl, [esi+ebx]
  1200.  add eax, ecx
  1201.  shr eax, 1
  1202.  mov [edi], al
  1203.  inc esi
  1204.  inc edi
  1205.  //14
  1206.  mov al, [esi]
  1207.  mov cl, [esi+ebx]
  1208.  add eax, ecx
  1209.  shr eax, 1
  1210.  mov [edi], al
  1211.  inc esi
  1212.  inc edi
  1213.  //15
  1214.  mov al, [esi]
  1215.  mov cl, [esi+ebx]
  1216.  add eax, ecx
  1217.  shr eax, 1
  1218.  mov [edi], al
  1219.  add esi, ebx
  1220.  sub esi, 15
  1221.  add edi, ebx
  1222.  sub edi, 15
  1223.  dec edx
  1224.  jnz start_again
  1225. }
  1226. }
  1227. /**/
  1228. void CopyMBlockHorVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
  1229. {
  1230. _asm {
  1231.  xor eax, eax
  1232.  mov ebx, Stride
  1233.  xor ecx, ecx
  1234.  mov edx, 16
  1235.  mov esi, dword ptr [Src]
  1236.  mov edi, dword ptr [Dst]
  1237. start_again:
  1238.  // 0
  1239.  mov al, [esi]
  1240.  mov cl, [esi+1]
  1241.  add eax, ecx
  1242.  mov cl, [esi+ebx]
  1243.  add eax, ecx
  1244.  mov cl, [esi+ebx+1]
  1245.  add eax, ecx
  1246.  inc eax
  1247.  shr eax, 2
  1248.  mov [edi], al
  1249.  // 1
  1250.  mov al, [esi+1]
  1251.  mov cl, [esi+2]
  1252.  add eax, ecx
  1253.  mov cl, [esi+ebx+1]
  1254.  add eax, ecx
  1255.  mov cl, [esi+ebx+2]
  1256.  add eax, ecx
  1257.  inc eax
  1258.  shr eax, 2
  1259.  mov [edi+1], al
  1260.  // 2
  1261.  mov al, [esi+2]
  1262.  mov cl, [esi+3]
  1263.  add eax, ecx
  1264.  mov cl, [esi+ebx+2]
  1265.  add eax, ecx
  1266.  mov cl, [esi+ebx+3]
  1267.  add eax, ecx
  1268.  inc eax
  1269.  shr eax, 2
  1270.  mov [edi+2], al
  1271.  // 3
  1272.  mov al, [esi+3]
  1273.  mov cl, [esi+4]
  1274.  add eax, ecx
  1275.  mov cl, [esi+ebx+3]
  1276.  add eax, ecx
  1277.  mov cl, [esi+ebx+4]
  1278.  add eax, ecx
  1279.  inc eax
  1280.  shr eax, 2
  1281.  mov [edi+3], al
  1282.  // 4
  1283.  mov al, [esi+4]
  1284.  mov cl, [esi+5]
  1285.  add eax, ecx
  1286.  mov cl, [esi+ebx+4]
  1287.  add eax, ecx
  1288.  mov cl, [esi+ebx+5]
  1289.  add eax, ecx
  1290.  inc eax
  1291.  shr eax, 2
  1292.  mov [edi+4], al
  1293.  // 5
  1294.  mov al, [esi+5]
  1295.  mov cl, [esi+6]
  1296.  add eax, ecx
  1297.  mov cl, [esi+ebx+5]
  1298.  add eax, ecx
  1299.  mov cl, [esi+ebx+6]
  1300.  add eax, ecx
  1301.  inc eax
  1302.  shr eax, 2
  1303.  mov [edi+5], al
  1304.  // 6
  1305.  mov al, [esi+6]
  1306.  mov cl, [esi+7]
  1307.  add eax, ecx
  1308.  mov cl, [esi+ebx+6]
  1309.  add eax, ecx
  1310.  mov cl, [esi+ebx+7]
  1311.  add eax, ecx
  1312.  inc eax
  1313.  shr eax, 2
  1314.  mov [edi+6], al
  1315.  // 7
  1316.  mov al, [esi+7]
  1317.  mov cl, [esi+8]
  1318.  add eax, ecx
  1319.  mov cl, [esi+ebx+7]
  1320.  add eax, ecx
  1321.  mov cl, [esi+ebx+8]
  1322.  add eax, ecx
  1323.  inc eax
  1324.  shr eax, 2
  1325.  mov [edi+7], al
  1326.  // 8
  1327.  mov al, [esi+8]
  1328.  mov cl, [esi+9]
  1329.  add eax, ecx
  1330.  mov cl, [esi+ebx+8]
  1331.  add eax, ecx
  1332.  mov cl, [esi+ebx+9]
  1333.  add eax, ecx
  1334.  inc eax
  1335.  shr eax, 2
  1336.  mov [edi+8], al
  1337.  // 9
  1338.  mov al, [esi+9]
  1339.  mov cl, [esi+10]
  1340.  add eax, ecx
  1341.  mov cl, [esi+ebx+9]
  1342.  add eax, ecx
  1343.  mov cl, [esi+ebx+10]
  1344.  add eax, ecx
  1345.  inc eax
  1346.  shr eax, 2
  1347.  mov [edi+9], al
  1348.  // 10
  1349.  mov al, [esi+10]
  1350.  mov cl, [esi+11]
  1351.  add eax, ecx
  1352.  mov cl, [esi+ebx+10]
  1353.  add eax, ecx
  1354.  mov cl, [esi+ebx+11]
  1355.  add eax, ecx
  1356.  inc eax
  1357.  shr eax, 2
  1358.  mov [edi+10], al
  1359.  // 11
  1360.  mov al, [esi+11]
  1361.  mov cl, [esi+12]
  1362.  add eax, ecx
  1363.  mov cl, [esi+ebx+11]
  1364.  add eax, ecx
  1365.  mov cl, [esi+ebx+12]
  1366.  add eax, ecx
  1367.  inc eax
  1368.  shr eax, 2
  1369.  mov [edi+11], al
  1370.  //12
  1371.  mov al, [esi+12]
  1372.  mov cl, [esi+13]
  1373.  add eax, ecx
  1374.  mov cl, [esi+ebx+12]
  1375.  add eax, ecx
  1376.  mov cl, [esi+ebx+13]
  1377.  add eax, ecx
  1378.  inc eax
  1379.  shr eax, 2
  1380.  mov [edi+12], al
  1381.  //13 
  1382.  mov al, [esi+13]
  1383.  mov cl, [esi+14]
  1384.  add eax, ecx
  1385.  mov cl, [esi+ebx+13]
  1386.  add eax, ecx
  1387.  mov cl, [esi+ebx+14]
  1388.  add eax, ecx
  1389.  inc eax
  1390.  shr eax, 2
  1391.  mov [edi+13], al
  1392.  //14
  1393.  mov al, [esi+14]
  1394.  mov cl, [esi+15]
  1395.  add eax, ecx
  1396.  mov cl, [esi+ebx+14]
  1397.  add eax, ecx
  1398.  mov cl, [esi+ebx+15]
  1399.  add eax, ecx
  1400.  inc eax
  1401.  shr eax, 2
  1402.  mov [edi+14], al
  1403.  //15
  1404.  //xor eax, eax
  1405.  mov al, [esi+15]
  1406.  mov cl, [esi+16]
  1407.  add eax, ecx
  1408.  mov cl, [esi+ebx+15]
  1409.  add eax, ecx
  1410.  mov cl, [esi+ebx+16]
  1411.  add eax, ecx
  1412.  inc eax
  1413.  shr eax, 2
  1414.  mov [edi+15], al
  1415.  add esi, ebx
  1416.  add edi, ebx
  1417.  dec edx
  1418.  jnz start_again
  1419. }
  1420. }