podman
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.
4
5//go:build gc && !purego
6
7#include "textflag.h"
8
9#define POLY1305_ADD(msg, h0, h1, h2) \
10ADDQ 0(msg), h0; \
11ADCQ 8(msg), h1; \
12ADCQ $1, h2; \
13LEAQ 16(msg), msg
14
15#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \
16MOVQ r0, AX; \
17MULQ h0; \
18MOVQ AX, t0; \
19MOVQ DX, t1; \
20MOVQ r0, AX; \
21MULQ h1; \
22ADDQ AX, t1; \
23ADCQ $0, DX; \
24MOVQ r0, t2; \
25IMULQ h2, t2; \
26ADDQ DX, t2; \
27\
28MOVQ r1, AX; \
29MULQ h0; \
30ADDQ AX, t1; \
31ADCQ $0, DX; \
32MOVQ DX, h0; \
33MOVQ r1, t3; \
34IMULQ h2, t3; \
35MOVQ r1, AX; \
36MULQ h1; \
37ADDQ AX, t2; \
38ADCQ DX, t3; \
39ADDQ h0, t2; \
40ADCQ $0, t3; \
41\
42MOVQ t0, h0; \
43MOVQ t1, h1; \
44MOVQ t2, h2; \
45ANDQ $3, h2; \
46MOVQ t2, t0; \
47ANDQ $0xFFFFFFFFFFFFFFFC, t0; \
48ADDQ t0, h0; \
49ADCQ t3, h1; \
50ADCQ $0, h2; \
51SHRQ $2, t3, t2; \
52SHRQ $2, t3; \
53ADDQ t2, h0; \
54ADCQ t3, h1; \
55ADCQ $0, h2
56
57// func update(state *[7]uint64, msg []byte)
58TEXT ·update(SB), $0-32
59MOVQ state+0(FP), DI
60MOVQ msg_base+8(FP), SI
61MOVQ msg_len+16(FP), R15
62
63MOVQ 0(DI), R8 // h0
64MOVQ 8(DI), R9 // h1
65MOVQ 16(DI), R10 // h2
66MOVQ 24(DI), R11 // r0
67MOVQ 32(DI), R12 // r1
68
69CMPQ R15, $16
70JB bytes_between_0_and_15
71
72loop:
73POLY1305_ADD(SI, R8, R9, R10)
74
75multiply:
76POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14)
77SUBQ $16, R15
78CMPQ R15, $16
79JAE loop
80
81bytes_between_0_and_15:
82TESTQ R15, R15
83JZ done
84MOVQ $1, BX
85XORQ CX, CX
86XORQ R13, R13
87ADDQ R15, SI
88
89flush_buffer:
90SHLQ $8, BX, CX
91SHLQ $8, BX
92MOVB -1(SI), R13
93XORQ R13, BX
94DECQ SI
95DECQ R15
96JNZ flush_buffer
97
98ADDQ BX, R8
99ADCQ CX, R9
100ADCQ $0, R10
101MOVQ $16, R15
102JMP multiply
103
104done:
105MOVQ R8, 0(DI)
106MOVQ R9, 8(DI)
107MOVQ R10, 16(DI)
108RET
109