| // 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. | |
| // +build !nacl | |
| #include "textflag.h" | |
| // Registers | |
| #define Rdst R0 | |
| #define Rsrc R1 | |
| #define Rn R2 | |
| #define Rstate R3 | |
| #define Rpi R4 | |
| #define Rpj R5 | |
| #define Ri R6 | |
| #define Rj R7 | |
| #define Rk R8 | |
| #define Rt R11 | |
| #define Rt2 R12 | |
| // func xorKeyStream(dst, src *byte, n int, state *[256]byte, i, j *uint8) | |
| TEXT ·xorKeyStream(SB),NOSPLIT,$0 | |
| MOVW dst+0(FP), Rdst | |
| MOVW src+4(FP), Rsrc | |
| MOVW n+8(FP), Rn | |
| MOVW state+12(FP), Rstate | |
| MOVW i+16(FP), Rpi | |
| MOVW j+20(FP), Rpj | |
| MOVBU (Rpi), Ri | |
| MOVBU (Rpj), Rj | |
| MOVW $0, Rk | |
| loop: | |
| // i += 1; j += state[i] | |
| ADD $1, Ri | |
| AND $0xff, Ri | |
| MOVBU Ri<<2(Rstate), Rt | |
| ADD Rt, Rj | |
| AND $0xff, Rj | |
| // swap state[i] <-> state[j] | |
| MOVBU Rj<<2(Rstate), Rt2 | |
| MOVB Rt2, Ri<<2(Rstate) | |
| MOVB Rt, Rj<<2(Rstate) | |
| // dst[k] = src[k] ^ state[state[i] + state[j]] | |
| ADD Rt2, Rt | |
| AND $0xff, Rt | |
| MOVBU Rt<<2(Rstate), Rt | |
| MOVBU Rk<<0(Rsrc), Rt2 | |
| EOR Rt, Rt2 | |
| MOVB Rt2, Rk<<0(Rdst) | |
| ADD $1, Rk | |
| CMP Rk, Rn | |
| BNE loop | |
| done: | |
| MOVB Ri, (Rpi) | |
| MOVB Rj, (Rpj) | |
| RET |