| // Copyright 2017 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. | |
| // +build ignore | |
| // This program generates bits_tables.go. | |
| package main | |
| import ( | |
| "bytes" | |
| "fmt" | |
| "go/format" | |
| "io" | |
| "log" | |
| "os" | |
| ) | |
| var header = []byte(`// Copyright 2017 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. | |
| // Code generated by go run make_tables.go. DO NOT EDIT. | |
| package bits | |
| `) | |
| func main() { | |
| buf := bytes.NewBuffer(header) | |
| gen(buf, "ntz8tab", ntz8) | |
| gen(buf, "pop8tab", pop8) | |
| gen(buf, "rev8tab", rev8) | |
| gen(buf, "len8tab", len8) | |
| out, err := format.Source(buf.Bytes()) | |
| if err != nil { | |
| log.Fatal(err) | |
| } | |
| err = os.WriteFile("bits_tables.go", out, 0666) | |
| if err != nil { | |
| log.Fatal(err) | |
| } | |
| } | |
| func gen(w io.Writer, name string, f func(uint8) uint8) { | |
| fmt.Fprintf(w, "var %s = [256]uint8{", name) | |
| for i := 0; i < 256; i++ { | |
| if i%16 == 0 { | |
| fmt.Fprint(w, "\n\t") | |
| } else { | |
| fmt.Fprint(w, " ") | |
| } | |
| fmt.Fprintf(w, "%#02x,", f(uint8(i))) | |
| } | |
| fmt.Fprint(w, "\n}\n\n") | |
| } | |
| func ntz8(x uint8) (n uint8) { | |
| for x&1 == 0 && n < 8 { | |
| x >>= 1 | |
| n++ | |
| } | |
| return | |
| } | |
| func pop8(x uint8) (n uint8) { | |
| for x != 0 { | |
| x &= x - 1 | |
| n++ | |
| } | |
| return | |
| } | |
| func rev8(x uint8) (r uint8) { | |
| for i := 8; i > 0; i-- { | |
| r = r<<1 | x&1 | |
| x >>= 1 | |
| } | |
| return | |
| } | |
| func len8(x uint8) (n uint8) { | |
| for x != 0 { | |
| x >>= 1 | |
| n++ | |
| } | |
| return | |
| } |