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