1// Copyright 2018 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5//go:build !purego 6 7#include "textflag.h" 8 9// func xorBytes(dst, a, b *byte, n int) 10TEXT ·xorBytes(SB), NOSPLIT, $0 11 MOVQ dst+0(FP), BX 12 MOVQ a+8(FP), SI 13 MOVQ b+16(FP), CX 14 MOVQ n+24(FP), DX 15 TESTQ $15, DX // AND 15 & len, if not zero jump to not_aligned. 16 JNZ not_aligned 17 18aligned: 19 MOVQ $0, AX // position in slices 20 21 PCALIGN $16 22loop16b: 23 MOVOU (SI)(AX*1), X0 // XOR 16byte forwards. 24 MOVOU (CX)(AX*1), X1 25 PXOR X1, X0 26 MOVOU X0, (BX)(AX*1) 27 ADDQ $16, AX 28 CMPQ DX, AX 29 JNE loop16b 30 RET 31 32 PCALIGN $16 33loop_1b: 34 SUBQ $1, DX // XOR 1byte backwards. 35 MOVB (SI)(DX*1), DI 36 MOVB (CX)(DX*1), AX 37 XORB AX, DI 38 MOVB DI, (BX)(DX*1) 39 TESTQ $7, DX // AND 7 & len, if not zero jump to loop_1b. 40 JNZ loop_1b 41 CMPQ DX, $0 // if len is 0, ret. 42 JE ret 43 TESTQ $15, DX // AND 15 & len, if zero jump to aligned. 44 JZ aligned 45 46not_aligned: 47 TESTQ $7, DX // AND $7 & len, if not zero jump to loop_1b. 48 JNE loop_1b 49 SUBQ $8, DX // XOR 8bytes backwards. 50 MOVQ (SI)(DX*1), DI 51 MOVQ (CX)(DX*1), AX 52 XORQ AX, DI 53 MOVQ DI, (BX)(DX*1) 54 CMPQ DX, $16 // if len is greater or equal 16 here, it must be aligned. 55 JGE aligned 56 57ret: 58 RET 59