// +build !noasm
// +build gc
// +build !purego

// Generated by PeachPy 0.2.0 from metro.py

// func Hash64(buffer_base uintptr, buffer_len int64, buffer_cap int64, seed uint64) uint64
TEXT ·Hash64(SB),4,$0-40
	MOVQ seed+24(FP), AX
	MOVQ buffer_base+0(FP), BX
	MOVQ buffer_len+8(FP), CX
	MOVQ $3603962101, DX
	IMULQ DX, AX
	MOVQ $5961697176435608501, DX
	ADDQ DX, AX
	CMPQ CX, $32
	JLT after32
	MOVQ AX, DX
	MOVQ AX, DI
	MOVQ AX, SI
	MOVQ AX, BP
loop_begin:
		MOVQ 0(BX), R8
		MOVQ $3603962101, R9
		IMULQ R9, R8
		ADDQ R8, DX
		RORQ $29, DX
		ADDQ SI, DX
		MOVQ 8(BX), R8
		MOVQ $2729050939, R9
		IMULQ R9, R8
		ADDQ R8, DI
		RORQ $29, DI
		ADDQ BP, DI
		MOVQ 16(BX), R8
		MOVQ $1654206401, R9
		IMULQ R9, R8
		ADDQ R8, SI
		RORQ $29, SI
		ADDQ DX, SI
		MOVQ 24(BX), R8
		MOVQ $817650473, R9
		IMULQ R9, R8
		ADDQ R8, BP
		RORQ $29, BP
		ADDQ DI, BP
		ADDQ $32, BX
		SUBQ $32, CX
		CMPQ CX, $32
		JGE loop_begin
	MOVQ DX, R8
	ADDQ BP, R8
	MOVQ $3603962101, R9
	IMULQ R9, R8
	ADDQ DI, R8
	RORQ $37, R8
	MOVQ $2729050939, R9
	IMULQ R9, R8
	XORQ R8, SI
	MOVQ DI, R8
	ADDQ SI, R8
	MOVQ $2729050939, R9
	IMULQ R9, R8
	ADDQ DX, R8
	RORQ $37, R8
	MOVQ $3603962101, R9
	IMULQ R9, R8
	XORQ R8, BP
	MOVQ DX, R8
	ADDQ SI, R8
	MOVQ $3603962101, R9
	IMULQ R9, R8
	ADDQ BP, R8
	RORQ $37, R8
	MOVQ $2729050939, R9
	IMULQ R9, R8
	XORQ R8, DX
	MOVQ DI, R8
	ADDQ BP, R8
	MOVQ $2729050939, BP
	IMULQ BP, R8
	ADDQ SI, R8
	RORQ $37, R8
	MOVQ $3603962101, SI
	IMULQ SI, R8
	XORQ R8, DI
	XORQ DI, DX
	ADDQ DX, AX
after32:
	CMPQ CX, $16
	JLT after16
	MOVQ 0(BX), DX
	MOVQ $1654206401, DI
	IMULQ DI, DX
	ADDQ AX, DX
	ADDQ $8, BX
	SUBQ $8, CX
	RORQ $29, DX
	MOVQ $817650473, DI
	IMULQ DI, DX
	MOVQ 0(BX), DI
	MOVQ $1654206401, SI
	IMULQ SI, DI
	ADDQ AX, DI
	ADDQ $8, BX
	SUBQ $8, CX
	RORQ $29, DI
	MOVQ $817650473, SI
	IMULQ SI, DI
	MOVQ DX, SI
	MOVQ $3603962101, BP
	IMULQ BP, SI
	RORQ $21, SI
	ADDQ DI, SI
	XORQ SI, DX
	MOVQ DI, SI
	MOVQ $817650473, BP
	IMULQ BP, SI
	RORQ $21, SI
	ADDQ DX, SI
	XORQ SI, DI
	ADDQ DI, AX
after16:
	CMPQ CX, $8
	JLT after8
	MOVQ 0(BX), DX
	MOVQ $817650473, DI
	IMULQ DI, DX
	ADDQ DX, AX
	ADDQ $8, BX
	SUBQ $8, CX
	MOVQ AX, DX
	RORQ $55, DX
	MOVQ $2729050939, DI
	IMULQ DI, DX
	XORQ DX, AX
after8:
	CMPQ CX, $4
	JLT after4
	XORQ DX, DX
	MOVL 0(BX), DX
	MOVQ $817650473, DI
	IMULQ DI, DX
	ADDQ DX, AX
	ADDQ $4, BX
	SUBQ $4, CX
	MOVQ AX, DX
	RORQ $26, DX
	MOVQ $2729050939, DI
	IMULQ DI, DX
	XORQ DX, AX
after4:
	CMPQ CX, $2
	JLT after2
	XORQ DX, DX
	MOVW 0(BX), DX
	MOVQ $817650473, DI
	IMULQ DI, DX
	ADDQ DX, AX
	ADDQ $2, BX
	SUBQ $2, CX
	MOVQ AX, DX
	RORQ $48, DX
	MOVQ $2729050939, DI
	IMULQ DI, DX
	XORQ DX, AX
after2:
	CMPQ CX, $1
	JLT after1
	MOVBQZX 0(BX), BX
	MOVQ $817650473, CX
	IMULQ CX, BX
	ADDQ BX, AX
	MOVQ AX, BX
	RORQ $37, BX
	MOVQ $2729050939, CX
	IMULQ CX, BX
	XORQ BX, AX
after1:
	MOVQ AX, BX
	RORQ $28, BX
	XORQ BX, AX
	MOVQ $3603962101, BX
	IMULQ BX, AX
	MOVQ AX, BX
	RORQ $29, BX
	XORQ BX, AX
	MOVQ AX, ret+32(FP)
	RET

