hash_amd64.s 2.9 KB

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