// Copyright 2025 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Code generated by 'go generate' (with ./internal/asmgen). DO NOT EDIT. //go:build !math_big_pure_go #include "textflag.h" // func addVV(z, x, y []Word) (c Word) TEXT ·addVV(SB), NOSPLIT, $0 MOVL z_len+4(FP), BX MOVL x_base+12(FP), SI MOVL y_base+24(FP), DI MOVL z_base+0(FP), BP // compute unrolled loop lengths MOVL BX, CX ANDL $3, CX SHRL $2, BX MOVL $0, DX // clear saved carry loop1: TESTL CX, CX; JZ loop1done loop1cont: // unroll 1X in batches of 1 ADDL DX, DX // restore carry MOVL 0(SI), DX ADCL 0(DI), DX MOVL DX, 0(BP) SBBL DX, DX // save carry LEAL 4(SI), SI // ADD $4, SI LEAL 4(DI), DI // ADD $4, DI LEAL 4(BP), BP // ADD $4, BP SUBL $1, CX; JNZ loop1cont loop1done: loop4: TESTL BX, BX; JZ loop4done loop4cont: // unroll 4X in batches of 1 ADDL DX, DX // restore carry MOVL 0(SI), CX ADCL 0(DI), CX MOVL CX, 0(BP) MOVL 4(SI), CX ADCL 4(DI), CX MOVL CX, 4(BP) MOVL 8(SI), CX ADCL 8(DI), CX MOVL CX, 8(BP) MOVL 12(SI), CX ADCL 12(DI), CX MOVL CX, 12(BP) SBBL DX, DX // save carry LEAL 16(SI), SI // ADD $16, SI LEAL 16(DI), DI // ADD $16, DI LEAL 16(BP), BP // ADD $16, BP SUBL $1, BX; JNZ loop4cont loop4done: NEGL DX // convert add carry MOVL DX, c+36(FP) RET // func subVV(z, x, y []Word) (c Word) TEXT ·subVV(SB), NOSPLIT, $0 MOVL z_len+4(FP), BX MOVL x_base+12(FP), SI MOVL y_base+24(FP), DI MOVL z_base+0(FP), BP // compute unrolled loop lengths MOVL BX, CX ANDL $3, CX SHRL $2, BX MOVL $0, DX // clear saved carry loop1: TESTL CX, CX; JZ loop1done loop1cont: // unroll 1X in batches of 1 ADDL DX, DX // restore carry MOVL 0(SI), DX SBBL 0(DI), DX MOVL DX, 0(BP) SBBL DX, DX // save carry LEAL 4(SI), SI // ADD $4, SI LEAL 4(DI), DI // ADD $4, DI LEAL 4(BP), BP // ADD $4, BP SUBL $1, CX; JNZ loop1cont loop1done: loop4: TESTL BX, BX; JZ loop4done loop4cont: // unroll 4X in batches of 1 ADDL DX, DX // restore carry MOVL 0(SI), CX SBBL 0(DI), CX MOVL CX, 0(BP) MOVL 4(SI), CX SBBL 4(DI), CX MOVL CX, 4(BP) MOVL 8(SI), CX SBBL 8(DI), CX MOVL CX, 8(BP) MOVL 12(SI), CX SBBL 12(DI), CX MOVL CX, 12(BP) SBBL DX, DX // save carry LEAL 16(SI), SI // ADD $16, SI LEAL 16(DI), DI // ADD $16, DI LEAL 16(BP), BP // ADD $16, BP SUBL $1, BX; JNZ loop4cont loop4done: NEGL DX // convert sub carry MOVL DX, c+36(FP) RET // func lshVU(z, x []Word, s uint) (c Word) TEXT ·lshVU(SB), NOSPLIT, $0 MOVL z_len+4(FP), BX TESTL BX, BX; JZ ret0 MOVL s+24(FP), CX MOVL x_base+12(FP), SI MOVL z_base+0(FP), DI // run loop backward, using counter as positive index // shift first word into carry MOVL -4(SI)(BX*4), BP MOVL $0, DX SHLL CX, BP, DX MOVL DX, c+28(FP) // shift remaining words SUBL $1, BX loop1: TESTL BX, BX; JZ loop1done loop1cont: // unroll 1X in batches of 1 MOVL -4(SI)(BX*4), DX SHLL CX, DX, BP MOVL BP, 0(DI)(BX*4) MOVL DX, BP SUBL $1, BX; JNZ loop1cont loop1done: // store final shifted bits SHLL CX, BP MOVL BP, 0(DI)(BX*4) RET ret0: MOVL $0, c+28(FP) RET // func rshVU(z, x []Word, s uint) (c Word) TEXT ·rshVU(SB), NOSPLIT, $0 MOVL z_len+4(FP), BX TESTL BX, BX; JZ ret0 MOVL s+24(FP), CX MOVL x_base+12(FP), SI MOVL z_base+0(FP), DI // use counter as negative index LEAL (SI)(BX*4), SI LEAL (DI)(BX*4), DI NEGL BX // shift first word into carry MOVL 0(SI)(BX*4), BP MOVL $0, DX SHRL CX, BP, DX MOVL DX, c+28(FP) // shift remaining words ADDL $1, BX loop1: TESTL BX, BX; JZ loop1done loop1cont: // unroll 1X in batches of 1 MOVL 0(SI)(BX*4), DX SHRL CX, DX, BP MOVL BP, -4(DI)(BX*4) MOVL DX, BP ADDL $1, BX; JNZ loop1cont loop1done: // store final shifted bits SHRL CX, BP MOVL BP, -4(DI)(BX*4) RET ret0: MOVL $0, c+28(FP) RET // func mulAddVWW(z, x []Word, m, a Word) (c Word) TEXT ·mulAddVWW(SB), NOSPLIT, $0 MOVL m+24(FP), BX MOVL a+28(FP), SI MOVL z_len+4(FP), DI MOVL x_base+12(FP), BP MOVL z_base+0(FP), CX // use counter as negative index LEAL (BP)(DI*4), BP LEAL (CX)(DI*4), CX NEGL DI loop1: TESTL DI, DI; JZ loop1done loop1cont: // unroll 1X in batches of 1 MOVL 0(BP)(DI*4), AX // multiply MULL BX ADDL SI, AX MOVL DX, SI ADCL $0, SI MOVL AX, 0(CX)(DI*4) ADDL $1, DI; JNZ loop1cont loop1done: MOVL SI, c+32(FP) RET // func addMulVVWW(z, x, y []Word, m, a Word) (c Word) TEXT ·addMulVVWW(SB), NOSPLIT, $0 MOVL a+40(FP), BX MOVL z_len+4(FP), SI MOVL x_base+12(FP), DI MOVL y_base+24(FP), BP MOVL z_base+0(FP), CX // use counter as negative index LEAL (DI)(SI*4), DI LEAL (BP)(SI*4), BP LEAL (CX)(SI*4), CX NEGL SI loop1: TESTL SI, SI; JZ loop1done loop1cont: // unroll 1X in batches of 1 MOVL 0(BP)(SI*4), AX // multiply MULL m+36(FP) ADDL BX, AX MOVL DX, BX ADCL $0, BX // add ADDL 0(DI)(SI*4), AX ADCL $0, BX MOVL AX, 0(CX)(SI*4) ADDL $1, SI; JNZ loop1cont loop1done: MOVL BX, c+44(FP) RET