sha1block.s 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. TEXT _sha1block+0(SB),$328
  2. /*
  3. * wp[off] = x;
  4. * x += A <<< 5;
  5. * E += 0xca62c1d6 + x;
  6. * x = FN(B,C,D);
  7. * E += x;
  8. * B >>> 2
  9. */
  10. #define BODYX(off,FN,V,A,B,C,D,E)\
  11. FN(B,C,D)\
  12. ADDU TMP1,E;\
  13. ADDU V,E;\
  14. MOVW TMP2,off(WREG);\
  15. ADDU TMP2,E;\
  16. SLL $5,A,TMP3;\
  17. SRL $27,A,TMP4;\
  18. OR TMP3,TMP4;\
  19. ADDU TMP4,E;\
  20. SLL $30,B,TMP4;\
  21. SRL $2,B;\
  22. OR TMP4,B
  23. /*
  24. * x = data[i]
  25. * BODYX
  26. */
  27. #define BODY1(off,FN,V,A,B,C,D,E)\
  28. MOVBU off(DATAREG),TMP2;\
  29. MOVBU (off+1)(DATAREG),TMP3;\
  30. MOVBU (off+2)(DATAREG),TMP1;\
  31. MOVBU (off+3)(DATAREG),TMP4;\
  32. SLL $24,TMP2;\
  33. SLL $16,TMP3;\
  34. OR TMP3,TMP2;\
  35. SLL $8,TMP1;\
  36. OR TMP1,TMP2;\
  37. OR TMP4,TMP2;\
  38. BODYX(off,FN,V,A,B,C,D,E)
  39. /*
  40. * x = (wp[off-3] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
  41. * BODYX
  42. */
  43. #define BODY(off,FN,V,A,B,C,D,E)\
  44. MOVW (off-64)(WREG),TMP1;\
  45. MOVW (off-56)(WREG),TMP2;\
  46. MOVW (off-32)(WREG),TMP3;\
  47. MOVW (off-12)(WREG),TMP4;\
  48. XOR TMP1,TMP2;\
  49. XOR TMP3,TMP2;\
  50. XOR TMP4,TMP2;\
  51. SLL $1,TMP2,TMP1;\
  52. SRL $31,TMP2;\
  53. OR TMP1,TMP2;\
  54. BODYX(off,FN,V,A,B,C,D,E)
  55. /*
  56. * fn1 = (((C^D)&B)^D);
  57. */
  58. #define FN1(B,C,D)\
  59. XOR C,D,TMP1;\
  60. AND B,TMP1;\
  61. XOR D,TMP1;
  62. /*
  63. * fn24 = B ^ C ^ D
  64. */
  65. #define FN24(B,C,D)\
  66. XOR B,C,TMP1;\
  67. XOR D,TMP1;
  68. /*
  69. * fn3 = ((B ^ C) & (D ^ B)) ^ B
  70. */
  71. #define FN3(B,C,D)\
  72. XOR B,C,TMP1;\
  73. XOR B,D,TMP4;\
  74. AND TMP4,TMP1;\
  75. XOR B,TMP1;
  76. /*
  77. * stack offsets
  78. * void vtSha1Block(ulong *STATE, uchar *DATA, int LEN)
  79. */
  80. #define DATA 0
  81. #define LEN 4
  82. #define STATE 8
  83. /*
  84. * stack offsets for locals
  85. * ulong w[80];
  86. * uchar *edata;
  87. * ulong *w15, *w40, *w60, *w80;
  88. * register local
  89. * ulong *wp = BP
  90. * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
  91. * ulong tmp = edi
  92. */
  93. #define WARRAY (-4-(80*4))
  94. #define AREG R5
  95. #define BREG R6
  96. #define CREG R7
  97. #define DREG R8
  98. #define EREG R9
  99. #define DATAREG R1
  100. #define STREG R11
  101. #define WREG R12
  102. #define W15REG R13
  103. #define W60REG R14
  104. #define W40REG R15
  105. #define W80REG R16
  106. #define EDREG R17
  107. #define VREG R18
  108. #define TMP1 R10
  109. #define TMP2 R2
  110. #define TMP3 R3
  111. #define TMP4 R4
  112. #define TMP5 R19
  113. MOVW len+LEN(FP),TMP1
  114. MOVW state+STATE(FP),STREG
  115. ADDU DATAREG,TMP1,EDREG
  116. MOVW 0(STREG),AREG
  117. MOVW 4(STREG),BREG
  118. MOVW 8(STREG),CREG
  119. MOVW 12(STREG),DREG
  120. MOVW 16(STREG),EREG
  121. MOVW $warray+WARRAY(SP),WREG
  122. ADDU $(15*4),WREG,W15REG
  123. ADDU $(40*4),WREG,W40REG
  124. ADDU $(60*4),WREG,W60REG
  125. ADDU $(80*4),WREG,W80REG
  126. mainloop:
  127. MOVW $warray+WARRAY(SP),WREG
  128. MOVW $0x5a827999,VREG
  129. loop1:
  130. BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG)
  131. BODY1(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG)
  132. BODY1(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG)
  133. BODY1(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG)
  134. BODY1(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG)
  135. ADDU $20,DATAREG
  136. ADDU $20,WREG
  137. BNE WREG,W15REG,loop1
  138. BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG)
  139. ADDU $4,DATAREG
  140. BODY(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG)
  141. BODY(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG)
  142. BODY(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG)
  143. BODY(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG)
  144. ADDU $20,WREG
  145. MOVW $0x6ed9eba1,VREG
  146. loop2:
  147. BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG)
  148. BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG)
  149. BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG)
  150. BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG)
  151. BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG)
  152. ADDU $20,WREG
  153. BNE WREG,W40REG,loop2
  154. MOVW $0x8f1bbcdc,VREG
  155. loop3:
  156. BODY(0,FN3,VREG,AREG,BREG,CREG,DREG,EREG)
  157. BODY(4,FN3,VREG,EREG,AREG,BREG,CREG,DREG)
  158. BODY(8,FN3,VREG,DREG,EREG,AREG,BREG,CREG)
  159. BODY(12,FN3,VREG,CREG,DREG,EREG,AREG,BREG)
  160. BODY(16,FN3,VREG,BREG,CREG,DREG,EREG,AREG)
  161. ADDU $20,WREG
  162. BNE WREG,W60REG,loop3
  163. MOVW $0xca62c1d6,VREG
  164. loop4:
  165. BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG)
  166. BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG)
  167. BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG)
  168. BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG)
  169. BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG)
  170. ADDU $20,WREG
  171. BNE WREG,W80REG,loop4
  172. MOVW 0(STREG),TMP1
  173. MOVW 4(STREG),TMP2
  174. MOVW 8(STREG),TMP3
  175. MOVW 12(STREG),TMP4
  176. MOVW 16(STREG),TMP5
  177. ADDU TMP1,AREG
  178. ADDU TMP2,BREG
  179. ADDU TMP3,CREG
  180. ADDU TMP4,DREG
  181. ADDU TMP5,EREG
  182. MOVW AREG,0(STREG)
  183. MOVW BREG,4(STREG)
  184. MOVW CREG,8(STREG)
  185. MOVW DREG,12(STREG)
  186. MOVW EREG,16(STREG)
  187. BNE DATAREG,EDREG,mainloop
  188. RET
  189. END