Text file src/math/big/arith_386.s

     1  // Copyright 2009 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 !math_big_pure_go
     6  
     7  #include "textflag.h"
     8  
     9  // This file provides fast assembly versions for the elementary
    10  // arithmetic operations on vectors implemented in arith.go.
    11  
    12  // func addVV(z, x, y []Word) (c Word)
    13  TEXT ·addVV(SB),NOSPLIT,$0
    14  	MOVL z+0(FP), DI
    15  	MOVL x+12(FP), SI
    16  	MOVL y+24(FP), CX
    17  	MOVL z_len+4(FP), BP
    18  	MOVL $0, BX		// i = 0
    19  	MOVL $0, DX		// c = 0
    20  	JMP E1
    21  
    22  L1:	MOVL (SI)(BX*4), AX
    23  	ADDL DX, DX		// restore CF
    24  	ADCL (CX)(BX*4), AX
    25  	SBBL DX, DX		// save CF
    26  	MOVL AX, (DI)(BX*4)
    27  	ADDL $1, BX		// i++
    28  
    29  E1:	CMPL BX, BP		// i < n
    30  	JL L1
    31  
    32  	NEGL DX
    33  	MOVL DX, c+36(FP)
    34  	RET
    35  
    36  
    37  // func subVV(z, x, y []Word) (c Word)
    38  // (same as addVV except for SBBL instead of ADCL and label names)
    39  TEXT ·subVV(SB),NOSPLIT,$0
    40  	MOVL z+0(FP), DI
    41  	MOVL x+12(FP), SI
    42  	MOVL y+24(FP), CX
    43  	MOVL z_len+4(FP), BP
    44  	MOVL $0, BX		// i = 0
    45  	MOVL $0, DX		// c = 0
    46  	JMP E2
    47  
    48  L2:	MOVL (SI)(BX*4), AX
    49  	ADDL DX, DX		// restore CF
    50  	SBBL (CX)(BX*4), AX
    51  	SBBL DX, DX		// save CF
    52  	MOVL AX, (DI)(BX*4)
    53  	ADDL $1, BX		// i++
    54  
    55  E2:	CMPL BX, BP		// i < n
    56  	JL L2
    57  
    58  	NEGL DX
    59  	MOVL DX, c+36(FP)
    60  	RET
    61  
    62  
    63  // func addVW(z, x []Word, y Word) (c Word)
    64  TEXT ·addVW(SB),NOSPLIT,$0
    65  	MOVL z+0(FP), DI
    66  	MOVL x+12(FP), SI
    67  	MOVL y+24(FP), AX	// c = y
    68  	MOVL z_len+4(FP), BP
    69  	MOVL $0, BX		// i = 0
    70  	JMP E3
    71  
    72  L3:	ADDL (SI)(BX*4), AX
    73  	MOVL AX, (DI)(BX*4)
    74  	SBBL AX, AX		// save CF
    75  	NEGL AX
    76  	ADDL $1, BX		// i++
    77  
    78  E3:	CMPL BX, BP		// i < n
    79  	JL L3
    80  
    81  	MOVL AX, c+28(FP)
    82  	RET
    83  
    84  
    85  // func subVW(z, x []Word, y Word) (c Word)
    86  TEXT ·subVW(SB),NOSPLIT,$0
    87  	MOVL z+0(FP), DI
    88  	MOVL x+12(FP), SI
    89  	MOVL y+24(FP), AX	// c = y
    90  	MOVL z_len+4(FP), BP
    91  	MOVL $0, BX		// i = 0
    92  	JMP E4
    93  
    94  L4:	MOVL (SI)(BX*4), DX
    95  	SUBL AX, DX
    96  	MOVL DX, (DI)(BX*4)
    97  	SBBL AX, AX		// save CF
    98  	NEGL AX
    99  	ADDL $1, BX		// i++
   100  
   101  E4:	CMPL BX, BP		// i < n
   102  	JL L4
   103  
   104  	MOVL AX, c+28(FP)
   105  	RET
   106  
   107  
   108  // func shlVU(z, x []Word, s uint) (c Word)
   109  TEXT ·shlVU(SB),NOSPLIT,$0
   110  	MOVL z_len+4(FP), BX	// i = z
   111  	SUBL $1, BX		// i--
   112  	JL X8b			// i < 0	(n <= 0)
   113  
   114  	// n > 0
   115  	MOVL z+0(FP), DI
   116  	MOVL x+12(FP), SI
   117  	MOVL s+24(FP), CX
   118  	MOVL (SI)(BX*4), AX	// w1 = x[n-1]
   119  	MOVL $0, DX
   120  	SHLL CX, AX, DX		// w1>>ŝ
   121  	MOVL DX, c+28(FP)
   122  
   123  	CMPL BX, $0
   124  	JLE X8a			// i <= 0
   125  
   126  	// i > 0
   127  L8:	MOVL AX, DX		// w = w1
   128  	MOVL -4(SI)(BX*4), AX	// w1 = x[i-1]
   129  	SHLL CX, AX, DX		// w<<s | w1>>ŝ
   130  	MOVL DX, (DI)(BX*4)	// z[i] = w<<s | w1>>ŝ
   131  	SUBL $1, BX		// i--
   132  	JG L8			// i > 0
   133  
   134  	// i <= 0
   135  X8a:	SHLL CX, AX		// w1<<s
   136  	MOVL AX, (DI)		// z[0] = w1<<s
   137  	RET
   138  
   139  X8b:	MOVL $0, c+28(FP)
   140  	RET
   141  
   142  
   143  // func shrVU(z, x []Word, s uint) (c Word)
   144  TEXT ·shrVU(SB),NOSPLIT,$0
   145  	MOVL z_len+4(FP), BP
   146  	SUBL $1, BP		// n--
   147  	JL X9b			// n < 0	(n <= 0)
   148  
   149  	// n > 0
   150  	MOVL z+0(FP), DI
   151  	MOVL x+12(FP), SI
   152  	MOVL s+24(FP), CX
   153  	MOVL (SI), AX		// w1 = x[0]
   154  	MOVL $0, DX
   155  	SHRL CX, AX, DX		// w1<<ŝ
   156  	MOVL DX, c+28(FP)
   157  
   158  	MOVL $0, BX		// i = 0
   159  	JMP E9
   160  
   161  	// i < n-1
   162  L9:	MOVL AX, DX		// w = w1
   163  	MOVL 4(SI)(BX*4), AX	// w1 = x[i+1]
   164  	SHRL CX, AX, DX		// w>>s | w1<<ŝ
   165  	MOVL DX, (DI)(BX*4)	// z[i] = w>>s | w1<<ŝ
   166  	ADDL $1, BX		// i++
   167  
   168  E9:	CMPL BX, BP
   169  	JL L9			// i < n-1
   170  
   171  	// i >= n-1
   172  X9a:	SHRL CX, AX		// w1>>s
   173  	MOVL AX, (DI)(BP*4)	// z[n-1] = w1>>s
   174  	RET
   175  
   176  X9b:	MOVL $0, c+28(FP)
   177  	RET
   178  
   179  
   180  // func mulAddVWW(z, x []Word, y, r Word) (c Word)
   181  TEXT ·mulAddVWW(SB),NOSPLIT,$0
   182  	MOVL z+0(FP), DI
   183  	MOVL x+12(FP), SI
   184  	MOVL y+24(FP), BP
   185  	MOVL r+28(FP), CX	// c = r
   186  	MOVL z_len+4(FP), BX
   187  	LEAL (DI)(BX*4), DI
   188  	LEAL (SI)(BX*4), SI
   189  	NEGL BX			// i = -n
   190  	JMP E5
   191  
   192  L5:	MOVL (SI)(BX*4), AX
   193  	MULL BP
   194  	ADDL CX, AX
   195  	ADCL $0, DX
   196  	MOVL AX, (DI)(BX*4)
   197  	MOVL DX, CX
   198  	ADDL $1, BX		// i++
   199  
   200  E5:	CMPL BX, $0		// i < 0
   201  	JL L5
   202  
   203  	MOVL CX, c+32(FP)
   204  	RET
   205  
   206  
   207  // func addMulVVW(z, x []Word, y Word) (c Word)
   208  TEXT ·addMulVVW(SB),NOSPLIT,$0
   209  	MOVL z+0(FP), DI
   210  	MOVL x+12(FP), SI
   211  	MOVL y+24(FP), BP
   212  	MOVL z_len+4(FP), BX
   213  	LEAL (DI)(BX*4), DI
   214  	LEAL (SI)(BX*4), SI
   215  	NEGL BX			// i = -n
   216  	MOVL $0, CX		// c = 0
   217  	JMP E6
   218  
   219  L6:	MOVL (SI)(BX*4), AX
   220  	MULL BP
   221  	ADDL CX, AX
   222  	ADCL $0, DX
   223  	ADDL AX, (DI)(BX*4)
   224  	ADCL $0, DX
   225  	MOVL DX, CX
   226  	ADDL $1, BX		// i++
   227  
   228  E6:	CMPL BX, $0		// i < 0
   229  	JL L6
   230  
   231  	MOVL CX, c+28(FP)
   232  	RET
   233  
   234  
   235  
   236  

View as plain text