diff options
author | Ondřej Surý <ondrej@sury.org> | 2012-04-06 15:14:11 +0200 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2012-04-06 15:14:11 +0200 |
commit | 505c19580e0f43fe5224431459cacb7c21edd93d (patch) | |
tree | 79e2634c253d60afc0cc0b2f510dc7dcbb48497b /src/cmd/5c | |
parent | 1336a7c91e596c423a49d1194ea42d98bca0d958 (diff) | |
download | golang-505c19580e0f43fe5224431459cacb7c21edd93d.tar.gz |
Imported Upstream version 1upstream/1
Diffstat (limited to 'src/cmd/5c')
-rw-r--r-- | src/cmd/5c/Makefile | 33 | ||||
-rw-r--r-- | src/cmd/5c/gc.h | 5 | ||||
-rw-r--r-- | src/cmd/5c/swt.c | 37 | ||||
-rw-r--r-- | src/cmd/5c/txt.c | 7 |
4 files changed, 36 insertions, 46 deletions
diff --git a/src/cmd/5c/Makefile b/src/cmd/5c/Makefile index 70b614e8a..3f528d751 100644 --- a/src/cmd/5c/Makefile +++ b/src/cmd/5c/Makefile @@ -1,34 +1,5 @@ -# Copyright 2009 The Go Authors. All rights reserved. +# Copyright 2012 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. -include ../../Make.inc -O:=$(HOST_O) - -TARG=5c - -HFILES=\ - gc.h\ - ../5l/5.out.h\ - ../cc/cc.h\ - -OFILES=\ - cgen.$O\ - list.$O\ - sgen.$O\ - swt.$O\ - txt.$O\ - mul.$O\ - reg.$O\ - peep.$O\ - pgen.$O\ - pswt.$O\ - ../5l/enam.$O\ - -LIB=\ - ../cc/cc.a\ - -include ../../Make.ccmd - -%.$O: ../cc/%.c - $(HOST_CC) $(HOST_CFLAGS) -c -I. -o $@ ../cc/$*.c +include ../../Make.dist diff --git a/src/cmd/5c/gc.h b/src/cmd/5c/gc.h index ff6d51916..20652682b 100644 --- a/src/cmd/5c/gc.h +++ b/src/cmd/5c/gc.h @@ -181,7 +181,7 @@ EXTERN int32 maxargsafe; EXTERN int mnstring; EXTERN Multab multab[20]; EXTERN int retok; -EXTERN int hintabsize; +extern int hintabsize; EXTERN Node* nodrat; EXTERN Node* nodret; EXTERN Node* nodsafe; @@ -304,7 +304,8 @@ void gpseudo(int, Sym*, Node*); int swcmp(const void*, const void*); void doswit(Node*); void swit1(C1*, int, int32, Node*); -void cas(void); +void swit2(C1*, int, int32, Node*); +void newcase(void); void bitload(Node*, Node*, Node*, Node*, Node*); void bitstore(Node*, Node*, Node*, Node*, Node*); int mulcon(Node*, Node*); diff --git a/src/cmd/5c/swt.c b/src/cmd/5c/swt.c index 7cbaadba9..7268f9af2 100644 --- a/src/cmd/5c/swt.c +++ b/src/cmd/5c/swt.c @@ -28,12 +28,31 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. - #include "gc.h" void swit1(C1 *q, int nc, int32 def, Node *n) { + Node nreg; + + if(typev[n->type->etype]) { + regsalloc(&nreg, n); + nreg.type = types[TVLONG]; + cgen(n, &nreg); + swit2(q, nc, def, &nreg); + return; + } + + regalloc(&nreg, n, Z); + nreg.type = types[TLONG]; + cgen(n, &nreg); + swit2(q, nc, def, &nreg); + regfree(&nreg); +} + +void +swit2(C1 *q, int nc, int32 def, Node *n) +{ C1 *r; int i; int32 v; @@ -65,12 +84,12 @@ swit1(C1 *q, int nc, int32 def, Node *n) sp = p; gopcode(OEQ, nodconst(r->val), n, Z); /* just gen the B.EQ */ patch(p, r->label); - swit1(q, i, def, n); + swit2(q, i, def, n); if(debug['W']) print("case < %.8ux\n", r->val); patch(sp, pc); - swit1(r+1, nc-i-1, def, n); + swit2(r+1, nc-i-1, def, n); return; direct: @@ -460,17 +479,13 @@ outhist(Biobuf *b) for(h = hist; h != H; h = h->link) { p = h->name; op = 0; - /* on windows skip drive specifier in pathname */ if(systemtype(Windows) && p && p[1] == ':'){ - p += 2; - c = *p; - } - if(p && p[0] != c && h->offset == 0 && pathname){ - /* on windows skip drive specifier in pathname */ + c = p[2]; + } else if(p && p[0] != c && h->offset == 0 && pathname){ if(systemtype(Windows) && pathname[1] == ':') { op = p; - p = pathname+2; - c = *p; + p = pathname; + c = p[2]; } else if(pathname[0] == c){ op = p; p = pathname; diff --git a/src/cmd/5c/txt.c b/src/cmd/5c/txt.c index a32387bc1..1a189e3af 100644 --- a/src/cmd/5c/txt.c +++ b/src/cmd/5c/txt.c @@ -139,7 +139,9 @@ gclean(void) continue; if(s->type == types[TENUM]) continue; + textflag = s->dataflag; gpseudo(AGLOBL, s, nodconst(s->type->width)); + textflag = 0; } nextpc(); p->as = AEND; @@ -357,7 +359,7 @@ regfree(Node *n) if(n->op != OREGISTER && n->op != OINDREG) goto err; i = n->reg; - if(i < 0 || i >= sizeof(reg)) + if(i < 0 || i >= nelem(reg)) goto err; if(reg[i] <= 0) goto err; @@ -1183,7 +1185,8 @@ gpseudo(int a, Sym *s, Node *n) if(a == ATEXT) { p->reg = textflag; textflag = 0; - } + } else if(a == AGLOBL) + p->reg = 0; if(s->class == CSTATIC) p->from.name = D_STATIC; naddr(n, &p->to); |