1 // Copyright 2026 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 #define LOAD64U(base, offset, t0, t1, t2, t3, dst) \
8 MOVBU (offset+0*1)(base), t0; \
9 MOVBU (offset+1*1)(base), t1; \
10 MOVBU (offset+2*1)(base), t2; \
11 MOVBU (offset+3*1)(base), t3; \
12 SLL $8, t1; \
13 SLL $16, t2; \
14 SLL $24, t3; \
15 OR t1, t0; \
16 OR t3, t2; \
17 OR t2, t0, dst; \
18 MOVBU (offset+4*1)(base), t0; \
19 MOVBU (offset+5*1)(base), t1; \
20 MOVBU (offset+6*1)(base), t2; \
21 MOVBU (offset+7*1)(base), t3; \
22 SLL $32, t0; \
23 SLL $40, t1; \
24 SLL $48, t2; \
25 SLL $56, t3; \
26 OR t1, t0; \
27 OR t3, t2; \
28 OR t2, t0; \
29 OR t0, dst
30
31 // func update(state *macState, msg []byte)
32 TEXT ·update(SB), $0-32
33 MOV state+0(FP), X5
34 MOV msg_base+8(FP), X6
35 MOV msg_len+16(FP), X7
36
37 MOV $16, X8
38
39 AND $7, X6, X28
40
41 MOV (0*8)(X5), X9 // h0
42 MOV (1*8)(X5), X10 // h1
43 MOV (2*8)(X5), X11 // h2
44 MOV (3*8)(X5), X12 // r0
45 MOV (4*8)(X5), X13 // r1
46
47 BLT X7, X8, tail
48
49 loop:
50 BEQZ X28, aligned_load
51
52 LOAD64U(X6, 0*8, X16, X18, X19, X20, X15) // msg[0:8]
53 LOAD64U(X6, 1*8, X16, X18, X19, X20, X17) // msg[8:16]
54 JMP block
55
56 aligned_load:
57 MOV (0*8)(X6), X15 // msg[0:8]
58 MOV (1*8)(X6), X17 // msg[8:16]
59
60 block:
61 ADD X15, X9 // h0 (x1 + y1 = z1', if z1' < x1 then z1' overflow)
62 SLTU X15, X9, X19 // h0.carry
63 ADD X17, X10, X22
64 SLTU X17, X22, X23
65 ADD X22, X19, X10 // h1
66 SLTU X22, X10, X19
67 OR X23, X19 // h1.carry
68 ADD $1, X19
69 ADD X19, X11 // h2
70
71 ADD $16, X6 // msg = msg[16:]
72
73 multiply:
74 MULHU X9, X12, X16 // h0r0.hi
75 MUL X9, X12, X15 // h0r0.lo
76 MULHU X10, X12, X17 // h1r0.hi
77 MUL X10, X12, X14 // h1r0.lo
78 ADD X14, X16
79 SLTU X14, X16, X19
80 ADD X19, X17
81 MUL X11, X12, X20
82 ADD X17, X20
83 MULHU X9, X13, X17 // h0r1.hi
84 MUL X9, X13, X14 // h0r1.lo
85 ADD X14, X16
86 SLTU X14, X16, X19
87 ADD X19, X17
88 MOV X17, X9
89 MUL X11, X13, X21 // h2r1
90 MULHU X10, X13, X17 // h1r1.hi
91 MUL X10, X13, X14 // h1r1.lo
92 ADD X14, X20
93 ADD X17, X21, X22
94 SLTU X14, X20, X19
95 ADD X22, X19, X21
96 ADD X9, X20
97 SLTU X9, X20, X19
98 ADD X19, X21
99 AND $3, X20, X11
100 AND $-4, X20, X18
101 ADD X18, X15, X9
102 ADD X21, X16, X22
103 SLTU X18, X9, X19
104 SLTU X21, X22, X23
105 ADD X22, X19, X10
106 SLTU X22, X10, X19
107 OR X19, X23, X19
108 ADD X19, X11
109 SLL $62, X21, X22
110 SRL $2, X20, X23
111 SRL $2, X21, X21
112 OR X22, X23, X20
113 ADD X20, X9, X9
114 ADD X21, X10, X22
115 SLTU X20, X9, X19
116 SLTU X21, X22, X23
117 ADD X22, X19, X10
118 SLTU X22, X10, X19
119 OR X19, X23, X19
120 ADD X19, X11, X11
121
122 SUB $16, X7, X7
123 BGE X7, X8, loop
124
125 tail:
126 BEQ X7, X0, done
127 MOV $1, X15
128 MOV $0, X16
129 ADD X7, X6, X6
130
131 flush_buffer:
132 MOVBU -1(X6), X20
133 SRL $56, X15, X19
134 SLL $8, X16, X23
135 SLL $8, X15, X15
136 OR X19, X23, X16
137 XOR X20, X15
138 SUB $1, X7, X7
139 SUB $1, X6, X6
140 BNE X7, X0, flush_buffer
141
142 ADD X15, X9
143 SLTU X15, X9, X19
144 ADD X16, X10, X22
145 SLTU X16, X22, X23
146 ADD X22, X19, X10
147 SLTU X22, X10, X19
148 OR X23, X19
149 ADD X19, X11
150
151 MOV $16, X7
152 JMP multiply
153
154 done:
155 MOV X9, (0*8)(X5) // h0
156 MOV X10, (1*8)(X5)
157 MOV X11, (2*8)(X5)
158 RET
159
View as plain text