sha1-mmx.S
上传用户:fubang
上传日期:2009-06-18
资源大小:2071k
文件大小:13k
源码类别:

其他

开发平台:

Unix_Linux

  1. // SHA-1 MMX implementation, (C) 2005 Simon Marechal
  2. // This code computes two SHA-1 digests at the same time. It
  3. // doesn't take care of padding (0x80 and size << 3), so make
  4. // sure the last input block is properly padded. Both 64-byte
  5. // input blocks must be (four bytes) interleaved.
  6. #ifdef __i386__
  7. .globl  shammx_init;
  8. .globl  shammx_ends;
  9. .globl  shammx_data;
  10. .globl _shammx_init;
  11. .globl _shammx_ends;
  12. .globl _shammx_data;
  13. .data
  14. .align(16)
  15. const_init_a:
  16. .long 0x67452301
  17. .long 0x67452301
  18. const_init_b:
  19. .long 0xEFCDAB89
  20. .long 0xEFCDAB89
  21. const_init_c:
  22. .long 0x98BADCFE
  23. .long 0x98BADCFE
  24. const_init_d:
  25. .long 0x10325476
  26. .long 0x10325476
  27. const_init_e:
  28. .long 0xC3D2E1F0
  29. .long 0xC3D2E1F0
  30. const_stage0:
  31. .long 0x5A827999
  32. .long 0x5A827999
  33. const_stage1:
  34. .long 0x6ED9EBA1
  35. .long 0x6ED9EBA1
  36. const_stage2:
  37. .long 0x8F1BBCDC
  38. .long 0x8F1BBCDC
  39. const_stage3:
  40. .long 0xCA62C1D6
  41. .long 0xCA62C1D6
  42. const_ff00:
  43. .long 0xFF00FF00
  44. .long 0xFF00FF00
  45. const_00ff:
  46. .long 0x00FF00FF
  47. .long 0x00FF00FF
  48. #define ctxa %mm0
  49. #define ctxb %mm1
  50. #define ctxc %mm2
  51. #define ctxd %mm3
  52. #define ctxe %mm4
  53. #define tmp1 %mm5
  54. #define tmp2 %mm6
  55. #define tmp3 %mm7
  56. #define tmp4 ctxa
  57. #define tmp5 ctxb
  58. #define F0(x,y,z)       
  59.         movq   x, tmp2; 
  60.         movq   x, tmp1; 
  61.         pand   y, tmp2; 
  62.         pandn  z, tmp1; 
  63.         por    tmp2, tmp1; 
  64. #define F1(x,y,z)       
  65.         movq   z, tmp1; 
  66.         pxor   y, tmp1; 
  67.         pxor   x, tmp1
  68. #define F2(x,y,z)       
  69.         movq   x, tmp1; 
  70.         movq   x, tmp2; 
  71.         pand   y, tmp1; 
  72.         por    y, tmp2; 
  73.         pand   z, tmp2; 
  74.         por    tmp2, tmp1;
  75.         
  76. #define subRoundX(a, b, c, d, e, f, k, data)    
  77.         f(b,c,d);                               
  78.         movq   a, tmp2;                         
  79.         movq   a, tmp3;                         
  80.         paddd  tmp1, e;                         
  81.         pslld    $5, tmp2;                      
  82.         psrld   $27, tmp3;                      
  83.         por    tmp3, tmp2;                      
  84.         paddd  tmp2, e;                         
  85.         movq   b, tmp2;                         
  86.         pslld  $30, b;                          
  87.         paddd  k, e;                            
  88.         psrld  $2, tmp2;                        
  89.         por    tmp2, b;                         
  90.         movq   (data*8)(%edx), tmp1;            
  91.         movq   tmp1, tmp2;                      
  92.         pand   const_ff00, tmp1;                
  93.         pand   const_00ff, tmp2;                
  94.         psrld  $8, tmp1;                        
  95.         pslld  $8, tmp2;                        
  96.         por    tmp2, tmp1;                      
  97.         movq   tmp1, tmp2;                      
  98.         psrld  $16, tmp1;                       
  99.         pslld  $16, tmp2;                       
  100.         por    tmp2, tmp1;                      
  101.         movq   tmp1, (data*8)(%ecx);            
  102.         paddd  tmp1, e;
  103. #define subRoundY(a, b, c, d, e, f, k, data)    
  104.         movq   ((data- 3)*8)(%ecx), tmp1;       
  105.         pxor   ((data- 8)*8)(%ecx), tmp1;       
  106.         pxor   ((data-14)*8)(%ecx), tmp1;       
  107.         pxor   ((data-16)*8)(%ecx), tmp1;       
  108.         movq   tmp1, tmp2;                      
  109.         pslld    $1, tmp1;                      
  110.         psrld   $31, tmp2;                      
  111.         por    tmp2, tmp1;                      
  112.         movq   tmp1, (data*8)(%ecx);            
  113.         paddd  tmp1, e;                         
  114.         f(b,c,d);                               
  115.         movq   a, tmp2;                         
  116.         movq   a, tmp3;                         
  117.         paddd  tmp1, e;                         
  118.         pslld    $5, tmp2;                      
  119.         psrld   $27, tmp3;                      
  120.         por    tmp3, tmp2;                      
  121.         paddd  tmp2, e;                         
  122.         movq   b, tmp2;                         
  123.         pslld  $30, b;                          
  124.         paddd  k, e;                            
  125.         psrld  $2, tmp2;                        
  126.         por    tmp2, b;
  127. .text
  128. // arg 1 (eax): context (40 bytes)
  129.  shammx_init:
  130. _shammx_init:
  131.         movq   const_init_a, ctxa
  132.         movq   const_init_b, ctxb
  133.         movq   const_init_c, ctxc
  134.         movq   const_init_d, ctxd
  135.         movq   const_init_e, ctxe
  136.         movq   ctxa,  0(%eax)
  137.         movq   ctxb,  8(%eax)
  138.         movq   ctxc, 16(%eax)
  139.         movq   ctxd, 24(%eax)
  140.         movq   ctxe, 32(%eax)
  141.         ret
  142. // arg 1 (eax): context (40 bytes)
  143. // arg 2 (edx): digests (40 bytes)
  144.  shammx_ends:
  145. _shammx_ends:
  146.         movq    0(%eax), ctxa
  147.         movq    8(%eax), ctxb
  148.         movq   16(%eax), ctxc
  149.         movq   24(%eax), ctxd
  150.         movq   32(%eax), ctxe
  151.         movq   const_ff00, tmp3
  152.         movq   ctxa, tmp1
  153.         movq   ctxb, tmp2
  154.         pand   tmp3, ctxa
  155.         pand   tmp3, ctxb
  156.         movq   const_00ff, tmp3
  157.         pand   tmp3, tmp1
  158.         pand   tmp3, tmp2
  159.         psrld  $8, ctxa
  160.         psrld  $8, ctxb
  161.         pslld  $8, tmp1
  162.         pslld  $8, tmp2
  163.         por    tmp1, ctxa
  164.         por    tmp2, ctxb
  165.         movq   ctxa, tmp1
  166.         movq   ctxb, tmp2
  167.         psrld  $16, ctxa
  168.         psrld  $16, ctxb
  169.         pslld  $16, tmp1
  170.         pslld  $16, tmp2
  171.         por    tmp1, ctxa
  172.         por    tmp2, ctxb 
  173.         movq   ctxa,  0(%edx)
  174.         movq   ctxb,  8(%edx)
  175.         movq   const_ff00, tmp5
  176.         movq   ctxc, tmp1
  177.         movq   ctxd, tmp2
  178.         movq   ctxe, tmp3
  179.         pand   tmp5, ctxc
  180.         pand   tmp5, ctxd
  181.         pand   tmp5, ctxe
  182.         movq   const_00ff, tmp5
  183.         pand   tmp5, tmp1
  184.         pand   tmp5, tmp2
  185.         pand   tmp5, tmp3
  186.         psrld  $8, ctxc
  187.         psrld  $8, ctxd
  188.         psrld  $8, ctxe
  189.         pslld  $8, tmp1
  190.         pslld  $8, tmp2
  191.         pslld  $8, tmp3
  192.         por    tmp1, ctxc
  193.         por    tmp2, ctxd
  194.         por    tmp3, ctxe
  195.         movq   ctxc, tmp1
  196.         movq   ctxd, tmp2
  197.         movq   ctxe, tmp3
  198.         psrld  $16, ctxc
  199.         psrld  $16, ctxd
  200.         psrld  $16, ctxe
  201.         pslld  $16, tmp1
  202.         pslld  $16, tmp2
  203.         pslld  $16, tmp3
  204.         por    tmp1, ctxc
  205.         por    tmp2, ctxd
  206.         por    tmp3, ctxe
  207.         movq   ctxc, 16(%edx)
  208.         movq   ctxd, 24(%edx)
  209.         movq   ctxe, 32(%edx)
  210.         ret
  211. // arg 1 (eax): context     (40 bytes)
  212. // arg 2 (edx): input data (128 bytes)
  213. // arg 3 (ecx): workspace  (640 bytes)
  214.  shammx_data:
  215. _shammx_data:
  216.         movq    0(%eax), ctxa
  217.         movq    8(%eax), ctxb
  218.         movq   16(%eax), ctxc
  219.         movq   24(%eax), ctxd
  220.         movq   32(%eax), ctxe
  221. round0:
  222.         prefetchnta (%edx)
  223.         subRoundX( ctxa, ctxb, ctxc, ctxd, ctxe, F0, const_stage0,  0 );
  224.         subRoundX( ctxe, ctxa, ctxb, ctxc, ctxd, F0, const_stage0,  1 );
  225.         subRoundX( ctxd, ctxe, ctxa, ctxb, ctxc, F0, const_stage0,  2 );
  226.         subRoundX( ctxc, ctxd, ctxe, ctxa, ctxb, F0, const_stage0,  3 );
  227.         subRoundX( ctxb, ctxc, ctxd, ctxe, ctxa, F0, const_stage0,  4 );
  228.         subRoundX( ctxa, ctxb, ctxc, ctxd, ctxe, F0, const_stage0,  5 );
  229.         subRoundX( ctxe, ctxa, ctxb, ctxc, ctxd, F0, const_stage0,  6 );
  230.         subRoundX( ctxd, ctxe, ctxa, ctxb, ctxc, F0, const_stage0,  7 );
  231.         subRoundX( ctxc, ctxd, ctxe, ctxa, ctxb, F0, const_stage0,  8 );
  232.         subRoundX( ctxb, ctxc, ctxd, ctxe, ctxa, F0, const_stage0,  9 );
  233.         subRoundX( ctxa, ctxb, ctxc, ctxd, ctxe, F0, const_stage0, 10 );
  234.         subRoundX( ctxe, ctxa, ctxb, ctxc, ctxd, F0, const_stage0, 11 );
  235.         subRoundX( ctxd, ctxe, ctxa, ctxb, ctxc, F0, const_stage0, 12 );
  236.         subRoundX( ctxc, ctxd, ctxe, ctxa, ctxb, F0, const_stage0, 13 );
  237.         subRoundX( ctxb, ctxc, ctxd, ctxe, ctxa, F0, const_stage0, 14 );
  238.         subRoundX( ctxa, ctxb, ctxc, ctxd, ctxe, F0, const_stage0, 15 );
  239.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F0, const_stage0, 16 );
  240.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F0, const_stage0, 17 );
  241.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F0, const_stage0, 18 );
  242.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F0, const_stage0, 19 );
  243. round1:
  244.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage1, 20 );
  245.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage1, 21 );
  246.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage1, 22 );
  247.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage1, 23 );
  248.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage1, 24 );
  249.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage1, 25 );
  250.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage1, 26 );
  251.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage1, 27 );
  252.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage1, 28 );
  253.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage1, 29 );
  254.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage1, 30 );
  255.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage1, 31 );
  256.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage1, 32 );
  257.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage1, 33 );
  258.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage1, 34 );
  259.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage1, 35 );
  260.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage1, 36 );
  261.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage1, 37 );
  262.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage1, 38 );
  263.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage1, 39 );
  264. round2:
  265.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F2, const_stage2, 40 );
  266.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F2, const_stage2, 41 );
  267.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F2, const_stage2, 42 );
  268.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F2, const_stage2, 43 );
  269.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F2, const_stage2, 44 );
  270.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F2, const_stage2, 45 );
  271.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F2, const_stage2, 46 );
  272.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F2, const_stage2, 47 );
  273.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F2, const_stage2, 48 );
  274.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F2, const_stage2, 49 );
  275.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F2, const_stage2, 50 );
  276.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F2, const_stage2, 51 );
  277.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F2, const_stage2, 52 );
  278.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F2, const_stage2, 53 );
  279.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F2, const_stage2, 54 );
  280.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F2, const_stage2, 55 );
  281.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F2, const_stage2, 56 );
  282.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F2, const_stage2, 57 );
  283.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F2, const_stage2, 58 );
  284.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F2, const_stage2, 59 );
  285. round3:
  286.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage3, 60 );
  287.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage3, 61 );
  288.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage3, 62 );
  289.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage3, 63 );
  290.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage3, 64 );
  291.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage3, 65 );
  292.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage3, 66 );
  293.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage3, 67 );
  294.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage3, 68 );
  295.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage3, 69 );
  296.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage3, 70 );
  297.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage3, 71 );
  298.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage3, 72 );
  299.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage3, 73 );
  300.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage3, 74 );
  301.         subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage3, 75 );
  302.         subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage3, 76 );
  303.         subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage3, 77 );
  304.         subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage3, 78 );
  305.         subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage3, 79 );
  306.         paddd    0(%eax), ctxa
  307.         paddd    8(%eax), ctxb
  308.         paddd   16(%eax), ctxc
  309.         paddd   24(%eax), ctxd
  310.         paddd   32(%eax), ctxe
  311.         movq    ctxa,  0(%eax)
  312.         movq    ctxb,  8(%eax)
  313.         movq    ctxc, 16(%eax)
  314.         movq    ctxd, 24(%eax)
  315.         movq    ctxe, 32(%eax)
  316.         ret
  317. #endif