1 // Copyright 2025 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 (mips || mipsle) && !purego
6
7 #include "textflag.h"
8
9 // func xorBytes(dst, a, b *byte, n int)
10 TEXT ·xorBytes(SB), NOSPLIT|NOFRAME, $0
11 MOVW dst+0(FP), R1
12 MOVW a+4(FP), R2
13 MOVW b+8(FP), R3
14 MOVW n+12(FP), R4
15
16 SGTU $64, R4, R5 // R5 = 1 if (64 > R4)
17 BNE R5, xor_32_check
18 xor_64:
19 MOVW (R2), R6
20 MOVW 4(R2), R7
21 MOVW 8(R2), R8
22 MOVW 12(R2), R9
23 MOVW (R3), R10
24 MOVW 4(R3), R11
25 MOVW 8(R3), R12
26 MOVW 12(R3), R13
27 XOR R6, R10
28 XOR R7, R11
29 XOR R8, R12
30 XOR R9, R13
31 MOVW R10, (R1)
32 MOVW R11, 4(R1)
33 MOVW R12, 8(R1)
34 MOVW R13, 12(R1)
35 MOVW 16(R2), R6
36 MOVW 20(R2), R7
37 MOVW 24(R2), R8
38 MOVW 28(R2), R9
39 MOVW 16(R3), R10
40 MOVW 20(R3), R11
41 MOVW 24(R3), R12
42 MOVW 28(R3), R13
43 XOR R6, R10
44 XOR R7, R11
45 XOR R8, R12
46 XOR R9, R13
47 MOVW R10, 16(R1)
48 MOVW R11, 20(R1)
49 MOVW R12, 24(R1)
50 MOVW R13, 28(R1)
51 MOVW 32(R2), R6
52 MOVW 36(R2), R7
53 MOVW 40(R2), R8
54 MOVW 44(R2), R9
55 MOVW 32(R3), R10
56 MOVW 36(R3), R11
57 MOVW 40(R3), R12
58 MOVW 44(R3), R13
59 XOR R6, R10
60 XOR R7, R11
61 XOR R8, R12
62 XOR R9, R13
63 MOVW R10, 32(R1)
64 MOVW R11, 36(R1)
65 MOVW R12, 40(R1)
66 MOVW R13, 44(R1)
67 MOVW 48(R2), R6
68 MOVW 52(R2), R7
69 MOVW 56(R2), R8
70 MOVW 60(R2), R9
71 MOVW 48(R3), R10
72 MOVW 52(R3), R11
73 MOVW 56(R3), R12
74 MOVW 60(R3), R13
75 XOR R6, R10
76 XOR R7, R11
77 XOR R8, R12
78 XOR R9, R13
79 MOVW R10, 48(R1)
80 MOVW R11, 52(R1)
81 MOVW R12, 56(R1)
82 MOVW R13, 60(R1)
83 ADD $64, R2
84 ADD $64, R3
85 ADD $64, R1
86 SUB $64, R4
87 SGTU $64, R4, R5
88 BEQ R0, R5, xor_64
89 BEQ R0, R4, end
90
91 xor_32_check:
92 SGTU $32, R4, R5
93 BNE R5, xor_16_check
94 xor_32:
95 MOVW (R2), R6
96 MOVW 4(R2), R7
97 MOVW 8(R2), R8
98 MOVW 12(R2), R9
99 MOVW (R3), R10
100 MOVW 4(R3), R11
101 MOVW 8(R3), R12
102 MOVW 12(R3), R13
103 XOR R6, R10
104 XOR R7, R11
105 XOR R8, R12
106 XOR R9, R13
107 MOVW R10, (R1)
108 MOVW R11, 4(R1)
109 MOVW R12, 8(R1)
110 MOVW R13, 12(R1)
111 MOVW 16(R2), R6
112 MOVW 20(R2), R7
113 MOVW 24(R2), R8
114 MOVW 28(R2), R9
115 MOVW 16(R3), R10
116 MOVW 20(R3), R11
117 MOVW 24(R3), R12
118 MOVW 28(R3), R13
119 XOR R6, R10
120 XOR R7, R11
121 XOR R8, R12
122 XOR R9, R13
123 MOVW R10, 16(R1)
124 MOVW R11, 20(R1)
125 MOVW R12, 24(R1)
126 MOVW R13, 28(R1)
127 ADD $32, R2
128 ADD $32, R3
129 ADD $32, R1
130 SUB $32, R4
131 BEQ R0, R4, end
132
133 xor_16_check:
134 SGTU $16, R4, R5
135 BNE R5, xor_8_check
136 xor_16:
137 MOVW (R2), R6
138 MOVW 4(R2), R7
139 MOVW 8(R2), R8
140 MOVW 12(R2), R9
141 MOVW (R3), R10
142 MOVW 4(R3), R11
143 MOVW 8(R3), R12
144 MOVW 12(R3), R13
145 XOR R6, R10
146 XOR R7, R11
147 XOR R8, R12
148 XOR R9, R13
149 MOVW R10, (R1)
150 MOVW R11, 4(R1)
151 MOVW R12, 8(R1)
152 MOVW R13, 12(R1)
153 ADD $16, R2
154 ADD $16, R3
155 ADD $16, R1
156 SUB $16, R4
157 BEQ R0, R4, end
158
159 xor_8_check:
160 SGTU $8, R4, R5
161 BNE R5, xor_4_check
162 xor_8:
163 MOVW (R2), R6
164 MOVW 4(R2), R7
165 MOVW (R3), R8
166 MOVW 4(R3), R9
167 XOR R6, R8
168 XOR R7, R9
169 MOVW R8, (R1)
170 MOVW R9, 4(R1)
171 ADD $8, R1
172 ADD $8, R2
173 ADD $8, R3
174 SUB $8, R4
175 BEQ R0, R4, end
176
177 xor_4_check:
178 SGTU $4, R4, R5
179 BNE R5, xor_2_check
180 xor_4:
181 MOVW (R2), R6
182 MOVW (R3), R7
183 XOR R6, R7
184 MOVW R7, (R1)
185 ADD $4, R2
186 ADD $4, R3
187 ADD $4, R1
188 SUB $4, R4
189 BEQ R0, R4, end
190
191 xor_2_check:
192 SGTU $2, R4, R5
193 BNE R5, xor_1
194 xor_2:
195 MOVH (R2), R6
196 MOVH (R3), R7
197 XOR R6, R7
198 MOVH R7, (R1)
199 ADD $2, R2
200 ADD $2, R3
201 ADD $2, R1
202 SUB $2, R4
203 BEQ R0, R4, end
204
205 xor_1:
206 MOVB (R2), R6
207 MOVB (R3), R7
208 XOR R6, R7
209 MOVB R7, (R1)
210
211 end:
212 RET
213
View as plain text