// 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 division 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) } } 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 / 128 u8test(a, b, 128) b = a / 184 u8test(a, b, 184) } } func main() { xtest() i64run() u64run() i32run() u32run() i16run() u16run() i8run() u8run() } func xtest() { }