| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- // +build amd64,!appengine,!gccgo
- // This is a translation of the gcc output of FloodyBerry's pure-C public
- // domain siphash implementation at https://github.com/floodyberry/siphash
- // func Hash(k0, k1 uint64, b []byte) uint64
- TEXT ·Hash(SB),4,$0-48
- MOVQ k0+0(FP),CX
- MOVQ $0x736F6D6570736575,R9
- MOVQ k1+8(FP),DI
- MOVQ $0x6C7967656E657261,BX
- MOVQ $0x646F72616E646F6D,AX
- MOVQ b_len+24(FP),DX
- MOVQ DX,R11
- MOVQ DX,R10
- XORQ CX,R9
- XORQ CX,BX
- MOVQ $0x7465646279746573,CX
- XORQ DI,AX
- XORQ DI,CX
- SHLQ $0x38,R11
- XORQ DI,DI
- MOVQ b_base+16(FP),SI
- ANDQ $0xFFFFFFFFFFFFFFF8,R10
- JE afterLoop
- XCHGQ AX,AX
- loopBody:
- MOVQ 0(SI)(DI*1),R8
- ADDQ AX,R9
- RORQ $0x33,AX
- XORQ R9,AX
- RORQ $0x20,R9
- ADDQ $0x8,DI
- XORQ R8,CX
- ADDQ CX,BX
- RORQ $0x30,CX
- XORQ BX,CX
- ADDQ AX,BX
- RORQ $0x2F,AX
- ADDQ CX,R9
- RORQ $0x2B,CX
- XORQ BX,AX
- XORQ R9,CX
- RORQ $0x20,BX
- ADDQ AX,R9
- ADDQ CX,BX
- RORQ $0x33,AX
- RORQ $0x30,CX
- XORQ R9,AX
- XORQ BX,CX
- RORQ $0x20,R9
- ADDQ AX,BX
- ADDQ CX,R9
- RORQ $0x2F,AX
- RORQ $0x2B,CX
- XORQ BX,AX
- RORQ $0x20,BX
- XORQ R9,CX
- XORQ R8,R9
- CMPQ R10,DI
- JA loopBody
- afterLoop:
- SUBQ R10,DX
- CMPQ DX,$0x7
- JA afterSwitch
- // no support for jump tables
- CMPQ DX,$0x7
- JE sw7
- CMPQ DX,$0x6
- JE sw6
- CMPQ DX,$0x5
- JE sw5
- CMPQ DX,$0x4
- JE sw4
- CMPQ DX,$0x3
- JE sw3
- CMPQ DX,$0x2
- JE sw2
- CMPQ DX,$0x1
- JE sw1
- JMP afterSwitch
- sw7: MOVBQZX 6(SI)(DI*1),DX
- SHLQ $0x30,DX
- ORQ DX,R11
- sw6: MOVBQZX 0x5(SI)(DI*1),DX
- SHLQ $0x28,DX
- ORQ DX,R11
- sw5: MOVBQZX 0x4(SI)(DI*1),DX
- SHLQ $0x20,DX
- ORQ DX,R11
- sw4: MOVBQZX 0x3(SI)(DI*1),DX
- SHLQ $0x18,DX
- ORQ DX,R11
- sw3: MOVBQZX 0x2(SI)(DI*1),DX
- SHLQ $0x10,DX
- ORQ DX,R11
- sw2: MOVBQZX 0x1(SI)(DI*1),DX
- SHLQ $0x8,DX
- ORQ DX,R11
- sw1: MOVBQZX 0(SI)(DI*1),DX
- ORQ DX,R11
- afterSwitch:
- LEAQ (AX)(R9*1),SI
- XORQ R11,CX
- RORQ $0x33,AX
- ADDQ CX,BX
- MOVQ CX,DX
- XORQ SI,AX
- RORQ $0x30,DX
- RORQ $0x20,SI
- LEAQ 0(BX)(AX*1),CX
- XORQ BX,DX
- RORQ $0x2F,AX
- ADDQ DX,SI
- RORQ $0x2B,DX
- XORQ CX,AX
- XORQ SI,DX
- RORQ $0x20,CX
- ADDQ AX,SI
- RORQ $0x33,AX
- ADDQ DX,CX
- XORQ SI,AX
- RORQ $0x30,DX
- RORQ $0x20,SI
- XORQ CX,DX
- ADDQ AX,CX
- RORQ $0x2F,AX
- ADDQ DX,SI
- XORQ CX,AX
- RORQ $0x2B,DX
- RORQ $0x20,CX
- XORQ SI,DX
- XORQ R11,SI
- XORB $0xFF,CL
- ADDQ AX,SI
- RORQ $0x33,AX
- ADDQ DX,CX
- RORQ $0x30,DX
- XORQ SI,AX
- XORQ CX,DX
- RORQ $0x20,SI
- ADDQ AX,CX
- ADDQ DX,SI
- RORQ $0x2F,AX
- RORQ $0x2B,DX
- XORQ CX,AX
- XORQ SI,DX
- RORQ $0x20,CX
- ADDQ AX,SI
- ADDQ DX,CX
- RORQ $0x33,AX
- RORQ $0x30,DX
- XORQ SI,AX
- RORQ $0x20,SI
- XORQ CX,DX
- ADDQ AX,CX
- RORQ $0x2F,AX
- ADDQ DX,SI
- RORQ $0x2B,DX
- XORQ CX,AX
- XORQ SI,DX
- RORQ $0x20,CX
- ADDQ AX,SI
- ADDQ DX,CX
- RORQ $0x33,AX
- RORQ $0x30,DX
- XORQ CX,DX
- XORQ SI,AX
- RORQ $0x20,SI
- ADDQ DX,SI
- ADDQ AX,CX
- RORQ $0x2F,AX
- XORQ CX,AX
- RORQ $0x2B,DX
- RORQ $0x20,CX
- XORQ SI,DX
- ADDQ AX,SI
- RORQ $0x33,AX
- ADDQ DX,CX
- XORQ SI,AX
- RORQ $0x30,DX
- XORQ CX,DX
- ADDQ AX,CX
- RORQ $0x2F,AX
- XORQ CX,AX
- RORQ $0x2B,DX
- RORQ $0x20,CX
- XORQ DX,AX
- XORQ CX,AX
- MOVQ AX,ret+40(FP)
- RET
|