hash_amd64.s 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. // +build amd64,!appengine,!gccgo
  2. // This is a translation of the gcc output of FloodyBerry's pure-C public
  3. // domain siphash implementation at https://github.com/floodyberry/siphash
  4. // func Hash(k0, k1 uint64, b []byte) uint64
  5. TEXT ·Hash(SB),4,$0-48
  6. MOVQ k0+0(FP),CX
  7. MOVQ $0x736F6D6570736575,R9
  8. MOVQ k1+8(FP),DI
  9. MOVQ $0x6C7967656E657261,BX
  10. MOVQ $0x646F72616E646F6D,AX
  11. MOVQ b_len+24(FP),DX
  12. MOVQ DX,R11
  13. MOVQ DX,R10
  14. XORQ CX,R9
  15. XORQ CX,BX
  16. MOVQ $0x7465646279746573,CX
  17. XORQ DI,AX
  18. XORQ DI,CX
  19. SHLQ $0x38,R11
  20. XORQ DI,DI
  21. MOVQ b_base+16(FP),SI
  22. ANDQ $0xFFFFFFFFFFFFFFF8,R10
  23. JE afterLoop
  24. XCHGQ AX,AX
  25. loopBody:
  26. MOVQ 0(SI)(DI*1),R8
  27. ADDQ AX,R9
  28. RORQ $0x33,AX
  29. XORQ R9,AX
  30. RORQ $0x20,R9
  31. ADDQ $0x8,DI
  32. XORQ R8,CX
  33. ADDQ CX,BX
  34. RORQ $0x30,CX
  35. XORQ BX,CX
  36. ADDQ AX,BX
  37. RORQ $0x2F,AX
  38. ADDQ CX,R9
  39. RORQ $0x2B,CX
  40. XORQ BX,AX
  41. XORQ R9,CX
  42. RORQ $0x20,BX
  43. ADDQ AX,R9
  44. ADDQ CX,BX
  45. RORQ $0x33,AX
  46. RORQ $0x30,CX
  47. XORQ R9,AX
  48. XORQ BX,CX
  49. RORQ $0x20,R9
  50. ADDQ AX,BX
  51. ADDQ CX,R9
  52. RORQ $0x2F,AX
  53. RORQ $0x2B,CX
  54. XORQ BX,AX
  55. RORQ $0x20,BX
  56. XORQ R9,CX
  57. XORQ R8,R9
  58. CMPQ R10,DI
  59. JA loopBody
  60. afterLoop:
  61. SUBQ R10,DX
  62. CMPQ DX,$0x7
  63. JA afterSwitch
  64. // no support for jump tables
  65. CMPQ DX,$0x7
  66. JE sw7
  67. CMPQ DX,$0x6
  68. JE sw6
  69. CMPQ DX,$0x5
  70. JE sw5
  71. CMPQ DX,$0x4
  72. JE sw4
  73. CMPQ DX,$0x3
  74. JE sw3
  75. CMPQ DX,$0x2
  76. JE sw2
  77. CMPQ DX,$0x1
  78. JE sw1
  79. JMP afterSwitch
  80. sw7: MOVBQZX 6(SI)(DI*1),DX
  81. SHLQ $0x30,DX
  82. ORQ DX,R11
  83. sw6: MOVBQZX 0x5(SI)(DI*1),DX
  84. SHLQ $0x28,DX
  85. ORQ DX,R11
  86. sw5: MOVBQZX 0x4(SI)(DI*1),DX
  87. SHLQ $0x20,DX
  88. ORQ DX,R11
  89. sw4: MOVBQZX 0x3(SI)(DI*1),DX
  90. SHLQ $0x18,DX
  91. ORQ DX,R11
  92. sw3: MOVBQZX 0x2(SI)(DI*1),DX
  93. SHLQ $0x10,DX
  94. ORQ DX,R11
  95. sw2: MOVBQZX 0x1(SI)(DI*1),DX
  96. SHLQ $0x8,DX
  97. ORQ DX,R11
  98. sw1: MOVBQZX 0(SI)(DI*1),DX
  99. ORQ DX,R11
  100. afterSwitch:
  101. LEAQ (AX)(R9*1),SI
  102. XORQ R11,CX
  103. RORQ $0x33,AX
  104. ADDQ CX,BX
  105. MOVQ CX,DX
  106. XORQ SI,AX
  107. RORQ $0x30,DX
  108. RORQ $0x20,SI
  109. LEAQ 0(BX)(AX*1),CX
  110. XORQ BX,DX
  111. RORQ $0x2F,AX
  112. ADDQ DX,SI
  113. RORQ $0x2B,DX
  114. XORQ CX,AX
  115. XORQ SI,DX
  116. RORQ $0x20,CX
  117. ADDQ AX,SI
  118. RORQ $0x33,AX
  119. ADDQ DX,CX
  120. XORQ SI,AX
  121. RORQ $0x30,DX
  122. RORQ $0x20,SI
  123. XORQ CX,DX
  124. ADDQ AX,CX
  125. RORQ $0x2F,AX
  126. ADDQ DX,SI
  127. XORQ CX,AX
  128. RORQ $0x2B,DX
  129. RORQ $0x20,CX
  130. XORQ SI,DX
  131. XORQ R11,SI
  132. XORB $0xFF,CL
  133. ADDQ AX,SI
  134. RORQ $0x33,AX
  135. ADDQ DX,CX
  136. RORQ $0x30,DX
  137. XORQ SI,AX
  138. XORQ CX,DX
  139. RORQ $0x20,SI
  140. ADDQ AX,CX
  141. ADDQ DX,SI
  142. RORQ $0x2F,AX
  143. RORQ $0x2B,DX
  144. XORQ CX,AX
  145. XORQ SI,DX
  146. RORQ $0x20,CX
  147. ADDQ AX,SI
  148. ADDQ DX,CX
  149. RORQ $0x33,AX
  150. RORQ $0x30,DX
  151. XORQ SI,AX
  152. RORQ $0x20,SI
  153. XORQ CX,DX
  154. ADDQ AX,CX
  155. RORQ $0x2F,AX
  156. ADDQ DX,SI
  157. RORQ $0x2B,DX
  158. XORQ CX,AX
  159. XORQ SI,DX
  160. RORQ $0x20,CX
  161. ADDQ AX,SI
  162. ADDQ DX,CX
  163. RORQ $0x33,AX
  164. RORQ $0x30,DX
  165. XORQ CX,DX
  166. XORQ SI,AX
  167. RORQ $0x20,SI
  168. ADDQ DX,SI
  169. ADDQ AX,CX
  170. RORQ $0x2F,AX
  171. XORQ CX,AX
  172. RORQ $0x2B,DX
  173. RORQ $0x20,CX
  174. XORQ SI,DX
  175. ADDQ AX,SI
  176. RORQ $0x33,AX
  177. ADDQ DX,CX
  178. XORQ SI,AX
  179. RORQ $0x30,DX
  180. XORQ CX,DX
  181. ADDQ AX,CX
  182. RORQ $0x2F,AX
  183. XORQ CX,AX
  184. RORQ $0x2B,DX
  185. RORQ $0x20,CX
  186. XORQ DX,AX
  187. XORQ CX,AX
  188. MOVQ AX,ret+40(FP)
  189. RET