]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/6g: allocate fewer new registers in sgen
authorJosh Bleecher Snyder <josharian@gmail.com>
Fri, 9 Jan 2015 21:03:55 +0000 (13:03 -0800)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 12 Feb 2015 22:16:08 +0000 (22:16 +0000)
When possible, generate nodl/nodr directly into DI/SI
rather than going through a temporary register.

CX has already been saved; use it during trailing bytes cleanup.

Change-Id: I4ec6209bcc5d3bfdc927c5c132009bd8d791ada3
Reviewed-on: https://go-review.googlesource.com/2608
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>

src/cmd/6g/cgen.c

index d1645cc56820f99da2dcfeb37c2d5c9ef65c17dd..627bffe27e492c5b3b6733cb25f531e9fbde636a 100644 (file)
@@ -1390,22 +1390,25 @@ sgen(Node *n, Node *ns, int64 w)
                return;
        }
 
+       nodreg(&noddi, types[tptr], REG_DI);
+       nodreg(&nodsi, types[tptr], REG_SI);
+
        if(n->ullman >= ns->ullman) {
-               agenr(n, &nodr, N);
+               agenr(n, &nodr, &nodsi);
                if(ns->op == ONAME)
                        gvardef(ns);
-               agenr(ns, &nodl, N);
+               agenr(ns, &nodl, &noddi);
        } else {
                if(ns->op == ONAME)
                        gvardef(ns);
-               agenr(ns, &nodl, N);
-               agenr(n, &nodr, N);
+               agenr(ns, &nodl, &noddi);
+               agenr(n, &nodr, &nodsi);
        }
        
-       nodreg(&noddi, types[tptr], REG_DI);
-       nodreg(&nodsi, types[tptr], REG_SI);
-       gmove(&nodl, &noddi);
-       gmove(&nodr, &nodsi);
+       if(nodl.val.u.reg != REG_DI)
+               gmove(&nodl, &noddi);
+       if(nodr.val.u.reg != REG_SI)
+               gmove(&nodr, &nodsi);
        regfree(&nodl);
        regfree(&nodr);
 
@@ -1468,24 +1471,29 @@ sgen(Node *n, Node *ns, int64 w)
                } else if(w < 8 || c <= 4) {
                        nodsi.op = OINDREG;
                        noddi.op = OINDREG;
+                       cx.type = types[TINT32];
                        nodsi.type = types[TINT32];
                        noddi.type = types[TINT32];
                        if(c > 4) {
                                nodsi.xoffset = 0;
                                noddi.xoffset = 0;
-                               gmove(&nodsi, &noddi);
+                               gmove(&nodsi, &cx);
+                               gmove(&cx, &noddi);
                        }
                        nodsi.xoffset = c-4;
                        noddi.xoffset = c-4;
-                       gmove(&nodsi, &noddi);
+                       gmove(&nodsi, &cx);
+                       gmove(&cx, &noddi);
                } else {
                        nodsi.op = OINDREG;
                        noddi.op = OINDREG;
+                       cx.type = types[TINT64];
                        nodsi.type = types[TINT64];
                        noddi.type = types[TINT64];
                        nodsi.xoffset = c-8;
                        noddi.xoffset = c-8;
-                       gmove(&nodsi, &noddi);
+                       gmove(&nodsi, &cx);
+                       gmove(&cx, &noddi);
                }
        }