mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 08:40:55 +00:00 
			
		
		
		
	 53fd522c0d
			
		
	
	
		53fd522c0d
		
	
	
	
	
		
			
			Follows suit with https://go-review.googlesource.com/#/c/20111. Generated by running $ grep -R 'Go Authors. All' * | cut -d":" -f1 | while read F;do perl -pi -e 's/Go Authors. All/Go Authors. All/g' $F;done The code in cmd/internal/unvendor wasn't changed. Fixes #15213 Change-Id: I4f235cee0a62ec435f9e8540a1ec08ae03b1a75f Reviewed-on: https://go-review.googlesource.com/21819 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
		
			
				
	
	
		
			166 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // skip
 | |
| 
 | |
| // NOTE: the actual tests to run are rotate[0123].go
 | |
| 
 | |
| // Copyright 2012 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.
 | |
| 
 | |
| // Generate test of shift and rotate by constants.
 | |
| // The output is compiled and run.
 | |
| //
 | |
| // The integer type depends on the value of mode (rotate direction,
 | |
| // signedness).
 | |
| 
 | |
| package main
 | |
| 
 | |
| import (
 | |
| 	"bufio"
 | |
| 	"flag"
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| func main() {
 | |
| 	flag.Parse()
 | |
| 
 | |
| 	b := bufio.NewWriter(os.Stdout)
 | |
| 	defer b.Flush()
 | |
| 
 | |
| 	fmt.Fprintf(b, "%s\n", prolog)
 | |
| 
 | |
| 	for logBits := uint(3); logBits <= 6; logBits++ {
 | |
| 		typ := fmt.Sprintf("int%d", 1<<logBits)
 | |
| 		fmt.Fprint(b, strings.Replace(checkFunc, "XXX", typ, -1))
 | |
| 		fmt.Fprint(b, strings.Replace(checkFunc, "XXX", "u"+typ, -1))
 | |
| 		gentest(b, 1<<logBits, mode&1 != 0, mode&2 != 0)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| const prolog = `
 | |
| 
 | |
| package main
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	i8 int8 = 0x12
 | |
| 	i16 int16 = 0x1234
 | |
| 	i32 int32 = 0x12345678
 | |
| 	i64 int64 = 0x123456789abcdef0
 | |
| 	ui8 uint8 = 0x12
 | |
| 	ui16 uint16 = 0x1234
 | |
| 	ui32 uint32 = 0x12345678
 | |
| 	ui64 uint64 = 0x123456789abcdef0
 | |
| 
 | |
| 	ni8 = ^i8
 | |
| 	ni16 = ^i16
 | |
| 	ni32 = ^i32
 | |
| 	ni64 = ^i64
 | |
| 	nui8 = ^ui8
 | |
| 	nui16 = ^ui16
 | |
| 	nui32 = ^ui32
 | |
| 	nui64 = ^ui64
 | |
| )
 | |
| 
 | |
| var nfail = 0
 | |
| 
 | |
| func main() {
 | |
| 	if nfail > 0 {
 | |
| 		fmt.Printf("BUG\n")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| `
 | |
| 
 | |
| const checkFunc = `
 | |
| func check_XXX(desc string, have, want XXX) {
 | |
| 	if have != want {
 | |
| 		nfail++
 | |
| 		fmt.Printf("%s = %T(%#x), want %T(%#x)\n", desc, have, have, want, want)
 | |
| 		if nfail >= 100 {
 | |
| 			fmt.Printf("BUG: stopping after 100 failures\n")
 | |
| 			os.Exit(0)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| `
 | |
| 
 | |
| var (
 | |
| 	uop = [2]func(x, y uint64) uint64{
 | |
| 		func(x, y uint64) uint64 {
 | |
| 			return x | y
 | |
| 		},
 | |
| 		func(x, y uint64) uint64 {
 | |
| 			return x ^ y
 | |
| 		},
 | |
| 	}
 | |
| 	iop = [2]func(x, y int64) int64{
 | |
| 		func(x, y int64) int64 {
 | |
| 			return x | y
 | |
| 		},
 | |
| 		func(x, y int64) int64 {
 | |
| 			return x ^ y
 | |
| 		},
 | |
| 	}
 | |
| 	cop = [2]byte{'|', '^'}
 | |
| )
 | |
| 
 | |
| func gentest(b *bufio.Writer, bits uint, unsigned, inverted bool) {
 | |
| 	fmt.Fprintf(b, "func init() {\n")
 | |
| 	defer fmt.Fprintf(b, "}\n")
 | |
| 	n := 0
 | |
| 
 | |
| 	// Generate tests for left/right and right/left.
 | |
| 	for l := uint(0); l <= bits; l++ {
 | |
| 		for r := uint(0); r <= bits; r++ {
 | |
| 			for o, op := range cop {
 | |
| 				typ := fmt.Sprintf("int%d", bits)
 | |
| 				v := fmt.Sprintf("i%d", bits)
 | |
| 				if unsigned {
 | |
| 					typ = "u" + typ
 | |
| 					v = "u" + v
 | |
| 				}
 | |
| 				v0 := int64(0x123456789abcdef0)
 | |
| 				if inverted {
 | |
| 					v = "n" + v
 | |
| 					v0 = ^v0
 | |
| 				}
 | |
| 				expr1 := fmt.Sprintf("%s<<%d %c %s>>%d", v, l, op, v, r)
 | |
| 				expr2 := fmt.Sprintf("%s>>%d %c %s<<%d", v, r, op, v, l)
 | |
| 
 | |
| 				var result string
 | |
| 				if unsigned {
 | |
| 					v := uint64(v0) >> (64 - bits)
 | |
| 					v = uop[o](v<<l, v>>r)
 | |
| 					v <<= 64 - bits
 | |
| 					v >>= 64 - bits
 | |
| 					result = fmt.Sprintf("%#x", v)
 | |
| 				} else {
 | |
| 					v := int64(v0) >> (64 - bits)
 | |
| 					v = iop[o](v<<l, v>>r)
 | |
| 					v <<= 64 - bits
 | |
| 					v >>= 64 - bits
 | |
| 					result = fmt.Sprintf("%#x", v)
 | |
| 				}
 | |
| 
 | |
| 				fmt.Fprintf(b, "\tcheck_%s(%q, %s, %s(%s))\n", typ, expr1, expr1, typ, result)
 | |
| 				fmt.Fprintf(b, "\tcheck_%s(%q, %s, %s(%s))\n", typ, expr2, expr2, typ, result)
 | |
| 
 | |
| 				// Chop test into multiple functions so that there's not one
 | |
| 				// enormous function to compile/link.
 | |
| 				// All the functions are named init so we don't have to do
 | |
| 				// anything special to call them.  ☺
 | |
| 				if n++; n >= 50 {
 | |
| 					fmt.Fprintf(b, "}\n")
 | |
| 					fmt.Fprintf(b, "func init() {\n")
 | |
| 					n = 0
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |