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

import 

const MaxUintptr = ^uintptr(0)

// MulUintptr returns a * b and whether the multiplication overflowed.
// On supported platforms this is an intrinsic lowered by the compiler.
func (,  uintptr) (uintptr, bool) {
	if | < 1<<(4*goarch.PtrSize) ||  == 0 {
		return  * , false
	}
	 :=  > MaxUintptr/
	return  * , 
}

// Mul64 returns the 128-bit product of x and y: (hi, lo) = x * y
// with the product bits' upper half returned in hi and the lower
// half returned in lo.
// This is a copy from math/bits.Mul64
// On supported platforms this is an intrinsic lowered by the compiler.
func (,  uint64) (,  uint64) {
	const  = 1<<32 - 1
	 :=  & 
	 :=  >> 32
	 :=  & 
	 :=  >> 32
	 :=  * 
	 := * + >>32
	 :=  & 
	 :=  >> 32
	 +=  * 
	 = * +  + >>32
	 =  * 
	return
}

// Add64 returns the sum with carry of x, y and carry: sum = x + y + carry.
// The carry input must be 0 or 1; otherwise the behavior is undefined.
// The carryOut output is guaranteed to be 0 or 1.
//
// This function's execution time does not depend on the inputs.
// On supported platforms this is an intrinsic lowered by the compiler.
func (, ,  uint64) (,  uint64) {
	 =  +  + 
	// The sum will overflow if both top bits are set (x & y) or if one of them
	// is (x | y), and a carry from the lower place happened. If such a carry
	// happens, the top bit will be 1 + 0 + 1 = 0 (&^ sum).
	 = (( & ) | (( | ) &^ )) >> 63
	return
}