| // Copyright 2009 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. |
| |
| //go:build !purego |
| |
| #include "textflag.h" |
| |
| // func addMulVVW1024(z, x *uint, y uint) (c uint) |
| TEXT ·addMulVVW1024(SB), $0-16 |
| MOVL $32, BX |
| JMP addMulVVWx(SB) |
| |
| // func addMulVVW1536(z, x *uint, y uint) (c uint) |
| TEXT ·addMulVVW1536(SB), $0-16 |
| MOVL $48, BX |
| JMP addMulVVWx(SB) |
| |
| // func addMulVVW2048(z, x *uint, y uint) (c uint) |
| TEXT ·addMulVVW2048(SB), $0-16 |
| MOVL $64, BX |
| JMP addMulVVWx(SB) |
| |
| TEXT addMulVVWx(SB), NOFRAME|NOSPLIT, $0 |
| MOVL z+0(FP), DI |
| MOVL x+4(FP), SI |
| MOVL y+8(FP), BP |
| LEAL (DI)(BX*4), DI |
| LEAL (SI)(BX*4), SI |
| NEGL BX // i = -n |
| MOVL $0, CX // c = 0 |
| JMP E6 |
| |
| L6: MOVL (SI)(BX*4), AX |
| MULL BP |
| ADDL CX, AX |
| ADCL $0, DX |
| ADDL AX, (DI)(BX*4) |
| ADCL $0, DX |
| MOVL DX, CX |
| ADDL $1, BX // i++ |
| |
| E6: CMPL BX, $0 // i < 0 |
| JL L6 |
| |
| MOVL CX, c+12(FP) |
| RET |