| // Copyright 2026 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. |
| |
| //go:build gc && !purego |
| |
| #define LOAD64U(base, offset, t0, t1, t2, t3, dst) \ |
| MOVBU (offset+0*1)(base), t0; \ |
| MOVBU (offset+1*1)(base), t1; \ |
| MOVBU (offset+2*1)(base), t2; \ |
| MOVBU (offset+3*1)(base), t3; \ |
| SLL $8, t1; \ |
| SLL $16, t2; \ |
| SLL $24, t3; \ |
| OR t1, t0; \ |
| OR t3, t2; \ |
| OR t2, t0, dst; \ |
| MOVBU (offset+4*1)(base), t0; \ |
| MOVBU (offset+5*1)(base), t1; \ |
| MOVBU (offset+6*1)(base), t2; \ |
| MOVBU (offset+7*1)(base), t3; \ |
| SLL $32, t0; \ |
| SLL $40, t1; \ |
| SLL $48, t2; \ |
| SLL $56, t3; \ |
| OR t1, t0; \ |
| OR t3, t2; \ |
| OR t2, t0; \ |
| OR t0, dst |
| |
| // func update(state *macState, msg []byte) |
| TEXT ·update(SB), $0-32 |
| MOV state+0(FP), X5 |
| MOV msg_base+8(FP), X6 |
| MOV msg_len+16(FP), X7 |
| |
| MOV $16, X8 |
| |
| AND $7, X6, X28 |
| |
| MOV (0*8)(X5), X9 // h0 |
| MOV (1*8)(X5), X10 // h1 |
| MOV (2*8)(X5), X11 // h2 |
| MOV (3*8)(X5), X12 // r0 |
| MOV (4*8)(X5), X13 // r1 |
| |
| BLT X7, X8, tail |
| |
| loop: |
| BEQZ X28, aligned_load |
| |
| LOAD64U(X6, 0*8, X16, X18, X19, X20, X15) // msg[0:8] |
| LOAD64U(X6, 1*8, X16, X18, X19, X20, X17) // msg[8:16] |
| JMP block |
| |
| aligned_load: |
| MOV (0*8)(X6), X15 // msg[0:8] |
| MOV (1*8)(X6), X17 // msg[8:16] |
| |
| block: |
| ADD X15, X9 // h0 (x1 + y1 = z1', if z1' < x1 then z1' overflow) |
| SLTU X15, X9, X19 // h0.carry |
| ADD X17, X10, X22 |
| SLTU X17, X22, X23 |
| ADD X22, X19, X10 // h1 |
| SLTU X22, X10, X19 |
| OR X23, X19 // h1.carry |
| ADD $1, X19 |
| ADD X19, X11 // h2 |
| |
| ADD $16, X6 // msg = msg[16:] |
| |
| multiply: |
| MULHU X9, X12, X16 // h0r0.hi |
| MUL X9, X12, X15 // h0r0.lo |
| MULHU X10, X12, X17 // h1r0.hi |
| MUL X10, X12, X14 // h1r0.lo |
| ADD X14, X16 |
| SLTU X14, X16, X19 |
| ADD X19, X17 |
| MUL X11, X12, X20 |
| ADD X17, X20 |
| MULHU X9, X13, X17 // h0r1.hi |
| MUL X9, X13, X14 // h0r1.lo |
| ADD X14, X16 |
| SLTU X14, X16, X19 |
| ADD X19, X17 |
| MOV X17, X9 |
| MUL X11, X13, X21 // h2r1 |
| MULHU X10, X13, X17 // h1r1.hi |
| MUL X10, X13, X14 // h1r1.lo |
| ADD X14, X20 |
| ADD X17, X21, X22 |
| SLTU X14, X20, X19 |
| ADD X22, X19, X21 |
| ADD X9, X20 |
| SLTU X9, X20, X19 |
| ADD X19, X21 |
| AND $3, X20, X11 |
| AND $-4, X20, X18 |
| ADD X18, X15, X9 |
| ADD X21, X16, X22 |
| SLTU X18, X9, X19 |
| SLTU X21, X22, X23 |
| ADD X22, X19, X10 |
| SLTU X22, X10, X19 |
| OR X19, X23, X19 |
| ADD X19, X11 |
| SLL $62, X21, X22 |
| SRL $2, X20, X23 |
| SRL $2, X21, X21 |
| OR X22, X23, X20 |
| ADD X20, X9, X9 |
| ADD X21, X10, X22 |
| SLTU X20, X9, X19 |
| SLTU X21, X22, X23 |
| ADD X22, X19, X10 |
| SLTU X22, X10, X19 |
| OR X19, X23, X19 |
| ADD X19, X11, X11 |
| |
| SUB $16, X7, X7 |
| BGE X7, X8, loop |
| |
| tail: |
| BEQ X7, X0, done |
| MOV $1, X15 |
| MOV $0, X16 |
| ADD X7, X6, X6 |
| |
| flush_buffer: |
| MOVBU -1(X6), X20 |
| SRL $56, X15, X19 |
| SLL $8, X16, X23 |
| SLL $8, X15, X15 |
| OR X19, X23, X16 |
| XOR X20, X15 |
| SUB $1, X7, X7 |
| SUB $1, X6, X6 |
| BNE X7, X0, flush_buffer |
| |
| ADD X15, X9 |
| SLTU X15, X9, X19 |
| ADD X16, X10, X22 |
| SLTU X16, X22, X23 |
| ADD X22, X19, X10 |
| SLTU X22, X10, X19 |
| OR X23, X19 |
| ADD X19, X11 |
| |
| MOV $16, X7 |
| JMP multiply |
| |
| done: |
| MOV X9, (0*8)(X5) // h0 |
| MOV X10, (1*8)(X5) |
| MOV X11, (2*8)(X5) |
| RET |