cmd/compile/internal/ppc64: clean up table initalisation

Move initproginfo and initvariants to ppc64.Main to avoid checking that
the tables are initialised every time.

Change-Id: I95ff4146a7abc18c42a20bfad716cc80ea8367e5
Reviewed-on: https://go-review.googlesource.com/20286
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Dave Cheney 2016-03-06 18:40:43 +11:00
parent 795e712b72
commit 1ec4f227f4
2 changed files with 10 additions and 30 deletions

View File

@ -89,6 +89,9 @@ func Main() {
gc.Thearch.Doregbits = doregbits gc.Thearch.Doregbits = doregbits
gc.Thearch.Regnames = regnames gc.Thearch.Regnames = regnames
initvariants()
initproginfo()
gc.Main() gc.Main()
gc.Exit(0) gc.Exit(0)
} }

View File

@ -105,28 +105,18 @@ var progtable = [ppc64.ALAST]obj.ProgInfo{
obj.ADUFFCOPY: {Flags: gc.Call}, obj.ADUFFCOPY: {Flags: gc.Call},
} }
var initproginfo_initialized int
func initproginfo() { func initproginfo() {
var addvariant = []int{V_CC, V_V, V_CC | V_V} var addvariant = []int{V_CC, V_V, V_CC | V_V}
if initproginfo_initialized != 0 {
return
}
initproginfo_initialized = 1
// Perform one-time expansion of instructions in progtable to // Perform one-time expansion of instructions in progtable to
// their CC, V, and VCC variants // their CC, V, and VCC variants
var as2 int for as := range progtable {
var i int
var variant int
for as := int(0); as < len(progtable); as++ {
if progtable[as].Flags == 0 { if progtable[as].Flags == 0 {
continue continue
} }
variant = as2variant(as) variant := as2variant(as)
for i = 0; i < len(addvariant); i++ { for i := range addvariant {
as2 = variant2as(as, variant|addvariant[i]) as2 := variant2as(as, variant|addvariant[i])
if as2 != 0 && progtable[as2].Flags == 0 { if as2 != 0 && progtable[as2].Flags == 0 {
progtable[as2] = progtable[as] progtable[as2] = progtable[as]
} }
@ -135,8 +125,6 @@ func initproginfo() {
} }
func proginfo(p *obj.Prog) { func proginfo(p *obj.Prog) {
initproginfo()
info := &p.Info info := &p.Info
*info = progtable[p.As] *info = progtable[p.As]
if info.Flags == 0 { if info.Flags == 0 {
@ -269,26 +257,17 @@ var varianttable = [ppc64.ALAST][4]int{
ppc64.AXOR: {ppc64.AXOR, ppc64.AXORCC, 0, 0}, ppc64.AXOR: {ppc64.AXOR, ppc64.AXORCC, 0, 0},
} }
var initvariants_initialized int
func initvariants() { func initvariants() {
if initvariants_initialized != 0 { for i := range varianttable {
return
}
initvariants_initialized = 1
var j int
for i := int(0); i < len(varianttable); i++ {
if varianttable[i][0] == 0 { if varianttable[i][0] == 0 {
// Instruction has no variants // Instruction has no variants
varianttable[i][0] = i varianttable[i][0] = i
continue continue
} }
// Copy base form to other variants // Copy base form to other variants
if varianttable[i][0] == i { if varianttable[i][0] == i {
for j = 0; j < len(varianttable[i]); j++ { for j := range varianttable[i] {
varianttable[varianttable[i][j]] = varianttable[i] varianttable[varianttable[i][j]] = varianttable[i]
} }
} }
@ -297,8 +276,7 @@ func initvariants() {
// as2variant returns the variant (V_*) flags of instruction as. // as2variant returns the variant (V_*) flags of instruction as.
func as2variant(as int) int { func as2variant(as int) int {
initvariants() for i := range varianttable[as] {
for i := int(0); i < len(varianttable[as]); i++ {
if varianttable[as][i] == as { if varianttable[as][i] == as {
return i return i
} }
@ -310,6 +288,5 @@ func as2variant(as int) int {
// variant2as returns the instruction as with the given variant (V_*) flags. // variant2as returns the instruction as with the given variant (V_*) flags.
// If no such variant exists, this returns 0. // If no such variant exists, this returns 0.
func variant2as(as int, flags int) int { func variant2as(as int, flags int) int {
initvariants()
return varianttable[as][flags] return varianttable[as][flags]
} }