From 2c7ec3d8617baab14a76d471fb954d6b2f72695e Mon Sep 17 00:00:00 2001 From: Kai Backman Date: Fri, 18 Sep 2009 12:47:44 -0700 Subject: [PATCH] fix 5g -S and -g output R=rsc APPROVED=rsc DELTA=115 (93 added, 14 deleted, 8 changed) OCL=34798 CL=34802 --- src/cmd/5g/gg.h | 1 + src/cmd/5g/list.c | 122 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 101 insertions(+), 22 deletions(-) diff --git a/src/cmd/5g/gg.h b/src/cmd/5g/gg.h index 34b330e55a..5f4f960117 100644 --- a/src/cmd/5g/gg.h +++ b/src/cmd/5g/gg.h @@ -149,6 +149,7 @@ void datastring(char*, int, Addr*); * list.c */ int Aconv(Fmt*); +int Cconv(Fmt*); int Dconv(Fmt*); int Mconv(Fmt*); int Pconv(Fmt*); diff --git a/src/cmd/5g/list.c b/src/cmd/5g/list.c index 01a0bc51d7..d0febaca6d 100644 --- a/src/cmd/5g/list.c +++ b/src/cmd/5g/list.c @@ -38,7 +38,8 @@ listinit(void) { fmtinstall('A', Aconv); // as - fmtinstall('P', Pconv); // Prog* + fmtinstall('C', Cconv); // conditional execution bit + fmtinstall('P', Pconv); // Prog* fmtinstall('D', Dconv); // Addr* fmtinstall('Y', Yconv); // sconst fmtinstall('R', Rconv); // register @@ -55,21 +56,23 @@ Pconv(Fmt *fp) sconsize = 8; switch(p->as) { default: - snprint(str, sizeof(str), "%.4ld (%L) %-7A %D,%D", - p->loc, p->lineno, p->as, &p->from, &p->to); + if(p->reg == NREG) + snprint(str, sizeof(str), "%.4ld (%L) %-7A%C %D,%D", + p->loc, p->lineno, p->as, p->scond, &p->from, &p->to); + else if (p->from.type != D_FREG) + snprint(str, sizeof(str), "%.4ld (%L) %-7A%C %D,R%d,%D", + p->loc, p->lineno, p->as, p->scond, &p->from, p->reg, &p->to); + else + snprint(str, sizeof(str), "%.4ld (%L) %-7A%C %D,F%d,%D", + p->loc, p->lineno, p->as, p->scond, &p->from, p->reg, &p->to); break; case ADATA: case AINIT: case ADYNT: - snprint(str, sizeof(str), "%.4ld (%L) %-7A %D/%d,%D", + snprint(str, sizeof(str), "%.4ld (%L) %-7A %D/%d,%D", p->loc, p->lineno, p->as, &p->from, p->reg, &p->to); break; - - case ATEXT: - snprint(str, sizeof(str), "%.4ld (%L) %-7A %D,%lD", - p->loc, p->lineno, p->as, &p->from, &p->to); - break; } return fmtstrcpy(fp, str); } @@ -77,33 +80,24 @@ Pconv(Fmt *fp) int Dconv(Fmt *fp) { - char str[100]; //, s[100]; + char str[STRINGSZ]; char *op; Addr *a; int i; int32 v; -// uint32 d1, d2; a = va_arg(fp->args, Addr*); i = a->type; switch(i) { default: - if(a->type == D_OREG) - snprint(str, sizeof(str), "$%d(R%d)", a->offset, a->reg); - else - snprint(str, sizeof(str), "R%d", a->reg); + sprint(str, "GOK-type(%d)", a->type); break; case D_NONE: str[0] = 0; - break; - - case D_BRANCH: - if(a->sym != S) - sprint(str, "%s+%d(APC)", a->sym->name, a->offset); - else - sprint(str, "%d(APC)", a->offset); + if(a->name != D_NONE || a->reg != NREG || a->sym != S) + sprint(str, "%M(R%d)(NONE)", a, a->reg); break; case D_CONST: @@ -128,6 +122,44 @@ Dconv(Fmt *fp) sprint(str+strlen(str), "(R%d)", a->reg); break; + case D_OCONST: + sprint(str, "$*$%M", a); + if(a->reg != NREG) + sprint(str, "%M(R%d)(CONST)", a, a->reg); + break; + + case D_OREG: + if(a->reg != NREG) + sprint(str, "%M(R%d)", a, a->reg); + else + sprint(str, "%M", a); + break; + + case D_REG: + sprint(str, "R%d", a->reg); + if(a->name != D_NONE || a->sym != S) + sprint(str, "%M(R%d)(REG)", a, a->reg); + break; + + case D_REGREG: + sprint(str, "(R%d,R%d)", a->reg, (int)a->offset); + if(a->name != D_NONE || a->sym != S) + sprint(str, "%M(R%d)(REG)", a, a->reg); + break; + + case D_FREG: + sprint(str, "F%d", a->reg); + if(a->name != D_NONE || a->sym != S) + sprint(str, "%M(R%d)(REG)", a, a->reg); + break; + + case D_BRANCH: + if(a->sym != S) + sprint(str, "%s+%d(APC)", a->sym->name, a->offset); + else + sprint(str, "%d(APC)", a->offset); + break; + case D_FCONST: snprint(str, sizeof(str), "$(%.17e)", a->dval); break; @@ -158,6 +190,44 @@ Aconv(Fmt *fp) return fmtstrcpy(fp, anames[i]); } +char* strcond[16] = +{ + ".EQ", + ".NE", + ".HS", + ".LO", + ".MI", + ".PL", + ".VS", + ".VC", + ".HI", + ".LS", + ".GE", + ".LT", + ".GT", + ".LE", + "", + ".NV" +}; + +int +Cconv(Fmt *fp) +{ + char s[20]; + int c; + + c = va_arg(fp->args, int); + strcpy(s, strcond[c & C_SCOND]); + if(c & C_SBIT) + strcat(s, ".S"); + if(c & C_PBIT) + strcat(s, ".P"); + if(c & C_WBIT) + strcat(s, ".W"); + if(c & C_UBIT) /* ambiguous with FBIT */ + strcat(s, ".U"); + return fmtstrcpy(fp, s); +} int Yconv(Fmt *fp) @@ -223,6 +293,14 @@ Mconv(Fmt *fp) a = va_arg(fp->args, Addr*); switch(a->name) { + default: + snprint(str, sizeof(str), "GOK-name(%d)", a->name); + break; + + case D_NONE: + snprint(str, sizeof(str), "%d", a->offset); + break; + case D_EXTERN: snprint(str, sizeof(str), "%S+%d(SB)", a->sym, a->offset); break; -- 2.48.1