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 | |
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
-rw-r--r-- | src/pkg/exp/locale/collate/colelem.go | 2 | ||||
-rw-r--r-- | test/bugs/bug440.go | 21 |
2 files changed, 22 insertions, 1 deletions
diff --git a/src/pkg/exp/locale/collate/colelem.go b/src/pkg/exp/locale/collate/colelem.go index 1d66392f9..c867fdac6 100644 --- a/src/pkg/exp/locale/collate/colelem.go +++ b/src/pkg/exp/locale/collate/colelem.go @@ -102,7 +102,7 @@ const ( ) func splitContractIndex(ce colElem) (index, n, offset int) { - h := uint16(ce) + h := ce & 0xffff return int(h >> maxNBits), int(h & (1<<maxNBits - 1)), int(ce>>16) & (1<<maxContractOffsetBits - 1) } 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) +} |