blake2s: new package
Add hash function BLAKE2s defined in RFC 7693.
On amd64/SSE4:
name time/op
Write64-4 125ns ± 0%
Write1K-4 1.64µs ± 1%
Sum64-4 152ns ± 0%
Sum1K-4 1.67µs ± 1%
name speed
Write64-4 508MB/s ± 0%
Write1K-4 624MB/s ± 1%
Sum64-4 420MB/s ± 0%
Sum1K-4 612MB/s ± 1%
On amd64/SSSE3:
name time/op
Write64-4 172ns ± 0%
Write1K-4 2.42µs ± 0%
Sum64-4 172ns ± 0%
Sum1K-4 2.42µs ± 0%
name speed
Write64-4 370MB/s ± 0%
Write1K-4 423MB/s ± 0%
Sum64-4 370MB/s ± 0%
Sum1K-4 422MB/s ± 0%
Change-Id: I5a17cc32d8f17d43db8b1d879af6ab68b44d630c
Reviewed-on: https://go-review.googlesource.com/30913
Run-TryBot: Adam Langley <agl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Adam Langley <agl@golang.org>
diff --git a/blake2s/blake2s_amd64.go b/blake2s/blake2s_amd64.go
new file mode 100644
index 0000000..6c5d830
--- /dev/null
+++ b/blake2s/blake2s_amd64.go
@@ -0,0 +1,37 @@
+// Copyright 2016 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.
+
+// +build amd64, !gccgo, !appengine
+
+package blake2s
+
+var (
+ useSSE4 = supportSSE4()
+ useSSSE3 = supportSSSE3()
+)
+
+//go:noescape
+func supportSSSE3() bool
+
+//go:noescape
+func supportSSE4() bool
+
+//go:noescape
+func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
+
+//go:noescape
+func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
+
+//go:noescape
+func hashBlocksSSE4(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
+
+func hashBlocks(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) {
+ if useSSE4 {
+ hashBlocksSSE4(h, c, flag, blocks)
+ } else if useSSSE3 {
+ hashBlocksSSSE3(h, c, flag, blocks)
+ } else {
+ hashBlocksSSE2(h, c, flag, blocks)
+ }
+}