diff options
author | Russ Cox <rsc@golang.org> | 2012-05-24 14:50:36 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2012-05-24 14:50:36 -0400 |
commit | acef2feed9613464f2bc107a7efbd4e44708e006 (patch) | |
tree | 42ac96d370d0cd3be2145a97437f71b63a264c5b /test | |
parent | 39febb27ddf233422785f8c236e4f5ecedec3435 (diff) | |
download | go-acef2feed9613464f2bc107a7efbd4e44708e006.tar.gz |
exp/locale/collate: avoid 16-bit math
There's no need for the 16-bit arithmetic here,
and it tickles a long-standing compiler bug.
Fix the exp code not to use 16-bit math and
create an explicit test for the compiler bug.
R=golang-dev, r
CC=golang-dev
http://codereview.appspot.com/6256048
Diffstat (limited to 'test')
-rw-r--r-- | test/bugs/bug440.go | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/test/bugs/bug440.go b/test/bugs/bug440.go new file mode 100644 index 000000000..816a18c58 --- /dev/null +++ b/test/bugs/bug440.go @@ -0,0 +1,21 @@ +// $G $D/$F.go && $L $F.$A && ./$A.out +// # switch above to 'run' when bug gets fixed. +// # right now it only breaks on 8g + +// Test for 8g register move bug. The optimizer gets confused +// about 16- vs 32-bit moves during splitContractIndex. + +package main + +func main() { + const c = 0x12345678 + index, n, offset := splitContractIndex(c) + if index != int((c&0xffff)>>5) || n != int(c & (1<<5-1)) || offset != (c>>16)&(1<<14-1) { + println("BUG", index, n, offset) + } +} + +func splitContractIndex(ce uint32) (index, n, offset int) { + h := uint16(ce) + return int(h >> 5), int(h & (1<<5 - 1)), int(ce>>16) & (1<<14 - 1) +} |