Implement Prometheus metrics
This commit is contained in:
		
							
								
								
									
										8
									
								
								vendor/github.com/cespare/xxhash/v2/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/cespare/xxhash/v2/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| language: go | ||||
| go: | ||||
|   - "1.x" | ||||
|   - master | ||||
| env: | ||||
|   - TAGS="" | ||||
|   - TAGS="-tags purego" | ||||
| script: go test $TAGS -v ./... | ||||
							
								
								
									
										22
									
								
								vendor/github.com/cespare/xxhash/v2/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/cespare/xxhash/v2/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| Copyright (c) 2016 Caleb Spare | ||||
|  | ||||
| MIT License | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining | ||||
| a copy of this software and associated documentation files (the | ||||
| "Software"), to deal in the Software without restriction, including | ||||
| without limitation the rights to use, copy, modify, merge, publish, | ||||
| distribute, sublicense, and/or sell copies of the Software, and to | ||||
| permit persons to whom the Software is furnished to do so, subject to | ||||
| the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be | ||||
| included in all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | ||||
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | ||||
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | ||||
| WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
							
								
								
									
										55
									
								
								vendor/github.com/cespare/xxhash/v2/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								vendor/github.com/cespare/xxhash/v2/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| # xxhash | ||||
|  | ||||
| [](https://godoc.org/github.com/cespare/xxhash) | ||||
| [](https://travis-ci.org/cespare/xxhash) | ||||
|  | ||||
| xxhash is a Go implementation of the 64-bit | ||||
| [xxHash](http://cyan4973.github.io/xxHash/) algorithm, XXH64. This is a | ||||
| high-quality hashing algorithm that is much faster than anything in the Go | ||||
| standard library. | ||||
|  | ||||
| This package provides a straightforward API: | ||||
|  | ||||
| ``` | ||||
| func Sum64(b []byte) uint64 | ||||
| func Sum64String(s string) uint64 | ||||
| type Digest struct{ ... } | ||||
|     func New() *Digest | ||||
| ``` | ||||
|  | ||||
| The `Digest` type implements hash.Hash64. Its key methods are: | ||||
|  | ||||
| ``` | ||||
| func (*Digest) Write([]byte) (int, error) | ||||
| func (*Digest) WriteString(string) (int, error) | ||||
| func (*Digest) Sum64() uint64 | ||||
| ``` | ||||
|  | ||||
| This implementation provides a fast pure-Go implementation and an even faster | ||||
| assembly implementation for amd64. | ||||
|  | ||||
| ## Benchmarks | ||||
|  | ||||
| Here are some quick benchmarks comparing the pure-Go and assembly | ||||
| implementations of Sum64. | ||||
|  | ||||
| | input size | purego | asm | | ||||
| | --- | --- | --- | | ||||
| | 5 B   |  979.66 MB/s |  1291.17 MB/s  | | ||||
| | 100 B | 7475.26 MB/s | 7973.40 MB/s  | | ||||
| | 4 KB  | 17573.46 MB/s | 17602.65 MB/s | | ||||
| | 10 MB | 17131.46 MB/s | 17142.16 MB/s | | ||||
|  | ||||
| These numbers were generated on Ubuntu 18.04 with an Intel i7-8700K CPU using | ||||
| the following commands under Go 1.11.2: | ||||
|  | ||||
| ``` | ||||
| $ go test -tags purego -benchtime 10s -bench '/xxhash,direct,bytes' | ||||
| $ go test -benchtime 10s -bench '/xxhash,direct,bytes' | ||||
| ``` | ||||
|  | ||||
| ## Projects using this package | ||||
|  | ||||
| - [InfluxDB](https://github.com/influxdata/influxdb) | ||||
| - [Prometheus](https://github.com/prometheus/prometheus) | ||||
| - [FreeCache](https://github.com/coocood/freecache) | ||||
							
								
								
									
										3
									
								
								vendor/github.com/cespare/xxhash/v2/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/cespare/xxhash/v2/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| module github.com/cespare/xxhash/v2 | ||||
|  | ||||
| go 1.13 | ||||
							
								
								
									
										0
									
								
								vendor/github.com/cespare/xxhash/v2/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								vendor/github.com/cespare/xxhash/v2/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
									
										236
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										236
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,236 @@ | ||||
| // Package xxhash implements the 64-bit variant of xxHash (XXH64) as described | ||||
| // at http://cyan4973.github.io/xxHash/. | ||||
| package xxhash | ||||
|  | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"errors" | ||||
| 	"math/bits" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	prime1 uint64 = 11400714785074694791 | ||||
| 	prime2 uint64 = 14029467366897019727 | ||||
| 	prime3 uint64 = 1609587929392839161 | ||||
| 	prime4 uint64 = 9650029242287828579 | ||||
| 	prime5 uint64 = 2870177450012600261 | ||||
| ) | ||||
|  | ||||
| // NOTE(caleb): I'm using both consts and vars of the primes. Using consts where | ||||
| // possible in the Go code is worth a small (but measurable) performance boost | ||||
| // by avoiding some MOVQs. Vars are needed for the asm and also are useful for | ||||
| // convenience in the Go code in a few places where we need to intentionally | ||||
| // avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the | ||||
| // result overflows a uint64). | ||||
| var ( | ||||
| 	prime1v = prime1 | ||||
| 	prime2v = prime2 | ||||
| 	prime3v = prime3 | ||||
| 	prime4v = prime4 | ||||
| 	prime5v = prime5 | ||||
| ) | ||||
|  | ||||
| // Digest implements hash.Hash64. | ||||
| type Digest struct { | ||||
| 	v1    uint64 | ||||
| 	v2    uint64 | ||||
| 	v3    uint64 | ||||
| 	v4    uint64 | ||||
| 	total uint64 | ||||
| 	mem   [32]byte | ||||
| 	n     int // how much of mem is used | ||||
| } | ||||
|  | ||||
| // New creates a new Digest that computes the 64-bit xxHash algorithm. | ||||
| func New() *Digest { | ||||
| 	var d Digest | ||||
| 	d.Reset() | ||||
| 	return &d | ||||
| } | ||||
|  | ||||
| // Reset clears the Digest's state so that it can be reused. | ||||
| func (d *Digest) Reset() { | ||||
| 	d.v1 = prime1v + prime2 | ||||
| 	d.v2 = prime2 | ||||
| 	d.v3 = 0 | ||||
| 	d.v4 = -prime1v | ||||
| 	d.total = 0 | ||||
| 	d.n = 0 | ||||
| } | ||||
|  | ||||
| // Size always returns 8 bytes. | ||||
| func (d *Digest) Size() int { return 8 } | ||||
|  | ||||
| // BlockSize always returns 32 bytes. | ||||
| func (d *Digest) BlockSize() int { return 32 } | ||||
|  | ||||
| // Write adds more data to d. It always returns len(b), nil. | ||||
| func (d *Digest) Write(b []byte) (n int, err error) { | ||||
| 	n = len(b) | ||||
| 	d.total += uint64(n) | ||||
|  | ||||
| 	if d.n+n < 32 { | ||||
| 		// This new data doesn't even fill the current block. | ||||
| 		copy(d.mem[d.n:], b) | ||||
| 		d.n += n | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if d.n > 0 { | ||||
| 		// Finish off the partial block. | ||||
| 		copy(d.mem[d.n:], b) | ||||
| 		d.v1 = round(d.v1, u64(d.mem[0:8])) | ||||
| 		d.v2 = round(d.v2, u64(d.mem[8:16])) | ||||
| 		d.v3 = round(d.v3, u64(d.mem[16:24])) | ||||
| 		d.v4 = round(d.v4, u64(d.mem[24:32])) | ||||
| 		b = b[32-d.n:] | ||||
| 		d.n = 0 | ||||
| 	} | ||||
|  | ||||
| 	if len(b) >= 32 { | ||||
| 		// One or more full blocks left. | ||||
| 		nw := writeBlocks(d, b) | ||||
| 		b = b[nw:] | ||||
| 	} | ||||
|  | ||||
| 	// Store any remaining partial block. | ||||
| 	copy(d.mem[:], b) | ||||
| 	d.n = len(b) | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Sum appends the current hash to b and returns the resulting slice. | ||||
| func (d *Digest) Sum(b []byte) []byte { | ||||
| 	s := d.Sum64() | ||||
| 	return append( | ||||
| 		b, | ||||
| 		byte(s>>56), | ||||
| 		byte(s>>48), | ||||
| 		byte(s>>40), | ||||
| 		byte(s>>32), | ||||
| 		byte(s>>24), | ||||
| 		byte(s>>16), | ||||
| 		byte(s>>8), | ||||
| 		byte(s), | ||||
| 	) | ||||
| } | ||||
|  | ||||
| // Sum64 returns the current hash. | ||||
| func (d *Digest) Sum64() uint64 { | ||||
| 	var h uint64 | ||||
|  | ||||
| 	if d.total >= 32 { | ||||
| 		v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4 | ||||
| 		h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4) | ||||
| 		h = mergeRound(h, v1) | ||||
| 		h = mergeRound(h, v2) | ||||
| 		h = mergeRound(h, v3) | ||||
| 		h = mergeRound(h, v4) | ||||
| 	} else { | ||||
| 		h = d.v3 + prime5 | ||||
| 	} | ||||
|  | ||||
| 	h += d.total | ||||
|  | ||||
| 	i, end := 0, d.n | ||||
| 	for ; i+8 <= end; i += 8 { | ||||
| 		k1 := round(0, u64(d.mem[i:i+8])) | ||||
| 		h ^= k1 | ||||
| 		h = rol27(h)*prime1 + prime4 | ||||
| 	} | ||||
| 	if i+4 <= end { | ||||
| 		h ^= uint64(u32(d.mem[i:i+4])) * prime1 | ||||
| 		h = rol23(h)*prime2 + prime3 | ||||
| 		i += 4 | ||||
| 	} | ||||
| 	for i < end { | ||||
| 		h ^= uint64(d.mem[i]) * prime5 | ||||
| 		h = rol11(h) * prime1 | ||||
| 		i++ | ||||
| 	} | ||||
|  | ||||
| 	h ^= h >> 33 | ||||
| 	h *= prime2 | ||||
| 	h ^= h >> 29 | ||||
| 	h *= prime3 | ||||
| 	h ^= h >> 32 | ||||
|  | ||||
| 	return h | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	magic         = "xxh\x06" | ||||
| 	marshaledSize = len(magic) + 8*5 + 32 | ||||
| ) | ||||
|  | ||||
| // MarshalBinary implements the encoding.BinaryMarshaler interface. | ||||
| func (d *Digest) MarshalBinary() ([]byte, error) { | ||||
| 	b := make([]byte, 0, marshaledSize) | ||||
| 	b = append(b, magic...) | ||||
| 	b = appendUint64(b, d.v1) | ||||
| 	b = appendUint64(b, d.v2) | ||||
| 	b = appendUint64(b, d.v3) | ||||
| 	b = appendUint64(b, d.v4) | ||||
| 	b = appendUint64(b, d.total) | ||||
| 	b = append(b, d.mem[:d.n]...) | ||||
| 	b = b[:len(b)+len(d.mem)-d.n] | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| // UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. | ||||
| func (d *Digest) UnmarshalBinary(b []byte) error { | ||||
| 	if len(b) < len(magic) || string(b[:len(magic)]) != magic { | ||||
| 		return errors.New("xxhash: invalid hash state identifier") | ||||
| 	} | ||||
| 	if len(b) != marshaledSize { | ||||
| 		return errors.New("xxhash: invalid hash state size") | ||||
| 	} | ||||
| 	b = b[len(magic):] | ||||
| 	b, d.v1 = consumeUint64(b) | ||||
| 	b, d.v2 = consumeUint64(b) | ||||
| 	b, d.v3 = consumeUint64(b) | ||||
| 	b, d.v4 = consumeUint64(b) | ||||
| 	b, d.total = consumeUint64(b) | ||||
| 	copy(d.mem[:], b) | ||||
| 	b = b[len(d.mem):] | ||||
| 	d.n = int(d.total % uint64(len(d.mem))) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func appendUint64(b []byte, x uint64) []byte { | ||||
| 	var a [8]byte | ||||
| 	binary.LittleEndian.PutUint64(a[:], x) | ||||
| 	return append(b, a[:]...) | ||||
| } | ||||
|  | ||||
| func consumeUint64(b []byte) ([]byte, uint64) { | ||||
| 	x := u64(b) | ||||
| 	return b[8:], x | ||||
| } | ||||
|  | ||||
| func u64(b []byte) uint64 { return binary.LittleEndian.Uint64(b) } | ||||
| func u32(b []byte) uint32 { return binary.LittleEndian.Uint32(b) } | ||||
|  | ||||
| func round(acc, input uint64) uint64 { | ||||
| 	acc += input * prime2 | ||||
| 	acc = rol31(acc) | ||||
| 	acc *= prime1 | ||||
| 	return acc | ||||
| } | ||||
|  | ||||
| func mergeRound(acc, val uint64) uint64 { | ||||
| 	val = round(0, val) | ||||
| 	acc ^= val | ||||
| 	acc = acc*prime1 + prime4 | ||||
| 	return acc | ||||
| } | ||||
|  | ||||
| func rol1(x uint64) uint64  { return bits.RotateLeft64(x, 1) } | ||||
| func rol7(x uint64) uint64  { return bits.RotateLeft64(x, 7) } | ||||
| func rol11(x uint64) uint64 { return bits.RotateLeft64(x, 11) } | ||||
| func rol12(x uint64) uint64 { return bits.RotateLeft64(x, 12) } | ||||
| func rol18(x uint64) uint64 { return bits.RotateLeft64(x, 18) } | ||||
| func rol23(x uint64) uint64 { return bits.RotateLeft64(x, 23) } | ||||
| func rol27(x uint64) uint64 { return bits.RotateLeft64(x, 27) } | ||||
| func rol31(x uint64) uint64 { return bits.RotateLeft64(x, 31) } | ||||
							
								
								
									
										13
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| // +build !appengine | ||||
| // +build gc | ||||
| // +build !purego | ||||
|  | ||||
| package xxhash | ||||
|  | ||||
| // Sum64 computes the 64-bit xxHash digest of b. | ||||
| // | ||||
| //go:noescape | ||||
| func Sum64(b []byte) uint64 | ||||
|  | ||||
| //go:noescape | ||||
| func writeBlocks(*Digest, []byte) int | ||||
							
								
								
									
										215
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,215 @@ | ||||
| // +build !appengine | ||||
| // +build gc | ||||
| // +build !purego | ||||
|  | ||||
| #include "textflag.h" | ||||
|  | ||||
| // Register allocation: | ||||
| // AX	h | ||||
| // CX	pointer to advance through b | ||||
| // DX	n | ||||
| // BX	loop end | ||||
| // R8	v1, k1 | ||||
| // R9	v2 | ||||
| // R10	v3 | ||||
| // R11	v4 | ||||
| // R12	tmp | ||||
| // R13	prime1v | ||||
| // R14	prime2v | ||||
| // R15	prime4v | ||||
|  | ||||
| // round reads from and advances the buffer pointer in CX. | ||||
| // It assumes that R13 has prime1v and R14 has prime2v. | ||||
| #define round(r) \ | ||||
| 	MOVQ  (CX), R12 \ | ||||
| 	ADDQ  $8, CX    \ | ||||
| 	IMULQ R14, R12  \ | ||||
| 	ADDQ  R12, r    \ | ||||
| 	ROLQ  $31, r    \ | ||||
| 	IMULQ R13, r | ||||
|  | ||||
| // mergeRound applies a merge round on the two registers acc and val. | ||||
| // It assumes that R13 has prime1v, R14 has prime2v, and R15 has prime4v. | ||||
| #define mergeRound(acc, val) \ | ||||
| 	IMULQ R14, val \ | ||||
| 	ROLQ  $31, val \ | ||||
| 	IMULQ R13, val \ | ||||
| 	XORQ  val, acc \ | ||||
| 	IMULQ R13, acc \ | ||||
| 	ADDQ  R15, acc | ||||
|  | ||||
| // func Sum64(b []byte) uint64 | ||||
| TEXT ·Sum64(SB), NOSPLIT, $0-32 | ||||
| 	// Load fixed primes. | ||||
| 	MOVQ ·prime1v(SB), R13 | ||||
| 	MOVQ ·prime2v(SB), R14 | ||||
| 	MOVQ ·prime4v(SB), R15 | ||||
|  | ||||
| 	// Load slice. | ||||
| 	MOVQ b_base+0(FP), CX | ||||
| 	MOVQ b_len+8(FP), DX | ||||
| 	LEAQ (CX)(DX*1), BX | ||||
|  | ||||
| 	// The first loop limit will be len(b)-32. | ||||
| 	SUBQ $32, BX | ||||
|  | ||||
| 	// Check whether we have at least one block. | ||||
| 	CMPQ DX, $32 | ||||
| 	JLT  noBlocks | ||||
|  | ||||
| 	// Set up initial state (v1, v2, v3, v4). | ||||
| 	MOVQ R13, R8 | ||||
| 	ADDQ R14, R8 | ||||
| 	MOVQ R14, R9 | ||||
| 	XORQ R10, R10 | ||||
| 	XORQ R11, R11 | ||||
| 	SUBQ R13, R11 | ||||
|  | ||||
| 	// Loop until CX > BX. | ||||
| blockLoop: | ||||
| 	round(R8) | ||||
| 	round(R9) | ||||
| 	round(R10) | ||||
| 	round(R11) | ||||
|  | ||||
| 	CMPQ CX, BX | ||||
| 	JLE  blockLoop | ||||
|  | ||||
| 	MOVQ R8, AX | ||||
| 	ROLQ $1, AX | ||||
| 	MOVQ R9, R12 | ||||
| 	ROLQ $7, R12 | ||||
| 	ADDQ R12, AX | ||||
| 	MOVQ R10, R12 | ||||
| 	ROLQ $12, R12 | ||||
| 	ADDQ R12, AX | ||||
| 	MOVQ R11, R12 | ||||
| 	ROLQ $18, R12 | ||||
| 	ADDQ R12, AX | ||||
|  | ||||
| 	mergeRound(AX, R8) | ||||
| 	mergeRound(AX, R9) | ||||
| 	mergeRound(AX, R10) | ||||
| 	mergeRound(AX, R11) | ||||
|  | ||||
| 	JMP afterBlocks | ||||
|  | ||||
| noBlocks: | ||||
| 	MOVQ ·prime5v(SB), AX | ||||
|  | ||||
| afterBlocks: | ||||
| 	ADDQ DX, AX | ||||
|  | ||||
| 	// Right now BX has len(b)-32, and we want to loop until CX > len(b)-8. | ||||
| 	ADDQ $24, BX | ||||
|  | ||||
| 	CMPQ CX, BX | ||||
| 	JG   fourByte | ||||
|  | ||||
| wordLoop: | ||||
| 	// Calculate k1. | ||||
| 	MOVQ  (CX), R8 | ||||
| 	ADDQ  $8, CX | ||||
| 	IMULQ R14, R8 | ||||
| 	ROLQ  $31, R8 | ||||
| 	IMULQ R13, R8 | ||||
|  | ||||
| 	XORQ  R8, AX | ||||
| 	ROLQ  $27, AX | ||||
| 	IMULQ R13, AX | ||||
| 	ADDQ  R15, AX | ||||
|  | ||||
| 	CMPQ CX, BX | ||||
| 	JLE  wordLoop | ||||
|  | ||||
| fourByte: | ||||
| 	ADDQ $4, BX | ||||
| 	CMPQ CX, BX | ||||
| 	JG   singles | ||||
|  | ||||
| 	MOVL  (CX), R8 | ||||
| 	ADDQ  $4, CX | ||||
| 	IMULQ R13, R8 | ||||
| 	XORQ  R8, AX | ||||
|  | ||||
| 	ROLQ  $23, AX | ||||
| 	IMULQ R14, AX | ||||
| 	ADDQ  ·prime3v(SB), AX | ||||
|  | ||||
| singles: | ||||
| 	ADDQ $4, BX | ||||
| 	CMPQ CX, BX | ||||
| 	JGE  finalize | ||||
|  | ||||
| singlesLoop: | ||||
| 	MOVBQZX (CX), R12 | ||||
| 	ADDQ    $1, CX | ||||
| 	IMULQ   ·prime5v(SB), R12 | ||||
| 	XORQ    R12, AX | ||||
|  | ||||
| 	ROLQ  $11, AX | ||||
| 	IMULQ R13, AX | ||||
|  | ||||
| 	CMPQ CX, BX | ||||
| 	JL   singlesLoop | ||||
|  | ||||
| finalize: | ||||
| 	MOVQ  AX, R12 | ||||
| 	SHRQ  $33, R12 | ||||
| 	XORQ  R12, AX | ||||
| 	IMULQ R14, AX | ||||
| 	MOVQ  AX, R12 | ||||
| 	SHRQ  $29, R12 | ||||
| 	XORQ  R12, AX | ||||
| 	IMULQ ·prime3v(SB), AX | ||||
| 	MOVQ  AX, R12 | ||||
| 	SHRQ  $32, R12 | ||||
| 	XORQ  R12, AX | ||||
|  | ||||
| 	MOVQ AX, ret+24(FP) | ||||
| 	RET | ||||
|  | ||||
| // writeBlocks uses the same registers as above except that it uses AX to store | ||||
| // the d pointer. | ||||
|  | ||||
| // func writeBlocks(d *Digest, b []byte) int | ||||
| TEXT ·writeBlocks(SB), NOSPLIT, $0-40 | ||||
| 	// Load fixed primes needed for round. | ||||
| 	MOVQ ·prime1v(SB), R13 | ||||
| 	MOVQ ·prime2v(SB), R14 | ||||
|  | ||||
| 	// Load slice. | ||||
| 	MOVQ b_base+8(FP), CX | ||||
| 	MOVQ b_len+16(FP), DX | ||||
| 	LEAQ (CX)(DX*1), BX | ||||
| 	SUBQ $32, BX | ||||
|  | ||||
| 	// Load vN from d. | ||||
| 	MOVQ d+0(FP), AX | ||||
| 	MOVQ 0(AX), R8   // v1 | ||||
| 	MOVQ 8(AX), R9   // v2 | ||||
| 	MOVQ 16(AX), R10 // v3 | ||||
| 	MOVQ 24(AX), R11 // v4 | ||||
|  | ||||
| 	// We don't need to check the loop condition here; this function is | ||||
| 	// always called with at least one block of data to process. | ||||
| blockLoop: | ||||
| 	round(R8) | ||||
| 	round(R9) | ||||
| 	round(R10) | ||||
| 	round(R11) | ||||
|  | ||||
| 	CMPQ CX, BX | ||||
| 	JLE  blockLoop | ||||
|  | ||||
| 	// Copy vN back to d. | ||||
| 	MOVQ R8, 0(AX) | ||||
| 	MOVQ R9, 8(AX) | ||||
| 	MOVQ R10, 16(AX) | ||||
| 	MOVQ R11, 24(AX) | ||||
|  | ||||
| 	// The number of bytes written is CX minus the old base pointer. | ||||
| 	SUBQ b_base+8(FP), CX | ||||
| 	MOVQ CX, ret+32(FP) | ||||
|  | ||||
| 	RET | ||||
							
								
								
									
										76
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_other.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_other.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | ||||
| // +build !amd64 appengine !gc purego | ||||
|  | ||||
| package xxhash | ||||
|  | ||||
| // Sum64 computes the 64-bit xxHash digest of b. | ||||
| func Sum64(b []byte) uint64 { | ||||
| 	// A simpler version would be | ||||
| 	//   d := New() | ||||
| 	//   d.Write(b) | ||||
| 	//   return d.Sum64() | ||||
| 	// but this is faster, particularly for small inputs. | ||||
|  | ||||
| 	n := len(b) | ||||
| 	var h uint64 | ||||
|  | ||||
| 	if n >= 32 { | ||||
| 		v1 := prime1v + prime2 | ||||
| 		v2 := prime2 | ||||
| 		v3 := uint64(0) | ||||
| 		v4 := -prime1v | ||||
| 		for len(b) >= 32 { | ||||
| 			v1 = round(v1, u64(b[0:8:len(b)])) | ||||
| 			v2 = round(v2, u64(b[8:16:len(b)])) | ||||
| 			v3 = round(v3, u64(b[16:24:len(b)])) | ||||
| 			v4 = round(v4, u64(b[24:32:len(b)])) | ||||
| 			b = b[32:len(b):len(b)] | ||||
| 		} | ||||
| 		h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4) | ||||
| 		h = mergeRound(h, v1) | ||||
| 		h = mergeRound(h, v2) | ||||
| 		h = mergeRound(h, v3) | ||||
| 		h = mergeRound(h, v4) | ||||
| 	} else { | ||||
| 		h = prime5 | ||||
| 	} | ||||
|  | ||||
| 	h += uint64(n) | ||||
|  | ||||
| 	i, end := 0, len(b) | ||||
| 	for ; i+8 <= end; i += 8 { | ||||
| 		k1 := round(0, u64(b[i:i+8:len(b)])) | ||||
| 		h ^= k1 | ||||
| 		h = rol27(h)*prime1 + prime4 | ||||
| 	} | ||||
| 	if i+4 <= end { | ||||
| 		h ^= uint64(u32(b[i:i+4:len(b)])) * prime1 | ||||
| 		h = rol23(h)*prime2 + prime3 | ||||
| 		i += 4 | ||||
| 	} | ||||
| 	for ; i < end; i++ { | ||||
| 		h ^= uint64(b[i]) * prime5 | ||||
| 		h = rol11(h) * prime1 | ||||
| 	} | ||||
|  | ||||
| 	h ^= h >> 33 | ||||
| 	h *= prime2 | ||||
| 	h ^= h >> 29 | ||||
| 	h *= prime3 | ||||
| 	h ^= h >> 32 | ||||
|  | ||||
| 	return h | ||||
| } | ||||
|  | ||||
| func writeBlocks(d *Digest, b []byte) int { | ||||
| 	v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4 | ||||
| 	n := len(b) | ||||
| 	for len(b) >= 32 { | ||||
| 		v1 = round(v1, u64(b[0:8:len(b)])) | ||||
| 		v2 = round(v2, u64(b[8:16:len(b)])) | ||||
| 		v3 = round(v3, u64(b[16:24:len(b)])) | ||||
| 		v4 = round(v4, u64(b[24:32:len(b)])) | ||||
| 		b = b[32:len(b):len(b)] | ||||
| 	} | ||||
| 	d.v1, d.v2, d.v3, d.v4 = v1, v2, v3, v4 | ||||
| 	return n - len(b) | ||||
| } | ||||
							
								
								
									
										15
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| // +build appengine | ||||
|  | ||||
| // This file contains the safe implementations of otherwise unsafe-using code. | ||||
|  | ||||
| package xxhash | ||||
|  | ||||
| // Sum64String computes the 64-bit xxHash digest of s. | ||||
| func Sum64String(s string) uint64 { | ||||
| 	return Sum64([]byte(s)) | ||||
| } | ||||
|  | ||||
| // WriteString adds more data to d. It always returns len(s), nil. | ||||
| func (d *Digest) WriteString(s string) (n int, err error) { | ||||
| 	return d.Write([]byte(s)) | ||||
| } | ||||
							
								
								
									
										46
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | ||||
| // +build !appengine | ||||
|  | ||||
| // This file encapsulates usage of unsafe. | ||||
| // xxhash_safe.go contains the safe implementations. | ||||
|  | ||||
| package xxhash | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"unsafe" | ||||
| ) | ||||
|  | ||||
| // Notes: | ||||
| // | ||||
| // See https://groups.google.com/d/msg/golang-nuts/dcjzJy-bSpw/tcZYBzQqAQAJ | ||||
| // for some discussion about these unsafe conversions. | ||||
| // | ||||
| // In the future it's possible that compiler optimizations will make these | ||||
| // unsafe operations unnecessary: https://golang.org/issue/2205. | ||||
| // | ||||
| // Both of these wrapper functions still incur function call overhead since they | ||||
| // will not be inlined. We could write Go/asm copies of Sum64 and Digest.Write | ||||
| // for strings to squeeze out a bit more speed. Mid-stack inlining should | ||||
| // eventually fix this. | ||||
|  | ||||
| // Sum64String computes the 64-bit xxHash digest of s. | ||||
| // It may be faster than Sum64([]byte(s)) by avoiding a copy. | ||||
| func Sum64String(s string) uint64 { | ||||
| 	var b []byte | ||||
| 	bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) | ||||
| 	bh.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data | ||||
| 	bh.Len = len(s) | ||||
| 	bh.Cap = len(s) | ||||
| 	return Sum64(b) | ||||
| } | ||||
|  | ||||
| // WriteString adds more data to d. It always returns len(s), nil. | ||||
| // It may be faster than Write([]byte(s)) by avoiding a copy. | ||||
| func (d *Digest) WriteString(s string) (n int, err error) { | ||||
| 	var b []byte | ||||
| 	bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) | ||||
| 	bh.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data | ||||
| 	bh.Len = len(s) | ||||
| 	bh.Cap = len(s) | ||||
| 	return d.Write(b) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user