| // run | |
| // 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. | |
| // Issue 4448: 64-bit indices that are statically known | |
| // to be bounded make 5g and 8g generate a dangling branch. | |
| package main | |
| const b26 uint64 = 0x022fdd63cc95386d | |
| var bitPos [64]int | |
| func init() { | |
| for p := uint(0); p < 64; p++ { | |
| bitPos[b26<<p>>58] = int(p) | |
| } | |
| } | |
| func MinPos(w uint64) int { | |
| if w == 0 { | |
| panic("bit: MinPos(0) undefined") | |
| } | |
| return bitPos[((w&-w)*b26)>>58] | |
| } | |
| func main() { | |
| const one = uint64(1) | |
| for i := 0; i < 64; i++ { | |
| if MinPos(1<<uint(i)) != i { | |
| println("i =", i) | |
| panic("MinPos(1<<uint(i)) != i") | |
| } | |
| } | |
| } |