| // Copyright 2025 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 |
| |
| // func update(state *macState, msg []byte) |
| TEXT ·update(SB), $0-32 |
| MOVV state+0(FP), R4 |
| MOVV msg_base+8(FP), R5 |
| MOVV msg_len+16(FP), R6 |
| |
| MOVV $0x10, R7 |
| |
| MOVV (R4), R8 // h0 |
| MOVV 8(R4), R9 // h1 |
| MOVV 16(R4), R10 // h2 |
| MOVV 24(R4), R11 // r0 |
| MOVV 32(R4), R12 // r1 |
| |
| BLT R6, R7, bytes_between_0_and_15 |
| |
| loop: |
| MOVV (R5), R14 // msg[0:8] |
| MOVV 8(R5), R16 // msg[8:16] |
| ADDV R14, R8, R8 // h0 (x1 + y1 = z1', if z1' < x1 then z1' overflow) |
| ADDV R16, R9, R27 |
| SGTU R14, R8, R24 // h0.carry |
| SGTU R9, R27, R28 |
| ADDV R27, R24, R9 // h1 |
| SGTU R27, R9, R24 |
| OR R24, R28, R24 // h1.carry |
| ADDV $0x01, R24, R24 |
| ADDV R10, R24, R10 // h2 |
| |
| ADDV $16, R5, R5 // msg = msg[16:] |
| |
| multiply: |
| MULV R8, R11, R14 // h0r0.lo |
| MULHVU R8, R11, R15 // h0r0.hi |
| MULV R9, R11, R13 // h1r0.lo |
| MULHVU R9, R11, R16 // h1r0.hi |
| ADDV R13, R15, R15 |
| SGTU R13, R15, R24 |
| ADDV R24, R16, R16 |
| MULV R10, R11, R25 |
| ADDV R16, R25, R25 |
| MULV R8, R12, R13 // h0r1.lo |
| MULHVU R8, R12, R16 // h0r1.hi |
| ADDV R13, R15, R15 |
| SGTU R13, R15, R24 |
| ADDV R24, R16, R16 |
| MOVV R16, R8 |
| MULV R10, R12, R26 // h2r1 |
| MULV R9, R12, R13 // h1r1.lo |
| MULHVU R9, R12, R16 // h1r1.hi |
| ADDV R13, R25, R25 |
| ADDV R16, R26, R27 |
| SGTU R13, R25, R24 |
| ADDV R27, R24, R26 |
| ADDV R8, R25, R25 |
| SGTU R8, R25, R24 |
| ADDV R24, R26, R26 |
| AND $3, R25, R10 |
| AND $-4, R25, R17 |
| ADDV R17, R14, R8 |
| ADDV R26, R15, R27 |
| SGTU R17, R8, R24 |
| SGTU R26, R27, R28 |
| ADDV R27, R24, R9 |
| SGTU R27, R9, R24 |
| OR R24, R28, R24 |
| ADDV R24, R10, R10 |
| SLLV $62, R26, R27 |
| SRLV $2, R25, R28 |
| SRLV $2, R26, R26 |
| OR R27, R28, R25 |
| ADDV R25, R8, R8 |
| ADDV R26, R9, R27 |
| SGTU R25, R8, R24 |
| SGTU R26, R27, R28 |
| ADDV R27, R24, R9 |
| SGTU R27, R9, R24 |
| OR R24, R28, R24 |
| ADDV R24, R10, R10 |
| |
| SUBV $16, R6, R6 |
| BGE R6, R7, loop |
| |
| bytes_between_0_and_15: |
| BEQ R6, R0, done |
| MOVV $1, R14 |
| XOR R15, R15 |
| ADDV R6, R5, R5 |
| |
| flush_buffer: |
| MOVBU -1(R5), R25 |
| SRLV $56, R14, R24 |
| SLLV $8, R15, R28 |
| SLLV $8, R14, R14 |
| OR R24, R28, R15 |
| XOR R25, R14, R14 |
| SUBV $1, R6, R6 |
| SUBV $1, R5, R5 |
| BNE R6, R0, flush_buffer |
| |
| ADDV R14, R8, R8 |
| SGTU R14, R8, R24 |
| ADDV R15, R9, R27 |
| SGTU R15, R27, R28 |
| ADDV R27, R24, R9 |
| SGTU R27, R9, R24 |
| OR R24, R28, R24 |
| ADDV R10, R24, R10 |
| |
| MOVV $16, R6 |
| JMP multiply |
| |
| done: |
| MOVV R8, (R4) |
| MOVV R9, 8(R4) |
| MOVV R10, 16(R4) |
| RET |