...
Run Format

Text file src/math/big/arith_386.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	MOVL z_len+4(FP), BX
    14	MOVL x_base+12(FP), SI
    15	MOVL y_base+24(FP), DI
    16	MOVL z_base+0(FP), BP
    17	// compute unrolled loop lengths
    18	MOVL BX, CX
    19	ANDL $3, CX
    20	SHRL $2, BX
    21	MOVL $0, DX	// clear saved carry
    22loop1:
    23	TESTL CX, CX; JZ loop1done
    24loop1cont:
    25	// unroll 1X in batches of 1
    26	ADDL DX, DX	// restore carry
    27	MOVL 0(SI), DX
    28	ADCL 0(DI), DX
    29	MOVL DX, 0(BP)
    30	SBBL DX, DX	// save carry
    31	LEAL 4(SI), SI	// ADD $4, SI
    32	LEAL 4(DI), DI	// ADD $4, DI
    33	LEAL 4(BP), BP	// ADD $4, BP
    34	SUBL $1, CX; JNZ loop1cont
    35loop1done:
    36loop4:
    37	TESTL BX, BX; JZ loop4done
    38loop4cont:
    39	// unroll 4X in batches of 1
    40	ADDL DX, DX	// restore carry
    41	MOVL 0(SI), CX
    42	ADCL 0(DI), CX
    43	MOVL CX, 0(BP)
    44	MOVL 4(SI), CX
    45	ADCL 4(DI), CX
    46	MOVL CX, 4(BP)
    47	MOVL 8(SI), CX
    48	ADCL 8(DI), CX
    49	MOVL CX, 8(BP)
    50	MOVL 12(SI), CX
    51	ADCL 12(DI), CX
    52	MOVL CX, 12(BP)
    53	SBBL DX, DX	// save carry
    54	LEAL 16(SI), SI	// ADD $16, SI
    55	LEAL 16(DI), DI	// ADD $16, DI
    56	LEAL 16(BP), BP	// ADD $16, BP
    57	SUBL $1, BX; JNZ loop4cont
    58loop4done:
    59	NEGL DX	// convert add carry
    60	MOVL DX, c+36(FP)
    61	RET
    62
    63// func subVV(z, x, y []Word) (c Word)
    64TEXT ·subVV(SB), NOSPLIT, $0
    65	MOVL z_len+4(FP), BX
    66	MOVL x_base+12(FP), SI
    67	MOVL y_base+24(FP), DI
    68	MOVL z_base+0(FP), BP
    69	// compute unrolled loop lengths
    70	MOVL BX, CX
    71	ANDL $3, CX
    72	SHRL $2, BX
    73	MOVL $0, DX	// clear saved carry
    74loop1:
    75	TESTL CX, CX; JZ loop1done
    76loop1cont:
    77	// unroll 1X in batches of 1
    78	ADDL DX, DX	// restore carry
    79	MOVL 0(SI), DX
    80	SBBL 0(DI), DX
    81	MOVL DX, 0(BP)
    82	SBBL DX, DX	// save carry
    83	LEAL 4(SI), SI	// ADD $4, SI
    84	LEAL 4(DI), DI	// ADD $4, DI
    85	LEAL 4(BP), BP	// ADD $4, BP
    86	SUBL $1, CX; JNZ loop1cont
    87loop1done:
    88loop4:
    89	TESTL BX, BX; JZ loop4done
    90loop4cont:
    91	// unroll 4X in batches of 1
    92	ADDL DX, DX	// restore carry
    93	MOVL 0(SI), CX
    94	SBBL 0(DI), CX
    95	MOVL CX, 0(BP)
    96	MOVL 4(SI), CX
    97	SBBL 4(DI), CX
    98	MOVL CX, 4(BP)
    99	MOVL 8(SI), CX
   100	SBBL 8(DI), CX
   101	MOVL CX, 8(BP)
   102	MOVL 12(SI), CX
   103	SBBL 12(DI), CX
   104	MOVL CX, 12(BP)
   105	SBBL DX, DX	// save carry
   106	LEAL 16(SI), SI	// ADD $16, SI
   107	LEAL 16(DI), DI	// ADD $16, DI
   108	LEAL 16(BP), BP	// ADD $16, BP
   109	SUBL $1, BX; JNZ loop4cont
   110loop4done:
   111	NEGL DX	// convert sub carry
   112	MOVL DX, c+36(FP)
   113	RET
   114
   115// func lshVU(z, x []Word, s uint) (c Word)
   116TEXT ·lshVU(SB), NOSPLIT, $0
   117	MOVL z_len+4(FP), BX
   118	TESTL BX, BX; JZ ret0
   119	MOVL s+24(FP), CX
   120	MOVL x_base+12(FP), SI
   121	MOVL z_base+0(FP), DI
   122	// run loop backward, using counter as positive index
   123	// shift first word into carry
   124	MOVL -4(SI)(BX*4), BP
   125	MOVL $0, DX
   126	SHLL CX, BP, DX
   127	MOVL DX, c+28(FP)
   128	// shift remaining words
   129	SUBL $1, BX
   130loop1:
   131	TESTL BX, BX; JZ loop1done
   132loop1cont:
   133	// unroll 1X in batches of 1
   134	MOVL -4(SI)(BX*4), DX
   135	SHLL CX, DX, BP
   136	MOVL BP, 0(DI)(BX*4)
   137	MOVL DX, BP
   138	SUBL $1, BX; JNZ loop1cont
   139loop1done:
   140	// store final shifted bits
   141	SHLL CX, BP
   142	MOVL BP, 0(DI)(BX*4)
   143	RET
   144ret0:
   145	MOVL $0, c+28(FP)
   146	RET
   147
   148// func rshVU(z, x []Word, s uint) (c Word)
   149TEXT ·rshVU(SB), NOSPLIT, $0
   150	MOVL z_len+4(FP), BX
   151	TESTL BX, BX; JZ ret0
   152	MOVL s+24(FP), CX
   153	MOVL x_base+12(FP), SI
   154	MOVL z_base+0(FP), DI
   155	// use counter as negative index
   156	LEAL (SI)(BX*4), SI
   157	LEAL (DI)(BX*4), DI
   158	NEGL BX
   159	// shift first word into carry
   160	MOVL 0(SI)(BX*4), BP
   161	MOVL $0, DX
   162	SHRL CX, BP, DX
   163	MOVL DX, c+28(FP)
   164	// shift remaining words
   165	ADDL $1, BX
   166loop1:
   167	TESTL BX, BX; JZ loop1done
   168loop1cont:
   169	// unroll 1X in batches of 1
   170	MOVL 0(SI)(BX*4), DX
   171	SHRL CX, DX, BP
   172	MOVL BP, -4(DI)(BX*4)
   173	MOVL DX, BP
   174	ADDL $1, BX; JNZ loop1cont
   175loop1done:
   176	// store final shifted bits
   177	SHRL CX, BP
   178	MOVL BP, -4(DI)(BX*4)
   179	RET
   180ret0:
   181	MOVL $0, c+28(FP)
   182	RET
   183
   184// func mulAddVWW(z, x []Word, m, a Word) (c Word)
   185TEXT ·mulAddVWW(SB), NOSPLIT, $0
   186	MOVL m+24(FP), BX
   187	MOVL a+28(FP), SI
   188	MOVL z_len+4(FP), DI
   189	MOVL x_base+12(FP), BP
   190	MOVL z_base+0(FP), CX
   191	// use counter as negative index
   192	LEAL (BP)(DI*4), BP
   193	LEAL (CX)(DI*4), CX
   194	NEGL DI
   195loop1:
   196	TESTL DI, DI; JZ loop1done
   197loop1cont:
   198	// unroll 1X in batches of 1
   199	MOVL 0(BP)(DI*4), AX
   200	// multiply
   201	MULL BX
   202	ADDL SI, AX
   203	MOVL DX, SI
   204	ADCL $0, SI
   205	MOVL AX, 0(CX)(DI*4)
   206	ADDL $1, DI; JNZ loop1cont
   207loop1done:
   208	MOVL SI, c+32(FP)
   209	RET
   210
   211// func addMulVVWW(z, x, y []Word, m, a Word) (c Word)
   212TEXT ·addMulVVWW(SB), NOSPLIT, $0
   213	MOVL a+40(FP), BX
   214	MOVL z_len+4(FP), SI
   215	MOVL x_base+12(FP), DI
   216	MOVL y_base+24(FP), BP
   217	MOVL z_base+0(FP), CX
   218	// use counter as negative index
   219	LEAL (DI)(SI*4), DI
   220	LEAL (BP)(SI*4), BP
   221	LEAL (CX)(SI*4), CX
   222	NEGL SI
   223loop1:
   224	TESTL SI, SI; JZ loop1done
   225loop1cont:
   226	// unroll 1X in batches of 1
   227	MOVL 0(BP)(SI*4), AX
   228	// multiply
   229	MULL m+36(FP)
   230	ADDL BX, AX
   231	MOVL DX, BX
   232	ADCL $0, BX
   233	// add
   234	ADDL 0(DI)(SI*4), AX
   235	ADCL $0, BX
   236	MOVL AX, 0(CX)(SI*4)
   237	ADDL $1, SI; JNZ loop1cont
   238loop1done:
   239	MOVL BX, c+44(FP)
   240	RET

View as plain text