Rémy Oudompheng | 578f24d | 2013-01-11 22:42:55 +0100 | [diff] [blame] | 1 | // skip |
Russ Cox | c6ce448 | 2012-05-24 17:20:07 -0400 | [diff] [blame] | 2 | |
Rémy Oudompheng | 578f24d | 2013-01-11 22:42:55 +0100 | [diff] [blame] | 3 | // NOTE: the actual tests to run are rotate[0123].go |
Russ Cox | cd22afa | 2012-09-23 13:16:14 -0400 | [diff] [blame] | 4 | |
Russ Cox | c6ce448 | 2012-05-24 17:20:07 -0400 | [diff] [blame] | 5 | // Copyright 2012 The Go Authors. All rights reserved. |
| 6 | // Use of this source code is governed by a BSD-style |
| 7 | // license that can be found in the LICENSE file. |
| 8 | |
| 9 | // Generate test of shift and rotate by constants. |
| 10 | // The output is compiled and run. |
| 11 | // |
Rémy Oudompheng | 578f24d | 2013-01-11 22:42:55 +0100 | [diff] [blame] | 12 | // The integer type depends on the value of mode (rotate direction, |
| 13 | // signedness). |
Russ Cox | c6ce448 | 2012-05-24 17:20:07 -0400 | [diff] [blame] | 14 | |
| 15 | package main |
| 16 | |
| 17 | import ( |
| 18 | "bufio" |
| 19 | "flag" |
| 20 | "fmt" |
| 21 | "os" |
Rémy Oudompheng | 7ab62b0 | 2012-06-04 23:31:31 +0200 | [diff] [blame] | 22 | "strings" |
Russ Cox | c6ce448 | 2012-05-24 17:20:07 -0400 | [diff] [blame] | 23 | ) |
| 24 | |
| 25 | func main() { |
| 26 | flag.Parse() |
| 27 | |
| 28 | b := bufio.NewWriter(os.Stdout) |
| 29 | defer b.Flush() |
| 30 | |
| 31 | fmt.Fprintf(b, "%s\n", prolog) |
| 32 | |
| 33 | for logBits := uint(3); logBits <= 6; logBits++ { |
Rémy Oudompheng | 7ab62b0 | 2012-06-04 23:31:31 +0200 | [diff] [blame] | 34 | typ := fmt.Sprintf("int%d", 1<<logBits) |
| 35 | fmt.Fprint(b, strings.Replace(checkFunc, "XXX", typ, -1)) |
| 36 | fmt.Fprint(b, strings.Replace(checkFunc, "XXX", "u"+typ, -1)) |
Rémy Oudompheng | 578f24d | 2013-01-11 22:42:55 +0100 | [diff] [blame] | 37 | gentest(b, 1<<logBits, mode&1 != 0, mode&2 != 0) |
Russ Cox | c6ce448 | 2012-05-24 17:20:07 -0400 | [diff] [blame] | 38 | } |
| 39 | } |
| 40 | |
| 41 | const prolog = ` |
| 42 | |
| 43 | package main |
| 44 | |
| 45 | import ( |
| 46 | "fmt" |
| 47 | "os" |
| 48 | ) |
| 49 | |
| 50 | var ( |
| 51 | i8 int8 = 0x12 |
| 52 | i16 int16 = 0x1234 |
| 53 | i32 int32 = 0x12345678 |
| 54 | i64 int64 = 0x123456789abcdef0 |
| 55 | ui8 uint8 = 0x12 |
| 56 | ui16 uint16 = 0x1234 |
| 57 | ui32 uint32 = 0x12345678 |
| 58 | ui64 uint64 = 0x123456789abcdef0 |
| 59 | |
| 60 | ni8 = ^i8 |
| 61 | ni16 = ^i16 |
| 62 | ni32 = ^i32 |
| 63 | ni64 = ^i64 |
| 64 | nui8 = ^ui8 |
| 65 | nui16 = ^ui16 |
| 66 | nui32 = ^ui32 |
| 67 | nui64 = ^ui64 |
| 68 | ) |
| 69 | |
| 70 | var nfail = 0 |
| 71 | |
Rémy Oudompheng | 7ab62b0 | 2012-06-04 23:31:31 +0200 | [diff] [blame] | 72 | func main() { |
| 73 | if nfail > 0 { |
| 74 | fmt.Printf("BUG\n") |
| 75 | } |
| 76 | } |
| 77 | |
| 78 | ` |
| 79 | |
| 80 | const checkFunc = ` |
| 81 | func check_XXX(desc string, have, want XXX) { |
Russ Cox | c6ce448 | 2012-05-24 17:20:07 -0400 | [diff] [blame] | 82 | if have != want { |
| 83 | nfail++ |
| 84 | fmt.Printf("%s = %T(%#x), want %T(%#x)\n", desc, have, have, want, want) |
| 85 | if nfail >= 100 { |
| 86 | fmt.Printf("BUG: stopping after 100 failures\n") |
| 87 | os.Exit(0) |
| 88 | } |
| 89 | } |
| 90 | } |
Russ Cox | c6ce448 | 2012-05-24 17:20:07 -0400 | [diff] [blame] | 91 | ` |
| 92 | |
Nigel Tao | 947a3dd | 2012-06-04 20:53:32 +1000 | [diff] [blame] | 93 | var ( |
| 94 | uop = [2]func(x, y uint64) uint64{ |
| 95 | func(x, y uint64) uint64 { |
| 96 | return x | y |
| 97 | }, |
| 98 | func(x, y uint64) uint64 { |
| 99 | return x ^ y |
| 100 | }, |
| 101 | } |
| 102 | iop = [2]func(x, y int64) int64{ |
| 103 | func(x, y int64) int64 { |
| 104 | return x | y |
| 105 | }, |
| 106 | func(x, y int64) int64 { |
| 107 | return x ^ y |
| 108 | }, |
| 109 | } |
| 110 | cop = [2]byte{'|', '^'} |
| 111 | ) |
| 112 | |
Russ Cox | c6ce448 | 2012-05-24 17:20:07 -0400 | [diff] [blame] | 113 | func gentest(b *bufio.Writer, bits uint, unsigned, inverted bool) { |
| 114 | fmt.Fprintf(b, "func init() {\n") |
| 115 | defer fmt.Fprintf(b, "}\n") |
| 116 | n := 0 |
| 117 | |
| 118 | // Generate tests for left/right and right/left. |
| 119 | for l := uint(0); l <= bits; l++ { |
| 120 | for r := uint(0); r <= bits; r++ { |
Nigel Tao | 947a3dd | 2012-06-04 20:53:32 +1000 | [diff] [blame] | 121 | for o, op := range cop { |
| 122 | typ := fmt.Sprintf("int%d", bits) |
| 123 | v := fmt.Sprintf("i%d", bits) |
| 124 | if unsigned { |
| 125 | typ = "u" + typ |
| 126 | v = "u" + v |
| 127 | } |
| 128 | v0 := int64(0x123456789abcdef0) |
| 129 | if inverted { |
| 130 | v = "n" + v |
| 131 | v0 = ^v0 |
| 132 | } |
| 133 | expr1 := fmt.Sprintf("%s<<%d %c %s>>%d", v, l, op, v, r) |
| 134 | expr2 := fmt.Sprintf("%s>>%d %c %s<<%d", v, r, op, v, l) |
Russ Cox | c6ce448 | 2012-05-24 17:20:07 -0400 | [diff] [blame] | 135 | |
Nigel Tao | 947a3dd | 2012-06-04 20:53:32 +1000 | [diff] [blame] | 136 | var result string |
| 137 | if unsigned { |
| 138 | v := uint64(v0) >> (64 - bits) |
| 139 | v = uop[o](v<<l, v>>r) |
| 140 | v <<= 64 - bits |
| 141 | v >>= 64 - bits |
| 142 | result = fmt.Sprintf("%#x", v) |
| 143 | } else { |
| 144 | v := int64(v0) >> (64 - bits) |
| 145 | v = iop[o](v<<l, v>>r) |
| 146 | v <<= 64 - bits |
| 147 | v >>= 64 - bits |
| 148 | result = fmt.Sprintf("%#x", v) |
| 149 | } |
Russ Cox | c6ce448 | 2012-05-24 17:20:07 -0400 | [diff] [blame] | 150 | |
Rémy Oudompheng | 7ab62b0 | 2012-06-04 23:31:31 +0200 | [diff] [blame] | 151 | fmt.Fprintf(b, "\tcheck_%s(%q, %s, %s(%s))\n", typ, expr1, expr1, typ, result) |
| 152 | fmt.Fprintf(b, "\tcheck_%s(%q, %s, %s(%s))\n", typ, expr2, expr2, typ, result) |
Nigel Tao | 947a3dd | 2012-06-04 20:53:32 +1000 | [diff] [blame] | 153 | |
| 154 | // Chop test into multiple functions so that there's not one |
| 155 | // enormous function to compile/link. |
| 156 | // All the functions are named init so we don't have to do |
| 157 | // anything special to call them. ☺ |
| 158 | if n++; n >= 50 { |
| 159 | fmt.Fprintf(b, "}\n") |
| 160 | fmt.Fprintf(b, "func init() {\n") |
| 161 | n = 0 |
| 162 | } |
Russ Cox | c6ce448 | 2012-05-24 17:20:07 -0400 | [diff] [blame] | 163 | } |
| 164 | } |
| 165 | } |
| 166 | } |