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

View File

@ -6,27 +6,10 @@
package big
import (
"testing"
)
import "testing"
// Tests whether the non vector routines are working, even when the tests are run on a
// vector-capable machine
func TestFunVVnovec(t *testing.T) {
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)
}
}
func TestNoVec(t *testing.T) {
// Make sure non-vector versions match vector versions.
t.Run("AddVV", func(t *testing.T) { testVV(t, "addVV_novec", addVV_novec, addVV) })
t.Run("SubVV", func(t *testing.T) { testVV(t, "subVV_novec", subVV_novec, subVV) })
}

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) {
x := rndNat(800)
b.Run("Shl", func(b *testing.B) {
b.Run("Lsh", func(b *testing.B) {
for i := 0; i < b.N; i++ {
var z nat
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++ {
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++ {
var z nat
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++ {
x.rsh(x, 0)
}