| // 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. |
| |
| // func xorKeyStream(dst, src *byte, n int, state *[256]byte, i, j *uint8) |
| TEXT ·xorKeyStream(SB),7,$0 |
| MOVQ dst+0(FP), DI |
| MOVQ src+8(FP), SI |
| MOVQ n+16(FP), CX |
| MOVQ state+24(FP), R8 |
| |
| MOVQ xPtr+32(FP), AX |
| MOVBQZX (AX), AX |
| MOVQ yPtr+40(FP), BX |
| MOVBQZX (BX), BX |
| |
| loop: |
| CMPQ CX, $0 |
| JE done |
| |
| // c.i += 1 |
| INCB AX |
| |
| // c.j += c.s[c.i] |
| MOVB (R8)(AX*1), R9 |
| ADDB R9, BX |
| |
| MOVBQZX (R8)(BX*1), R10 |
| |
| MOVB R10, (R8)(AX*1) |
| MOVB R9, (R8)(BX*1) |
| |
| // R11 = c.s[c.i]+c.s[c.j] |
| MOVQ R10, R11 |
| ADDB R9, R11 |
| |
| MOVB (R8)(R11*1), R11 |
| MOVB (SI), R12 |
| XORB R11, R12 |
| MOVB R12, (DI) |
| |
| INCQ SI |
| INCQ DI |
| DECQ CX |
| |
| JMP loop |
| done: |
| MOVQ xPtr+32(FP), R8 |
| MOVB AX, (R8) |
| MOVQ yPtr+40(FP), R8 |
| MOVB BX, (R8) |
| |
| RET |