Text file src/vendor/golang.org/x/crypto/internal/poly1305/sum_riscv64.s

     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