[dev.cc] cmd/internal/gc, cmd/new6g etc: convert from cmd/gc, cmd/6g etc

First draft of converted Go compiler, using rsc.io/c2go rev 83d795a.

Change-Id: I29f4c7010de07d2ff1947bbca9865879d83c32c3
Reviewed-on: https://go-review.googlesource.com/4851
Reviewed-by: Rob Pike <r@golang.org>
diff --git a/src/cmd/internal/gc/bv.go b/src/cmd/internal/gc/bv.go
new file mode 100644
index 0000000..998a1f5
--- /dev/null
+++ b/src/cmd/internal/gc/bv.go
@@ -0,0 +1,208 @@
+// Copyright 2013 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.
+
+package gc
+
+import "fmt"
+
+const (
+	WORDSIZE  = 4
+	WORDBITS  = 32
+	WORDMASK  = WORDBITS - 1
+	WORDSHIFT = 5
+)
+
+func bvsize(n uint32) uint32 {
+	return ((n + WORDBITS - 1) / WORDBITS) * WORDSIZE
+}
+
+func bvbits(bv *Bvec) int32 {
+	return bv.n
+}
+
+func bvwords(bv *Bvec) int32 {
+	return (bv.n + WORDBITS - 1) / WORDBITS
+}
+
+func bvalloc(n int32) *Bvec {
+	return &Bvec{n, make([]uint32, bvsize(uint32(n))/4)}
+}
+
+/* difference */
+func bvandnot(dst *Bvec, src1 *Bvec, src2 *Bvec) {
+	var i int32
+	var w int32
+
+	if dst.n != src1.n || dst.n != src2.n {
+		Fatal("bvand: lengths %d, %d, and %d are not equal", dst.n, src1.n, src2.n)
+	}
+	i = 0
+	w = 0
+	for ; i < dst.n; (func() { i += WORDBITS; w++ })() {
+		dst.b[w] = src1.b[w] &^ src2.b[w]
+	}
+}
+
+func bvcmp(bv1 *Bvec, bv2 *Bvec) int {
+	if bv1.n != bv2.n {
+		Fatal("bvequal: lengths %d and %d are not equal", bv1.n, bv2.n)
+	}
+	for i, x := range bv1.b {
+		if x != bv2.b[i] {
+			return 1
+		}
+	}
+	return 0
+}
+
+func bvcopy(dst *Bvec, src *Bvec) {
+	for i, x := range src.b {
+		dst.b[i] = x
+	}
+}
+
+func bvconcat(src1 *Bvec, src2 *Bvec) *Bvec {
+	var dst *Bvec
+	var i int32
+
+	dst = bvalloc(src1.n + src2.n)
+	for i = 0; i < src1.n; i++ {
+		if bvget(src1, i) != 0 {
+			bvset(dst, i)
+		}
+	}
+	for i = 0; i < src2.n; i++ {
+		if bvget(src2, i) != 0 {
+			bvset(dst, i+src1.n)
+		}
+	}
+	return dst
+}
+
+func bvget(bv *Bvec, i int32) int {
+	if i < 0 || i >= bv.n {
+		Fatal("bvget: index %d is out of bounds with length %d\n", i, bv.n)
+	}
+	return int((bv.b[i>>WORDSHIFT] >> uint(i&WORDMASK)) & 1)
+}
+
+// bvnext returns the smallest index >= i for which bvget(bv, i) == 1.
+// If there is no such index, bvnext returns -1.
+func bvnext(bv *Bvec, i int32) int {
+	var w uint32
+
+	if i >= bv.n {
+		return -1
+	}
+
+	// Jump i ahead to next word with bits.
+	if bv.b[i>>WORDSHIFT]>>uint(i&WORDMASK) == 0 {
+		i &^= WORDMASK
+		i += WORDBITS
+		for i < bv.n && bv.b[i>>WORDSHIFT] == 0 {
+			i += WORDBITS
+		}
+	}
+
+	if i >= bv.n {
+		return -1
+	}
+
+	// Find 1 bit.
+	w = bv.b[i>>WORDSHIFT] >> uint(i&WORDMASK)
+
+	for w&1 == 0 {
+		w >>= 1
+		i++
+	}
+
+	return int(i)
+}
+
+func bvisempty(bv *Bvec) int {
+	var i int32
+
+	for i = 0; i < bv.n; i += WORDBITS {
+		if bv.b[i>>WORDSHIFT] != 0 {
+			return 0
+		}
+	}
+	return 1
+}
+
+func bvnot(bv *Bvec) {
+	var i int32
+	var w int32
+
+	i = 0
+	w = 0
+	for ; i < bv.n; (func() { i += WORDBITS; w++ })() {
+		bv.b[w] = ^bv.b[w]
+	}
+}
+
+/* union */
+func bvor(dst *Bvec, src1 *Bvec, src2 *Bvec) {
+	var i int32
+	var w int32
+
+	if dst.n != src1.n || dst.n != src2.n {
+		Fatal("bvor: lengths %d, %d, and %d are not equal", dst.n, src1.n, src2.n)
+	}
+	i = 0
+	w = 0
+	for ; i < dst.n; (func() { i += WORDBITS; w++ })() {
+		dst.b[w] = src1.b[w] | src2.b[w]
+	}
+}
+
+/* intersection */
+func bvand(dst *Bvec, src1 *Bvec, src2 *Bvec) {
+	var i int32
+	var w int32
+
+	if dst.n != src1.n || dst.n != src2.n {
+		Fatal("bvor: lengths %d, %d, and %d are not equal", dst.n, src1.n, src2.n)
+	}
+	i = 0
+	w = 0
+	for ; i < dst.n; (func() { i += WORDBITS; w++ })() {
+		dst.b[w] = src1.b[w] & src2.b[w]
+	}
+}
+
+func bvprint(bv *Bvec) {
+	var i int32
+
+	fmt.Printf("#*")
+	for i = 0; i < bv.n; i++ {
+		fmt.Printf("%d", bvget(bv, i))
+	}
+}
+
+func bvreset(bv *Bvec, i int32) {
+	var mask uint32
+
+	if i < 0 || i >= bv.n {
+		Fatal("bvreset: index %d is out of bounds with length %d\n", i, bv.n)
+	}
+	mask = ^(1 << uint(i%WORDBITS))
+	bv.b[i/WORDBITS] &= mask
+}
+
+func bvresetall(bv *Bvec) {
+	for i := range bv.b {
+		bv.b[i] = 0
+	}
+}
+
+func bvset(bv *Bvec, i int32) {
+	var mask uint32
+
+	if i < 0 || i >= bv.n {
+		Fatal("bvset: index %d is out of bounds with length %d\n", i, bv.n)
+	}
+	mask = 1 << uint(i%WORDBITS)
+	bv.b[i/WORDBITS] |= mask
+}