Text file src/math/big/arith_riscv64.s

     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)
    12  TEXT ·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
    21  loop1:
    22  	BEQZ X9, loop1done
    23  loop1cont:
    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
    38  loop1done:
    39  loop4:
    40  	BEQZ X5, loop4done
    41  loop4cont:
    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
    80  loop4done:
    81  	MOV X28, c+72(FP)
    82  	RET
    83  
    84  // func subVV(z, x, y []Word) (c Word)
    85  TEXT ·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
    94  loop1:
    95  	BEQZ X9, loop1done
    96  loop1cont:
    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
   111  loop1done:
   112  loop4:
   113  	BEQZ X5, loop4done
   114  loop4cont:
   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
   153  loop4done:
   154  	MOV X28, c+72(FP)
   155  	RET
   156  
   157  // func lshVU(z, x []Word, s uint) (c Word)
   158  TEXT ·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
   181  loop1:
   182  	BEQZ X11, loop1done
   183  loop1cont:
   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
   194  loop1done:
   195  loop4:
   196  	BEQZ X5, loop4done
   197  loop4cont:
   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
   223  loop4done:
   224  	// store final shifted bits
   225  	MOV X9, -8(X8)
   226  	RET
   227  ret0:
   228  	MOV X0, c+56(FP)
   229  	RET
   230  
   231  // func rshVU(z, x []Word, s uint) (c Word)
   232  TEXT ·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
   250  loop1:
   251  	BEQZ X11, loop1done
   252  loop1cont:
   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
   263  loop1done:
   264  loop4:
   265  	BEQZ X5, loop4done
   266  loop4cont:
   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
   292  loop4done:
   293  	// store final shifted bits
   294  	MOV X9, 0(X8)
   295  	RET
   296  ret0:
   297  	MOV X0, c+56(FP)
   298  	RET
   299  
   300  // func mulAddVWW(z, x []Word, m, a Word) (c Word)
   301  TEXT ·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
   310  loop1:
   311  	BEQZ X10, loop1done
   312  loop1cont:
   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
   326  loop1done:
   327  loop4:
   328  	BEQZ X7, loop4done
   329  loop4cont:
   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
   364  loop4done:
   365  	MOV X6, c+64(FP)
   366  	RET
   367  
   368  // func addMulVVWW(z, x, y []Word, m, a Word) (c Word)
   369  TEXT ·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
   379  loop1:
   380  	BEQZ X11, loop1done
   381  loop1cont:
   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
   400  loop1done:
   401  loop4:
   402  	BEQZ X7, loop4done
   403  loop4cont:
   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
   455  loop4done:
   456  	MOV X6, c+88(FP)
   457  	RET
   458  

View as plain text