// run

// Copyright 2009 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.

// Test integer modulus by constants.

package main

import "math/rand"

const Count = 1e5

func i64rand() int64 {
	for {
		a := int64(rand.Uint32())
		a = (a << 32) | int64(rand.Uint32())
		a >>= uint(rand.Intn(64))
		if -a != a {
			return a
		}
	}
	return 0 // impossible
}

func i64test(a, b, c int64) {
	d := a % c
	if d != b {
		println("i64", a, b, c, d)
		panic("fail")
	}
}

func i64run() {
	var a, b int64

	for i := 0; i < Count; i++ {
		a = i64rand()

		b = a % 1
		i64test(a, b, 1)
		b = a % 2
		i64test(a, b, 2)
		b = a % 3
		i64test(a, b, 3)
		b = a % 4
		i64test(a, b, 4)
		b = a % 5
		i64test(a, b, 5)
		b = a % 6
		i64test(a, b, 6)
		b = a % 7
		i64test(a, b, 7)
		b = a % 8
		i64test(a, b, 8)
		b = a % 10
		i64test(a, b, 10)
		b = a % 16
		i64test(a, b, 16)
		b = a % 20
		i64test(a, b, 20)
		b = a % 32
		i64test(a, b, 32)
		b = a % 60
		i64test(a, b, 60)
		b = a % 64
		i64test(a, b, 64)
		b = a % 128
		i64test(a, b, 128)
		b = a % 256
		i64test(a, b, 256)
		b = a % 16384
		i64test(a, b, 16384)

		b = a % -1
		i64test(a, b, -1)
		b = a % -2
		i64test(a, b, -2)
		b = a % -3
		i64test(a, b, -3)
		b = a % -4
		i64test(a, b, -4)
		b = a % -5
		i64test(a, b, -5)
		b = a % -6
		i64test(a, b, -6)
		b = a % -7
		i64test(a, b, -7)
		b = a % -8
		i64test(a, b, -8)
		b = a % -10
		i64test(a, b, -10)
		b = a % -16
		i64test(a, b, -16)
		b = a % -20
		i64test(a, b, -20)
		b = a % -32
		i64test(a, b, -32)
		b = a % -60
		i64test(a, b, -60)
		b = a % -64
		i64test(a, b, -64)
		b = a % -128
		i64test(a, b, -128)
		b = a % -256
		i64test(a, b, -256)
		b = a % -16384
		i64test(a, b, -16384)
	}
}

func u64rand() uint64 {
	a := uint64(rand.Uint32())
	a = (a << 32) | uint64(rand.Uint32())
	a >>= uint(rand.Intn(64))
	return a
}

func u64test(a, b, c uint64) {
	d := a % c
	if d != b {
		println("u64", a, b, c, d)
		panic("fail")
	}
}

func u64run() {
	var a, b uint64

	for i := 0; i < Count; i++ {
		a = u64rand()

		b = a % 1
		u64test(a, b, 1)
		b = a % 2
		u64test(a, b, 2)
		b = a % 3
		u64test(a, b, 3)
		b = a % 4
		u64test(a, b, 4)
		b = a % 5
		u64test(a, b, 5)
		b = a % 6
		u64test(a, b, 6)
		b = a % 7
		u64test(a, b, 7)
		b = a % 8
		u64test(a, b, 8)
		b = a % 10
		u64test(a, b, 10)
		b = a % 16
		u64test(a, b, 16)
		b = a % 20
		u64test(a, b, 20)
		b = a % 32
		u64test(a, b, 32)
		b = a % 60
		u64test(a, b, 60)
		b = a % 64
		u64test(a, b, 64)
		b = a % 128
		u64test(a, b, 128)
		b = a % 256
		u64test(a, b, 256)
		b = a % 16384
		u64test(a, b, 16384)
	}
}

func i32rand() int32 {
	for {
		a := int32(rand.Uint32())
		a >>= uint(rand.Intn(32))
		if -a != a {
			return a
		}
	}
	return 0 // impossible
}

func i32test(a, b, c int32) {
	d := a % c
	if d != b {
		println("i32", a, b, c, d)
		panic("fail")
	}
}

