github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/crypto/subtle/xor_amd64.s (about) 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) 10 TEXT ·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 18 aligned: 19 MOVQ $0, AX // position in slices 20 21 loop16b: 22 MOVOU (SI)(AX*1), X0 // XOR 16byte forwards. 23 MOVOU (CX)(AX*1), X1 24 PXOR X1, X0 25 MOVOU X0, (BX)(AX*1) 26 ADDQ $16, AX 27 CMPQ DX, AX 28 JNE loop16b 29 RET 30 31 loop_1b: 32 SUBQ $1, DX // XOR 1byte backwards. 33 MOVB (SI)(DX*1), DI 34 MOVB (CX)(DX*1), AX 35 XORB AX, DI 36 MOVB DI, (BX)(DX*1) 37 TESTQ $7, DX // AND 7 & len, if not zero jump to loop_1b. 38 JNZ loop_1b 39 CMPQ DX, $0 // if len is 0, ret. 40 JE ret 41 TESTQ $15, DX // AND 15 & len, if zero jump to aligned. 42 JZ aligned 43 44 not_aligned: 45 TESTQ $7, DX // AND $7 & len, if not zero jump to loop_1b. 46 JNE loop_1b 47 SUBQ $8, DX // XOR 8bytes backwards. 48 MOVQ (SI)(DX*1), DI 49 MOVQ (CX)(DX*1), AX 50 XORQ AX, DI 51 MOVQ DI, (BX)(DX*1) 52 CMPQ DX, $16 // if len is greater or equal 16 here, it must be aligned. 53 JGE aligned 54 55 ret: 56 RET