From b0077f8d2e2e97637bd2f49ed99c9b35879caba3 Mon Sep 17 00:00:00 2001 From: Nathan VanBenschoten Date: Sun, 9 Jan 2022 13:05:52 -0500 Subject: [PATCH] apd: add inline fast-pathis to BigInt.{IsUint64,IsInt64,Uint64,Int64} Not important, but easy enough to do. --- bigint.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/bigint.go b/bigint.go index fadcb2a..53d8377 100644 --- a/bigint.go +++ b/bigint.go @@ -571,18 +571,39 @@ func (z *BigInt) GobDecode(buf []byte) error { // Int64 calls (big.Int).Int64. func (z *BigInt) Int64() int64 { + if bits.UintSize == 64 { + if zVal, zNeg, ok := z.innerAsUint(); ok { + zi := int64(zVal) + if zNeg { + zi = -zi + } + return zi + } + } var tmp1 big.Int return z.inner(&tmp1).Int64() } // IsInt64 calls (big.Int).IsInt64. func (z *BigInt) IsInt64() bool { + if bits.UintSize == 64 { + if zVal, zNeg, ok := z.innerAsUint(); ok { + // From (big.Int).IsInt64. + zi := int64(zVal) + return zi >= 0 || zNeg && zi == -zi + } + } var tmp1 big.Int return z.inner(&tmp1).IsInt64() } // IsUint64 calls (big.Int).IsUint64. func (z *BigInt) IsUint64() bool { + if bits.UintSize == 64 { + if _, zNeg, ok := z.innerAsUint(); ok { + return !zNeg + } + } var tmp1 big.Int return z.inner(&tmp1).IsUint64() } @@ -943,6 +964,11 @@ func (z *BigInt) TrailingZeroBits() uint { // Uint64 calls (big.Int).Uint64. func (z *BigInt) Uint64() uint64 { + if bits.UintSize == 64 { + if zVal, _, ok := z.innerAsUint(); ok { + return uint64(zVal) + } + } var tmp1 big.Int return z.inner(&tmp1).Uint64() }