#include "textflag.h"

// func xorfwd(x []byte)
TEXT ·xorfwd(SB),NOSPLIT,$0
  MOVQ x+0(FP), SI  // x[i]
  MOVQ x_len+8(FP), CX  // x.len
  MOVQ x+0(FP), DI
  ADDQ $4, DI       // x[i+4]
  SUBQ $4, CX
xorfwdloop:
  MOVL (SI), AX
  XORL AX, (DI)
  ADDQ $4, SI
  ADDQ $4, DI
  SUBQ $4, CX

  CMPL CX, $0
  JE xorfwddone

  JMP xorfwdloop
xorfwddone:        
  RET

// func xorbkd(x []byte)
TEXT ·xorbkd(SB),NOSPLIT,$0
  MOVQ x+0(FP), SI
  MOVQ x_len+8(FP), CX  // x.len
  MOVQ x+0(FP), DI
  ADDQ CX, SI       // x[-8]
  SUBQ $8, SI
  ADDQ CX, DI       // x[-4]
  SUBQ $4, DI
  SUBQ $4, CX
xorbkdloop:
  MOVL (SI), AX
  XORL AX, (DI)
  SUBQ $4, SI
  SUBQ $4, DI
  SUBQ $4, CX

  CMPL CX, $0
  JE xorbkddone
  
  JMP xorbkdloop

xorbkddone:        
  RET
