Commit 5bf57c1b authored by Robert Griesemer's avatar Robert Griesemer

big: remove some unnecessary conversions

R=rsc
CC=golang-dev
https://golang.org/cl/4529110
parent 2a8ea0d1
......@@ -188,7 +188,7 @@ func subVW_g(z, x []Word, y Word) (c Word) {
}
func shlVW_g(z, x []Word, s Word) (c Word) {
func shlVU_g(z, x []Word, s uint) (c Word) {
if n := len(z); n > 0 {
ŝ := _W - s
w1 := x[n-1]
......@@ -204,7 +204,7 @@ func shlVW_g(z, x []Word, s Word) (c Word) {
}
func shrVW_g(z, x []Word, s Word) (c Word) {
func shrVU_g(z, x []Word, s uint) (c Word) {
if n := len(z); n > 0 {
ŝ := _W - s
w1 := x[0]
......
......@@ -118,8 +118,8 @@ E4: CMPL BX, BP // i < n
RET
// func shlVW(z, x []Word, s Word) (c Word)
TEXT ·shlVW(SB),7,$0
// func shlVU(z, x []Word, s uint) (c Word)
TEXT ·shlVU(SB),7,$0
MOVL n+4(FP), BX // i = n
SUBL $1, BX // i--
JL X8b // i < 0 (n <= 0)
......@@ -153,8 +153,8 @@ X8b: MOVL $0, c+28(FP)
RET
// func shrVW(z, x []Word, s Word) (c Word)
TEXT ·shrVW(SB),7,$0
// func shrVU(z, x []Word, s uint) (c Word)
TEXT ·shrVU(SB),7,$0
MOVL n+4(FP), BP
SUBL $1, BP // n--
JL X9b // n < 0 (n <= 0)
......
......@@ -120,8 +120,8 @@ E4: CMPQ BX, R11 // i < n
RET
// func shlVW(z, x []Word, s Word) (c Word)
TEXT ·shlVW(SB),7,$0
// func shlVU(z, x []Word, s uint) (c Word)
TEXT ·shlVU(SB),7,$0
MOVL n+8(FP), BX // i = n
SUBL $1, BX // i--
JL X8b // i < 0 (n <= 0)
......@@ -129,7 +129,7 @@ TEXT ·shlVW(SB),7,$0
// n > 0
MOVQ z+0(FP), R10
MOVQ x+16(FP), R8
MOVQ s+32(FP), CX
MOVL s+32(FP), CX
MOVQ (R8)(BX*8), AX // w1 = x[n-1]
MOVQ $0, DX
SHLQ CX, DX:AX // w1>>ŝ
......@@ -155,8 +155,8 @@ X8b: MOVQ $0, c+40(FP)
RET
// func shrVW(z, x []Word, s Word) (c Word)
TEXT ·shrVW(SB),7,$0
// func shrVU(z, x []Word, s uint) (c Word)
TEXT ·shrVU(SB),7,$0
MOVL n+8(FP), R11
SUBL $1, R11 // n--
JL X9b // n < 0 (n <= 0)
......@@ -164,7 +164,7 @@ TEXT ·shrVW(SB),7,$0
// n > 0
MOVQ z+0(FP), R10
MOVQ x+16(FP), R8
MOVQ s+32(FP), CX
MOVL s+32(FP), CX
MOVQ (R8), AX // w1 = x[0]
MOVQ $0, DX
SHRQ CX, DX:AX // w1<<ŝ
......
......@@ -97,6 +97,7 @@ E3:
RET
// func subVW(z, x []Word, y Word) (c Word)
TEXT ·subVW(SB),7,$0
MOVW z+0(FP), R1
MOVW x+12(FP), R2
......@@ -131,8 +132,8 @@ E4:
RET
// func shlVW(z, x []Word, s Word) (c Word)
TEXT ·shlVW(SB),7,$0
// func shlVU(z, x []Word, s uint) (c Word)
TEXT ·shlVU(SB),7,$0
MOVW n+4(FP), R5
CMP $0, R5
BEQ X7
......@@ -180,7 +181,8 @@ X7:
RET
TEXT ·shrVW(SB),7,$0
// func shrVU(z, x []Word, s uint) (c Word)
TEXT ·shrVU(SB),7,$0
MOVW n+4(FP), R5
CMP $0, R5
BEQ X6
......@@ -229,6 +231,7 @@ X6:
RET
// func mulAddVWW(z, x []Word, y, r Word) (c Word)
TEXT ·mulAddVWW(SB),7,$0
MOVW $0, R0
MOVW z+0(FP), R1
......@@ -256,6 +259,7 @@ E8:
RET
// func addMulVVW(z, x []Word, y Word) (c Word)
TEXT ·addMulVVW(SB),7,$0
MOVW $0, R0
MOVW z+0(FP), R1
......@@ -286,11 +290,13 @@ E9:
RET
// divWVW(z* Word, xn Word, x []Word, y Word) (r Word)
TEXT ·divWVW(SB),7,$0
// ARM has no multiword division, so use portable code.
B ·divWVW_g(SB)
// func divWW(x1, x0, y Word) (q, r Word)
TEXT ·divWW(SB),7,$0
// ARM has no multiword division, so use portable code.
B ·divWW_g(SB)
......
......@@ -11,8 +11,8 @@ func addVV(z, x, y []Word) (c Word)
func subVV(z, x, y []Word) (c Word)
func addVW(z, x []Word, y Word) (c Word)
func subVW(z, x []Word, y Word) (c Word)
func shlVW(z, x []Word, s Word) (c Word)
func shrVW(z, x []Word, s Word) (c Word)
func shlVU(z, x []Word, s uint) (c Word)
func shrVU(z, x []Word, s uint) (c Word)
func mulAddVWW(z, x []Word, y, r Word) (c Word)
func addMulVVW(z, x []Word, y Word) (c Word)
func divWVW(z []Word, xn Word, x []Word, y Word) (r Word)
......@@ -185,6 +185,13 @@ func testFunVW(t *testing.T, msg string, f funVW, a argVW) {
}
func makeFunVW(f func(z, x []Word, s uint) (c Word)) funVW {
return func(z, x []Word, s Word) (c Word) {
return f(z, x, uint(s))
}
}
func TestFunVW(t *testing.T) {
for _, a := range sumVW {
arg := a
......@@ -196,16 +203,20 @@ func TestFunVW(t *testing.T) {
testFunVW(t, "subVW", subVW, arg)
}
shlVW_g := makeFunVW(shlVU_g)
shlVW := makeFunVW(shlVU)
for _, a := range lshVW {
arg := a
testFunVW(t, "shlVW_g", shlVW_g, arg)
testFunVW(t, "shlVW", shlVW, arg)
testFunVW(t, "shlVU_g", shlVW_g, arg)
testFunVW(t, "shlVU", shlVW, arg)
}
shrVW_g := makeFunVW(shrVU_g)
shrVW := makeFunVW(shrVU)
for _, a := range rshVW {
arg := a
testFunVW(t, "shrVW_g", shrVW_g, arg)
testFunVW(t, "shrVW", shrVW, arg)
testFunVW(t, "shrVU_g", shrVW_g, arg)
testFunVW(t, "shrVU", shrVW, arg)
}
}
......
......@@ -550,14 +550,14 @@ func (z nat) divLarge(u, uIn, v nat) (q, r nat) {
u.clear()
// D1.
shift := Word(leadingZeros(v[n-1]))
shift := leadingZeros(v[n-1])
if shift > 0 {
// do not modify v, it may be used by another goroutine simultaneously
v1 := make(nat, n)
shlVW(v1, v, shift)
shlVU(v1, v, shift)
v = v1
}
u[len(uIn)] = shlVW(u[0:len(uIn)], uIn, shift)
u[len(uIn)] = shlVU(u[0:len(uIn)], uIn, shift)
// D2.
for j := m; j >= 0; j-- {
......@@ -596,7 +596,7 @@ func (z nat) divLarge(u, uIn, v nat) (q, r nat) {
}
q = q.norm()
shrVW(u, u, shift)
shrVU(u, u, shift)
r = u.norm()
return q, r
......@@ -824,7 +824,7 @@ func (z nat) shl(x nat, s uint) nat {
n := m + int(s/_W)
z = z.make(n + 1)
z[n] = shlVW(z[n-m:n], x, Word(s%_W))
z[n] = shlVU(z[n-m:n], x, s%_W)
z[0 : n-m].clear()
return z.norm()
......@@ -841,7 +841,7 @@ func (z nat) shr(x nat, s uint) nat {
// n > 0
z = z.make(n)
shrVW(z, x[m-n:], Word(s%_W))
shrVU(z, x[m-n:], s%_W)
return z.norm()
}
......@@ -972,25 +972,26 @@ func (x nat) modW(d Word) (r Word) {
}
// powersOfTwoDecompose finds q and k such that q * 1<<k = n and q is odd.
func (n nat) powersOfTwoDecompose() (q nat, k Word) {
if len(n) == 0 {
return n, 0
// powersOfTwoDecompose finds q and k with x = q * 1<<k and q is odd, or q and k are 0.
func (x nat) powersOfTwoDecompose() (q nat, k int) {
if len(x) == 0 {
return x, 0
}
zeroWords := 0
for n[zeroWords] == 0 {
zeroWords++
// One of the words must be non-zero by definition,
// so this loop will terminate with i < len(x), and
// i is the number of 0 words.
i := 0
for x[i] == 0 {
i++
}
// One of the words must be non-zero by invariant, therefore
// zeroWords < len(n).
x := trailingZeroBits(n[zeroWords])
n := trailingZeroBits(x[i]) // x[i] != 0
q = q.make(len(n) - zeroWords)
shrVW(q, n[zeroWords:], Word(x))
q = q.norm()
q = make(nat, len(x)-i)
shrVU(q, x[i:], uint(n))
k = Word(_W*zeroWords + x)
q = q.norm()
k = i*_W + n
return
}
......@@ -1161,7 +1162,7 @@ NextRandom:
if y.cmp(natOne) == 0 || y.cmp(nm1) == 0 {
continue
}
for j := Word(1); j < k; j++ {
for j := 1; j < k; j++ {
y = y.mul(y, y)
quotient, y = quotient.div(y, y, n)
if y.cmp(nm1) == 0 {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment