]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: eagerly initialize x86 assembler
authorJosh Bleecher Snyder <josharian@gmail.com>
Sat, 25 Mar 2017 14:22:53 +0000 (07:22 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Sat, 25 Mar 2017 23:20:25 +0000 (23:20 +0000)
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>

src/cmd/asm/internal/arch/arch.go
src/cmd/compile/internal/amd64/galign.go
src/cmd/compile/internal/x86/galign.go
src/cmd/internal/obj/x86/asm6.go

index 9110ca7c0205698090813c2348bca5b4890a259c..6f13a3a4db1ad7afccf6e3c7331acce66c867be3 100644 (file)
@@ -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,
index 90ee895364dfe54bf4ed77bd95286f807d663894..59484b1537d685e1bea5b6de172bae3cacd6acb8 100644 (file)
@@ -27,4 +27,6 @@ func Init(arch *gc.Arch) {
        arch.SSAMarkMoves = ssaMarkMoves
        arch.SSAGenValue = ssaGenValue
        arch.SSAGenBlock = ssaGenBlock
+
+       x86.InstInit()
 }
index b5cf044bc7457992a17d6dda340f817f408b154f..5255e9c60ec802ac559e58a6b6de2238acc361ea 100644 (file)
@@ -33,4 +33,6 @@ func Init(arch *gc.Arch) {
        arch.Ginsnop = ginsnop
 
        arch.SSAMarkMoves = ssaMarkMoves
+
+       x86.InstInit()
 }
index 2fad88d67bb38030d39cdee85eda181154882224..0e175e3760c16d1ce9cc4a73206bfe5c95a91e58 100644 (file)
@@ -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;
@@ -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 {
@@ -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 {