// func Hash64Str(buffer_base uintptr, buffer_len int64, seed uint64) uint64
TEXT ·Hash64Str(SB),4,$0-32
	MOVQ seed+16(FP), AX
	MOVQ buffer_base+0(FP), BX
	MOVQ buffer_len+8(FP), CX
	MOVQ $3603962101, DX
	IMULQ DX, AX
	MOVQ $5961697176435608501, DX
	ADDQ DX, AX
	CMPQ CX, $32
	JLT after32
	MOVQ AX, DX
	MOVQ AX, DI
	MOVQ AX, SI
	MOVQ AX, BP
loop_begin:
		MOVQ 0(BX), R8
		MOVQ $3603962101, R9
		IMULQ R9, R8
		ADDQ R8, DX
		RORQ $29, DX
		ADDQ SI, DX
		MOVQ 8(BX), R8
		MOVQ $2729050939, R9
		IMULQ R9, R8
		ADDQ R8, DI
		RORQ $29, DI
		ADDQ BP, DI
		MOVQ 16(BX), R8
		MOVQ $1654206401, R9
		IMULQ R9, R8
		ADDQ R8, SI
		RORQ $29, SI
		ADDQ DX, SI
		MOVQ 24(BX), R8
		MOVQ $817650473, R9
		IMULQ R9, R8
		ADDQ R8, BP
		RORQ $29, BP
		ADDQ DI, BP
		ADDQ $32, BX
		SUBQ $32, CX
		CMPQ CX, $32
		JGE loop_begin
	MOVQ DX, R8
	ADDQ BP, R8
	MOVQ $3603962101, R9
	IMULQ R9, R8
	ADDQ DI, R8
	RORQ $37, R8
	MOVQ $2729050939, R9
	IMULQ R9, R8
	XORQ R8, SI
	MOVQ DI, R8
	ADDQ SI, R8
	MOVQ $2729050939, R9
	IMULQ R9, R8
	ADDQ DX, R8
	RORQ $37, R8
	MOVQ $3603962101, R9
	IMULQ R9, R8
	XORQ R8, BP
	MOVQ DX, R8
	ADDQ SI, R8
	MOVQ $3603962101, R9
	IMULQ R9, R8
	ADDQ BP, R8
	RORQ $37, R8
	MOVQ $2729050939, R9
	IMULQ R9, R8
	XORQ R8, DX
	MOVQ DI, R8
	ADDQ BP, R8
	MOVQ $2729050939, BP
	IMULQ BP, R8
	ADDQ SI, R8
	RORQ $37, R8
	MOVQ $3603962101, SI
	IMULQ SI, R8
	XORQ R8, DI
	XORQ DI, DX
	ADDQ DX, AX
after32:
	CMPQ CX, $16
	JLT after16
	MOVQ 0(BX), DX
	MOVQ $1654206401, DI
	IMULQ DI, DX
	ADDQ AX, DX
	ADDQ $8, BX
	SUBQ $8, CX
	RORQ $29, DX
	MOVQ $817650473, DI
	IMULQ DI, DX
	MOVQ 0(BX), DI
	MOVQ $1654206401, SI
	IMULQ SI, DI
	ADDQ AX, DI
	ADDQ $8, BX
	SUBQ $8, CX
	RORQ $29, DI
	MOVQ $817650473, SI
	IMULQ SI, DI
	MOVQ DX, SI
	MOVQ $3603962101, BP
	IMULQ BP, SI
	RORQ $21, SI
	ADDQ DI, SI
	XORQ SI, DX
	MOVQ DI, SI
	MOVQ $817650473, BP
	IMULQ BP, SI
	RORQ $21, SI
	ADDQ DX, SI
	XORQ SI, DI
	ADDQ DI, AX
after16:
	CMPQ CX, $8
	JLT after8
	MOVQ 0(BX), DX
	MOVQ $817650473, DI
	IMULQ DI, DX
	ADDQ DX, AX
	ADDQ $8, BX
	SUBQ $8, CX
	MOVQ AX, DX
	RORQ $55, DX
	MOVQ $2729050939, DI
	IMULQ DI, DX
	XORQ DX, AX
after8:
	CMPQ CX, $4
	JLT after4
	XORQ DX, DX
	MOVL 0(BX), DX
	MOVQ $817650473, DI
	IMULQ DI, DX
	ADDQ DX, AX
	ADDQ $4, BX
	SUBQ $4, CX
	MOVQ AX, DX
	RORQ $26, DX
	MOVQ $2729050939, DI
	IMULQ DI, DX
	XORQ DX, AX
after4:
	CMPQ CX, $2
	JLT after2
	XORQ DX, DX
	MOVW 0(BX), DX
	MOVQ $817650473, DI
	IMULQ DI, DX
	ADDQ DX, AX
	ADDQ $2, BX
	SUBQ $2, CX
	MOVQ AX, DX
	RORQ $48, DX
	MOVQ $2729050939, DI
	IMULQ DI, DX
	XORQ DX, AX
after2:
	CMPQ CX, $1
	JLT after1
	MOVBQZX 0(BX), BX
	MOVQ $817650473, CX
	IMULQ CX, BX
	ADDQ BX, AX
	MOVQ AX, BX
	RORQ $37, BX
	MOVQ $2729050939, CX
	IMULQ CX, BX
	XORQ BX, AX
after1:
	MOVQ AX, BX
	RORQ $28, BX
	XORQ BX, AX
	MOVQ $3603962101, BX
	IMULQ BX, AX
	MOVQ AX, BX
	RORQ $29, BX
	XORQ BX, AX
	MOVQ AX, ret+24(FP)
	RET
