mirror of
https://github.com/autc04/Retro68.git
synced 2025-02-27 20:30:31 +00:00
80 lines
1.7 KiB
Go
80 lines
1.7 KiB
Go
// 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
|
|
}
|
|
}
|
|
})
|
|
}
|