|  | // 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 |