@@ -22,6 +22,15 @@ type binaryOpEntry struct {
2222 bigFn bigDualArgFunc
2323}
2424
25+ func lookupBinary (name string ) binaryOpEntry {
26+ for _ , tc := range binaryOpFuncs {
27+ if tc .name == name {
28+ return tc
29+ }
30+ }
31+ panic (fmt .Sprintf ("%v not found" , name ))
32+ }
33+
2534var binaryOpFuncs = []binaryOpEntry {
2635 {"Add" , (* Int ).Add , (* big .Int ).Add },
2736 {"Sub" , (* Int ).Sub , (* big .Int ).Sub },
@@ -52,24 +61,15 @@ var cmpOpFuncs = []struct {
5261 {"Eq" , (* Int ).Eq , func (a , b * big.Int ) bool { return a .Cmp (b ) == 0 }},
5362 {"Lt" , (* Int ).Lt , func (a , b * big.Int ) bool { return a .Cmp (b ) < 0 }},
5463 {"Gt" , (* Int ).Gt , func (a , b * big.Int ) bool { return a .Cmp (b ) > 0 }},
55- {"Slt" , (* Int ).Slt , func (a , b * big.Int ) bool { return S256 (a ).Cmp (S256 (b )) < 0 }},
56- {"Sgt" , (* Int ).Sgt , func (a , b * big.Int ) bool { return S256 (a ).Cmp (S256 (b )) > 0 }},
64+ {"Slt" , (* Int ).Slt , func (a , b * big.Int ) bool { return bigS256 (a ).Cmp (bigS256 (b )) < 0 }},
65+ {"Sgt" , (* Int ).Sgt , func (a , b * big.Int ) bool { return bigS256 (a ).Cmp (bigS256 (b )) > 0 }},
5766 {"CmpEq" , func (a , b * Int ) bool { return a .Cmp (b ) == 0 }, func (a , b * big.Int ) bool { return a .Cmp (b ) == 0 }},
5867 {"CmpLt" , func (a , b * Int ) bool { return a .Cmp (b ) < 0 }, func (a , b * big.Int ) bool { return a .Cmp (b ) < 0 }},
5968 {"CmpGt" , func (a , b * Int ) bool { return a .Cmp (b ) > 0 }, func (a , b * big.Int ) bool { return a .Cmp (b ) > 0 }},
6069 {"LtUint64" , func (a , b * Int ) bool { return a .LtUint64 (b .Uint64 ()) }, func (a , b * big.Int ) bool { return a .Cmp (new (big.Int ).SetUint64 (b .Uint64 ())) < 0 }},
6170 {"GtUint64" , func (a , b * Int ) bool { return a .GtUint64 (b .Uint64 ()) }, func (a , b * big.Int ) bool { return a .Cmp (new (big.Int ).SetUint64 (b .Uint64 ())) > 0 }},
6271}
6372
64- func lookupBinary (name string ) binaryOpEntry {
65- for _ , tc := range binaryOpFuncs {
66- if tc .name == name {
67- return tc
68- }
69- }
70- panic (fmt .Sprintf ("%v not found" , name ))
71- }
72-
7373func checkBinaryOperation (t * testing.T , opName string , op opDualArgFunc , bigOp bigDualArgFunc , x , y Int ) {
7474 var (
7575 b1 = x .ToBig ()
@@ -159,7 +159,7 @@ func bigLsh(z, x, y *big.Int) *big.Int {
159159}
160160
161161func bigSRsh (z , x , y * big.Int ) * big.Int {
162- return z .Rsh (S256 (x ), uint (y .Uint64 ()& 0x1FF ))
162+ return z .Rsh (bigS256 (x ), uint (y .Uint64 ()& 0x1FF ))
163163}
164164
165165func bigExtendSign (result , num , byteNum * big.Int ) * big.Int {
@@ -198,8 +198,8 @@ func bigSDiv(result, x, y *big.Int) *big.Int {
198198 if y .Sign () == 0 {
199199 return result .SetUint64 (0 )
200200 }
201- sx := S256 (x )
202- sy := S256 (y )
201+ sx := bigS256 (x )
202+ sy := bigS256 (y )
203203
204204 n := new (big.Int )
205205 if sx .Sign () == sy .Sign () {
@@ -218,15 +218,47 @@ func bigSMod(result, x, y *big.Int) *big.Int {
218218 return result .SetUint64 (0 )
219219 }
220220
221- sx := S256 (x )
222- sy := S256 (y )
221+ sx := bigS256 (x )
222+ sy := bigS256 (y )
223223 neg := sx .Sign () < 0
224224
225225 result .Mod (sx .Abs (sx ), sy .Abs (sy ))
226226 if neg {
227227 result .Neg (result )
228228 }
229- return u256 (result )
229+ return bigU256 (result )
230+ }
231+
232+ // divModDiv wraps DivMod and returns quotient only
233+ func divModDiv (z , x , y * Int ) * Int {
234+ var m Int
235+ z .DivMod (x , y , & m )
236+ return z
237+ }
238+
239+ // divModMod wraps DivMod and returns modulus only
240+ func divModMod (z , x , y * Int ) * Int {
241+ new (Int ).DivMod (x , y , z )
242+ return z
243+ }
244+
245+ // udivremDiv wraps udivrem and returns quotient
246+ func udivremDiv (z , x , y * Int ) * Int {
247+ var quot Int
248+ if ! y .IsZero () {
249+ udivrem (quot [:], x [:], y )
250+ }
251+ return z .Set (& quot )
252+ }
253+
254+ // udivremMod wraps udivrem and returns remainder
255+ func udivremMod (z , x , y * Int ) * Int {
256+ if y .IsZero () {
257+ return z .Clear ()
258+ }
259+ var quot Int
260+ rem := udivrem (quot [:], x [:], y )
261+ return z .Set (& rem )
230262}
231263
232264func checkCompareOperation (t * testing.T , opName string , op opCmpArgFunc , bigOp bigCmpArgFunc , x , y Int ) {
0 commit comments