13e12c5d1SDavid du Colombier #include "gc.h" 23e12c5d1SDavid du Colombier 33e12c5d1SDavid du Colombier void 43e12c5d1SDavid du Colombier listinit(void) 53e12c5d1SDavid du Colombier { 63e12c5d1SDavid du Colombier 73e12c5d1SDavid du Colombier fmtinstall('A', Aconv); 83e12c5d1SDavid du Colombier fmtinstall('P', Pconv); 93e12c5d1SDavid du Colombier fmtinstall('S', Sconv); 103e12c5d1SDavid du Colombier fmtinstall('N', Nconv); 113e12c5d1SDavid du Colombier fmtinstall('B', Bconv); 123e12c5d1SDavid du Colombier fmtinstall('D', Dconv); 133e12c5d1SDavid du Colombier } 143e12c5d1SDavid du Colombier 153e12c5d1SDavid du Colombier int 16bd389b36SDavid du Colombier Pconv(void *o, Fconv *fp) 173e12c5d1SDavid du Colombier { 183e12c5d1SDavid du Colombier char str[STRINGSZ]; 193e12c5d1SDavid du Colombier Prog *p; 203e12c5d1SDavid du Colombier int a; 213e12c5d1SDavid du Colombier 223e12c5d1SDavid du Colombier p = *(Prog**)o; 233e12c5d1SDavid du Colombier a = p->as; 243e12c5d1SDavid du Colombier if(a == ADATA) 253e12c5d1SDavid du Colombier sprint(str, " %A %D/%d,%D", a, &p->from, p->reg, &p->to); 263e12c5d1SDavid du Colombier else 273e12c5d1SDavid du Colombier if(p->reg == NREG) 283e12c5d1SDavid du Colombier sprint(str, " %A %D,%D", a, &p->from, &p->to); 293e12c5d1SDavid du Colombier else 303e12c5d1SDavid du Colombier if(p->from.type != D_FREG) 313e12c5d1SDavid du Colombier sprint(str, " %A %D,R%d,%D", a, &p->from, p->reg, &p->to); 323e12c5d1SDavid du Colombier else 333e12c5d1SDavid du Colombier sprint(str, " %A %D,F%d,%D", a, &p->from, p->reg, &p->to); 34bd389b36SDavid du Colombier strconv(str, fp); 353e12c5d1SDavid du Colombier return sizeof(p); 363e12c5d1SDavid du Colombier } 373e12c5d1SDavid du Colombier 383e12c5d1SDavid du Colombier int 39bd389b36SDavid du Colombier Aconv(void *o, Fconv *fp) 403e12c5d1SDavid du Colombier { 413e12c5d1SDavid du Colombier char *s; 423e12c5d1SDavid du Colombier int a; 433e12c5d1SDavid du Colombier 443e12c5d1SDavid du Colombier a = *(int*)o; 453e12c5d1SDavid du Colombier s = "???"; 46*219b2ee8SDavid du Colombier if(a >= AXXX && a < ALAST) 473e12c5d1SDavid du Colombier s = anames[a]; 48bd389b36SDavid du Colombier strconv(s, fp); 493e12c5d1SDavid du Colombier return sizeof(a); 503e12c5d1SDavid du Colombier } 513e12c5d1SDavid du Colombier 523e12c5d1SDavid du Colombier int 53bd389b36SDavid du Colombier Dconv(void *o, Fconv *fp) 543e12c5d1SDavid du Colombier { 553e12c5d1SDavid du Colombier char str[STRINGSZ]; 563e12c5d1SDavid du Colombier Adr *a; 573e12c5d1SDavid du Colombier 583e12c5d1SDavid du Colombier a = *(Adr**)o; 593e12c5d1SDavid du Colombier switch(a->type) { 603e12c5d1SDavid du Colombier 613e12c5d1SDavid du Colombier default: 623e12c5d1SDavid du Colombier sprint(str, "GOK-type(%d)", a->type); 633e12c5d1SDavid du Colombier break; 643e12c5d1SDavid du Colombier 653e12c5d1SDavid du Colombier case D_NONE: 663e12c5d1SDavid du Colombier str[0] = 0; 673e12c5d1SDavid du Colombier if(a->name != D_NONE || a->reg != NREG || a->sym != S) 683e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(NONE)", a, a->reg); 693e12c5d1SDavid du Colombier break; 703e12c5d1SDavid du Colombier 713e12c5d1SDavid du Colombier case D_CONST: 723e12c5d1SDavid du Colombier if(a->reg != NREG) 733e12c5d1SDavid du Colombier sprint(str, "$%N(R%d)", a, a->reg); 743e12c5d1SDavid du Colombier else 753e12c5d1SDavid du Colombier sprint(str, "$%N", a); 763e12c5d1SDavid du Colombier break; 773e12c5d1SDavid du Colombier 783e12c5d1SDavid du Colombier case D_OREG: 793e12c5d1SDavid du Colombier if(a->reg != NREG) 803e12c5d1SDavid du Colombier sprint(str, "%N(R%d)", a, a->reg); 813e12c5d1SDavid du Colombier else 823e12c5d1SDavid du Colombier sprint(str, "%N", a); 833e12c5d1SDavid du Colombier break; 843e12c5d1SDavid du Colombier 853e12c5d1SDavid du Colombier case D_REG: 863e12c5d1SDavid du Colombier sprint(str, "R%d", a->reg); 873e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S) 883e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg); 893e12c5d1SDavid du Colombier break; 903e12c5d1SDavid du Colombier 913e12c5d1SDavid du Colombier case D_FREG: 923e12c5d1SDavid du Colombier sprint(str, "F%d", a->reg); 933e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S) 943e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg); 953e12c5d1SDavid du Colombier break; 963e12c5d1SDavid du Colombier 973e12c5d1SDavid du Colombier case D_FCREG: 983e12c5d1SDavid du Colombier sprint(str, "FCR%d", a->reg); 993e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S) 1003e12c5d1SDavid du Colombier sprint(str, "%N(R%d)(REG)", a, a->reg); 1013e12c5d1SDavid du Colombier break; 1023e12c5d1SDavid du Colombier 1033e12c5d1SDavid du Colombier case D_LO: 1043e12c5d1SDavid du Colombier sprint(str, "LO", a->reg); 1053e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S) 1063e12c5d1SDavid du Colombier sprint(str, "%N(LO)(REG)", a, a->reg); 1073e12c5d1SDavid du Colombier break; 1083e12c5d1SDavid du Colombier 1093e12c5d1SDavid du Colombier case D_HI: 1103e12c5d1SDavid du Colombier sprint(str, "HI", a->reg); 1113e12c5d1SDavid du Colombier if(a->name != D_NONE || a->sym != S) 1123e12c5d1SDavid du Colombier sprint(str, "%N(HI)(REG)", a, a->reg); 1133e12c5d1SDavid du Colombier break; 1143e12c5d1SDavid du Colombier 1153e12c5d1SDavid du Colombier case D_BRANCH: 1163e12c5d1SDavid du Colombier sprint(str, "%ld(PC)", a->offset-pc); 1173e12c5d1SDavid du Colombier break; 1183e12c5d1SDavid du Colombier 1193e12c5d1SDavid du Colombier case D_FCONST: 120*219b2ee8SDavid du Colombier sprint(str, "$%.17e", a->dval); 1213e12c5d1SDavid du Colombier break; 1223e12c5d1SDavid du Colombier 1233e12c5d1SDavid du Colombier case D_SCONST: 1243e12c5d1SDavid du Colombier sprint(str, "$\"%S\"", a->sval); 1253e12c5d1SDavid du Colombier break; 1263e12c5d1SDavid du Colombier } 127bd389b36SDavid du Colombier strconv(str, fp); 1283e12c5d1SDavid du Colombier return sizeof(a); 1293e12c5d1SDavid du Colombier } 1303e12c5d1SDavid du Colombier 1313e12c5d1SDavid du Colombier int 132bd389b36SDavid du Colombier Sconv(void *o, Fconv *fp) 1333e12c5d1SDavid du Colombier { 1343e12c5d1SDavid du Colombier int i, c; 1353e12c5d1SDavid du Colombier char str[STRINGSZ], *p, *a; 1363e12c5d1SDavid du Colombier 1373e12c5d1SDavid du Colombier a = *(char**)o; 1383e12c5d1SDavid du Colombier p = str; 1393e12c5d1SDavid du Colombier for(i=0; i<NSNAME; i++) { 1403e12c5d1SDavid du Colombier c = a[i] & 0xff; 1413e12c5d1SDavid du Colombier if(c >= 'a' && c <= 'z' || 1423e12c5d1SDavid du Colombier c >= 'A' && c <= 'Z' || 1433e12c5d1SDavid du Colombier c >= '0' && c <= '9' || 1443e12c5d1SDavid du Colombier c == ' ' || c == '%') { 1453e12c5d1SDavid du Colombier *p++ = c; 1463e12c5d1SDavid du Colombier continue; 1473e12c5d1SDavid du Colombier } 1483e12c5d1SDavid du Colombier *p++ = '\\'; 1493e12c5d1SDavid du Colombier switch(c) { 1503e12c5d1SDavid du Colombier case 0: 1513e12c5d1SDavid du Colombier *p++ = 'z'; 1523e12c5d1SDavid du Colombier continue; 1533e12c5d1SDavid du Colombier case '\\': 1543e12c5d1SDavid du Colombier case '"': 1553e12c5d1SDavid du Colombier *p++ = c; 1563e12c5d1SDavid du Colombier continue; 1573e12c5d1SDavid du Colombier case '\n': 1583e12c5d1SDavid du Colombier *p++ = 'n'; 1593e12c5d1SDavid du Colombier continue; 1603e12c5d1SDavid du Colombier case '\t': 1613e12c5d1SDavid du Colombier *p++ = 't'; 1623e12c5d1SDavid du Colombier continue; 1633e12c5d1SDavid du Colombier case '\r': 1643e12c5d1SDavid du Colombier *p++ = 'r'; 1653e12c5d1SDavid du Colombier continue; 1663e12c5d1SDavid du Colombier case '\f': 1673e12c5d1SDavid du Colombier *p++ = 'f'; 1683e12c5d1SDavid du Colombier continue; 1693e12c5d1SDavid du Colombier } 1703e12c5d1SDavid du Colombier *p++ = (c>>6) + '0'; 1713e12c5d1SDavid du Colombier *p++ = ((c>>3) & 7) + '0'; 1723e12c5d1SDavid du Colombier *p++ = (c & 7) + '0'; 1733e12c5d1SDavid du Colombier } 1743e12c5d1SDavid du Colombier *p = 0; 175bd389b36SDavid du Colombier strconv(str, fp); 1763e12c5d1SDavid du Colombier return sizeof(a); 1773e12c5d1SDavid du Colombier } 1783e12c5d1SDavid du Colombier 1793e12c5d1SDavid du Colombier int 180bd389b36SDavid du Colombier Nconv(void *o, Fconv *fp) 1813e12c5d1SDavid du Colombier { 1823e12c5d1SDavid du Colombier char str[STRINGSZ]; 1833e12c5d1SDavid du Colombier Adr *a; 1843e12c5d1SDavid du Colombier Sym *s; 1853e12c5d1SDavid du Colombier 1863e12c5d1SDavid du Colombier a = *(Adr**)o; 1873e12c5d1SDavid du Colombier s = a->sym; 1883e12c5d1SDavid du Colombier if(s == S) { 1893e12c5d1SDavid du Colombier sprint(str, "%ld", a->offset); 1903e12c5d1SDavid du Colombier goto out; 1913e12c5d1SDavid du Colombier } 1923e12c5d1SDavid du Colombier switch(a->name) { 1933e12c5d1SDavid du Colombier default: 1943e12c5d1SDavid du Colombier sprint(str, "GOK-name(%d)", a->name); 1953e12c5d1SDavid du Colombier break; 1963e12c5d1SDavid du Colombier 1973e12c5d1SDavid du Colombier case D_NONE: 1983e12c5d1SDavid du Colombier sprint(str, "%ld", a->offset); 1993e12c5d1SDavid du Colombier break; 2003e12c5d1SDavid du Colombier 2013e12c5d1SDavid du Colombier case D_EXTERN: 2023e12c5d1SDavid du Colombier sprint(str, "%s+%ld(SB)", s->name, a->offset); 2033e12c5d1SDavid du Colombier break; 2043e12c5d1SDavid du Colombier 2053e12c5d1SDavid du Colombier case D_STATIC: 2063e12c5d1SDavid du Colombier sprint(str, "%s<>+%ld(SB)", s->name, a->offset); 2073e12c5d1SDavid du Colombier break; 2083e12c5d1SDavid du Colombier 2093e12c5d1SDavid du Colombier case D_AUTO: 2103e12c5d1SDavid du Colombier sprint(str, "%s-%ld(SP)", s->name, -a->offset); 2113e12c5d1SDavid du Colombier break; 2123e12c5d1SDavid du Colombier 2133e12c5d1SDavid du Colombier case D_PARAM: 2143e12c5d1SDavid du Colombier sprint(str, "%s+%ld(FP)", s->name, a->offset); 2153e12c5d1SDavid du Colombier break; 2163e12c5d1SDavid du Colombier } 2173e12c5d1SDavid du Colombier out: 218bd389b36SDavid du Colombier strconv(str, fp); 2193e12c5d1SDavid du Colombier return sizeof(a); 2203e12c5d1SDavid du Colombier } 221