math/big: add more complete tests and benchmarks of assembly

Also fix a few real but currently harmless bugs from CL 664895.
There were a few places that were still wrong if z != x or if a != 0.

Change-Id: Id8971e2505523bc4708780c82bf998a546f4f081
Reviewed-on: https://go-review.googlesource.com/c/go/+/664897
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
Russ Cox 2025-03-30 16:56:29 -04:00
parent 930cf59ba8
commit b44b360dd4
4 changed files with 631 additions and 389 deletions

View File

@ -430,7 +430,7 @@ adx:
MOVQ y+48(FP), R8 MOVQ y+48(FP), R8
MOVQ m+72(FP), DX MOVQ m+72(FP), DX
MOVQ $0, BX // i = 0 MOVQ $0, BX // i = 0
MOVQ $0, CX // carry MOVQ a+80(FP), CX // carry
CMPQ R11, $8 CMPQ R11, $8
JAE adx_loop_header JAE adx_loop_header
CMPQ BX, R11 CMPQ BX, R11
@ -446,7 +446,7 @@ adx_loop:
MULXQ (R8), SI, DI MULXQ (R8), SI, DI
ADCXQ CX,SI ADCXQ CX,SI
ADOXQ (R10), SI ADOXQ (R10), SI
MOVQ SI,(R10) MOVQ SI,(R14)
MULXQ 8(R8), AX, CX MULXQ 8(R8), AX, CX
ADCXQ DI, AX ADCXQ DI, AX
@ -505,7 +505,8 @@ adx_short:
MULXQ (R8)(BX*8), SI, DI MULXQ (R8)(BX*8), SI, DI
ADDQ CX, SI ADDQ CX, SI
ADCQ $0, DI ADCQ $0, DI
ADDQ SI, (R10)(BX*8) ADDQ (R10)(BX*8), SI
MOVQ SI, (R14)(BX*8)
ADCQ $0, DI ADCQ $0, DI
MOVQ DI, CX MOVQ DI, CX
ADDQ $1, BX // i++ ADDQ $1, BX // i++

View File

@ -6,27 +6,10 @@
package big package big
import ( import "testing"
"testing"
)
// Tests whether the non vector routines are working, even when the tests are run on a func TestNoVec(t *testing.T) {
// vector-capable machine // Make sure non-vector versions match vector versions.
t.Run("AddVV", func(t *testing.T) { testVV(t, "addVV_novec", addVV_novec, addVV) })
func TestFunVVnovec(t *testing.T) { t.Run("SubVV", func(t *testing.T) { testVV(t, "subVV_novec", subVV_novec, subVV) })
if hasVX {
for _, a := range sumVV {
arg := a
testFunVV(t, "addVV_novec", addVV_novec, arg)
arg = argVV{a.z, a.y, a.x, a.c}
testFunVV(t, "addVV_novec symmetric", addVV_novec, arg)
arg = argVV{a.x, a.z, a.y, a.c}
testFunVV(t, "subVV_novec", subVV_novec, arg)
arg = argVV{a.y, a.z, a.x, a.c}
testFunVV(t, "subVV_novec symmetric", subVV_novec, arg)
}
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -466,25 +466,25 @@ func TestShiftRight(t *testing.T) {
func BenchmarkZeroShifts(b *testing.B) { func BenchmarkZeroShifts(b *testing.B) {
x := rndNat(800) x := rndNat(800)
b.Run("Shl", func(b *testing.B) { b.Run("Lsh", func(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
var z nat var z nat
z.lsh(x, 0) z.lsh(x, 0)
} }
}) })
b.Run("ShlSame", func(b *testing.B) { b.Run("LshSame", func(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
x.lsh(x, 0) x.lsh(x, 0)
} }
}) })
b.Run("Shr", func(b *testing.B) { b.Run("Rsh", func(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
var z nat var z nat
z.rsh(x, 0) z.rsh(x, 0)
} }
}) })
b.Run("ShrSame", func(b *testing.B) { b.Run("RshSame", func(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
x.rsh(x, 0) x.rsh(x, 0)
} }