From a749d17980b8eb54b34872d8d8f2c90d69442cc5 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Wed, 14 May 2025 16:45:48 -0700 Subject: [PATCH] chacha20poly1305: remove usages of BYTE instr We have had VBROADCASTI128 since at least Go 1.11, so no need to use BYTE instructions. Change-Id: I297bbc636320ae830f6e8f83eb174efe8251a9a3 Reviewed-on: https://go-review.googlesource.com/c/crypto/+/672838 Reviewed-by: Daniel McCarney Auto-Submit: Roland Shoemaker LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com Reviewed-by: Cherry Mui --- .../_asm/chacha20poly1305_amd64_asm.go | 49 ++--------- chacha20poly1305/chacha20poly1305_amd64.s | 82 ++++++------------- 2 files changed, 32 insertions(+), 99 deletions(-) diff --git a/chacha20poly1305/_asm/chacha20poly1305_amd64_asm.go b/chacha20poly1305/_asm/chacha20poly1305_amd64_asm.go index c25199d..e718002 100644 --- a/chacha20poly1305/_asm/chacha20poly1305_amd64_asm.go +++ b/chacha20poly1305/_asm/chacha20poly1305_amd64_asm.go @@ -88,11 +88,6 @@ func main() { removePeskyUnicodeDot(internalFunctions, "../chacha20poly1305_amd64.s") } -// Utility function to emit BYTE instruction -func BYTE(u8 U8) { - Instruction(&ir.Instruction{Opcode: "BYTE", Operands: []Op{u8}}) -} - func chachaQR_AVX2(A, B, C, D, T VecPhysical) { VPADDD(B, A, A) VPXOR(A, D, D) @@ -373,38 +368,6 @@ func openSSETail16Store() { JMP(LabelRef("openSSEFinalize")) } -// Functions to emit AVX instructions via BYTE directive - -// broadcasti128 16(r8), ymm14 -func VBROADCASTI128_16_R8_YMM14() { - BYTE(U8(0xc4)) - BYTE(U8(0x42)) - BYTE(U8(0x7d)) - BYTE(U8(0x5a)) - BYTE(U8(0x70)) - BYTE(U8(0x10)) -} - -// broadcasti128 32(r8), ymm12 -func VBROADCASTI128_32_R8_YMM12() { - BYTE(U8(0xc4)) - BYTE(U8(0x42)) - BYTE(U8(0x7d)) - BYTE(U8(0x5a)) - BYTE(U8(0x60)) - BYTE(U8(0x20)) -} - -// broadcasti128 48(r8), ymm4 -func VBROADCASTI128_48_R8_YMM4() { - BYTE(U8(0xc4)) - BYTE(U8(0xc2)) - BYTE(U8(0x7d)) - BYTE(U8(0x5a)) - BYTE(U8(0x60)) - BYTE(U8(0x30)) -} - // Implements the following function signature: // // func chacha20Poly1305Open(dst []byte, key []uint32, src []byte, ad []byte) bool @@ -427,9 +390,9 @@ func chacha20Poly1305Open() { VZEROUPPER() chacha20Constants := chacha20Constants_DATA() VMOVDQU(chacha20Constants, AA0) - VBROADCASTI128_16_R8_YMM14() - VBROADCASTI128_32_R8_YMM12() - VBROADCASTI128_48_R8_YMM4() + VBROADCASTI128(Mem{Base: R8}.Offset(16), BB0) + VBROADCASTI128(Mem{Base: R8}.Offset(32), CC0) + VBROADCASTI128(Mem{Base: R8}.Offset(48), DD0) avx2InitMask := avx2InitMask_DATA() VPADDD(avx2InitMask, DD0, DD0) @@ -1853,9 +1816,9 @@ func chacha20Poly1305Seal() { VZEROUPPER() chacha20Constants := chacha20Constants_DATA() VMOVDQU(chacha20Constants, AA0) - VBROADCASTI128_16_R8_YMM14() - VBROADCASTI128_32_R8_YMM12() - VBROADCASTI128_48_R8_YMM4() + VBROADCASTI128(Mem{Base: R8}.Offset(16), BB0) + VBROADCASTI128(Mem{Base: R8}.Offset(32), CC0) + VBROADCASTI128(Mem{Base: R8}.Offset(48), DD0) avx2InitMask := avx2InitMask_DATA() VPADDD(avx2InitMask, DD0, DD0) diff --git a/chacha20poly1305/chacha20poly1305_amd64.s b/chacha20poly1305/chacha20poly1305_amd64.s index 7c0dcd1..c703c13 100644 --- a/chacha20poly1305/chacha20poly1305_amd64.s +++ b/chacha20poly1305/chacha20poly1305_amd64.s @@ -171,35 +171,20 @@ hashADDone: // Requires: AVX, AVX2, BMI2, CMOV, SSE2 TEXT ·chacha20Poly1305Open(SB), $288-97 // For aligned stack access - MOVQ SP, BP - ADDQ $0x20, BP - ANDQ $-32, BP - MOVQ dst_base+0(FP), DI - MOVQ key_base+24(FP), R8 - MOVQ src_base+48(FP), SI - MOVQ src_len+56(FP), BX - MOVQ ad_base+72(FP), CX + MOVQ SP, BP + ADDQ $0x20, BP + ANDQ $-32, BP + MOVQ dst_base+0(FP), DI + MOVQ key_base+24(FP), R8 + MOVQ src_base+48(FP), SI + MOVQ src_len+56(FP), BX + MOVQ ad_base+72(FP), CX VZEROUPPER - VMOVDQU ·chacha20Constants<>+0(SB), Y0 - BYTE $0xc4 - BYTE $0x42 - BYTE $0x7d - BYTE $0x5a - BYTE $0x70 - BYTE $0x10 - BYTE $0xc4 - BYTE $0x42 - BYTE $0x7d - BYTE $0x5a - BYTE $0x60 - BYTE $0x20 - BYTE $0xc4 - BYTE $0xc2 - BYTE $0x7d - BYTE $0x5a - BYTE $0x60 - BYTE $0x30 - VPADDD ·avx2InitMask<>+0(SB), Y4, Y4 + VMOVDQU ·chacha20Constants<>+0(SB), Y0 + VBROADCASTI128 16(R8), Y14 + VBROADCASTI128 32(R8), Y12 + VBROADCASTI128 48(R8), Y4 + VPADDD ·avx2InitMask<>+0(SB), Y4, Y4 // Special optimization, for very short buffers CMPQ BX, $0xc0 @@ -2488,35 +2473,20 @@ GLOBL ·andMask<>(SB), RODATA|NOPTR, $240 // func chacha20Poly1305Seal(dst []byte, key []uint32, src []byte, ad []byte) // Requires: AVX, AVX2, BMI2, CMOV, SSE2 TEXT ·chacha20Poly1305Seal(SB), $288-96 - MOVQ SP, BP - ADDQ $0x20, BP - ANDQ $-32, BP - MOVQ dst_base+0(FP), DI - MOVQ key_base+24(FP), R8 - MOVQ src_base+48(FP), SI - MOVQ src_len+56(FP), BX - MOVQ ad_base+72(FP), CX + MOVQ SP, BP + ADDQ $0x20, BP + ANDQ $-32, BP + MOVQ dst_base+0(FP), DI + MOVQ key_base+24(FP), R8 + MOVQ src_base+48(FP), SI + MOVQ src_len+56(FP), BX + MOVQ ad_base+72(FP), CX VZEROUPPER - VMOVDQU ·chacha20Constants<>+0(SB), Y0 - BYTE $0xc4 - BYTE $0x42 - BYTE $0x7d - BYTE $0x5a - BYTE $0x70 - BYTE $0x10 - BYTE $0xc4 - BYTE $0x42 - BYTE $0x7d - BYTE $0x5a - BYTE $0x60 - BYTE $0x20 - BYTE $0xc4 - BYTE $0xc2 - BYTE $0x7d - BYTE $0x5a - BYTE $0x60 - BYTE $0x30 - VPADDD ·avx2InitMask<>+0(SB), Y4, Y4 + VMOVDQU ·chacha20Constants<>+0(SB), Y0 + VBROADCASTI128 16(R8), Y14 + VBROADCASTI128 32(R8), Y12 + VBROADCASTI128 48(R8), Y4 + VPADDD ·avx2InitMask<>+0(SB), Y4, Y4 // Special optimizations, for very short buffers CMPQ BX, $0x000000c0