| // Copyright 2025 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 (mips || mipsle) && !purego |
| |
| #include "textflag.h" |
| |
| // func xorBytesAligned(dst, a, b *byte, n int) |
| TEXT ·xorBytesAligned(SB), NOSPLIT|NOFRAME, $0 |
| MOVW dst+0(FP), R1 |
| MOVW a+4(FP), R2 |
| MOVW b+8(FP), R3 |
| MOVW n+12(FP), R4 |
| |
| SGTU $64, R4, R5 // R5 = 1 if (64 > R4) |
| BNE R5, xor_32_check |
| xor_64: |
| MOVW (R2), R6 |
| MOVW 4(R2), R7 |
| MOVW 8(R2), R8 |
| MOVW 12(R2), R9 |
| MOVW (R3), R10 |
| MOVW 4(R3), R11 |
| MOVW 8(R3), R12 |
| MOVW 12(R3), R13 |
| XOR R6, R10 |
| XOR R7, R11 |
| XOR R8, R12 |
| XOR R9, R13 |
| MOVW R10, (R1) |
| MOVW R11, 4(R1) |
| MOVW R12, 8(R1) |
| MOVW R13, 12(R1) |
| MOVW 16(R2), R6 |
| MOVW 20(R2), R7 |
| MOVW 24(R2), R8 |
| MOVW 28(R2), R9 |
| MOVW 16(R3), R10 |
| MOVW 20(R3), R11 |
| MOVW 24(R3), R12 |
| MOVW 28(R3), R13 |
| XOR R6, R10 |
| XOR R7, R11 |
| XOR R8, R12 |
| XOR R9, R13 |
| MOVW R10, 16(R1) |
| MOVW R11, 20(R1) |
| MOVW R12, 24(R1) |
| MOVW R13, 28(R1) |
| MOVW 32(R2), R6 |
| MOVW 36(R2), R7 |
| MOVW 40(R2), R8 |
| MOVW 44(R2), R9 |
| MOVW 32(R3), R10 |
| MOVW 36(R3), R11 |
| MOVW 40(R3), R12 |
| MOVW 44(R3), R13 |
| XOR R6, R10 |
| XOR R7, R11 |
| XOR R8, R12 |
| XOR R9, R13 |
| MOVW R10, 32(R1) |
| MOVW R11, 36(R1) |
| MOVW R12, 40(R1) |
| MOVW R13, 44(R1) |
| MOVW 48(R2), R6 |
| MOVW 52(R2), R7 |
| MOVW 56(R2), R8 |
| MOVW 60(R2), R9 |
| MOVW 48(R3), R10 |
| MOVW 52(R3), R11 |
| MOVW 56(R3), R12 |
| MOVW 60(R3), R13 |
| XOR R6, R10 |
| XOR R7, R11 |
| XOR R8, R12 |
| XOR R9, R13 |
| MOVW R10, 48(R1) |
| MOVW R11, 52(R1) |
| MOVW R12, 56(R1) |
| MOVW R13, 60(R1) |
| ADD $64, R2 |
| ADD $64, R3 |
| ADD $64, R1 |
| SUB $64, R4 |
| SGTU $64, R4, R5 |
| BEQ R5, xor_64 |
| BEQ R4, end |
| |
| xor_32_check: |
| SGTU $32, R4, R5 |
| BNE R5, xor_16_check |
| xor_32: |
| MOVW (R2), R6 |
| MOVW 4(R2), R7 |
| MOVW 8(R2), R8 |
| MOVW 12(R2), R9 |
| MOVW (R3), R10 |
| MOVW 4(R3), R11 |
| MOVW 8(R3), R12 |
| MOVW 12(R3), R13 |
| XOR R6, R10 |
| XOR R7, R11 |
| XOR R8, R12 |
| XOR R9, R13 |
| MOVW R10, (R1) |
| MOVW R11, 4(R1) |
| MOVW R12, 8(R1) |
| MOVW R13, 12(R1) |
| MOVW 16(R2), R6 |
| MOVW 20(R2), R7 |
| MOVW 24(R2), R8 |
| MOVW 28(R2), R9 |
| MOVW 16(R3), R10 |
| MOVW 20(R3), R11 |
| MOVW 24(R3), R12 |
| MOVW 28(R3), R13 |
| XOR R6, R10 |
| XOR R7, R11 |
| XOR R8, R12 |
| XOR R9, R13 |
| MOVW R10, 16(R1) |
| MOVW R11, 20(R1) |
| MOVW R12, 24(R1) |
| MOVW R13, 28(R1) |
| ADD $32, R2 |
| ADD $32, R3 |
| ADD $32, R1 |
| SUB $32, R4 |
| BEQ R4, end |
| |
| xor_16_check: |
| SGTU $16, R4, R5 |
| BNE R5, xor_8_check |
| xor_16: |
| MOVW (R2), R6 |
| MOVW 4(R2), R7 |
| MOVW 8(R2), R8 |
| MOVW 12(R2), R9 |
| MOVW (R3), R10 |
| MOVW 4(R3), R11 |
| MOVW 8(R3), R12 |
| MOVW 12(R3), R13 |
| XOR R6, R10 |
| XOR R7, R11 |
| XOR R8, R12 |
| XOR R9, R13 |
| MOVW R10, (R1) |
| MOVW R11, 4(R1) |
| MOVW R12, 8(R1) |
| MOVW R13, 12(R1) |
| ADD $16, R2 |
| ADD $16, R3 |
| ADD $16, R1 |
| SUB $16, R4 |
| BEQ R4, end |
| |
| xor_8_check: |
| SGTU $8, R4, R5 |
| BNE R5, xor_4 |
| xor_8: |
| MOVW (R2), R6 |
| MOVW 4(R2), R7 |
| MOVW (R3), R8 |
| MOVW 4(R3), R9 |
| XOR R6, R8 |
| XOR R7, R9 |
| MOVW R8, (R1) |
| MOVW R9, 4(R1) |
| ADD $8, R1 |
| ADD $8, R2 |
| ADD $8, R3 |
| SUB $8, R4 |
| BEQ R4, end |
| |
| xor_4: |
| MOVW (R2), R6 |
| MOVW (R3), R7 |
| XOR R6, R7 |
| MOVW R7, (R1) |
| ADD $4, R2 |
| ADD $4, R3 |
| ADD $4, R1 |
| SUB $4, R4 |
| |
| end: |
| RET |