// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package math_test
import (
. "runtime/internal/math"
"testing"
)
const (
UintptrSize = 32 << (^uintptr(0) >> 63)
)
type mulUintptrTest struct {
a uintptr
b uintptr
overflow bool
}
var mulUintptrTests = []mulUintptrTest{
{0, 0, false},
{1000, 1000, false},
{MaxUintptr, 0, false},
{MaxUintptr, 1, false},
{MaxUintptr / 2, 2, false},
{MaxUintptr / 2, 3, true},
{MaxUintptr, 10, true},
{MaxUintptr, 100, true},
{MaxUintptr / 100, 100, false},
{MaxUintptr / 1000, 1001, true},
{1<<(UintptrSize/2) - 1, 1<<(UintptrSize/2) - 1, false},
{1 << (UintptrSize / 2), 1 << (UintptrSize / 2), true},
{MaxUintptr >> 32, MaxUintptr >> 32, false},
{MaxUintptr, MaxUintptr, true},
}
func TestMulUintptr(t *testing.T) {
for _, test := range mulUintptrTests {
a, b := test.a, test.b
for i := 0; i < 2; i++ {
mul, overflow := MulUintptr(a, b)
if mul != a*b || overflow != test.overflow {
t.Errorf("MulUintptr(%v, %v) = %v, %v want %v, %v",
a, b, mul, overflow, a*b, test.overflow)
}
a, b = b, a
}
}
}
var SinkUintptr uintptr
var SinkBool bool
var x, y uintptr
func BenchmarkMulUintptr(b *testing.B) {
x, y = 1, 2
b.Run("small", func(b *testing.B) {
for i := 0; i < b.N; i++ {
var overflow bool
SinkUintptr, overflow = MulUintptr(x, y)
if overflow {
SinkUintptr = 0
}
}
})
x, y = MaxUintptr, MaxUintptr-1
b.Run("large", func(b *testing.B) {
for i := 0; i < b.N; i++ {
var overflow bool
SinkUintptr, overflow = MulUintptr(x, y)
if overflow {
SinkUintptr = 0
}
}
})
}