func i32run() {
	var a, b int32

	for i := 0; i < Count; i++ {
		a = i32rand()

		b = a % 1
		i32test(a, b, 1)
		b = a % 2
		i32test(a, b, 2)
		b = a % 3
		i32test(a, b, 3)
		b = a % 4
		i32test(a, b, 4)
		b = a % 5
		i32test(a, b, 5)
		b = a % 6
		i32test(a, b, 6)
		b = a % 7
		i32test(a, b, 7)
		b = a % 8
		i32test(a, b, 8)
		b = a % 10
		i32test(a, b, 10)
		b = a % 16
		i32test(a, b, 16)
		b = a % 20
		i32test(a, b, 20)
		b = a % 32
		i32test(a, b, 32)
		b = a % 60
		i32test(a, b, 60)
		b = a % 64
		i32test(a, b, 64)
		b = a % 128
		i32test(a, b, 128)
		b = a % 256
		i32test(a, b, 256)
		b = a % 16384
		i32test(a, b, 16384)

		b = a % -1
		i32test(a, b, -1)
		b = a % -2
		i32test(a, b, -2)
		b = a % -3
		i32test(a, b, -3)
		b = a % -4
		i32test(a, b, -4)
		b = a % -5
		i32test(a, b, -5)
		b = a % -6
		i32test(a, b, -6)
		b = a % -7
		i32test(a, b, -7)
		b = a % -8
		i32test(a, b, -8)
		b = a % -10
		i32test(a, b, -10)
		b = a % -16
		i32test(a, b, -16)
		b = a % -20
		i32test(a, b, -20)
		b = a % -32
		i32test(a, b, -32)
		b = a % -60
		i32test(a, b, -60)
		b = a % -64
		i32test(a, b, -64)
		b = a % -128
		i32test(a, b, -128)
		b = a % -256
		i32test(a, b, -256)
	}
}

func u32rand() uint32 {
	a := uint32(rand.Uint32())
	a >>= uint(rand.Intn(32))
	return a
}

func u32test(a, b, c uint32) {
	d := a % c
	if d != b {
		println("u32", a, b, c, d)
		panic("fail")
	}
}

func u32run() {
	var a, b uint32

	for i := 0; i < Count; i++ {
		a = u32rand()

		b = a % 1
		u32test(a, b, 1)
		b = a % 2
		u32test(a, b, 2)
		b = a % 3
		u32test(a, b, 3)
		b = a % 4
		u32test(a, b, 4)
		b = a % 5
		u32test(a, b, 5)
		b = a % 6
		u32test(a, b, 6)
		b = a % 7
		u32test(a, b, 7)
		b = a % 8
		u32test(a, b, 8)
		b = a % 10
		u32test(a, b, 10)
		b = a % 16
		u32test(a, b, 16)
		b = a % 20
		u32test(a, b, 20)
		b = a % 32
		u32test(a, b, 32)
		b = a % 60
		u32test(a, b, 60)
		b = a % 64
		u32test(a, b, 64)
		b = a % 128
		u32test(a, b, 128)
		b = a % 256
		u32test(a, b, 256)
		b = a % 16384
		u32test(a, b, 16384)
	}
}

func i16rand() int16 {
	for {
		a := int16(rand.Uint32())
		a >>= uint(rand.Intn(16))
		if -a != a {
			return a
		}
	}
	return 0 // impossible
}

func i16test(a, b, c int16) {
	d := a % c
	if d != b {
		println("i16", a, b, c, d)
		panic("fail")
	}
}

func i16run() {
	var a, b int16

	for i := 0; i < Count; i++ {
		a = i16rand()

		b = a % 1
		i16test(a, b, 1)
		b = a % 2
		i16test(a, b, 2)
		b = a % 3
		i16test(a, b, 3)
		b = a % 4
		i16test(a, b, 4)
		b = a % 5
		i16test(a, b, 5)
		b = a % 6
		i16test(a, b, 6)
		b = a % 7
		i16test(a, b, 7)
		b = a % 8
		i16test(a, b, 8)
		b = a % 10
		i16test(a, b, 10)
		b = a % 16
		i16test(a, b, 16)
		b = a % 20
		i16test(a, b, 20)
		b = a % 32
		i16test(a, b, 32)
		b = a % 60
		i16test(a, b, 60)
		b = a % 64
		i16test(a, b, 64)
		b = a % 128
		i16test(a, b, 128)
		b = a % 256
		i16test(a, b, 256)
		b = a % 16384
		i16test(a, b, 16384)

		b = a % -1
		i16test(a, b, -1)
		b = a % -2
		i16test(a, b, -2)
		b = a % -3
		i16test(a, b, -3)
		b = a % -4
		i16test(a, b, -4)
		b = a % -5
		i16test(a, b, -5)
		b = a % -6
		i16test(a, b, -6)
		b = a % -7
		i16test(a, b, -7)
		b = a % -8
		i16test(a, b, -8)
		b = a % -10
		i16test(a, b, -10)
		b = a % -16
		i16test(a, b, -16)
		b = a % -20
		i16test(a, b, -20)
		b = a % -32
		i16test(a, b, -32)
		b = a % -60
		i16test(a, b, -60)
		b = a % -64
		i16test(a, b, -64)
		b = a % -128
		i16test(a, b, -128)
		b = a % -256
		i16test(a, b, -256)
		b = a % -16384
		i16test(a, b, -16384)
	}
}

