|  | // 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") | 
|  | } | 
|  | } | 
|  | } |