--- /dev/null
+// Copyright 2024 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.
+
+//go:build !purego
+
+package subtle
+
+//go:noescape
+func xorBytes(dst, a, b *byte, n int)
--- /dev/null
+// Copyright 2024 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.
+
+//go:build !purego
+
+#include "textflag.h"
+
+// func xorBytes(dst, a, b *byte, n int)
+TEXT ·xorBytes(SB), NOSPLIT, $0
+ MOVV dst+0(FP), R4
+ MOVV a+8(FP), R5
+ MOVV b+16(FP), R6
+ MOVV n+24(FP), R7
+
+ MOVV $64, R9
+ BGEU R7, R9, loop64 // n >= 64
+tail:
+ SRLV $1, R9
+ BGEU R7, R9, xor_32 // n >= 32 && n < 64
+ SRLV $1, R9
+ BGEU R7, R9, xor_16 // n >= 16 && n < 32
+ SRLV $1, R9
+ BGEU R7, R9, xor_8 // n >= 8 && n < 16
+ SRLV $1, R9
+ BGEU R7, R9, xor_4 // n >= 4 && n < 8
+ SRLV $1, R9
+ BGEU R7, R9, xor_2 // n >= 2 && n < 4
+ SRLV $1, R9
+ BGEU R7, R9, xor_1 // n = 1
+
+loop64:
+ MOVV (R5), R10
+ MOVV 8(R5), R11
+ MOVV 16(R5), R12
+ MOVV 24(R5), R13
+ MOVV (R6), R14
+ MOVV 8(R6), R15
+ MOVV 16(R6), R16
+ MOVV 24(R6), R17
+ XOR R10, R14
+ XOR R11, R15
+ XOR R12, R16
+ XOR R13, R17
+ MOVV R14, (R4)
+ MOVV R15, 8(R4)
+ MOVV R16, 16(R4)
+ MOVV R17, 24(R4)
+ MOVV 32(R5), R10
+ MOVV 40(R5), R11
+ MOVV 48(R5), R12
+ MOVV 56(R5), R13
+ MOVV 32(R6), R14
+ MOVV 40(R6), R15
+ MOVV 48(R6), R16
+ MOVV 56(R6), R17
+ XOR R10, R14
+ XOR R11, R15
+ XOR R12, R16
+ XOR R13, R17
+ MOVV R14, 32(R4)
+ MOVV R15, 40(R4)
+ MOVV R16, 48(R4)
+ MOVV R17, 56(R4)
+ ADDV $64, R5
+ ADDV $64, R6
+ ADDV $64, R4
+ SUBV $64, R7
+ // 64 in R9
+ BGEU R7, R9, loop64
+ BEQ R7, R0, end
+
+xor_32_check:
+ SRLV $1, R9
+ BLT R7, R9, xor_16_check
+xor_32:
+ MOVV (R5), R10
+ MOVV 8(R5), R11
+ MOVV 16(R5), R12
+ MOVV 24(R5), R13
+ MOVV (R6), R14
+ MOVV 8(R6), R15
+ MOVV 16(R6), R16
+ MOVV 24(R6), R17
+ XOR R10, R14
+ XOR R11, R15
+ XOR R12, R16
+ XOR R13, R17
+ MOVV R14, (R4)
+ MOVV R15, 8(R4)
+ MOVV R16, 16(R4)
+ MOVV R17, 24(R4)
+ ADDV $32, R5
+ ADDV $32, R6
+ ADDV $32, R4
+ SUBV $32, R7
+ BEQ R7, R0, end
+
+xor_16_check:
+ SRLV $1, R9
+ BLT R7, R9, xor_8_check
+xor_16:
+ MOVV (R5), R10
+ MOVV 8(R5), R11
+ MOVV (R6), R12
+ MOVV 8(R6), R13
+ XOR R10, R12
+ XOR R11, R13
+ MOVV R12, (R4)
+ MOVV R13, 8(R4)
+ ADDV $16, R5
+ ADDV $16, R6
+ ADDV $16, R4
+ SUBV $16, R7
+ BEQ R7, R0, end
+
+xor_8_check:
+ SRLV $1, R9
+ BLT R7, R9, xor_4_check
+xor_8:
+ MOVV (R5), R10
+ MOVV (R6), R11
+ XOR R10, R11
+ MOVV R11, (R4)
+ ADDV $8, R5
+ ADDV $8, R6
+ ADDV $8, R4
+ SUBV $8, R7
+ BEQ R7, R0, end
+
+xor_4_check:
+ SRLV $1, R9
+ BLT R7, R9, xor_2_check
+xor_4:
+ MOVW (R5), R10
+ MOVW (R6), R11
+ XOR R10, R11
+ MOVW R11, (R4)
+ ADDV $4, R5
+ ADDV $4, R6
+ ADDV $4, R4
+ SUBV $4, R7
+ BEQ R7, R0, end
+
+xor_2_check:
+ SRLV $1, R9
+ BLT R7, R9, xor_1
+xor_2:
+ MOVH (R5), R10
+ MOVH (R6), R11
+ XOR R10, R11
+ MOVH R11, (R4)
+ ADDV $2, R5
+ ADDV $2, R6
+ ADDV $2, R4
+ SUBV $2, R7
+ BEQ R7, R0, end
+
+xor_1:
+ MOVB (R5), R10
+ MOVB (R6), R11
+ XOR R10, R11
+ MOVB R11, (R4)
+
+end:
+ RET