1 // Copyright 2012 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.
5 // +build amd64,!gccgo,!appengine
9 #define POLY1305_ADD(msg, h0, h1, h2) \
15 #define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \
47 ANDQ $0xFFFFFFFFFFFFFFFC, t0; \
57 DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF
58 DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC
59 GLOBL ·poly1305Mask<>(SB), RODATA, $16
61 // func update(state *[7]uint64, msg []byte)
62 TEXT ·update(SB), $0-32
64 MOVQ msg_base+8(FP), SI
65 MOVQ msg_len+16(FP), R15
69 MOVQ 16(DI), R10 // h2
70 MOVQ 24(DI), R11 // r0
71 MOVQ 32(DI), R12 // r1
74 JB bytes_between_0_and_15
77 POLY1305_ADD(SI, R8, R9, R10)
80 POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14)
85 bytes_between_0_and_15:
114 // func initialize(state *[7]uint64, key *[32]byte)
115 TEXT ·initialize(SB), $0-16
119 // state[0...7] is initialized with zero
122 MOVOU ·poly1305Mask<>(SB), X2
128 // func finalize(tag *[TagSize]byte, state *[7]uint64)
129 TEXT ·finalize(SB), $0-16
138 SUBQ $0xFFFFFFFFFFFFFFFB, AX
139 SBBQ $0xFFFFFFFFFFFFFFFF, BX