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

View as plain text