]> Cypherpunks repositories - gostls13.git/commitdiff
crypto/rc4: naïve ARM assembly implementation
authorShenghou Ma <minux.ma@gmail.com>
Thu, 7 Feb 2013 10:54:21 +0000 (18:54 +0800)
committerShenghou Ma <minux.ma@gmail.com>
Thu, 7 Feb 2013 10:54:21 +0000 (18:54 +0800)
On 800MHz Cortex-A8:
benchmark           old ns/op    new ns/op    delta
BenchmarkRC4_128         9395         2838  -69.79%
BenchmarkRC4_1K         74497        22120  -70.31%
BenchmarkRC4_8K        587243       171435  -70.81%

benchmark            old MB/s     new MB/s  speedup
BenchmarkRC4_128        13.62        45.09    3.31x
BenchmarkRC4_1K         13.75        46.29    3.37x
BenchmarkRC4_8K         13.79        47.22    3.42x

Result for "OpenSSL 1.0.1c 10 May 2012" from Debian/armhf sid:
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
rc4              39553.81k    46522.39k    49336.11k    50085.63k    50258.06k

R=golang-dev, agl, dave
CC=golang-dev
https://golang.org/cl/7310051

src/pkg/crypto/rc4/rc4_arm.s [new file with mode: 0644]
src/pkg/crypto/rc4/rc4_asm.go
src/pkg/crypto/rc4/rc4_ref.go

diff --git a/src/pkg/crypto/rc4/rc4_arm.s b/src/pkg/crypto/rc4/rc4_arm.s
new file mode 100644 (file)
index 0000000..51a332f
--- /dev/null
@@ -0,0 +1,58 @@
+// Copyright 2013 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.
+
+// Registers
+dst = 0
+src = 1
+n = 2
+state = 3
+pi = 4
+pj = 5
+i = 6
+j = 7
+k = 8
+t = 11
+t2 = 12
+
+// func xorKeyStream(dst, src *byte, n int, state *[256]byte, i, j *uint8)
+TEXT ·xorKeyStream(SB),7,$0
+       MOVW 0(FP), R(dst)
+       MOVW 4(FP), R(src)
+       MOVW 8(FP), R(n)
+       MOVW 12(FP), R(state)
+       MOVW 16(FP), R(pi)
+       MOVW 20(FP), R(pj)
+       MOVBU (R(pi)), R(i)
+       MOVBU (R(pj)), R(j)
+       MOVW $0, R(k)
+
+loop:
+       // i += 1; j += state[i]
+       ADD $1, R(i)
+       AND $0xff, R(i)
+       MOVBU R(i)<<0(R(state)), R(t)
+       ADD R(t), R(j)
+       AND $0xff, R(j)
+
+       // swap state[i] <-> state[j]
+       MOVBU R(j)<<0(R(state)), R(t2)
+       MOVB R(t2), R(i)<<0(R(state))
+       MOVB R(t), R(j)<<0(R(state))
+
+       // dst[k] = src[k] ^ state[state[i] + state[j]]
+       ADD R(t2), R(t)
+       AND $0xff, R(t)
+       MOVBU R(t)<<0(R(state)), R(t)
+       MOVBU R(k)<<0(R(src)), R(t2)
+       EOR R(t), R(t2)
+       MOVB R(t2), R(k)<<0(R(dst))
+
+       ADD $1, R(k)
+       CMP R(k), R(n)
+       BNE loop
+
+done:
+       MOVB R(i), (R(pi))
+       MOVB R(j), (R(pj))
+       RET
index 6bb24398e21ea343d1a5c5cfb71c1297ce130a45..0b66e4a9e21a6f0bb75f5346a910d33ea0c9f1e3 100644 (file)
@@ -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 amd64
+// +build amd64 arm
 
 package rc4
 
index 4d47299cbb2ef23c7b9fde5b949583bcecc83884..1018548c240a05087cc5020c76302ebbbceefe43 100644 (file)
@@ -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 !amd64
+// +build !amd64,!arm
 
 package rc4