diff --git a/src/crypto/internal/fips140/subtle/xor_asm.go b/src/crypto/internal/fips140/subtle/xor_asm.go index 9a5da424aed9f23a74e50f9d75f914bf5143d649..1ff120edef5d71d545f954e565e0b899dc8a87a4 100644 --- a/src/crypto/internal/fips140/subtle/xor_asm.go +++ b/src/crypto/internal/fips140/subtle/xor_asm.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build (amd64 || arm64 || loong64 || ppc64 || ppc64le || riscv64) && !purego +//go:build (amd64 || arm64 || loong64 || mips64 || mips64le || ppc64 || ppc64le || riscv64) && !purego package subtle diff --git a/src/crypto/internal/fips140/subtle/xor_generic.go b/src/crypto/internal/fips140/subtle/xor_generic.go index 0b31eec60197d33cc194f022b2e4f473863790b5..08af84de2a3dabc85ae9230be5056cf5e32e2eca 100644 --- a/src/crypto/internal/fips140/subtle/xor_generic.go +++ b/src/crypto/internal/fips140/subtle/xor_generic.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build (!amd64 && !arm64 && !loong64 && !ppc64 && !ppc64le && !riscv64) || purego +//go:build (!amd64 && !arm64 && !loong64 && !mips64 && !mips64le && !ppc64 && !ppc64le && !riscv64) || purego package subtle diff --git a/src/crypto/internal/fips140/subtle/xor_mips64x.s b/src/crypto/internal/fips140/subtle/xor_mips64x.s new file mode 100644 index 0000000000000000000000000000000000000000..e580235914aeafc2fd0949d07dee23b7ce07e970 --- /dev/null +++ b/src/crypto/internal/fips140/subtle/xor_mips64x.s @@ -0,0 +1,153 @@ +// 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 (mips64 || mips64le) && !purego + +#include "textflag.h" + +// func xorBytes(dst, a, b *byte, n int) +TEXT ·xorBytes(SB), NOSPLIT|NOFRAME, $0 + MOVV dst+0(FP), R1 + MOVV a+8(FP), R2 + MOVV b+16(FP), R3 + MOVV n+24(FP), R4 + +xor_64_check: + SGTU $64, R4, R5 // R5 = 1 if (64 > R4) + BNE R5, xor_32_check +xor_64: + MOVV (R2), R6 + MOVV 8(R2), R7 + MOVV 16(R2), R8 + MOVV 24(R2), R9 + MOVV (R3), R10 + MOVV 8(R3), R11 + MOVV 16(R3), R12 + MOVV 24(R3), R13 + XOR R6, R10 + XOR R7, R11 + XOR R8, R12 + XOR R9, R13 + MOVV R10, (R1) + MOVV R11, 8(R1) + MOVV R12, 16(R1) + MOVV R13, 24(R1) + MOVV 32(R2), R6 + MOVV 40(R2), R7 + MOVV 48(R2), R8 + MOVV 56(R2), R9 + MOVV 32(R3), R10 + MOVV 40(R3), R11 + MOVV 48(R3), R12 + MOVV 56(R3), R13 + XOR R6, R10 + XOR R7, R11 + XOR R8, R12 + XOR R9, R13 + MOVV R10, 32(R1) + MOVV R11, 40(R1) + MOVV R12, 48(R1) + MOVV R13, 56(R1) + ADDV $64, R2 + ADDV $64, R3 + ADDV $64, R1 + SUBV $64, R4 + SGTU $64, R4, R5 + BEQ R0, R5, xor_64 + BEQ R0, R4, end + +xor_32_check: + SGTU $32, R4, R5 + BNE R5, xor_16_check +xor_32: + MOVV (R2), R6 + MOVV 8(R2), R7 + MOVV 16(R2), R8 + MOVV 24(R2), R9 + MOVV (R3), R10 + MOVV 8(R3), R11 + MOVV 16(R3), R12 + MOVV 24(R3), R13 + XOR R6, R10 + XOR R7, R11 + XOR R8, R12 + XOR R9, R13 + MOVV R10, (R1) + MOVV R11, 8(R1) + MOVV R12, 16(R1) + MOVV R13, 24(R1) + ADDV $32, R2 + ADDV $32, R3 + ADDV $32, R1 + SUBV $32, R4 + BEQ R0, R4, end + +xor_16_check: + SGTU $16, R4, R5 + BNE R5, xor_8_check +xor_16: + MOVV (R2), R6 + MOVV 8(R2), R7 + MOVV (R3), R8 + MOVV 8(R3), R9 + XOR R6, R8 + XOR R7, R9 + MOVV R8, (R1) + MOVV R9, 8(R1) + ADDV $16, R2 + ADDV $16, R3 + ADDV $16, R1 + SUBV $16, R4 + BEQ R0, R4, end + +xor_8_check: + SGTU $8, R4, R5 + BNE R5, xor_4_check +xor_8: + MOVV (R2), R6 + MOVV (R3), R7 + XOR R6, R7 + MOVV R7, (R1) + ADDV $8, R1 + ADDV $8, R2 + ADDV $8, R3 + SUBV $8, R4 + BEQ R0, R4, end + +xor_4_check: + SGTU $4, R4, R5 + BNE R5, xor_2_check +xor_4: + MOVW (R2), R6 + MOVW (R3), R7 + XOR R6, R7 + MOVW R7, (R1) + ADDV $4, R2 + ADDV $4, R3 + ADDV $4, R1 + SUBV $4, R4 + BEQ R0, R4, end + +xor_2_check: + SGTU $2, R4, R5 + BNE R5, xor_1 +xor_2: + MOVH (R2), R6 + MOVH (R3), R7 + XOR R6, R7 + MOVH R7, (R1) + ADDV $2, R2 + ADDV $2, R3 + ADDV $2, R1 + SUBV $2, R4 + BEQ R0, R4, end + +xor_1: + MOVB (R2), R6 + MOVB (R3), R7 + XOR R6, R7 + MOVB R7, (R1) + +end: + RET