github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/test/fixedbugs/issue4448.go (about)

     1  // run
     2  
     3  // Copyright 2012 The Go Authors.  All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // Issue 4448: 64-bit indices that are statically known
     8  // to be bounded make 5g and 8g generate a dangling branch.
     9  
    10  package main
    11  
    12  const b26 uint64 = 0x022fdd63cc95386d
    13  
    14  var bitPos [64]int
    15  
    16  func init() {
    17  	for p := uint(0); p < 64; p++ {
    18  		bitPos[b26<<p>>58] = int(p)
    19  	}
    20  }
    21  
    22  func MinPos(w uint64) int {
    23  	if w == 0 {
    24  		panic("bit: MinPos(0) undefined")
    25  	}
    26  	return bitPos[((w&-w)*b26)>>58]
    27  }
    28  
    29  func main() {
    30  	const one = uint64(1)
    31  	for i := 0; i < 64; i++ {
    32  		if MinPos(1<<uint(i)) != i {
    33  			println("i =", i)
    34  			panic("MinPos(1<<uint(i)) != i")
    35  		}
    36  	}
    37  }