]> Cypherpunks repositories - gostls13.git/commitdiff
fix 5g -S and -g output
authorKai Backman <kaib@golang.org>
Fri, 18 Sep 2009 19:47:44 +0000 (12:47 -0700)
committerKai Backman <kaib@golang.org>
Fri, 18 Sep 2009 19:47:44 +0000 (12:47 -0700)
R=rsc
APPROVED=rsc
DELTA=115  (93 added, 14 deleted, 8 changed)
OCL=34798
CL=34802

src/cmd/5g/gg.h
src/cmd/5g/list.c

index 34b330e55af1eaef2bfb44f933862939a7c62969..5f4f9601172e3c2958553c5c42eebb2b62ff8b65 100644 (file)
@@ -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*);
index 01a0bc51d7a9fe619061a7c4008e5e682517a5a1..d0febaca6d65625377c446473cf912e57caabc03 100644 (file)
@@ -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;