// 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 } } }) }