File: sum_amd64_asm.go

package info (click to toggle)
golang-go.crypto 1%3A0.42.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 8,588 kB
  • sloc: asm: 28,094; ansic: 258; sh: 25; makefile: 11
file content (126 lines) | stat: -rw-r--r-- 2,484 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright 2024 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.

package main

import (
	. "github.com/mmcloughlin/avo/build"
	. "github.com/mmcloughlin/avo/operand"
	. "github.com/mmcloughlin/avo/reg"
	_ "golang.org/x/crypto/sha3"
)

//go:generate go run . -out ../sum_amd64.s -pkg poly1305

func main() {
	Package("golang.org/x/crypto/internal/poly1305")
	ConstraintExpr("gc,!purego")
	update()
	Generate()
}

func update() {
	Implement("update")

	Load(Param("state"), RDI)
	MOVQ(NewParamAddr("msg_base", 8), RSI)
	MOVQ(NewParamAddr("msg_len", 16), R15)

	MOVQ(Mem{Base: DI}.Offset(0), R8)   // h0
	MOVQ(Mem{Base: DI}.Offset(8), R9)   // h1
	MOVQ(Mem{Base: DI}.Offset(16), R10) // h2
	MOVQ(Mem{Base: DI}.Offset(24), R11) // r0
	MOVQ(Mem{Base: DI}.Offset(32), R12) // r1

	CMPQ(R15, Imm(16))
	JB(LabelRef("bytes_between_0_and_15"))

	Label("loop")
	POLY1305_ADD(RSI, R8, R9, R10)

	Label("multiply")
	POLY1305_MUL(R8, R9, R10, R11, R12, RBX, RCX, R13, R14)
	SUBQ(Imm(16), R15)
	CMPQ(R15, Imm(16))
	JAE(LabelRef("loop"))

	Label("bytes_between_0_and_15")
	TESTQ(R15, R15)
	JZ(LabelRef("done"))
	MOVQ(U32(1), RBX)
	XORQ(RCX, RCX)
	XORQ(R13, R13)
	ADDQ(R15, RSI)

	Label("flush_buffer")
	SHLQ(Imm(8), RBX, RCX)
	SHLQ(Imm(8), RBX)
	MOVB(Mem{Base: SI}.Offset(-1), R13B)
	XORQ(R13, RBX)
	DECQ(RSI)
	DECQ(R15)
	JNZ(LabelRef("flush_buffer"))

	ADDQ(RBX, R8)
	ADCQ(RCX, R9)
	ADCQ(Imm(0), R10)
	MOVQ(U32(16), R15)
	JMP(LabelRef("multiply"))

	Label("done")
	MOVQ(R8, Mem{Base: DI}.Offset(0))
	MOVQ(R9, Mem{Base: DI}.Offset(8))
	MOVQ(R10, Mem{Base: DI}.Offset(16))
	RET()
}

func POLY1305_ADD(msg, h0, h1, h2 GPPhysical) {
	ADDQ(Mem{Base: msg}.Offset(0), h0)
	ADCQ(Mem{Base: msg}.Offset(8), h1)
	ADCQ(Imm(1), h2)
	LEAQ(Mem{Base: msg}.Offset(16), msg)
}

func POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3 GPPhysical) {
	MOVQ(r0, RAX)
	MULQ(h0)
	MOVQ(RAX, t0)
	MOVQ(RDX, t1)
	MOVQ(r0, RAX)
	MULQ(h1)
	ADDQ(RAX, t1)
	ADCQ(Imm(0), RDX)
	MOVQ(r0, t2)
	IMULQ(h2, t2)
	ADDQ(RDX, t2)

	MOVQ(r1, RAX)
	MULQ(h0)
	ADDQ(RAX, t1)
	ADCQ(Imm(0), RDX)
	MOVQ(RDX, h0)
	MOVQ(r1, t3)
	IMULQ(h2, t3)
	MOVQ(r1, RAX)
	MULQ(h1)
	ADDQ(RAX, t2)
	ADCQ(RDX, t3)
	ADDQ(h0, t2)
	ADCQ(Imm(0), t3)

	MOVQ(t0, h0)
	MOVQ(t1, h1)
	MOVQ(t2, h2)
	ANDQ(Imm(3), h2)
	MOVQ(t2, t0)
	ANDQ(I32(-4), t0)
	ADDQ(t0, h0)
	ADCQ(t3, h1)
	ADCQ(Imm(0), h2)
	SHRQ(Imm(2), t3, t2)
	SHRQ(Imm(2), t3)
	ADDQ(t2, h0)
	ADCQ(t3, h1)
	ADCQ(Imm(0), h2)
}