blob: c726d6d1c04b47c1ef5f89d81212bc18d9b36a35 [file] [log] [blame]
// 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