func u16rand() uint16 {
	a := uint16(rand.Uint32())
	a >>= uint(rand.Intn(16))
	return a
}

func u16test(a, b, c uint16) {
	d := a % c
	if d != b {
		println("u16", a, b, c, d)
		panic("fail")
	}
}

func u16run() {
	var a, b uint16

	for i := 0; i < Count; i++ {
		a = u16rand()

		b = a % 1
		u16test(a, b, 1)
		b = a % 2
		u16test(a, b, 2)
		b = a % 3
		u16test(a, b, 3)
		b = a % 4
		u16test(a, b, 4)
		b = a % 5
		u16test(a, b, 5)
		b = a % 6
		u16test(a, b, 6)
		b = a % 7
		u16test(a, b, 7)
		b = a % 8
		u16test(a, b, 8)
		b = a % 10
		u16test(a, b, 10)
		b = a % 16
		u16test(a, b, 16)
		b = a % 20
		u16test(a, b, 20)
		b = a % 32
		u16test(a, b, 32)
		b = a % 60
		u16test(a, b, 60)
		b = a % 64
		u16test(a, b, 64)
		b = a % 128
		u16test(a, b, 128)
		b = a % 256
		u16test(a, b, 256)
		b = a % 16384
		u16test(a, b, 16384)
	}
}

func i8rand() int8 {
	for {
		a := int8(rand.Uint32())
		a >>= uint(rand.Intn(8))
		if -a != a {
			return a
		}
	}
	return 0 // impossible
}

func i8test(a, b, c int8) {
	d := a % c
	if d != b {
		println("i8", a, b, c, d)
		panic("fail")
	}
}

func i8run() {
	var a, b int8

	for i := 0; i < Count; i++ {
		a = i8rand()

		b = a % 1
		i8test(a, b, 1)
		b = a % 2
		i8test(a, b, 2)
		b = a % 3
		i8test(a, b, 3)
		b = a % 4
		i8test(a, b, 4)
		b = a % 5
		i8test(a, b, 5)
		b = a % 6
		i8test(a, b, 6)
		b = a % 7
		i8test(a, b, 7)
		b = a % 8
		i8test(a, b, 8)
		b = a % 10
		i8test(a, b, 10)
		b = a % 8
		i8test(a, b, 8)
		b = a % 20
		i8test(a, b, 20)
		b = a % 32
		i8test(a, b, 32)
		b = a % 60
		i8test(a, b, 60)
		b = a % 64
		i8test(a, b, 64)
		b = a % 127
		i8test(a, b, 127)

		b = a % -1
		i8test(a, b, -1)
		b = a % -2
		i8test(a, b, -2)
		b = a % -3
		i8test(a, b, -3)
		b = a % -4
		i8test(a, b, -4)
		b = a % -5
		i8test(a, b, -5)
		b = a % -6
		i8test(a, b, -6)
		b = a % -7
		i8test(a, b, -7)
		b = a % -8
		i8test(a, b, -8)
		b = a % -10
		i8test(a, b, -10)
		b = a % -8
		i8test(a, b, -8)
		b = a % -20
		i8test(a, b, -20)
		b = a % -32
		i8test(a, b, -32)
		b = a % -60
		i8test(a, b, -60)
		b = a % -64
		i8test(a, b, -64)
		b = a % -128
		i8test(a, b, -128)
		b = a % -101
		i8test(a, b, -101)
	}
}

func u8rand() uint8 {
	a := uint8(rand.Uint32())
	a >>= uint(rand.Intn(8))
	return a
}

func u8test(a, b, c uint8) {
	d := a % c
	if d != b {
		println("u8", a, b, c, d)
		panic("fail")
	}
}

func u8run() {
	var a, b uint8

	for i := 0; i < Count; i++ {
		a = u8rand()

		b = a % 1
		u8test(a, b, 1)
		b = a % 2
		u8test(a, b, 2)
		b = a % 3
		u8test(a, b, 3)
		b = a % 4
		u8test(a, b, 4)
		b = a % 5
		u8test(a, b, 5)
		b = a % 6
		u8test(a, b, 6)
		b = a % 7
		u8test(a, b, 7)
		b = a % 8
		u8test(a, b, 8)
		b = a % 10
		u8test(a, b, 10)
		b = a % 8
		u8test(a, b, 8)
		b = a % 20
		u8test(a, b, 20)
		b = a % 32
		u8test(a, b, 32)
		b = a % 60
		u8test(a, b, 60)
		b = a % 64
		u8test(a, b, 64)
		b = a % 127
		u8test(a, b, 127)
	}
}

func main() {
	xtest()
	i64run()
	u64run()
	i32run()
	u32run()
	i16run()
	u16run()
	i8run()
	u8run()
}

func xtest() {
}
