diff options
author | Ian Lance Taylor <iant@google.com> | 2016-02-03 21:58:02 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-02-03 21:58:02 +0000 |
commit | f98dd1a338867a408f7c72d73fbad7fe7fc93e3a (patch) | |
tree | 2f8da9862a9c1fe0df138917f997b03439c02773 /libgo/go/hash | |
parent | b081ed4efc144da0c45a6484aebfd10e0eb9fda3 (diff) | |
download | gcc-f98dd1a338867a408f7c72d73fbad7fe7fc93e3a.zip gcc-f98dd1a338867a408f7c72d73fbad7fe7fc93e3a.tar.gz gcc-f98dd1a338867a408f7c72d73fbad7fe7fc93e3a.tar.bz2 |
libgo: Update to go1.6rc1.
Reviewed-on: https://go-review.googlesource.com/19200
From-SVN: r233110
Diffstat (limited to 'libgo/go/hash')
-rw-r--r-- | libgo/go/hash/adler32/adler32.go | 1 | ||||
-rw-r--r-- | libgo/go/hash/crc32/crc32.go | 23 | ||||
-rw-r--r-- | libgo/go/hash/crc32/crc32_amd64.go | 56 | ||||
-rw-r--r-- | libgo/go/hash/crc32/crc32_amd64p32.go (renamed from libgo/go/hash/crc32/crc32_amd64x.go) | 17 | ||||
-rw-r--r-- | libgo/go/hash/crc32/crc32_generic.go | 13 | ||||
-rw-r--r-- | libgo/go/hash/crc64/crc64.go | 4 | ||||
-rw-r--r-- | libgo/go/hash/fnv/fnv.go | 6 |
7 files changed, 102 insertions, 18 deletions
diff --git a/libgo/go/hash/adler32/adler32.go b/libgo/go/hash/adler32/adler32.go index 7c80796..0c733f7 100644 --- a/libgo/go/hash/adler32/adler32.go +++ b/libgo/go/hash/adler32/adler32.go @@ -33,6 +33,7 @@ type digest uint32 func (d *digest) Reset() { *d = 1 } // New returns a new hash.Hash32 computing the Adler-32 checksum. +// Its Sum method will lay the value out in big-endian byte order. func New() hash.Hash32 { d := new(digest) d.Reset() diff --git a/libgo/go/hash/crc32/crc32.go b/libgo/go/hash/crc32/crc32.go index 234d929..dc59948 100644 --- a/libgo/go/hash/crc32/crc32.go +++ b/libgo/go/hash/crc32/crc32.go @@ -57,11 +57,12 @@ var IEEETable = makeTable(IEEE) // slicing8Table is array of 8 Tables type slicing8Table [8]Table -// iEEETable8 is the slicing8Table for IEEE -var iEEETable8 *slicing8Table -var iEEETable8Once sync.Once +// ieeeTable8 is the slicing8Table for IEEE +var ieeeTable8 *slicing8Table +var ieeeTable8Once sync.Once -// MakeTable returns the Table constructed from the specified polynomial. +// MakeTable returns a Table constructed from the specified polynomial. +// The contents of this Table must not be modified. func MakeTable(poly uint32) *Table { switch poly { case IEEE: @@ -112,10 +113,12 @@ type digest struct { // New creates a new hash.Hash32 computing the CRC-32 checksum // using the polynomial represented by the Table. +// Its Sum method will lay the value out in big-endian byte order. func New(tab *Table) hash.Hash32 { return &digest{0, tab} } // NewIEEE creates a new hash.Hash32 computing the CRC-32 checksum // using the IEEE polynomial. +// Its Sum method will lay the value out in big-endian byte order. func NewIEEE() hash.Hash32 { return New(IEEETable) } func (d *digest) Size() int { return Size } @@ -148,15 +151,11 @@ func updateSlicingBy8(crc uint32, tab *slicing8Table, p []byte) uint32 { // Update returns the result of adding the bytes in p to the crc. func Update(crc uint32, tab *Table, p []byte) uint32 { - if tab == castagnoliTable { + switch tab { + case castagnoliTable: return updateCastagnoli(crc, p) - } - // only use slicing-by-8 when input is larger than 4KB - if tab == IEEETable && len(p) >= 4096 { - iEEETable8Once.Do(func() { - iEEETable8 = makeTable8(IEEE) - }) - return updateSlicingBy8(crc, iEEETable8, p) + case IEEETable: + return updateIEEE(crc, p) } return update(crc, tab, p) } diff --git a/libgo/go/hash/crc32/crc32_amd64.go b/libgo/go/hash/crc32/crc32_amd64.go new file mode 100644 index 0000000..ab4e2b8 --- /dev/null +++ b/libgo/go/hash/crc32/crc32_amd64.go @@ -0,0 +1,56 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package crc32 + +// This file contains the code to call the SSE 4.2 version of the Castagnoli +// and IEEE CRC. + +// haveSSE41/haveSSE42/haveCLMUL are defined in crc_amd64.s and use +// CPUID to test for SSE 4.1, 4.2 and CLMUL support. +func haveSSE41() bool +func haveSSE42() bool +func haveCLMUL() bool + +// castagnoliSSE42 is defined in crc_amd64.s and uses the SSE4.2 CRC32 +// instruction. +//go:noescape +func castagnoliSSE42(crc uint32, p []byte) uint32 + +// ieeeCLMUL is defined in crc_amd64.s and uses the PCLMULQDQ +// instruction as well as SSE 4.1. +//go:noescape +func ieeeCLMUL(crc uint32, p []byte) uint32 + +var sse42 = haveSSE42() +var useFastIEEE = haveCLMUL() && haveSSE41() + +func updateCastagnoli(crc uint32, p []byte) uint32 { + if sse42 { + return castagnoliSSE42(crc, p) + } + return update(crc, castagnoliTable, p) +} + +func updateIEEE(crc uint32, p []byte) uint32 { + if useFastIEEE && len(p) >= 64 { + left := len(p) & 15 + do := len(p) - left + crc = ^ieeeCLMUL(^crc, p[:do]) + if left > 0 { + crc = update(crc, IEEETable, p[do:]) + } + return crc + } + + // only use slicing-by-8 when input is >= 4KB + if len(p) >= 4096 { + ieeeTable8Once.Do(func() { + ieeeTable8 = makeTable8(IEEE) + }) + return updateSlicingBy8(crc, ieeeTable8, p) + } + + return update(crc, IEEETable, p) +} diff --git a/libgo/go/hash/crc32/crc32_amd64x.go b/libgo/go/hash/crc32/crc32_amd64p32.go index b7e3599..067fbb1 100644 --- a/libgo/go/hash/crc32/crc32_amd64x.go +++ b/libgo/go/hash/crc32/crc32_amd64p32.go @@ -2,19 +2,18 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64 amd64p32 - package crc32 // This file contains the code to call the SSE 4.2 version of the Castagnoli // CRC. -// haveSSE42 is defined in crc_amd64.s and uses CPUID to test for SSE 4.2 +// haveSSE42 is defined in crc_amd64p32.s and uses CPUID to test for SSE 4.2 // support. func haveSSE42() bool // castagnoliSSE42 is defined in crc_amd64.s and uses the SSE4.2 CRC32 // instruction. +//go:noescape func castagnoliSSE42(crc uint32, p []byte) uint32 var sse42 = haveSSE42() @@ -25,3 +24,15 @@ func updateCastagnoli(crc uint32, p []byte) uint32 { } return update(crc, castagnoliTable, p) } + +func updateIEEE(crc uint32, p []byte) uint32 { + // only use slicing-by-8 when input is >= 4KB + if len(p) >= 4096 { + ieeeTable8Once.Do(func() { + ieeeTable8 = makeTable8(IEEE) + }) + return updateSlicingBy8(crc, ieeeTable8, p) + } + + return update(crc, IEEETable, p) +} diff --git a/libgo/go/hash/crc32/crc32_generic.go b/libgo/go/hash/crc32/crc32_generic.go index 416c1b7..8fc11a7 100644 --- a/libgo/go/hash/crc32/crc32_generic.go +++ b/libgo/go/hash/crc32/crc32_generic.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build 386 arm arm64 ppc64 ppc64le +// +build 386 arm arm64 mips64 mips64le ppc64 ppc64le package crc32 @@ -12,3 +12,14 @@ package crc32 func updateCastagnoli(crc uint32, p []byte) uint32 { return update(crc, castagnoliTable, p) } + +func updateIEEE(crc uint32, p []byte) uint32 { + // only use slicing-by-8 when input is >= 4KB + if len(p) >= 4096 { + ieeeTable8Once.Do(func() { + ieeeTable8 = makeTable8(IEEE) + }) + return updateSlicingBy8(crc, ieeeTable8, p) + } + return update(crc, IEEETable, p) +} diff --git a/libgo/go/hash/crc64/crc64.go b/libgo/go/hash/crc64/crc64.go index 6925867..54cc560 100644 --- a/libgo/go/hash/crc64/crc64.go +++ b/libgo/go/hash/crc64/crc64.go @@ -24,7 +24,8 @@ const ( // Table is a 256-word table representing the polynomial for efficient processing. type Table [256]uint64 -// MakeTable returns the Table constructed from the specified polynomial. +// MakeTable returns a Table constructed from the specified polynomial. +// The contents of this Table must not be modified. func MakeTable(poly uint64) *Table { t := new(Table) for i := 0; i < 256; i++ { @@ -49,6 +50,7 @@ type digest struct { // New creates a new hash.Hash64 computing the CRC-64 checksum // using the polynomial represented by the Table. +// Its Sum method will lay the value out in big-endian byte order. func New(tab *Table) hash.Hash64 { return &digest{0, tab} } func (d *digest) Size() int { return Size } diff --git a/libgo/go/hash/fnv/fnv.go b/libgo/go/hash/fnv/fnv.go index c020661..f1fbb25 100644 --- a/libgo/go/hash/fnv/fnv.go +++ b/libgo/go/hash/fnv/fnv.go @@ -5,7 +5,7 @@ // Package fnv implements FNV-1 and FNV-1a, non-cryptographic hash functions // created by Glenn Fowler, Landon Curt Noll, and Phong Vo. // See -// http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function. +// https://en.wikipedia.org/wiki/Fowler-Noll-Vo_hash_function. package fnv import ( @@ -27,24 +27,28 @@ const ( ) // New32 returns a new 32-bit FNV-1 hash.Hash. +// Its Sum method will lay the value out in big-endian byte order. func New32() hash.Hash32 { var s sum32 = offset32 return &s } // New32a returns a new 32-bit FNV-1a hash.Hash. +// Its Sum method will lay the value out in big-endian byte order. func New32a() hash.Hash32 { var s sum32a = offset32 return &s } // New64 returns a new 64-bit FNV-1 hash.Hash. +// Its Sum method will lay the value out in big-endian byte order. func New64() hash.Hash64 { var s sum64 = offset64 return &s } // New64a returns a new 64-bit FNV-1a hash.Hash. +// Its Sum method will lay the value out in big-endian byte order. func New64a() hash.Hash64 { var s sum64a = offset64 return &s |