...
Run Format

Text file src/math/big/arith_riscv64.s

Documentation: math/big

     1// Copyright 2025 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// Code generated by 'go generate' (with ./internal/asmgen). DO NOT EDIT.
     6
     7//go:build !math_big_pure_go
     8
     9#include "textflag.h"
    10
    11// func addVV(z, x, y []Word) (c Word)
    12TEXT ·addVV(SB), NOSPLIT, $0
    13	MOV z_len+8(FP), X5
    14	MOV x_base+24(FP), X6
    15	MOV y_base+48(FP), X7
    16	MOV z_base+0(FP), X8
    17	// compute unrolled loop lengths
    18	AND $3, X5, X9
    19	SRL $2, X5
    20	XOR X28, X28	// clear carry
    21loop1:
    22	BEQZ X9, loop1done
    23loop1cont:
    24	// unroll 1X
    25	MOV 0(X6), X10
    26	MOV 0(X7), X11
    27	ADD X11, X10	// ADCS X11, X10, X10 (cr=X28)
    28	SLTU X11, X10, X31	// ...
    29	ADD X28, X10	// ...
    30	SLTU X28, X10, X28	// ...
    31	ADD X31, X28	// ...
    32	MOV X10, 0(X8)
    33	ADD $8, X6
    34	ADD $8, X7
    35	ADD $8, X8
    36	SUB $1, X9
    37	BNEZ X9, loop1cont
    38loop1done:
    39loop4:
    40	BEQZ X5, loop4done
    41loop4cont:
    42	// unroll 4X
    43	MOV 0(X6), X9
    44	MOV 8(X6), X10
    45	MOV 16(X6), X11
    46	MOV 24(X6), X12
    47	MOV 0(X7), X13
    48	MOV 8(X7), X14
    49	MOV 16(X7), X15
    50	MOV 24(X7), X16
    51	ADD X13, X9	// ADCS X13, X9, X9 (cr=X28)
    52	SLTU X13, X9, X31	// ...
    53	ADD X28, X9	// ...
    54	SLTU X28, X9, X28	// ...
    55	ADD X31, X28	// ...
    56	ADD X14, X10	// ADCS X14, X10, X10 (cr=X28)
    57	SLTU X14, X10, X31	// ...
    58	ADD X28, X10	// ...
    59	SLTU X28, X10, X28	// ...
    60	ADD X31, X28	// ...
    61	ADD X15, X11	// ADCS X15, X11, X11 (cr=X28)
    62	SLTU X15, X11, X31	// ...
    63	ADD X28, X11	// ...
    64	SLTU X28, X11, X28	// ...
    65	ADD X31, X28	// ...
    66	ADD X16, X12	// ADCS X16, X12, X12 (cr=X28)
    67	SLTU X16, X12, X31	// ...
    68	ADD X28, X12	// ...
    69	SLTU X28, X12, X28	// ...
    70	ADD X31, X28	// ...
    71	MOV X9, 0(X8)
    72	MOV X10, 8(X8)
    73	MOV X11, 16(X8)
    74	MOV X12, 24(X8)
    75	ADD $32, X6
    76	ADD $32, X7
    77	ADD $32, X8
    78	SUB $1, X5
    79	BNEZ X5, loop4cont
    80loop4done:
    81	MOV X28, c+72(FP)
    82	RET
    83
    84// func subVV(z, x, y []Word) (c Word)
    85TEXT ·subVV(SB), NOSPLIT, $0
    86	MOV z_len+8(FP), X5
    87	MOV x_base+24(FP), X6
    88	MOV y_base+48(FP), X7
    89	MOV z_base+0(FP), X8
    90	// compute unrolled loop lengths
    91	AND $3, X5, X9
    92	SRL $2, X5
    93	XOR X28, X28	// clear carry
    94loop1:
    95	BEQZ X9, loop1done
    96loop1cont:
    97	// unroll 1X
    98	MOV 0(X6), X10
    99	MOV 0(X7), X11
   100	SLTU X28, X10, X31	// SBCS X11, X10, X10
   101	SUB X28, X10	// ...
   102	SLTU X11, X10, X28	// ...
   103	SUB X11, X10	// ...
   104	ADD X31, X28	// ...
   105	MOV X10, 0(X8)
   106	ADD $8, X6
   107	ADD $8, X7
   108	ADD $8, X8
   109	SUB $1, X9
   110	BNEZ X9, loop1cont
   111loop1done:
   112loop4:
   113	BEQZ X5, loop4done
   114loop4cont:
   115	// unroll 4X
   116	MOV 0(X6), X9
   117	MOV 8(X6), X10
   118	MOV 16(X6), X11
   119	MOV 24(X6), X12
   120	MOV 0(X7), X13
   121	MOV 8(X7), X14
   122	MOV 16(X7), X15
   123	MOV 24(X7), X16
   124	SLTU X28, X9, X31	// SBCS X13, X9, X9
   125	SUB X28, X9	// ...
   126	SLTU X13, X9, X28	// ...
   127	SUB X13, X9	// ...
   128	ADD X31, X28	// ...
   129	SLTU X28, X10, X31	// SBCS X14, X10, X10
   130	SUB X28, X10	// ...
   131	SLTU X14, X10, X28	// ...
   132	SUB X14, X10	// ...
   133	ADD X31, X28	// ...
   134	SLTU X28, X11, X31	// SBCS X15, X11, X11
   135	SUB X28, X11	// ...
   136	SLTU X15, X11, X28	// ...
   137	SUB X15, X11	// ...
   138	ADD X31, X28	// ...
   139	SLTU X28, X12, X31	// SBCS X16, X12, X12
   140	SUB X28, X12	// ...
   141	SLTU X16, X12, X28	// ...
   142	SUB X16, X12	// ...
   143	ADD X31, X28	// ...
   144	MOV X9, 0(X8)
   145	MOV X10, 8(X8)
   146	MOV X11, 16(X8)
   147	MOV X12, 24(X8)
   148	ADD $32, X6
   149	ADD $32, X7
   150	ADD $32, X8
   151	SUB $1, X5
   152	BNEZ X5, loop4cont
   153loop4done:
   154	MOV X28, c+72(FP)
   155	RET
   156
   157// func lshVU(z, x []Word, s uint) (c Word)
   158TEXT ·lshVU(SB), NOSPLIT, $0
   159	MOV z_len+8(FP), X5
   160	BEQZ X5, ret0
   161	MOV s+48(FP), X6
   162	MOV x_base+24(FP), X7
   163	MOV z_base+0(FP), X8
   164	// run loop backward
   165	SLL $3, X5, X9
   166	ADD X9, X7
   167	SLL $3, X5, X9
   168	ADD X9, X8
   169	// shift first word into carry
   170	MOV -8(X7), X9
   171	MOV $64, X10
   172	SUB X6, X10
   173	SRL X10, X9, X11
   174	SLL X6, X9
   175	MOV X11, c+56(FP)
   176	// shift remaining words
   177	SUB $1, X5
   178	// compute unrolled loop lengths
   179	AND $3, X5, X11
   180	SRL $2, X5
   181loop1:
   182	BEQZ X11, loop1done
   183loop1cont:
   184	// unroll 1X
   185	MOV -16(X7), X12
   186	SRL X10, X12, X13
   187	OR X9, X13
   188	SLL X6, X12, X9
   189	MOV X13, -8(X8)
   190	ADD $-8, X7
   191	ADD $-8, X8
   192	SUB $1, X11
   193	BNEZ X11, loop1cont
   194loop1done:
   195loop4:
   196	BEQZ X5, loop4done
   197loop4cont:
   198	// unroll 4X
   199	MOV -16(X7), X11
   200	MOV -24(X7), X12
   201	MOV -32(X7), X13
   202	MOV -40(X7), X14
   203	SRL X10, X11, X15
   204	OR X9, X15
   205	SLL X6, X11, X9
   206	SRL X10, X12, X11
   207	OR X9, X11
   208	SLL X6, X12, X9
   209	SRL X10, X13, X12
   210	OR X9, X12
   211	SLL X6, X13, X9
   212	SRL X10, X14, X13
   213	OR X9, X13
   214	SLL X6, X14, X9
   215	MOV X15, -8(X8)
   216	MOV X11, -16(X8)
   217	MOV X12, -24(X8)
   218	MOV X13, -32(X8)
   219	ADD $-32, X7
   220	ADD $-32, X8
   221	SUB $1, X5
   222	BNEZ X5, loop4cont
   223loop4done:
   224	// store final shifted bits
   225	MOV X9, -8(X8)
   226	RET
   227ret0:
   228	MOV X0, c+56(FP)
   229	RET
   230
   231// func rshVU(z, x []Word, s uint) (c Word)
   232TEXT ·rshVU(SB), NOSPLIT, $0
   233	MOV z_len+8(FP), X5
   234	BEQZ X5, ret0
   235	MOV s+48(FP), X6
   236	MOV x_base+24(FP), X7
   237	MOV z_base+0(FP), X8
   238	// shift first word into carry
   239	MOV 0(X7), X9
   240	MOV $64, X10
   241	SUB X6, X10
   242	SLL X10, X9, X11
   243	SRL X6, X9
   244	MOV X11, c+56(FP)
   245	// shift remaining words
   246	SUB $1, X5
   247	// compute unrolled loop lengths
   248	AND $3, X5, X11
   249	SRL $2, X5
   250loop1:
   251	BEQZ X11, loop1done
   252loop1cont:
   253	// unroll 1X
   254	MOV 8(X7), X12
   255	SLL X10, X12, X13
   256	OR X9, X13
   257	SRL X6, X12, X9
   258	MOV X13, 0(X8)
   259	ADD $8, X7
   260	ADD $8, X8
   261	SUB $1, X11
   262	BNEZ X11, loop1cont
   263loop1done:
   264loop4:
   265	BEQZ X5, loop4done
   266loop4cont:
   267	// unroll 4X
   268	MOV 8(X7), X11
   269	MOV 16(X7), X12
   270	MOV 24(X7), X13
   271	MOV 32(X7), X14
   272	SLL X10, X11, X15
   273	OR X9, X15
   274	SRL X6, X11, X9
   275	SLL X10, X12, X11
   276	OR X9, X11
   277	SRL X6, X12, X9
   278	SLL X10, X13, X12
   279	OR X9, X12
   280	SRL X6, X13, X9
   281	SLL X10, X14, X13
   282	OR X9, X13
   283	SRL X6, X14, X9
   284	MOV X15, 0(X8)
   285	MOV X11, 8(X8)
   286	MOV X12, 16(X8)
   287	MOV X13, 24(X8)
   288	ADD $32, X7
   289	ADD $32, X8
   290	SUB $1, X5
   291	BNEZ X5, loop4cont
   292loop4done:
   293	// store final shifted bits
   294	MOV X9, 0(X8)
   295	RET
   296ret0:
   297	MOV X0, c+56(FP)
   298	RET
   299
   300// func mulAddVWW(z, x []Word, m, a Word) (c Word)
   301TEXT ·mulAddVWW(SB), NOSPLIT, $0
   302	MOV m+48(FP), X5
   303	MOV a+56(FP), X6
   304	MOV z_len+8(FP), X7
   305	MOV x_base+24(FP), X8
   306	MOV z_base+0(FP), X9
   307	// compute unrolled loop lengths
   308	AND $3, X7, X10
   309	SRL $2, X7
   310loop1:
   311	BEQZ X10, loop1done
   312loop1cont:
   313	// unroll 1X
   314	MOV 0(X8), X11
   315	// synthetic carry, one column at a time
   316	MUL X5, X11, X12
   317	MULHU X5, X11, X13
   318	ADD X6, X12, X11	// ADDS X6, X12, X11 (cr=X28)
   319	SLTU X6, X11, X28	// ...
   320	ADD X28, X13, X6	// ADC $0, X13, X6
   321	MOV X11, 0(X9)
   322	ADD $8, X8
   323	ADD $8, X9
   324	SUB $1, X10
   325	BNEZ X10, loop1cont
   326loop1done:
   327loop4:
   328	BEQZ X7, loop4done
   329loop4cont:
   330	// unroll 4X
   331	MOV 0(X8), X10
   332	MOV 8(X8), X11
   333	MOV 16(X8), X12
   334	MOV 24(X8), X13
   335	// synthetic carry, one column at a time
   336	MUL X5, X10, X14
   337	MULHU X5, X10, X15
   338	ADD X6, X14, X10	// ADDS X6, X14, X10 (cr=X28)
   339	SLTU X6, X10, X28	// ...
   340	ADD X28, X15, X6	// ADC $0, X15, X6
   341	MUL X5, X11, X14
   342	MULHU X5, X11, X15
   343	ADD X6, X14, X11	// ADDS X6, X14, X11 (cr=X28)
   344	SLTU X6, X11, X28	// ...
   345	ADD X28, X15, X6	// ADC $0, X15, X6
   346	MUL X5, X12, X14
   347	MULHU X5, X12, X15
   348	ADD X6, X14, X12	// ADDS X6, X14, X12 (cr=X28)
   349	SLTU X6, X12, X28	// ...
   350	ADD X28, X15, X6	// ADC $0, X15, X6
   351	MUL X5, X13, X14
   352	MULHU X5, X13, X15
   353	ADD X6, X14, X13	// ADDS X6, X14, X13 (cr=X28)
   354	SLTU X6, X13, X28	// ...
   355	ADD X28, X15, X6	// ADC $0, X15, X6
   356	MOV X10, 0(X9)
   357	MOV X11, 8(X9)
   358	MOV X12, 16(X9)
   359	MOV X13, 24(X9)
   360	ADD $32, X8
   361	ADD $32, X9
   362	SUB $1, X7
   363	BNEZ X7, loop4cont
   364loop4done:
   365	MOV X6, c+64(FP)
   366	RET
   367
   368// func addMulVVWW(z, x, y []Word, m, a Word) (c Word)
   369TEXT ·addMulVVWW(SB), NOSPLIT, $0
   370	MOV m+72(FP), X5
   371	MOV a+80(FP), X6
   372	MOV z_len+8(FP), X7
   373	MOV x_base+24(FP), X8
   374	MOV y_base+48(FP), X9
   375	MOV z_base+0(FP), X10
   376	// compute unrolled loop lengths
   377	AND $3, X7, X11
   378	SRL $2, X7
   379loop1:
   380	BEQZ X11, loop1done
   381loop1cont:
   382	// unroll 1X
   383	MOV 0(X8), X12
   384	MOV 0(X9), X13
   385	// synthetic carry, one column at a time
   386	MUL X5, X13, X14
   387	MULHU X5, X13, X15
   388	ADD X12, X14	// ADDS X12, X14, X14 (cr=X28)
   389	SLTU X12, X14, X28	// ...
   390	ADD X28, X15	// ADC $0, X15, X15
   391	ADD X6, X14, X13	// ADDS X6, X14, X13 (cr=X28)
   392	SLTU X6, X13, X28	// ...
   393	ADD X28, X15, X6	// ADC $0, X15, X6
   394	MOV X13, 0(X10)
   395	ADD $8, X8
   396	ADD $8, X9
   397	ADD $8, X10
   398	SUB $1, X11
   399	BNEZ X11, loop1cont
   400loop1done:
   401loop4:
   402	BEQZ X7, loop4done
   403loop4cont:
   404	// unroll 4X
   405	MOV 0(X8), X11
   406	MOV 8(X8), X12
   407	MOV 16(X8), X13
   408	MOV 24(X8), X14
   409	MOV 0(X9), X15
   410	MOV 8(X9), X16
   411	MOV 16(X9), X17
   412	MOV 24(X9), X18
   413	// synthetic carry, one column at a time
   414	MUL X5, X15, X19
   415	MULHU X5, X15, X20
   416	ADD X11, X19	// ADDS X11, X19, X19 (cr=X28)
   417	SLTU X11, X19, X28	// ...
   418	ADD X28, X20	// ADC $0, X20, X20
   419	ADD X6, X19, X15	// ADDS X6, X19, X15 (cr=X28)
   420	SLTU X6, X15, X28	// ...
   421	ADD X28, X20, X6	// ADC $0, X20, X6
   422	MUL X5, X16, X19
   423	MULHU X5, X16, X20
   424	ADD X12, X19	// ADDS X12, X19, X19 (cr=X28)
   425	SLTU X12, X19, X28	// ...
   426	ADD X28, X20	// ADC $0, X20, X20
   427	ADD X6, X19, X16	// ADDS X6, X19, X16 (cr=X28)
   428	SLTU X6, X16, X28	// ...
   429	ADD X28, X20, X6	// ADC $0, X20, X6
   430	MUL X5, X17, X19
   431	MULHU X5, X17, X20
   432	ADD X13, X19	// ADDS X13, X19, X19 (cr=X28)
   433	SLTU X13, X19, X28	// ...
   434	ADD X28, X20	// ADC $0, X20, X20
   435	ADD X6, X19, X17	// ADDS X6, X19, X17 (cr=X28)
   436	SLTU X6, X17, X28	// ...
   437	ADD X28, X20, X6	// ADC $0, X20, X6
   438	MUL X5, X18, X19
   439	MULHU X5, X18, X20
   440	ADD X14, X19	// ADDS X14, X19, X19 (cr=X28)
   441	SLTU X14, X19, X28	// ...
   442	ADD X28, X20	// ADC $0, X20, X20
   443	ADD X6, X19, X18	// ADDS X6, X19, X18 (cr=X28)
   444	SLTU X6, X18, X28	// ...
   445	ADD X28, X20, X6	// ADC $0, X20, X6
   446	MOV X15, 0(X10)
   447	MOV X16, 8(X10)
   448	MOV X17, 16(X10)
   449	MOV X18, 24(X10)
   450	ADD $32, X8
   451	ADD $32, X9
   452	ADD $32, X10
   453	SUB $1, X7
   454	BNEZ X7, loop4cont
   455loop4done:
   456	MOV X6, c+88(FP)
   457	RET

View as plain text