]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: make arm64 use RegTo2 instead of a full fledged Addr To2
authorShenghou Ma <minux@golang.org>
Thu, 21 May 2015 21:51:34 +0000 (17:51 -0400)
committerMinux Ma <minux@golang.org>
Thu, 28 May 2015 01:09:38 +0000 (01:09 +0000)
It shrinks Prog type from 448 bytes down to 376 bytes on amd64.

It also makes sense, because I don't know of any modern architecture
that have instructions which can write to two destinations, none of
which is a register (even x86 doesn't have such instructions).

Change-Id: I3061f1c9ac93d79ee2b92ecb9049641d0e0f6300
Reviewed-on: https://go-review.googlesource.com/10330
Reviewed-by: Aram Hăvărneanu <aram@mgk.ro>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/asm/internal/asm/asm.go
src/cmd/compile/internal/arm64/peep.go
src/cmd/internal/obj/arm64/asm7.go
src/cmd/internal/obj/link.go
src/cmd/internal/obj/util.go
src/cmd/internal/obj/x86/obj6.go

index 725c6352cb6a60042ac5eeb5731cb5f9f33fd12d..d5d2772ef357491bf895656239edf9ace1bfda32 100644 (file)
@@ -493,7 +493,10 @@ func (p *Parser) asmInstruction(op int, cond string, a []obj.Addr) {
                        if arch.IsARM64STLXR(op) {
                                prog.From = a[0]
                                prog.To = a[1]
-                               prog.To2 = a[2]
+                               if a[2].Type != obj.TYPE_REG {
+                                       p.errorf("invalid addressing modes for third operand to %s instruction, must be register", obj.Aconv(op))
+                               }
+                               prog.RegTo2 = a[2].Reg
                                break
                        }
                        prog.From = a[0]
index 1c3b2891aa044e2ec568aab79a13fe29c3f5cab3..3dbccb70b2f747da66b736ca9d8b3115c4e2356f 100644 (file)
@@ -422,9 +422,9 @@ func copyu(p *obj.Prog, v *obj.Addr, s *obj.Addr) int {
                // 7g never generates a from3
                fmt.Printf("copyu: from3 (%v) not implemented\n", gc.Ctxt.Dconv(&p.From3))
        }
-       if p.To2.Type != obj.TYPE_NONE {
+       if p.RegTo2 != obj.REG_NONE {
                // 7g never generates a to2
-               fmt.Printf("copyu: to2 (%v) not implemented\n", gc.Ctxt.Dconv(&p.To2))
+               fmt.Printf("copyu: RegTo2 (%v) not implemented\n", obj.Rconv(int(p.RegTo2)))
        }
 
        switch p.As {
index 6e00cb55ab5a298aa48715d61755e359f4956db0..9e643932be1ccd43291cab6f12bee2e37fe22d9c 100644 (file)
@@ -2677,8 +2677,8 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) {
        case 59: /* stxr/stlxr */
                o1 = opstore(ctxt, int(p.As))
 
-               if p.To2.Type != obj.TYPE_NONE {
-                       o1 |= uint32(p.To2.Reg&31) << 16
+               if p.RegTo2 != obj.REG_NONE {
+                       o1 |= uint32(p.RegTo2&31) << 16
                } else {
                        o1 |= 0x1F << 16
                }
index b0c7a55ca17585f072510f5f8aaa68ab7e2cb704..2fc12c1eb13d7f1fe4a3a309645d5145575ed461 100644 (file)
@@ -206,7 +206,6 @@ type Prog struct {
        From     Addr
        From3    Addr
        To       Addr
-       To2      Addr
        Opt      interface{}
        Forwd    *Prog
        Pcond    *Prog
@@ -217,6 +216,7 @@ type Prog struct {
        Spadj    int32
        As       int16
        Reg      int16
+       RegTo2   int16 // 2nd register output operand
        Mark     uint16
        Optab    uint16
        Scond    uint8
index 317ee4f14da7896675e6b0ddb2e08f553568c0e1..efecae62ac90d7d8c160bf9c0e08628d915fb1f3 100644 (file)
@@ -327,8 +327,8 @@ func (p *Prog) String() string {
        if p.To.Type != TYPE_NONE {
                fmt.Fprintf(&buf, "%s%v", sep, Dconv(p, &p.To))
        }
-       if p.To2.Type != TYPE_NONE {
-               fmt.Fprintf(&buf, "%s%v", sep, Dconv(p, &p.To2))
+       if p.RegTo2 != REG_NONE {
+               fmt.Fprintf(&buf, "%s%v", sep, Rconv(int(p.RegTo2)))
        }
        return buf.String()
 }
index 7a4fc128e6400cd5998ceb46a243b7cfe8a76205..4798c8f7fb0aea91017868941a3fd90c8c50960e 100644 (file)
@@ -350,9 +350,6 @@ func progedit(ctxt *obj.Link, p *obj.Prog) {
                if p.From3.Name == obj.NAME_EXTERN {
                        ctxt.Diag("don't know how to handle %v with -dynlink", p)
                }
-               if p.To2.Name == obj.NAME_EXTERN {
-                       ctxt.Diag("don't know how to handle %v with -dynlink", p)
-               }
                var source *obj.Addr
                if p.From.Name == obj.NAME_EXTERN && !p.From.Sym.Local {
                        if p.To.Name == obj.NAME_EXTERN && !p.To.Sym.Local {