Skip to content

Commit

Permalink
cmd/internal/obj: eagerly initialize x86 assembler
Browse files Browse the repository at this point in the history
Prior to this CL, instinit was called as needed.
This does not work well in a concurrent backend.
Initialization is very cheap; do it on startup instead.

Passes toolstash-check -all.
No compiler performance impact.

Updates #15756

Change-Id: Ifa5e82e8abf4504435e1b28766f5703a0555f42d
Reviewed-on: https://go-review.googlesource.com/38662
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
  • Loading branch information
josharian committed Mar 25, 2017
1 parent e76d6a4 commit 3b251e6
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 4 deletions.
2 changes: 2 additions & 0 deletions src/cmd/asm/internal/arch/arch.go
Expand Up @@ -171,6 +171,8 @@ func archX86(linkArch *obj.LinkArch) *Arch {
instructions["PSRLDQ"] = x86.APSRLO
instructions["PADDD"] = x86.APADDL

x86.InstInit()

return &Arch{
LinkArch: linkArch,
Instructions: instructions,
Expand Down
2 changes: 2 additions & 0 deletions src/cmd/compile/internal/amd64/galign.go
Expand Up @@ -27,4 +27,6 @@ func Init(arch *gc.Arch) {
arch.SSAMarkMoves = ssaMarkMoves
arch.SSAGenValue = ssaGenValue
arch.SSAGenBlock = ssaGenBlock

x86.InstInit()
}
2 changes: 2 additions & 0 deletions src/cmd/compile/internal/x86/galign.go
Expand Up @@ -33,4 +33,6 @@ func Init(arch *gc.Arch) {
arch.Ginsnop = ginsnop

arch.SSAMarkMoves = ssaMarkMoves

x86.InstInit()
}
15 changes: 11 additions & 4 deletions src/cmd/internal/obj/x86/asm6.go
Expand Up @@ -883,8 +883,8 @@ var ymmxmm0f38 = []ytab{
* two values match the Ytypes of the p->from and p->to operands. The function
* oclass in span.c computes the specific Ytype of an operand and then the set
* of more general Ytypes that it satisfies is implied by the ycover table, set
* up in instinit. For example, oclass distinguishes the constants 0 and 1
* from the more general 8-bit constants, but instinit says
* up in InstInit. For example, oclass distinguishes the constants 0 and 1
* from the more general 8-bit constants, but InstInit says
*
* ycover[Yi0*Ymax + Ys32] = 1;
* ycover[Yi1*Ymax + Ys32] = 1;
Expand Down Expand Up @@ -1770,7 +1770,7 @@ func span6(ctxt *obj.Link, s *obj.LSym) {
}

if ycover[0] == 0 {
instinit()
ctxt.Diag("x86 tables not initialized, call x86.InstInit first")
}

for p := ctxt.Cursym.Text; p != nil; p = p.Link {
Expand Down Expand Up @@ -1965,7 +1965,14 @@ func span6(ctxt *obj.Link, s *obj.LSym) {
}
}

func instinit() {
func InstInit() {
if ycover[0] != 0 {
// Already initialized; stop now.
// This happens in the cmd/asm tests,
// each of which re-initializes the arch.
return
}

for i := 1; optab[i].as != 0; i++ {
c := optab[i].as
if opindex[c&obj.AMask] != nil {
Expand Down

0 comments on commit 3b251e6

Please sign in to comment.