Benchmark results on Loongson-3C6000 @ 2.20GHz:
goos: linux
goarch: loong64
pkg: golang.org/x/crypto/argon2
cpu: Loongson-3C6000/S @ 2200.00MHz
| old.bench | new.bench |
| sec/op | sec/op vs base |
Argon2i/_Time:_3_Memory:_32_MB,_Threads:_1 123.36m ± 0% 76.67m ± 0% -37.85% (p=0.000 n=10)
Argon2i/_Time:_4_Memory:_32_MB,_Threads:_1 163.7m ± 0% 101.3m ± 0% -38.09% (p=0.000 n=10)
Argon2i/_Time:_5_Memory:_32_MB,_Threads:_1 195.0m ± 0% 116.5m ± 8% -40.24% (p=0.000 n=10)
Argon2i/_Time:_3_Memory:_64_MB,_Threads:_4 259.4m ± 0% 165.3m ± 0% -36.28% (p=0.000 n=10)
Argon2i/_Time:_4_Memory:_64_MB,_Threads:_4 349.9m ± 0% 220.8m ± 0% -36.92% (p=0.000 n=10)
Argon2i/_Time:_5_Memory:_64_MB,_Threads:_4 437.6m ± 0% 276.0m ± 0% -36.92% (p=0.000 n=10)
Argon2d/_Time:_3,_Memory:_32_MB,_Threads:_1 116.34m ± 0% 72.07m ± 0% -38.06% (p=0.000 n=10)
Argon2d/_Time:_4,_Memory:_32_MB,_Threads:_1 154.42m ± 0% 95.28m ± 0% -38.30% (p=0.000 n=10)
Argon2d/_Time:_5,_Memory:_32_MB,_Threads:_1 192.4m ± 0% 115.9m ± 2% -39.73% (p=0.000 n=10)
Argon2d/_Time:_3,_Memory:_64_MB,_Threads:_4 254.4m ± 0% 165.2m ± 0% -35.06% (p=0.000 n=10)
Argon2d/_Time:_4,_Memory:_64_MB,_Threads:_4 345.5m ± 1% 221.0m ± 0% -36.04% (p=0.000 n=10)
Argon2d/_Time:_5,_Memory:_64_MB,_Threads:_4 432.1m ± 0% 276.2m ± 0% -36.09% (p=0.000 n=10)
Argon2id/_Time:_3,_Memory:_32_MB,_Threads:_1 116.49m ± 0% 72.38m ± 0% -37.86% (p=0.000 n=10)
Argon2id/_Time:_4,_Memory:_32_MB,_Threads:_1 154.59m ± 0% 95.71m ± 3% -38.09% (p=0.000 n=10)
Argon2id/_Time:_5,_Memory:_32_MB,_Threads:_1 192.5m ± 0% 115.0m ± 0% -40.25% (p=0.000 n=10)
Argon2id/_Time:_3,_Memory:_64_MB,_Threads:_4 255.6m ± 0% 165.7m ± 0% -35.18% (p=0.000 n=10)
Argon2id/_Time:_4,_Memory:_64_MB,_Threads:_4 345.4m ± 0% 221.5m ± 0% -35.87% (p=0.000 n=10)
Argon2id/_Time:_5,_Memory:_64_MB,_Threads:_4 431.9m ± 0% 276.6m ± 0% -35.96% (p=0.000 n=10)
geomean 227.7m 142.6m -37.40%
| old.bench | new.bench |
| B/op | B/op vs base |
Argon2i/_Time:_3_Memory:_32_MB,_Threads:_1 32.00Mi ± 0% 32.00Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2i/_Time:_4_Memory:_32_MB,_Threads:_1 32.00Mi ± 0% 32.00Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2i/_Time:_5_Memory:_32_MB,_Threads:_1 32.00Mi ± 0% 32.00Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2i/_Time:_3_Memory:_64_MB,_Threads:_4 64.01Mi ± 0% 64.01Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2i/_Time:_4_Memory:_64_MB,_Threads:_4 64.01Mi ± 0% 64.01Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2i/_Time:_5_Memory:_64_MB,_Threads:_4 64.01Mi ± 0% 64.01Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_3,_Memory:_32_MB,_Threads:_1 32.00Mi ± 0% 32.00Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_4,_Memory:_32_MB,_Threads:_1 32.00Mi ± 0% 32.00Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_5,_Memory:_32_MB,_Threads:_1 32.00Mi ± 0% 32.00Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_3,_Memory:_64_MB,_Threads:_4 64.01Mi ± 0% 64.01Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_4,_Memory:_64_MB,_Threads:_4 64.01Mi ± 0% 64.01Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_5,_Memory:_64_MB,_Threads:_4 64.01Mi ± 0% 64.01Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_3,_Memory:_32_MB,_Threads:_1 32.00Mi ± 0% 32.00Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_4,_Memory:_32_MB,_Threads:_1 32.00Mi ± 0% 32.00Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_5,_Memory:_32_MB,_Threads:_1 32.00Mi ± 0% 32.00Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_3,_Memory:_64_MB,_Threads:_4 64.01Mi ± 0% 64.01Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_4,_Memory:_64_MB,_Threads:_4 64.01Mi ± 0% 64.01Mi ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_5,_Memory:_64_MB,_Threads:_4 64.01Mi ± 0% 64.01Mi ± 0% ~ (p=1.000 n=10) ¹
geomean 45.26Mi 45.26Mi +0.00%
¹ all samples are equal
| old.bench | new.bench |
| allocs/op | allocs/op vs base |
Argon2i/_Time:_3_Memory:_32_MB,_Threads:_1 31.00 ± 0% 31.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2i/_Time:_4_Memory:_32_MB,_Threads:_1 39.00 ± 0% 39.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2i/_Time:_5_Memory:_32_MB,_Threads:_1 47.00 ± 0% 47.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2i/_Time:_3_Memory:_64_MB,_Threads:_4 73.00 ± 0% 73.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2i/_Time:_4_Memory:_64_MB,_Threads:_4 93.00 ± 0% 93.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2i/_Time:_5_Memory:_64_MB,_Threads:_4 113.0 ± 0% 113.0 ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_3,_Memory:_32_MB,_Threads:_1 31.00 ± 0% 31.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_4,_Memory:_32_MB,_Threads:_1 39.00 ± 0% 39.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_5,_Memory:_32_MB,_Threads:_1 47.00 ± 0% 47.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_3,_Memory:_64_MB,_Threads:_4 73.00 ± 0% 73.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_4,_Memory:_64_MB,_Threads:_4 93.00 ± 0% 93.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2d/_Time:_5,_Memory:_64_MB,_Threads:_4 113.0 ± 0% 113.0 ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_3,_Memory:_32_MB,_Threads:_1 31.00 ± 0% 31.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_4,_Memory:_32_MB,_Threads:_1 39.00 ± 0% 39.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_5,_Memory:_32_MB,_Threads:_1 47.00 ± 0% 47.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_3,_Memory:_64_MB,_Threads:_4 73.00 ± 0% 73.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_4,_Memory:_64_MB,_Threads:_4 93.00 ± 0% 93.00 ± 0% ~ (p=1.000 n=10) ¹
Argon2id/_Time:_5,_Memory:_64_MB,_Threads:_4 113.0 ± 0% 113.0 ± 0% ~ (p=1.000 n=10) ¹
geomean 59.32 59.32 +0.00%
¹ all samples are equal
Change-Id: Ia814057ddfdefbe1d23431fa366189ffe5852b96
Reviewed-on: https://go-review.googlesource.com/c/crypto/+/826304
Reviewed-by: Junyang Shao <shaojunyang@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
Reviewed-by: Cherry Mui <cherryyz@google.com>
168 lines
4.5 KiB
Go
168 lines
4.5 KiB
Go
// Copyright 2017 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 argon2
|
|
|
|
var useSSE4 bool
|
|
|
|
// useLSX reports whether the loong64 LSX vector implementation should be
|
|
// used. It is set from cpu.Loong64.HasLSX in blamka_loong64.go's init().
|
|
var useLSX bool
|
|
|
|
func processBlockGeneric(out, in1, in2 *block, xor bool) {
|
|
var t block
|
|
for i := range t {
|
|
t[i] = in1[i] ^ in2[i]
|
|
}
|
|
for i := 0; i < blockLength; i += 16 {
|
|
blamkaGeneric(
|
|
&t[i+0], &t[i+1], &t[i+2], &t[i+3],
|
|
&t[i+4], &t[i+5], &t[i+6], &t[i+7],
|
|
&t[i+8], &t[i+9], &t[i+10], &t[i+11],
|
|
&t[i+12], &t[i+13], &t[i+14], &t[i+15],
|
|
)
|
|
}
|
|
for i := 0; i < blockLength/8; i += 2 {
|
|
blamkaGeneric(
|
|
&t[i], &t[i+1], &t[16+i], &t[16+i+1],
|
|
&t[32+i], &t[32+i+1], &t[48+i], &t[48+i+1],
|
|
&t[64+i], &t[64+i+1], &t[80+i], &t[80+i+1],
|
|
&t[96+i], &t[96+i+1], &t[112+i], &t[112+i+1],
|
|
)
|
|
}
|
|
if xor {
|
|
for i := range t {
|
|
out[i] ^= in1[i] ^ in2[i] ^ t[i]
|
|
}
|
|
} else {
|
|
for i := range t {
|
|
out[i] = in1[i] ^ in2[i] ^ t[i]
|
|
}
|
|
}
|
|
}
|
|
|
|
func blamkaGeneric(t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15 *uint64) {
|
|
v00, v01, v02, v03 := *t00, *t01, *t02, *t03
|
|
v04, v05, v06, v07 := *t04, *t05, *t06, *t07
|
|
v08, v09, v10, v11 := *t08, *t09, *t10, *t11
|
|
v12, v13, v14, v15 := *t12, *t13, *t14, *t15
|
|
|
|
v00 += v04 + 2*uint64(uint32(v00))*uint64(uint32(v04))
|
|
v12 ^= v00
|
|
v12 = v12>>32 | v12<<32
|
|
v08 += v12 + 2*uint64(uint32(v08))*uint64(uint32(v12))
|
|
v04 ^= v08
|
|
v04 = v04>>24 | v04<<40
|
|
|
|
v00 += v04 + 2*uint64(uint32(v00))*uint64(uint32(v04))
|
|
v12 ^= v00
|
|
v12 = v12>>16 | v12<<48
|
|
v08 += v12 + 2*uint64(uint32(v08))*uint64(uint32(v12))
|
|
v04 ^= v08
|
|
v04 = v04>>63 | v04<<1
|
|
|
|
v01 += v05 + 2*uint64(uint32(v01))*uint64(uint32(v05))
|
|
v13 ^= v01
|
|
v13 = v13>>32 | v13<<32
|
|
v09 += v13 + 2*uint64(uint32(v09))*uint64(uint32(v13))
|
|
v05 ^= v09
|
|
v05 = v05>>24 | v05<<40
|
|
|
|
v01 += v05 + 2*uint64(uint32(v01))*uint64(uint32(v05))
|
|
v13 ^= v01
|
|
v13 = v13>>16 | v13<<48
|
|
v09 += v13 + 2*uint64(uint32(v09))*uint64(uint32(v13))
|
|
v05 ^= v09
|
|
v05 = v05>>63 | v05<<1
|
|
|
|
v02 += v06 + 2*uint64(uint32(v02))*uint64(uint32(v06))
|
|
v14 ^= v02
|
|
v14 = v14>>32 | v14<<32
|
|
v10 += v14 + 2*uint64(uint32(v10))*uint64(uint32(v14))
|
|
v06 ^= v10
|
|
v06 = v06>>24 | v06<<40
|
|
|
|
v02 += v06 + 2*uint64(uint32(v02))*uint64(uint32(v06))
|
|
v14 ^= v02
|
|
v14 = v14>>16 | v14<<48
|
|
v10 += v14 + 2*uint64(uint32(v10))*uint64(uint32(v14))
|
|
v06 ^= v10
|
|
v06 = v06>>63 | v06<<1
|
|
|
|
v03 += v07 + 2*uint64(uint32(v03))*uint64(uint32(v07))
|
|
v15 ^= v03
|
|
v15 = v15>>32 | v15<<32
|
|
v11 += v15 + 2*uint64(uint32(v11))*uint64(uint32(v15))
|
|
v07 ^= v11
|
|
v07 = v07>>24 | v07<<40
|
|
|
|
v03 += v07 + 2*uint64(uint32(v03))*uint64(uint32(v07))
|
|
v15 ^= v03
|
|
v15 = v15>>16 | v15<<48
|
|
v11 += v15 + 2*uint64(uint32(v11))*uint64(uint32(v15))
|
|
v07 ^= v11
|
|
v07 = v07>>63 | v07<<1
|
|
|
|
v00 += v05 + 2*uint64(uint32(v00))*uint64(uint32(v05))
|
|
v15 ^= v00
|
|
v15 = v15>>32 | v15<<32
|
|
v10 += v15 + 2*uint64(uint32(v10))*uint64(uint32(v15))
|
|
v05 ^= v10
|
|
v05 = v05>>24 | v05<<40
|
|
|
|
v00 += v05 + 2*uint64(uint32(v00))*uint64(uint32(v05))
|
|
v15 ^= v00
|
|
v15 = v15>>16 | v15<<48
|
|
v10 += v15 + 2*uint64(uint32(v10))*uint64(uint32(v15))
|
|
v05 ^= v10
|
|
v05 = v05>>63 | v05<<1
|
|
|
|
v01 += v06 + 2*uint64(uint32(v01))*uint64(uint32(v06))
|
|
v12 ^= v01
|
|
v12 = v12>>32 | v12<<32
|
|
v11 += v12 + 2*uint64(uint32(v11))*uint64(uint32(v12))
|
|
v06 ^= v11
|
|
v06 = v06>>24 | v06<<40
|
|
|
|
v01 += v06 + 2*uint64(uint32(v01))*uint64(uint32(v06))
|
|
v12 ^= v01
|
|
v12 = v12>>16 | v12<<48
|
|
v11 += v12 + 2*uint64(uint32(v11))*uint64(uint32(v12))
|
|
v06 ^= v11
|
|
v06 = v06>>63 | v06<<1
|
|
|
|
v02 += v07 + 2*uint64(uint32(v02))*uint64(uint32(v07))
|
|
v13 ^= v02
|
|
v13 = v13>>32 | v13<<32
|
|
v08 += v13 + 2*uint64(uint32(v08))*uint64(uint32(v13))
|
|
v07 ^= v08
|
|
v07 = v07>>24 | v07<<40
|
|
|
|
v02 += v07 + 2*uint64(uint32(v02))*uint64(uint32(v07))
|
|
v13 ^= v02
|
|
v13 = v13>>16 | v13<<48
|
|
v08 += v13 + 2*uint64(uint32(v08))*uint64(uint32(v13))
|
|
v07 ^= v08
|
|
v07 = v07>>63 | v07<<1
|
|
|
|
v03 += v04 + 2*uint64(uint32(v03))*uint64(uint32(v04))
|
|
v14 ^= v03
|
|
v14 = v14>>32 | v14<<32
|
|
v09 += v14 + 2*uint64(uint32(v09))*uint64(uint32(v14))
|
|
v04 ^= v09
|
|
v04 = v04>>24 | v04<<40
|
|
|
|
v03 += v04 + 2*uint64(uint32(v03))*uint64(uint32(v04))
|
|
v14 ^= v03
|
|
v14 = v14>>16 | v14<<48
|
|
v09 += v14 + 2*uint64(uint32(v09))*uint64(uint32(v14))
|
|
v04 ^= v09
|
|
v04 = v04>>63 | v04<<1
|
|
|
|
*t00, *t01, *t02, *t03 = v00, v01, v02, v03
|
|
*t04, *t05, *t06, *t07 = v04, v05, v06, v07
|
|
*t08, *t09, *t10, *t11 = v08, v09, v10, v11
|
|
*t12, *t13, *t14, *t15 = v12, v13, v14, v15
|
|
}
|