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 <daniel@binaryparadox.net>
Auto-Submit: Roland Shoemaker <roland@golang.org>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
This commit is contained in:
Roland Shoemaker
2026-05-18 11:44:40 -07:00
committed by Gopher Robot
parent 7ee59707ff
commit a749d17980
2 changed files with 32 additions and 99 deletions
@@ -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)
+26 -56
View File
@@ -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