mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-03 23:12:26 -06:00 
			
		
		
		
	[feature] Read + Write tombstones for deleted Actors (#1005)
* [feature] Read + Write tombstones for deleted Actors * copyTombstone * update to use resultcache instead of old ttl cache Signed-off-by: kim <grufwub@gmail.com> * update go-cache library to fix result cache capacity / ordering bugs Signed-off-by: kim <grufwub@gmail.com> * bump go-cache/v3 to v3.1.6 to fix bugs Signed-off-by: kim <grufwub@gmail.com> * switch on status code * better explain ErrGone reasoning Signed-off-by: kim <grufwub@gmail.com> Co-authored-by: kim <grufwub@gmail.com>
This commit is contained in:
		
					parent
					
						
							
								948e90b95a
							
						
					
				
			
			
				commit
				
					
						edcee14d07
					
				
			
		
					 47 changed files with 3808 additions and 7 deletions
				
			
		
							
								
								
									
										22
									
								
								vendor/github.com/cespare/xxhash/LICENSE.txt
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/cespare/xxhash/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.
 | 
			
		||||
							
								
								
									
										50
									
								
								vendor/github.com/cespare/xxhash/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								vendor/github.com/cespare/xxhash/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
# xxhash
 | 
			
		||||
 | 
			
		||||
[](https://godoc.org/github.com/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.
 | 
			
		||||
 | 
			
		||||
The API is very small, taking its cue from the other hashing packages in the
 | 
			
		||||
standard library:
 | 
			
		||||
 | 
			
		||||
    $ go doc github.com/cespare/xxhash                                                                                                                                                                                              !
 | 
			
		||||
    package xxhash // import "github.com/cespare/xxhash"
 | 
			
		||||
 | 
			
		||||
    Package xxhash implements the 64-bit variant of xxHash (XXH64) as described
 | 
			
		||||
    at http://cyan4973.github.io/xxHash/.
 | 
			
		||||
 | 
			
		||||
    func New() hash.Hash64
 | 
			
		||||
    func Sum64(b []byte) uint64
 | 
			
		||||
    func Sum64String(s string) 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 against another popular Go XXH64 implementation,
 | 
			
		||||
[github.com/OneOfOne/xxhash](https://github.com/OneOfOne/xxhash):
 | 
			
		||||
 | 
			
		||||
| input size | OneOfOne | cespare (purego) | cespare |
 | 
			
		||||
| --- | --- | --- | --- |
 | 
			
		||||
| 5 B   |  416 MB/s | 720 MB/s |  872 MB/s  |
 | 
			
		||||
| 100 B | 3980 MB/s | 5013 MB/s | 5252 MB/s  |
 | 
			
		||||
| 4 KB  | 12727 MB/s | 12999 MB/s | 13026 MB/s |
 | 
			
		||||
| 10 MB | 9879 MB/s | 10775 MB/s | 10913 MB/s  |
 | 
			
		||||
 | 
			
		||||
These numbers were generated with:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ go test -benchtime 10s -bench '/OneOfOne,'
 | 
			
		||||
$ go test -tags purego -benchtime 10s -bench '/xxhash,'
 | 
			
		||||
$ go test -benchtime 10s -bench '/xxhash,'
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Projects using this package
 | 
			
		||||
 | 
			
		||||
- [InfluxDB](https://github.com/influxdata/influxdb)
 | 
			
		||||
- [Prometheus](https://github.com/prometheus/prometheus)
 | 
			
		||||
							
								
								
									
										14
									
								
								vendor/github.com/cespare/xxhash/rotate.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/cespare/xxhash/rotate.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
// +build !go1.9
 | 
			
		||||
 | 
			
		||||
package xxhash
 | 
			
		||||
 | 
			
		||||
// TODO(caleb): After Go 1.10 comes out, remove this fallback code.
 | 
			
		||||
 | 
			
		||||
func rol1(x uint64) uint64  { return (x << 1) | (x >> (64 - 1)) }
 | 
			
		||||
func rol7(x uint64) uint64  { return (x << 7) | (x >> (64 - 7)) }
 | 
			
		||||
func rol11(x uint64) uint64 { return (x << 11) | (x >> (64 - 11)) }
 | 
			
		||||
func rol12(x uint64) uint64 { return (x << 12) | (x >> (64 - 12)) }
 | 
			
		||||
func rol18(x uint64) uint64 { return (x << 18) | (x >> (64 - 18)) }
 | 
			
		||||
func rol23(x uint64) uint64 { return (x << 23) | (x >> (64 - 23)) }
 | 
			
		||||
func rol27(x uint64) uint64 { return (x << 27) | (x >> (64 - 27)) }
 | 
			
		||||
func rol31(x uint64) uint64 { return (x << 31) | (x >> (64 - 31)) }
 | 
			
		||||
							
								
								
									
										14
									
								
								vendor/github.com/cespare/xxhash/rotate19.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/cespare/xxhash/rotate19.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
// +build go1.9
 | 
			
		||||
 | 
			
		||||
package xxhash
 | 
			
		||||
 | 
			
		||||
import "math/bits"
 | 
			
		||||
 | 
			
		||||
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) }
 | 
			
		||||
							
								
								
									
										168
									
								
								vendor/github.com/cespare/xxhash/xxhash.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								vendor/github.com/cespare/xxhash/xxhash.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,168 @@
 | 
			
		|||
// Package xxhash implements the 64-bit variant of xxHash (XXH64) as described
 | 
			
		||||
// at http://cyan4973.github.io/xxHash/.
 | 
			
		||||
package xxhash
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/binary"
 | 
			
		||||
	"hash"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type xxh struct {
 | 
			
		||||
	v1    uint64
 | 
			
		||||
	v2    uint64
 | 
			
		||||
	v3    uint64
 | 
			
		||||
	v4    uint64
 | 
			
		||||
	total int
 | 
			
		||||
	mem   [32]byte
 | 
			
		||||
	n     int // how much of mem is used
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// New creates a new hash.Hash64 that implements the 64-bit xxHash algorithm.
 | 
			
		||||
func New() hash.Hash64 {
 | 
			
		||||
	var x xxh
 | 
			
		||||
	x.Reset()
 | 
			
		||||
	return &x
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *xxh) Reset() {
 | 
			
		||||
	x.n = 0
 | 
			
		||||
	x.total = 0
 | 
			
		||||
	x.v1 = prime1v + prime2
 | 
			
		||||
	x.v2 = prime2
 | 
			
		||||
	x.v3 = 0
 | 
			
		||||
	x.v4 = -prime1v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *xxh) Size() int      { return 8 }
 | 
			
		||||
func (x *xxh) BlockSize() int { return 32 }
 | 
			
		||||
 | 
			
		||||
// Write adds more data to x. It always returns len(b), nil.
 | 
			
		||||
func (x *xxh) Write(b []byte) (n int, err error) {
 | 
			
		||||
	n = len(b)
 | 
			
		||||
	x.total += len(b)
 | 
			
		||||
 | 
			
		||||
	if x.n+len(b) < 32 {
 | 
			
		||||
		// This new data doesn't even fill the current block.
 | 
			
		||||
		copy(x.mem[x.n:], b)
 | 
			
		||||
		x.n += len(b)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if x.n > 0 {
 | 
			
		||||
		// Finish off the partial block.
 | 
			
		||||
		copy(x.mem[x.n:], b)
 | 
			
		||||
		x.v1 = round(x.v1, u64(x.mem[0:8]))
 | 
			
		||||
		x.v2 = round(x.v2, u64(x.mem[8:16]))
 | 
			
		||||
		x.v3 = round(x.v3, u64(x.mem[16:24]))
 | 
			
		||||
		x.v4 = round(x.v4, u64(x.mem[24:32]))
 | 
			
		||||
		b = b[32-x.n:]
 | 
			
		||||
		x.n = 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(b) >= 32 {
 | 
			
		||||
		// One or more full blocks left.
 | 
			
		||||
		b = writeBlocks(x, b)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Store any remaining partial block.
 | 
			
		||||
	copy(x.mem[:], b)
 | 
			
		||||
	x.n = len(b)
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *xxh) Sum(b []byte) []byte {
 | 
			
		||||
	s := x.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),
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *xxh) Sum64() uint64 {
 | 
			
		||||
	var h uint64
 | 
			
		||||
 | 
			
		||||
	if x.total >= 32 {
 | 
			
		||||
		v1, v2, v3, v4 := x.v1, x.v2, x.v3, x.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 = x.v3 + prime5
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	h += uint64(x.total)
 | 
			
		||||
 | 
			
		||||
	i, end := 0, x.n
 | 
			
		||||
	for ; i+8 <= end; i += 8 {
 | 
			
		||||
		k1 := round(0, u64(x.mem[i:i+8]))
 | 
			
		||||
		h ^= k1
 | 
			
		||||
		h = rol27(h)*prime1 + prime4
 | 
			
		||||
	}
 | 
			
		||||
	if i+4 <= end {
 | 
			
		||||
		h ^= uint64(u32(x.mem[i:i+4])) * prime1
 | 
			
		||||
		h = rol23(h)*prime2 + prime3
 | 
			
		||||
		i += 4
 | 
			
		||||
	}
 | 
			
		||||
	for i < end {
 | 
			
		||||
		h ^= uint64(x.mem[i]) * prime5
 | 
			
		||||
		h = rol11(h) * prime1
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	h ^= h >> 33
 | 
			
		||||
	h *= prime2
 | 
			
		||||
	h ^= h >> 29
 | 
			
		||||
	h *= prime3
 | 
			
		||||
	h ^= h >> 32
 | 
			
		||||
 | 
			
		||||
	return h
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								vendor/github.com/cespare/xxhash/xxhash_amd64.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/cespare/xxhash/xxhash_amd64.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
// +build !appengine
 | 
			
		||||
// +build gc
 | 
			
		||||
// +build !purego
 | 
			
		||||
 | 
			
		||||
package xxhash
 | 
			
		||||
 | 
			
		||||
// Sum64 computes the 64-bit xxHash digest of b.
 | 
			
		||||
//
 | 
			
		||||
//go:noescape
 | 
			
		||||
func Sum64(b []byte) uint64
 | 
			
		||||
 | 
			
		||||
func writeBlocks(x *xxh, b []byte) []byte
 | 
			
		||||
							
								
								
									
										233
									
								
								vendor/github.com/cespare/xxhash/xxhash_amd64.s
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								vendor/github.com/cespare/xxhash/xxhash_amd64.s
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,233 @@
 | 
			
		|||
// +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 x pointer.
 | 
			
		||||
 | 
			
		||||
// func writeBlocks(x *xxh, b []byte) []byte
 | 
			
		||||
TEXT ·writeBlocks(SB), NOSPLIT, $0-56
 | 
			
		||||
	// Load fixed primes needed for round.
 | 
			
		||||
	MOVQ ·prime1v(SB), R13
 | 
			
		||||
	MOVQ ·prime2v(SB), R14
 | 
			
		||||
 | 
			
		||||
	// Load slice.
 | 
			
		||||
	MOVQ b_base+8(FP), CX
 | 
			
		||||
	MOVQ CX, ret_base+32(FP) // initialize return base pointer; see NOTE below
 | 
			
		||||
	MOVQ b_len+16(FP), DX
 | 
			
		||||
	LEAQ (CX)(DX*1), BX
 | 
			
		||||
	SUBQ $32, BX
 | 
			
		||||
 | 
			
		||||
	// Load vN from x.
 | 
			
		||||
	MOVQ x+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 x.
 | 
			
		||||
	MOVQ R8, 0(AX)
 | 
			
		||||
	MOVQ R9, 8(AX)
 | 
			
		||||
	MOVQ R10, 16(AX)
 | 
			
		||||
	MOVQ R11, 24(AX)
 | 
			
		||||
 | 
			
		||||
	// Construct return slice.
 | 
			
		||||
	// NOTE: It's important that we don't construct a slice that has a base
 | 
			
		||||
	// pointer off the end of the original slice, as in Go 1.7+ this will
 | 
			
		||||
	// cause runtime crashes. (See discussion in, for example,
 | 
			
		||||
	// https://github.com/golang/go/issues/16772.)
 | 
			
		||||
	// Therefore, we calculate the length/cap first, and if they're zero, we
 | 
			
		||||
	// keep the old base. This is what the compiler does as well if you
 | 
			
		||||
	// write code like
 | 
			
		||||
	//   b = b[len(b):]
 | 
			
		||||
 | 
			
		||||
	// New length is 32 - (CX - BX) -> BX+32 - CX.
 | 
			
		||||
	ADDQ $32, BX
 | 
			
		||||
	SUBQ CX, BX
 | 
			
		||||
	JZ   afterSetBase
 | 
			
		||||
 | 
			
		||||
	MOVQ CX, ret_base+32(FP)
 | 
			
		||||
 | 
			
		||||
afterSetBase:
 | 
			
		||||
	MOVQ BX, ret_len+40(FP)
 | 
			
		||||
	MOVQ BX, ret_cap+48(FP) // set cap == len
 | 
			
		||||
 | 
			
		||||
	RET
 | 
			
		||||
							
								
								
									
										75
									
								
								vendor/github.com/cespare/xxhash/xxhash_other.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								vendor/github.com/cespare/xxhash/xxhash_other.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,75 @@
 | 
			
		|||
// +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
 | 
			
		||||
	//   x := New()
 | 
			
		||||
	//   x.Write(b)
 | 
			
		||||
	//   return x.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(x *xxh, b []byte) []byte {
 | 
			
		||||
	v1, v2, v3, v4 := x.v1, x.v2, x.v3, x.v4
 | 
			
		||||
	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)]
 | 
			
		||||
	}
 | 
			
		||||
	x.v1, x.v2, x.v3, x.v4 = v1, v2, v3, v4
 | 
			
		||||
	return b
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/github.com/cespare/xxhash/xxhash_safe.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/cespare/xxhash/xxhash_safe.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
// +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))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								vendor/github.com/cespare/xxhash/xxhash_unsafe.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								vendor/github.com/cespare/xxhash/xxhash_unsafe.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
// +build !appengine
 | 
			
		||||
 | 
			
		||||
// This file encapsulates usage of unsafe.
 | 
			
		||||
// xxhash_safe.go contains the safe implementations.
 | 
			
		||||
 | 
			
		||||
package xxhash
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Sum64String computes the 64-bit xxHash digest of s.
 | 
			
		||||
// It may be faster than Sum64([]byte(s)) by avoiding a copy.
 | 
			
		||||
//
 | 
			
		||||
// TODO(caleb): Consider removing this if an optimization is ever added to make
 | 
			
		||||
// it unnecessary: https://golang.org/issue/2205.
 | 
			
		||||
//
 | 
			
		||||
// TODO(caleb): We still have a function call; we could instead write Go/asm
 | 
			
		||||
// copies of Sum64 for strings to squeeze out a bit more speed.
 | 
			
		||||
func Sum64String(s string) uint64 {
 | 
			
		||||
	// See https://groups.google.com/d/msg/golang-nuts/dcjzJy-bSpw/tcZYBzQqAQAJ
 | 
			
		||||
	// for some discussion about this unsafe conversion.
 | 
			
		||||
	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)
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue