1 // Copyright 2024 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 MOVV dst+0(FP), R4
12 MOVV a+8(FP), R5
13 MOVV b+16(FP), R6
14 MOVV n+24(FP), R7
15
16 MOVV $64, R9
17 BGEU R7, R9, loop64 // n >= 64
18 tail:
19 SRLV $1, R9
20 BGEU R7, R9, xor_32 // n >= 32 && n < 64
21 SRLV $1, R9
22 BGEU R7, R9, xor_16 // n >= 16 && n < 32
23 SRLV $1, R9
24 BGEU R7, R9, xor_8 // n >= 8 && n < 16
25 SRLV $1, R9
26 BGEU R7, R9, xor_4 // n >= 4 && n < 8
27 SRLV $1, R9
28 BGEU R7, R9, xor_2 // n >= 2 && n < 4
29 SRLV $1, R9
30 BGEU R7, R9, xor_1 // n = 1
31
32 loop64:
33 MOVV (R5), R10
34 MOVV 8(R5), R11
35 MOVV 16(R5), R12
36 MOVV 24(R5), R13
37 MOVV (R6), R14
38 MOVV 8(R6), R15
39 MOVV 16(R6), R16
40 MOVV 24(R6), R17
41 XOR R10, R14
42 XOR R11, R15
43 XOR R12, R16
44 XOR R13, R17
45 MOVV R14, (R4)
46 MOVV R15, 8(R4)
47 MOVV R16, 16(R4)
48 MOVV R17, 24(R4)
49 MOVV 32(R5), R10
50 MOVV 40(R5), R11
51 MOVV 48(R5), R12
52 MOVV 56(R5), R13
53 MOVV 32(R6), R14
54 MOVV 40(R6), R15
55 MOVV 48(R6), R16
56 MOVV 56(R6), R17
57 XOR R10, R14
58 XOR R11, R15
59 XOR R12, R16
60 XOR R13, R17
61 MOVV R14, 32(R4)
62 MOVV R15, 40(R4)
63 MOVV R16, 48(R4)
64 MOVV R17, 56(R4)
65 ADDV $64, R5
66 ADDV $64, R6
67 ADDV $64, R4
68 SUBV $64, R7
69 // 64 in R9
70 BGEU R7, R9, loop64
71 BEQ R7, R0, end
72
73 xor_32_check:
74 SRLV $1, R9
75 BLT R7, R9, xor_16_check
76 xor_32:
77 MOVV (R5), R10
78 MOVV 8(R5), R11
79 MOVV 16(R5), R12
80 MOVV 24(R5), R13
81 MOVV (R6), R14
82 MOVV 8(R6), R15
83 MOVV 16(R6), R16
84 MOVV 24(R6), R17
85 XOR R10, R14
86 XOR R11, R15
87 XOR R12, R16
88 XOR R13, R17
89 MOVV R14, (R4)
90 MOVV R15, 8(R4)
91 MOVV R16, 16(R4)
92 MOVV R17, 24(R4)
93 ADDV $32, R5
94 ADDV $32, R6
95 ADDV $32, R4
96 SUBV $32, R7
97 BEQ R7, R0, end
98
99 xor_16_check:
100 SRLV $1, R9
101 BLT R7, R9, xor_8_check
102 xor_16:
103 MOVV (R5), R10
104 MOVV 8(R5), R11
105 MOVV (R6), R12
106 MOVV 8(R6), R13
107 XOR R10, R12
108 XOR R11, R13
109 MOVV R12, (R4)
110 MOVV R13, 8(R4)
111 ADDV $16, R5
112 ADDV $16, R6
113 ADDV $16, R4
114 SUBV $16, R7
115 BEQ R7, R0, end
116
117 xor_8_check:
118 SRLV $1, R9
119 BLT R7, R9, xor_4_check
120 xor_8:
121 MOVV (R5), R10
122 MOVV (R6), R11
123 XOR R10, R11
124 MOVV R11, (R4)
125 ADDV $8, R5
126 ADDV $8, R6
127 ADDV $8, R4
128 SUBV $8, R7
129 BEQ R7, R0, end
130
131 xor_4_check:
132 SRLV $1, R9
133 BLT R7, R9, xor_2_check
134 xor_4:
135 MOVW (R5), R10
136 MOVW (R6), R11
137 XOR R10, R11
138 MOVW R11, (R4)
139 ADDV $4, R5
140 ADDV $4, R6
141 ADDV $4, R4
142 SUBV $4, R7
143 BEQ R7, R0, end
144
145 xor_2_check:
146 SRLV $1, R9
147 BLT R7, R9, xor_1
148 xor_2:
149 MOVH (R5), R10
150 MOVH (R6), R11
151 XOR R10, R11
152 MOVH R11, (R4)
153 ADDV $2, R5
154 ADDV $2, R6
155 ADDV $2, R4
156 SUBV $2, R7
157 BEQ R7, R0, end
158
159 xor_1:
160 MOVB (R5), R10
161 MOVB (R6), R11
162 XOR R10, R11
163 MOVB R11, (R4)
164
165 end:
166 RET
167
View as plain text