From 4d1cf5269ce9db7a55c9be8fb51fda675c5d8223 Mon Sep 17 00:00:00 2001 From: forsyth Date: Thu, 15 Jul 2010 17:13:02 +0100 Subject: 20100715-1712 --- utils/8a/a.y | 7 +++++++ utils/8c/list.c | 6 +++--- utils/8c/peep.c | 8 ++++++-- utils/8c/reg.c | 2 ++ utils/8l/l.h | 1 + utils/8l/span.c | 2 ++ utils/NOTICE | 5 +++-- utils/cc/macbody | 46 ++++++++++++++++++++++++++++++++++++++++------ utils/kc/cgen.c | 2 ++ utils/kl/asm.c | 5 +++++ 10 files changed, 71 insertions(+), 13 deletions(-) (limited to 'utils') diff --git a/utils/8a/a.y b/utils/8a/a.y index 167234b4..631344d3 100644 --- a/utils/8a/a.y +++ b/utils/8a/a.y @@ -236,6 +236,7 @@ rom: } | reg | omem +| imm rim: rem @@ -386,6 +387,12 @@ omem: $$ = nullgen; $$.type = D_INDIR+D_SP; } +| con '(' LSREG ')' + { + $$ = nullgen; + $$.type = D_INDIR+$3; + $$.offset = $1; + } | '(' LLREG '*' con ')' { $$ = nullgen; diff --git a/utils/8c/list.c b/utils/8c/list.c index 8ee83383..84466942 100644 --- a/utils/8c/list.c +++ b/utils/8c/list.c @@ -70,7 +70,7 @@ Aconv(Fmt *fp) int Dconv(Fmt *fp) { - char str[40], s[20]; + char str[STRINGSZ], s[STRINGSZ]; Adr *a; int i; @@ -224,7 +224,7 @@ char* regstr[] = int Rconv(Fmt *fp) { - char str[20]; + char str[STRINGSZ]; int r; r = va_arg(fp->args, int); @@ -240,7 +240,7 @@ int Sconv(Fmt *fp) { int i, c; - char str[30], *p, *a; + char str[STRINGSZ], *p, *a; a = va_arg(fp->args, char*); p = str; diff --git a/utils/8c/peep.c b/utils/8c/peep.c index ed3e6b78..3d98b771 100644 --- a/utils/8c/peep.c +++ b/utils/8c/peep.c @@ -639,10 +639,14 @@ copyu(Prog *p, Adr *v, Adr *s) return 2; goto caseread; - case AMOVSL: case AREP: case AREPN: - if(v->type == D_CX || v->type == D_DI || v->type == D_SI) + if(v->type == D_CX) + return 2; + goto caseread; + + case AMOVSL: + if(v->type == D_DI || v->type == D_SI) return 2; goto caseread; diff --git a/utils/8c/reg.c b/utils/8c/reg.c index 12ad50ab..fe84f573 100644 --- a/utils/8c/reg.c +++ b/utils/8c/reg.c @@ -224,7 +224,9 @@ regopt(Prog *p) */ case AFMOVDP: case AFMOVFP: + case AFMOVLP: case AFMOVVP: + case AFMOVWP: case ACALL: for(z=0; zname); c = getc(); n = -1; + dots = 0; if(c == '(') { n++; c = getnsc(); if(c != ')') { unget(c); for(;;) { - a = getsym(); + a = getsymdots(&dots); if(a == S) goto bad; if(n >= NARG) { @@ -199,7 +222,7 @@ macdef(void) c = getnsc(); if(c == ')') break; - if(c != ',') + if(c != ',' || dots) goto bad; } } @@ -325,6 +348,8 @@ macdef(void) } while(len & 3); *base = n+1; + if(dots) + *base |= VARMAC; s->macro = base; if(debug['m']) print("#define %s %s\n", s->name, s->macro+1); @@ -343,16 +368,19 @@ macexpand(Sym *s, char *b) { char buf[2000]; int n, l, c, nargs; - char *arg[NARG], *cp, *ob, *ecp; + char *arg[NARG], *cp, *ob, *ecp, dots; ob = b; - nargs = *s->macro - 1; - if(nargs < 0) { + if(*s->macro == 0) { strcpy(b, s->macro+1); if(debug['m']) print("#expand %s %s\n", s->name, ob); return; } + + nargs = (char)(*s->macro & ~VARMAC) - 1; + dots = *s->macro & VARMAC; + c = getnsc(); if(c != '(') goto bad; @@ -425,6 +453,10 @@ macexpand(Sym *s, char *b) } if(l == 0) { if(c == ',') { + if(n == nargs && dots) { + *cp++ = ','; + continue; + } *cp++ = 0; arg[n++] = cp; if(n > nargs) @@ -452,6 +484,8 @@ macexpand(Sym *s, char *b) cp = s->macro+1; for(;;) { c = *cp++; + if(c == '\n') + c = ' '; if(c != '#') { *b++ = c; if(c == 0) diff --git a/utils/kc/cgen.c b/utils/kc/cgen.c index e4e54d48..a6b5771c 100644 --- a/utils/kc/cgen.c +++ b/utils/kc/cgen.c @@ -493,6 +493,8 @@ cgen(Node *n, Node *nn) } else gopcode(OADD, nodconst(v), Z, &nod); gopcode(OAS, &nod, Z, &nod2); + if(nn && l->op == ONAME) /* in x=++i, emit USED(i) */ + gins(ANOP, l, Z); regfree(&nod); if(l->addable < INDEXED) diff --git a/utils/kl/asm.c b/utils/kl/asm.c index dde73d6d..62fe60b7 100644 --- a/utils/kl/asm.c +++ b/utils/kl/asm.c @@ -1001,6 +1001,11 @@ asmout(Prog *p, Optab *o, int aflag) } } break; + + case 57: /* op r1,r2 with reserved rs1 */ + r = 0; + o1 = OP_RRR(opcode(p->as), p->from.reg, r, p->to.reg); + break; } if(aflag) return o1; -- cgit v1.2.3