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