13e12c5d1SDavid du Colombier #include "l.h" 23e12c5d1SDavid du Colombier 33e12c5d1SDavid du Colombier #define LPUT(c)\ 43e12c5d1SDavid du Colombier {\ 53e12c5d1SDavid du Colombier cbp[0] = (c)>>24;\ 63e12c5d1SDavid du Colombier cbp[1] = (c)>>16;\ 73e12c5d1SDavid du Colombier cbp[2] = (c)>>8;\ 83e12c5d1SDavid du Colombier cbp[3] = (c);\ 93e12c5d1SDavid du Colombier cbp += 4;\ 103e12c5d1SDavid du Colombier cbc -= 4;\ 113e12c5d1SDavid du Colombier if(cbc <= 0)\ 123e12c5d1SDavid du Colombier cflush();\ 133e12c5d1SDavid du Colombier } 143e12c5d1SDavid du Colombier 153e12c5d1SDavid du Colombier #define CPUT(c)\ 163e12c5d1SDavid du Colombier {\ 173e12c5d1SDavid du Colombier cbp[0] = (c);\ 183e12c5d1SDavid du Colombier cbp++;\ 193e12c5d1SDavid du Colombier cbc--;\ 203e12c5d1SDavid du Colombier if(cbc <= 0)\ 213e12c5d1SDavid du Colombier cflush();\ 223e12c5d1SDavid du Colombier } 233e12c5d1SDavid du Colombier 243e12c5d1SDavid du Colombier long 253e12c5d1SDavid du Colombier entryvalue(void) 263e12c5d1SDavid du Colombier { 273e12c5d1SDavid du Colombier char *a; 283e12c5d1SDavid du Colombier Sym *s; 293e12c5d1SDavid du Colombier 303e12c5d1SDavid du Colombier a = INITENTRY; 313e12c5d1SDavid du Colombier if(*a >= '0' && *a <= '9') 323e12c5d1SDavid du Colombier return atolwhex(a); 333e12c5d1SDavid du Colombier s = lookup(a, 0); 343e12c5d1SDavid du Colombier if(s->type == 0) 353e12c5d1SDavid du Colombier return INITTEXT; 363e12c5d1SDavid du Colombier if(s->type != STEXT && s->type != SLEAF) 373e12c5d1SDavid du Colombier diag("entry not text: %s", s->name); 383e12c5d1SDavid du Colombier return s->value; 393e12c5d1SDavid du Colombier } 403e12c5d1SDavid du Colombier 413e12c5d1SDavid du Colombier void 423e12c5d1SDavid du Colombier asmb(void) 433e12c5d1SDavid du Colombier { 443e12c5d1SDavid du Colombier Prog *p; 453e12c5d1SDavid du Colombier long t; 463e12c5d1SDavid du Colombier Optab *o; 473e12c5d1SDavid du Colombier 483e12c5d1SDavid du Colombier if(debug['v']) 493e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f asm\n", cputime()); 503e12c5d1SDavid du Colombier Bflush(&bso); 513e12c5d1SDavid du Colombier seek(cout, HEADR, 0); 523e12c5d1SDavid du Colombier pc = INITTEXT; 533e12c5d1SDavid du Colombier for(p = firstp; p != P; p = p->link) { 543e12c5d1SDavid du Colombier if(p->as == ATEXT) { 553e12c5d1SDavid du Colombier curtext = p; 563e12c5d1SDavid du Colombier autosize = p->to.offset + 4; 573e12c5d1SDavid du Colombier } 583e12c5d1SDavid du Colombier if(p->pc != pc) { 596b6b9ac8SDavid du Colombier diag("phase error %lux sb %lux", 603e12c5d1SDavid du Colombier p->pc, pc); 613e12c5d1SDavid du Colombier if(!debug['a']) 623e12c5d1SDavid du Colombier prasm(curp); 633e12c5d1SDavid du Colombier pc = p->pc; 643e12c5d1SDavid du Colombier } 653e12c5d1SDavid du Colombier curp = p; 663e12c5d1SDavid du Colombier o = oplook(p); /* could probably avoid this call */ 673e12c5d1SDavid du Colombier if(asmout(p, o, 0)) { 683e12c5d1SDavid du Colombier p = p->link; 693e12c5d1SDavid du Colombier pc += 4; 703e12c5d1SDavid du Colombier } 713e12c5d1SDavid du Colombier pc += o->size; 723e12c5d1SDavid du Colombier } 733e12c5d1SDavid du Colombier if(debug['a']) 743e12c5d1SDavid du Colombier Bprint(&bso, "\n"); 753e12c5d1SDavid du Colombier Bflush(&bso); 763e12c5d1SDavid du Colombier cflush(); 773e12c5d1SDavid du Colombier 783e12c5d1SDavid du Colombier curtext = P; 793e12c5d1SDavid du Colombier switch(HEADTYPE) { 803e12c5d1SDavid du Colombier case 0: 81b7b24591SDavid du Colombier case 3: 823e12c5d1SDavid du Colombier seek(cout, HEADR+textsize, 0); 833e12c5d1SDavid du Colombier break; 843e12c5d1SDavid du Colombier case 1: 853e12c5d1SDavid du Colombier case 2: 863e12c5d1SDavid du Colombier seek(cout, HEADR+textsize, 0); 873e12c5d1SDavid du Colombier break; 883e12c5d1SDavid du Colombier } 893e12c5d1SDavid du Colombier for(t = 0; t < datsize; t += sizeof(buf)-100) { 903e12c5d1SDavid du Colombier if(datsize-t > sizeof(buf)-100) 913e12c5d1SDavid du Colombier datblk(t, sizeof(buf)-100); 923e12c5d1SDavid du Colombier else 933e12c5d1SDavid du Colombier datblk(t, datsize-t); 943e12c5d1SDavid du Colombier } 953e12c5d1SDavid du Colombier 963e12c5d1SDavid du Colombier symsize = 0; 973e12c5d1SDavid du Colombier lcsize = 0; 983e12c5d1SDavid du Colombier if(!debug['s']) { 993e12c5d1SDavid du Colombier if(debug['v']) 1003e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f sym\n", cputime()); 1013e12c5d1SDavid du Colombier Bflush(&bso); 1023e12c5d1SDavid du Colombier switch(HEADTYPE) { 1033e12c5d1SDavid du Colombier case 0: 104b7b24591SDavid du Colombier case 3: 1053e12c5d1SDavid du Colombier seek(cout, HEADR+textsize+datsize, 0); 1063e12c5d1SDavid du Colombier break; 1073e12c5d1SDavid du Colombier case 2: 1083e12c5d1SDavid du Colombier case 1: 1093e12c5d1SDavid du Colombier seek(cout, HEADR+textsize+datsize, 0); 1103e12c5d1SDavid du Colombier break; 1113e12c5d1SDavid du Colombier } 1123e12c5d1SDavid du Colombier if(!debug['s']) 1133e12c5d1SDavid du Colombier asmsym(); 1143e12c5d1SDavid du Colombier if(debug['v']) 1153e12c5d1SDavid du Colombier Bprint(&bso, "%5.2f sp\n", cputime()); 1163e12c5d1SDavid du Colombier Bflush(&bso); 1173e12c5d1SDavid du Colombier if(!debug['s']) 1183e12c5d1SDavid du Colombier asmlc(); 119b7b24591SDavid du Colombier /* round up file length for boot image */ 120b7b24591SDavid du Colombier if(HEADTYPE == 0 || HEADTYPE == 3) 121219b2ee8SDavid du Colombier if((symsize+lcsize) & 1) 122219b2ee8SDavid du Colombier CPUT(0); 1233e12c5d1SDavid du Colombier cflush(); 1243e12c5d1SDavid du Colombier } 1253e12c5d1SDavid du Colombier 1263e12c5d1SDavid du Colombier seek(cout, 0L, 0); 1273e12c5d1SDavid du Colombier switch(HEADTYPE) { 1283e12c5d1SDavid du Colombier case 0: 1293e12c5d1SDavid du Colombier lput(0x1030107); /* magic and sections */ 1303e12c5d1SDavid du Colombier lput(textsize); /* sizes */ 1313e12c5d1SDavid du Colombier lput(datsize); 1323e12c5d1SDavid du Colombier lput(bsssize); 1333e12c5d1SDavid du Colombier lput(symsize); /* nsyms */ 1343e12c5d1SDavid du Colombier lput(entryvalue()); /* va of entry */ 1353e12c5d1SDavid du Colombier lput(0L); 1363e12c5d1SDavid du Colombier lput(lcsize); 1373e12c5d1SDavid du Colombier break; 1383e12c5d1SDavid du Colombier case 1: 1393e12c5d1SDavid du Colombier break; 1403e12c5d1SDavid du Colombier case 2: 1413e12c5d1SDavid du Colombier lput(4*13*13+7); /* magic */ 1423e12c5d1SDavid du Colombier lput(textsize); /* sizes */ 1433e12c5d1SDavid du Colombier lput(datsize); 1443e12c5d1SDavid du Colombier lput(bsssize); 1453e12c5d1SDavid du Colombier lput(symsize); /* nsyms */ 1463e12c5d1SDavid du Colombier lput(entryvalue()); /* va of entry */ 1473e12c5d1SDavid du Colombier lput(0L); 1483e12c5d1SDavid du Colombier lput(lcsize); 1493e12c5d1SDavid du Colombier break; 150b7b24591SDavid du Colombier case 3: 151b7b24591SDavid du Colombier lput(0x1030107); /* magic and sections */ 152b7b24591SDavid du Colombier lput(0x90100000); 153b7b24591SDavid du Colombier #define SPARC_NOOP 0x01000000 154b7b24591SDavid du Colombier lput(SPARC_NOOP); 155b7b24591SDavid du Colombier lput(SPARC_NOOP); 156b7b24591SDavid du Colombier lput(SPARC_NOOP); 157b7b24591SDavid du Colombier lput(SPARC_NOOP); 158b7b24591SDavid du Colombier lput(SPARC_NOOP); 159b7b24591SDavid du Colombier lput(SPARC_NOOP); 160b7b24591SDavid du Colombier break; 1613e12c5d1SDavid du Colombier } 1623e12c5d1SDavid du Colombier cflush(); 1633e12c5d1SDavid du Colombier } 1643e12c5d1SDavid du Colombier 1653e12c5d1SDavid du Colombier void 1663e12c5d1SDavid du Colombier lput(long l) 1673e12c5d1SDavid du Colombier { 1683e12c5d1SDavid du Colombier 1693e12c5d1SDavid du Colombier LPUT(l); 1703e12c5d1SDavid du Colombier } 1713e12c5d1SDavid du Colombier 1723e12c5d1SDavid du Colombier void 1733e12c5d1SDavid du Colombier cflush(void) 1743e12c5d1SDavid du Colombier { 1753e12c5d1SDavid du Colombier int n; 1763e12c5d1SDavid du Colombier 1773e12c5d1SDavid du Colombier n = sizeof(buf.cbuf) - cbc; 1783e12c5d1SDavid du Colombier if(n) 1793e12c5d1SDavid du Colombier write(cout, buf.cbuf, n); 1803e12c5d1SDavid du Colombier cbp = buf.cbuf; 1813e12c5d1SDavid du Colombier cbc = sizeof(buf.cbuf); 1823e12c5d1SDavid du Colombier } 1833e12c5d1SDavid du Colombier 1843e12c5d1SDavid du Colombier void 1853e12c5d1SDavid du Colombier asmsym(void) 1863e12c5d1SDavid du Colombier { 1873e12c5d1SDavid du Colombier Prog *p; 1883e12c5d1SDavid du Colombier Auto *a; 1893e12c5d1SDavid du Colombier Sym *s; 1903e12c5d1SDavid du Colombier int h; 1913e12c5d1SDavid du Colombier 1923e12c5d1SDavid du Colombier s = lookup("etext", 0); 1933e12c5d1SDavid du Colombier if(s->type == STEXT) 1943e12c5d1SDavid du Colombier putsymb(s->name, 'T', s->value, s->version); 1953e12c5d1SDavid du Colombier 1963e12c5d1SDavid du Colombier for(h=0; h<NHASH; h++) 1973e12c5d1SDavid du Colombier for(s=hash[h]; s!=S; s=s->link) 1983e12c5d1SDavid du Colombier switch(s->type) { 199219b2ee8SDavid du Colombier case SCONST: 200219b2ee8SDavid du Colombier putsymb(s->name, 'D', s->value, s->version); 201219b2ee8SDavid du Colombier continue; 202219b2ee8SDavid du Colombier 2033e12c5d1SDavid du Colombier case SDATA: 2043e12c5d1SDavid du Colombier putsymb(s->name, 'D', s->value+INITDAT, s->version); 2053e12c5d1SDavid du Colombier continue; 2063e12c5d1SDavid du Colombier 2073e12c5d1SDavid du Colombier case SBSS: 2083e12c5d1SDavid du Colombier putsymb(s->name, 'B', s->value+INITDAT, s->version); 2093e12c5d1SDavid du Colombier continue; 2103e12c5d1SDavid du Colombier 2113e12c5d1SDavid du Colombier case SFILE: 2123e12c5d1SDavid du Colombier putsymb(s->name, 'f', s->value, s->version); 2133e12c5d1SDavid du Colombier continue; 2143e12c5d1SDavid du Colombier } 2153e12c5d1SDavid du Colombier 2163e12c5d1SDavid du Colombier for(p=textp; p!=P; p=p->cond) { 2173e12c5d1SDavid du Colombier s = p->from.sym; 2183e12c5d1SDavid du Colombier if(s->type != STEXT && s->type != SLEAF) 2193e12c5d1SDavid du Colombier continue; 2203e12c5d1SDavid du Colombier 2213e12c5d1SDavid du Colombier /* filenames first */ 2223e12c5d1SDavid du Colombier for(a=p->to.autom; a; a=a->link) 2233e12c5d1SDavid du Colombier if(a->type == D_FILE) 2247dd7cddfSDavid du Colombier putsymb(a->asym->name, 'z', a->aoffset, 0); 2253e12c5d1SDavid du Colombier else 226219b2ee8SDavid du Colombier if(a->type == D_FILE1) 2277dd7cddfSDavid du Colombier putsymb(a->asym->name, 'Z', a->aoffset, 0); 2283e12c5d1SDavid du Colombier 2293e12c5d1SDavid du Colombier if(s->type == STEXT) 2303e12c5d1SDavid du Colombier putsymb(s->name, 'T', s->value, s->version); 2313e12c5d1SDavid du Colombier else 2323e12c5d1SDavid du Colombier putsymb(s->name, 'L', s->value, s->version); 2333e12c5d1SDavid du Colombier 2343e12c5d1SDavid du Colombier /* frame, auto and param after */ 235219b2ee8SDavid du Colombier putsymb(".frame", 'm', p->to.offset+4, 0); 2363e12c5d1SDavid du Colombier for(a=p->to.autom; a; a=a->link) 2373e12c5d1SDavid du Colombier if(a->type == D_AUTO) 2387dd7cddfSDavid du Colombier putsymb(a->asym->name, 'a', -a->aoffset, 0); 2393e12c5d1SDavid du Colombier else 2403e12c5d1SDavid du Colombier if(a->type == D_PARAM) 2417dd7cddfSDavid du Colombier putsymb(a->asym->name, 'p', a->aoffset, 0); 2423e12c5d1SDavid du Colombier } 2433e12c5d1SDavid du Colombier if(debug['v'] || debug['n']) 2443e12c5d1SDavid du Colombier Bprint(&bso, "symsize = %lud\n", symsize); 2453e12c5d1SDavid du Colombier Bflush(&bso); 2463e12c5d1SDavid du Colombier } 2473e12c5d1SDavid du Colombier 2483e12c5d1SDavid du Colombier void 2493e12c5d1SDavid du Colombier putsymb(char *s, int t, long v, int ver) 2503e12c5d1SDavid du Colombier { 2513e12c5d1SDavid du Colombier int i, f; 2523e12c5d1SDavid du Colombier 2533e12c5d1SDavid du Colombier if(t == 'f') 2543e12c5d1SDavid du Colombier s++; 2553e12c5d1SDavid du Colombier LPUT(v); 2563e12c5d1SDavid du Colombier if(ver) 2573e12c5d1SDavid du Colombier t += 'a' - 'A'; 258219b2ee8SDavid du Colombier CPUT(t+0x80); /* 0x80 is variable length */ 259219b2ee8SDavid du Colombier 260219b2ee8SDavid du Colombier if(t == 'Z' || t == 'z') { 261219b2ee8SDavid du Colombier CPUT(s[0]); 262219b2ee8SDavid du Colombier for(i=1; s[i] != 0 || s[i+1] != 0; i += 2) { 263219b2ee8SDavid du Colombier CPUT(s[i]); 264219b2ee8SDavid du Colombier CPUT(s[i+1]); 265219b2ee8SDavid du Colombier } 266219b2ee8SDavid du Colombier CPUT(0); 267219b2ee8SDavid du Colombier CPUT(0); 268219b2ee8SDavid du Colombier i++; 269219b2ee8SDavid du Colombier } 270219b2ee8SDavid du Colombier else { 271219b2ee8SDavid du Colombier for(i=0; s[i]; i++) 2723e12c5d1SDavid du Colombier CPUT(s[i]); 2733e12c5d1SDavid du Colombier CPUT(0); 274219b2ee8SDavid du Colombier } 275219b2ee8SDavid du Colombier symsize += 4 + 1 + i + 1; 276219b2ee8SDavid du Colombier 2773e12c5d1SDavid du Colombier if(debug['n']) { 2783e12c5d1SDavid du Colombier if(t == 'z' || t == 'Z') { 279219b2ee8SDavid du Colombier Bprint(&bso, "%c %.8lux ", t, v); 280219b2ee8SDavid du Colombier for(i=1; s[i] != 0 || s[i+1] != 0; i+=2) { 2813e12c5d1SDavid du Colombier f = ((s[i]&0xff) << 8) | (s[i+1]&0xff); 282219b2ee8SDavid du Colombier Bprint(&bso, "/%x", f); 2833e12c5d1SDavid du Colombier } 284219b2ee8SDavid du Colombier Bprint(&bso, "\n"); 2853e12c5d1SDavid du Colombier return; 2863e12c5d1SDavid du Colombier } 2873e12c5d1SDavid du Colombier if(ver) 2883e12c5d1SDavid du Colombier Bprint(&bso, "%c %.8lux %s<%d>\n", t, v, s, ver); 2893e12c5d1SDavid du Colombier else 2903e12c5d1SDavid du Colombier Bprint(&bso, "%c %.8lux %s\n", t, v, s); 2913e12c5d1SDavid du Colombier } 2923e12c5d1SDavid du Colombier } 2933e12c5d1SDavid du Colombier 2943e12c5d1SDavid du Colombier #define MINLC 4 2953e12c5d1SDavid du Colombier void 2963e12c5d1SDavid du Colombier asmlc(void) 2973e12c5d1SDavid du Colombier { 2983e12c5d1SDavid du Colombier long oldpc, oldlc; 2993e12c5d1SDavid du Colombier Prog *p; 3003e12c5d1SDavid du Colombier long v, s; 3013e12c5d1SDavid du Colombier 3023e12c5d1SDavid du Colombier oldpc = INITTEXT; 3033e12c5d1SDavid du Colombier oldlc = 0; 3043e12c5d1SDavid du Colombier for(p = firstp; p != P; p = p->link) { 3053e12c5d1SDavid du Colombier if(p->line == oldlc || p->as == ATEXT || p->as == ANOP) { 3063e12c5d1SDavid du Colombier if(p->as == ATEXT) 3073e12c5d1SDavid du Colombier curtext = p; 3083e12c5d1SDavid du Colombier if(debug['L']) 3093e12c5d1SDavid du Colombier Bprint(&bso, "%6lux %P\n", 3103e12c5d1SDavid du Colombier p->pc, p); 3113e12c5d1SDavid du Colombier continue; 3123e12c5d1SDavid du Colombier } 3133e12c5d1SDavid du Colombier if(debug['L']) 3143e12c5d1SDavid du Colombier Bprint(&bso, "\t\t%6ld", lcsize); 3153e12c5d1SDavid du Colombier v = (p->pc - oldpc) / MINLC; 3163e12c5d1SDavid du Colombier while(v) { 3173e12c5d1SDavid du Colombier s = 127; 3183e12c5d1SDavid du Colombier if(v < 127) 3193e12c5d1SDavid du Colombier s = v; 3203e12c5d1SDavid du Colombier CPUT(s+128); /* 129-255 +pc */ 3213e12c5d1SDavid du Colombier if(debug['L']) 3223e12c5d1SDavid du Colombier Bprint(&bso, " pc+%ld*%d(%ld)", s, MINLC, s+128); 3233e12c5d1SDavid du Colombier v -= s; 3243e12c5d1SDavid du Colombier lcsize++; 3253e12c5d1SDavid du Colombier } 3263e12c5d1SDavid du Colombier s = p->line - oldlc; 3273e12c5d1SDavid du Colombier oldlc = p->line; 3283e12c5d1SDavid du Colombier oldpc = p->pc + MINLC; 3293e12c5d1SDavid du Colombier if(s > 64 || s < -64) { 3303e12c5d1SDavid du Colombier CPUT(0); /* 0 vv +lc */ 3313e12c5d1SDavid du Colombier CPUT(s>>24); 3323e12c5d1SDavid du Colombier CPUT(s>>16); 3333e12c5d1SDavid du Colombier CPUT(s>>8); 3343e12c5d1SDavid du Colombier CPUT(s); 3353e12c5d1SDavid du Colombier if(debug['L']) { 3363e12c5d1SDavid du Colombier if(s > 0) 3373e12c5d1SDavid du Colombier Bprint(&bso, " lc+%ld(%d,%ld)\n", 3383e12c5d1SDavid du Colombier s, 0, s); 3393e12c5d1SDavid du Colombier else 3403e12c5d1SDavid du Colombier Bprint(&bso, " lc%ld(%d,%ld)\n", 3413e12c5d1SDavid du Colombier s, 0, s); 3423e12c5d1SDavid du Colombier Bprint(&bso, "%6lux %P\n", 3433e12c5d1SDavid du Colombier p->pc, p); 3443e12c5d1SDavid du Colombier } 3453e12c5d1SDavid du Colombier lcsize += 5; 3463e12c5d1SDavid du Colombier continue; 3473e12c5d1SDavid du Colombier } 3483e12c5d1SDavid du Colombier if(s > 0) { 3493e12c5d1SDavid du Colombier CPUT(0+s); /* 1-64 +lc */ 3503e12c5d1SDavid du Colombier if(debug['L']) { 3513e12c5d1SDavid du Colombier Bprint(&bso, " lc+%ld(%ld)\n", s, 0+s); 3523e12c5d1SDavid du Colombier Bprint(&bso, "%6lux %P\n", 3533e12c5d1SDavid du Colombier p->pc, p); 3543e12c5d1SDavid du Colombier } 3553e12c5d1SDavid du Colombier } else { 3563e12c5d1SDavid du Colombier CPUT(64-s); /* 65-128 -lc */ 3573e12c5d1SDavid du Colombier if(debug['L']) { 3583e12c5d1SDavid du Colombier Bprint(&bso, " lc%ld(%ld)\n", s, 64-s); 3593e12c5d1SDavid du Colombier Bprint(&bso, "%6lux %P\n", 3603e12c5d1SDavid du Colombier p->pc, p); 3613e12c5d1SDavid du Colombier } 3623e12c5d1SDavid du Colombier } 3633e12c5d1SDavid du Colombier lcsize++; 3643e12c5d1SDavid du Colombier } 3653e12c5d1SDavid du Colombier while(lcsize & 1) { 3663e12c5d1SDavid du Colombier s = 129; 3673e12c5d1SDavid du Colombier CPUT(s); 3683e12c5d1SDavid du Colombier lcsize++; 3693e12c5d1SDavid du Colombier } 3703e12c5d1SDavid du Colombier if(debug['v'] || debug['L']) 3713e12c5d1SDavid du Colombier Bprint(&bso, "lcsize = %ld\n", lcsize); 3723e12c5d1SDavid du Colombier Bflush(&bso); 3733e12c5d1SDavid du Colombier } 3743e12c5d1SDavid du Colombier 3753e12c5d1SDavid du Colombier void 3763e12c5d1SDavid du Colombier datblk(long s, long n) 3773e12c5d1SDavid du Colombier { 3783e12c5d1SDavid du Colombier Prog *p; 3793e12c5d1SDavid du Colombier char *cast; 3803e12c5d1SDavid du Colombier long l, fl, j, d; 3813e12c5d1SDavid du Colombier int i, c; 3823e12c5d1SDavid du Colombier 3833e12c5d1SDavid du Colombier memset(buf.dbuf, 0, n+100); 3843e12c5d1SDavid du Colombier for(p = datap; p != P; p = p->link) { 3853e12c5d1SDavid du Colombier curp = p; 3863e12c5d1SDavid du Colombier l = p->from.sym->value + p->from.offset - s; 3873e12c5d1SDavid du Colombier c = p->reg; 3883e12c5d1SDavid du Colombier i = 0; 3893e12c5d1SDavid du Colombier if(l < 0) { 3903e12c5d1SDavid du Colombier if(l+c <= 0) 3913e12c5d1SDavid du Colombier continue; 3923e12c5d1SDavid du Colombier while(l < 0) { 3933e12c5d1SDavid du Colombier l++; 3943e12c5d1SDavid du Colombier i++; 3953e12c5d1SDavid du Colombier } 3963e12c5d1SDavid du Colombier } 3973e12c5d1SDavid du Colombier if(l >= n) 3983e12c5d1SDavid du Colombier continue; 399219b2ee8SDavid du Colombier if(p->as != AINIT && p->as != ADYNT) { 4003e12c5d1SDavid du Colombier for(j=l+(c-i)-1; j>=l; j--) 4013e12c5d1SDavid du Colombier if(buf.dbuf[j]) { 4023e12c5d1SDavid du Colombier print("%P\n", p); 4036b6b9ac8SDavid du Colombier diag("multiple initialization"); 4043e12c5d1SDavid du Colombier break; 4053e12c5d1SDavid du Colombier } 406219b2ee8SDavid du Colombier } 4073e12c5d1SDavid du Colombier switch(p->to.type) { 4083e12c5d1SDavid du Colombier default: 4096b6b9ac8SDavid du Colombier diag("unknown mode in initialization\n%P", p); 4103e12c5d1SDavid du Colombier break; 4113e12c5d1SDavid du Colombier 4123e12c5d1SDavid du Colombier case D_FCONST: 4133e12c5d1SDavid du Colombier switch(c) { 4143e12c5d1SDavid du Colombier default: 4153e12c5d1SDavid du Colombier case 4: 4163e12c5d1SDavid du Colombier fl = ieeedtof(&p->to.ieee); 4173e12c5d1SDavid du Colombier cast = (char*)&fl; 4183e12c5d1SDavid du Colombier for(; i<c; i++) { 4193e12c5d1SDavid du Colombier buf.dbuf[l] = cast[fnuxi8[i+4]]; 4203e12c5d1SDavid du Colombier l++; 4213e12c5d1SDavid du Colombier } 4223e12c5d1SDavid du Colombier break; 4233e12c5d1SDavid du Colombier case 8: 4243e12c5d1SDavid du Colombier cast = (char*)&p->to.ieee; 4253e12c5d1SDavid du Colombier for(; i<c; i++) { 4263e12c5d1SDavid du Colombier buf.dbuf[l] = cast[fnuxi8[i]]; 4273e12c5d1SDavid du Colombier l++; 4283e12c5d1SDavid du Colombier } 4293e12c5d1SDavid du Colombier break; 4303e12c5d1SDavid du Colombier } 4313e12c5d1SDavid du Colombier break; 4323e12c5d1SDavid du Colombier 4333e12c5d1SDavid du Colombier case D_SCONST: 4343e12c5d1SDavid du Colombier for(; i<c; i++) { 4353e12c5d1SDavid du Colombier buf.dbuf[l] = p->to.sval[i]; 4363e12c5d1SDavid du Colombier l++; 4373e12c5d1SDavid du Colombier } 4383e12c5d1SDavid du Colombier break; 4393e12c5d1SDavid du Colombier 4403e12c5d1SDavid du Colombier case D_CONST: 4413e12c5d1SDavid du Colombier d = p->to.offset; 4423e12c5d1SDavid du Colombier if(p->to.sym) { 4433e12c5d1SDavid du Colombier if(p->to.sym->type == STEXT || 4443e12c5d1SDavid du Colombier p->to.sym->type == SLEAF) 4453e12c5d1SDavid du Colombier d += p->to.sym->value; 4463e12c5d1SDavid du Colombier if(p->to.sym->type == SDATA) 4473e12c5d1SDavid du Colombier d += p->to.sym->value + INITDAT; 4483e12c5d1SDavid du Colombier if(p->to.sym->type == SBSS) 4493e12c5d1SDavid du Colombier d += p->to.sym->value + INITDAT; 4503e12c5d1SDavid du Colombier } 4513e12c5d1SDavid du Colombier cast = (char*)&d; 4523e12c5d1SDavid du Colombier switch(c) { 4533e12c5d1SDavid du Colombier default: 4546b6b9ac8SDavid du Colombier diag("bad nuxi %d %d\n%P", c, i, curp); 4553e12c5d1SDavid du Colombier break; 4563e12c5d1SDavid du Colombier case 1: 4573e12c5d1SDavid du Colombier for(; i<c; i++) { 4583e12c5d1SDavid du Colombier buf.dbuf[l] = cast[inuxi1[i]]; 4593e12c5d1SDavid du Colombier l++; 4603e12c5d1SDavid du Colombier } 4613e12c5d1SDavid du Colombier break; 4623e12c5d1SDavid du Colombier case 2: 4633e12c5d1SDavid du Colombier for(; i<c; i++) { 4643e12c5d1SDavid du Colombier buf.dbuf[l] = cast[inuxi2[i]]; 4653e12c5d1SDavid du Colombier l++; 4663e12c5d1SDavid du Colombier } 4673e12c5d1SDavid du Colombier break; 4683e12c5d1SDavid du Colombier case 4: 4693e12c5d1SDavid du Colombier for(; i<c; i++) { 4703e12c5d1SDavid du Colombier buf.dbuf[l] = cast[inuxi4[i]]; 4713e12c5d1SDavid du Colombier l++; 4723e12c5d1SDavid du Colombier } 4733e12c5d1SDavid du Colombier break; 4743e12c5d1SDavid du Colombier } 4753e12c5d1SDavid du Colombier break; 4763e12c5d1SDavid du Colombier } 4773e12c5d1SDavid du Colombier } 4783e12c5d1SDavid du Colombier write(cout, buf.dbuf, n); 4793e12c5d1SDavid du Colombier } 4803e12c5d1SDavid du Colombier 4813e12c5d1SDavid du Colombier #define OP2(x) (0x80000000|((x)<<19)) 4823e12c5d1SDavid du Colombier #define OP3(x) (0xc0000000|((x)<<19)) 4833e12c5d1SDavid du Colombier #define OPB(x) (0x00800000|((x)<<25)) 4843e12c5d1SDavid du Colombier #define OPT(x) (0x81d02000|((x)<<25)) 4853e12c5d1SDavid du Colombier #define OPF1(x) (0x81a00000|((x)<<5)) 4863e12c5d1SDavid du Colombier #define OPF2(x) (0x81a80000|((x)<<5)) 4873e12c5d1SDavid du Colombier #define OPFB(x) (0x01800000|((x)<<25)) 4883e12c5d1SDavid du Colombier 4893e12c5d1SDavid du Colombier #define OP_RRR(op,r1,r2,r3)\ 4903e12c5d1SDavid du Colombier (0x00000000 | op |\ 4913e12c5d1SDavid du Colombier (((r1)&31L)<<0) |\ 4923e12c5d1SDavid du Colombier (((r2)&31L)<<14) |\ 4933e12c5d1SDavid du Colombier (((r3)&31L)<<25)) 4943e12c5d1SDavid du Colombier #define OP_IRR(op,i,r2,r3)\ 4953e12c5d1SDavid du Colombier (0x00002000L | (op) |\ 4963e12c5d1SDavid du Colombier (((i)&0x1fffL)<<0) |\ 4973e12c5d1SDavid du Colombier (((r2)&31L)<<14) |\ 4983e12c5d1SDavid du Colombier (((r3)&31L)<<25)) 4993e12c5d1SDavid du Colombier #define OP_BRA(op,pc)\ 5003e12c5d1SDavid du Colombier ((op) |\ 5013e12c5d1SDavid du Colombier (((pc)&0x3fffff)<<0)) 5023e12c5d1SDavid du Colombier 5033e12c5d1SDavid du Colombier int 5043e12c5d1SDavid du Colombier asmout(Prog *p, Optab *o, int aflag) 5053e12c5d1SDavid du Colombier { 5063e12c5d1SDavid du Colombier long o1, o2, o3, o4, o5, v; 5073e12c5d1SDavid du Colombier Prog *ct; 5083e12c5d1SDavid du Colombier int r; 5093e12c5d1SDavid du Colombier 5103e12c5d1SDavid du Colombier o1 = 0; 5113e12c5d1SDavid du Colombier o2 = 0; 5123e12c5d1SDavid du Colombier o3 = 0; 5133e12c5d1SDavid du Colombier o4 = 0; 5143e12c5d1SDavid du Colombier o5 = 0; 5153e12c5d1SDavid du Colombier 5163e12c5d1SDavid du Colombier switch(o->type) { 5173e12c5d1SDavid du Colombier default: 5183e12c5d1SDavid du Colombier if(aflag) 5193e12c5d1SDavid du Colombier return 0; 5206b6b9ac8SDavid du Colombier diag("unknown type %d", o->type); 5213e12c5d1SDavid du Colombier if(!debug['a']) 5223e12c5d1SDavid du Colombier prasm(p); 5233e12c5d1SDavid du Colombier break; 5243e12c5d1SDavid du Colombier 5253e12c5d1SDavid du Colombier case 0: /* pseudo ops */ 5263e12c5d1SDavid du Colombier if(aflag) { 5273e12c5d1SDavid du Colombier if(p->link) { 5283e12c5d1SDavid du Colombier if(p->as == ATEXT) { 5293e12c5d1SDavid du Colombier ct = curtext; 5303e12c5d1SDavid du Colombier o2 = autosize; 5313e12c5d1SDavid du Colombier curtext = p; 5323e12c5d1SDavid du Colombier autosize = p->to.offset + 4; 5333e12c5d1SDavid du Colombier o1 = asmout(p->link, oplook(p->link), aflag); 5343e12c5d1SDavid du Colombier curtext = ct; 5353e12c5d1SDavid du Colombier autosize = o2; 5363e12c5d1SDavid du Colombier } else 5373e12c5d1SDavid du Colombier o1 = asmout(p->link, oplook(p->link), aflag); 5383e12c5d1SDavid du Colombier } 5393e12c5d1SDavid du Colombier return o1; 5403e12c5d1SDavid du Colombier } 5413e12c5d1SDavid du Colombier break; 5423e12c5d1SDavid du Colombier 5433e12c5d1SDavid du Colombier case 1: /* mov r1,r2 ==> OR r1,r0,r2 */ 5443e12c5d1SDavid du Colombier o1 = OP_RRR(opcode(AOR), p->from.reg, REGZERO, p->to.reg); 5453e12c5d1SDavid du Colombier break; 5463e12c5d1SDavid du Colombier 5473e12c5d1SDavid du Colombier case 2: /* mov $c,r ==> add r1,r0,r2 */ 5483e12c5d1SDavid du Colombier r = p->from.reg; 5493e12c5d1SDavid du Colombier if(r == NREG) 5503e12c5d1SDavid du Colombier r = o->param; 5513e12c5d1SDavid du Colombier v = regoff(&p->from); 5523e12c5d1SDavid du Colombier o1 = OP_IRR(opcode(AADD), v, r, p->to.reg); 5533e12c5d1SDavid du Colombier break; 5543e12c5d1SDavid du Colombier 5553e12c5d1SDavid du Colombier case 3: /* mov soreg, r */ 5563e12c5d1SDavid du Colombier r = p->from.reg; 5573e12c5d1SDavid du Colombier if(r == NREG) 5583e12c5d1SDavid du Colombier r = o->param; 5593e12c5d1SDavid du Colombier v = regoff(&p->from); 5603e12c5d1SDavid du Colombier if(v == 0 && p->reg != NREG) 5613e12c5d1SDavid du Colombier o1 = OP_RRR(opcode(p->as), p->reg, r, p->to.reg); 5623e12c5d1SDavid du Colombier else 5633e12c5d1SDavid du Colombier o1 = OP_IRR(opcode(p->as), v, r, p->to.reg); 5643e12c5d1SDavid du Colombier break; 5653e12c5d1SDavid du Colombier 5663e12c5d1SDavid du Colombier case 4: /* mov r, soreg */ 5673e12c5d1SDavid du Colombier r = p->to.reg; 5683e12c5d1SDavid du Colombier if(r == NREG) 5693e12c5d1SDavid du Colombier r = o->param; 5703e12c5d1SDavid du Colombier v = regoff(&p->to); 5713e12c5d1SDavid du Colombier if(v == 0 && p->reg != NREG) 5723e12c5d1SDavid du Colombier o1 = OP_RRR(opcode(p->as+AEND), p->reg, r, p->from.reg); 5733e12c5d1SDavid du Colombier else 5743e12c5d1SDavid du Colombier o1 = OP_IRR(opcode(p->as+AEND), v, r, p->from.reg); 5753e12c5d1SDavid du Colombier break; 5763e12c5d1SDavid du Colombier 5773e12c5d1SDavid du Colombier case 5: /* mov $lcon, reg => sethi, add */ 5783e12c5d1SDavid du Colombier v = regoff(&p->from); 5793e12c5d1SDavid du Colombier o1 = 0x1000000 | (REGTMP<<25) | ((v>>10) & 0x3fffff); /* sethi */ 5803e12c5d1SDavid du Colombier o2 = OP_IRR(opcode(AADD), (v&0x3ff), REGTMP, p->to.reg); 5813e12c5d1SDavid du Colombier break; 5823e12c5d1SDavid du Colombier 5833e12c5d1SDavid du Colombier case 6: /* mov asi, r[+r] */ 5843e12c5d1SDavid du Colombier o1 = OP_RRR(opcode(p->as), p->reg, p->from.reg, p->to.reg); 5853e12c5d1SDavid du Colombier o1 |= (1<<23) | ((p->from.offset&0xff)<<5); 5863e12c5d1SDavid du Colombier break; 5873e12c5d1SDavid du Colombier 5883e12c5d1SDavid du Colombier case 7: /* mov [+r]r, asi */ 5893e12c5d1SDavid du Colombier o1 = OP_RRR(opcode(p->as+AEND), p->reg, p->to.reg, p->from.reg); 5903e12c5d1SDavid du Colombier o1 |= (1<<23) | ((p->to.offset&0xff)<<5); 5913e12c5d1SDavid du Colombier break; 5923e12c5d1SDavid du Colombier 5933e12c5d1SDavid du Colombier case 8: /* mov r, preg and mov preg, r */ 5943e12c5d1SDavid du Colombier if(p->to.type == D_PREG) { 5953e12c5d1SDavid du Colombier r = p->from.reg; 5963e12c5d1SDavid du Colombier switch(p->to.reg) 5973e12c5d1SDavid du Colombier { 5983e12c5d1SDavid du Colombier default: 5993e12c5d1SDavid du Colombier diag("unknown register P%d", p->to.reg); 6003e12c5d1SDavid du Colombier case D_Y: 6013e12c5d1SDavid du Colombier o1 = OP2(48); /* wry */ 6023e12c5d1SDavid du Colombier break; 6033e12c5d1SDavid du Colombier case D_PSR: 6043e12c5d1SDavid du Colombier o1 = OP2(49); /* wrpsr */ 6053e12c5d1SDavid du Colombier break; 6063e12c5d1SDavid du Colombier case D_WIM: 6073e12c5d1SDavid du Colombier o1 = OP2(50); /* wrwim */ 6083e12c5d1SDavid du Colombier break; 6093e12c5d1SDavid du Colombier case D_TBR: 6103e12c5d1SDavid du Colombier o1 = OP2(51); /* wrtbr */ 6113e12c5d1SDavid du Colombier break; 6123e12c5d1SDavid du Colombier } 6133e12c5d1SDavid du Colombier o1 = OP_IRR(o1, 0, r, 0); 6143e12c5d1SDavid du Colombier break; 6153e12c5d1SDavid du Colombier } 6163e12c5d1SDavid du Colombier if(p->from.type == D_PREG) { 6173e12c5d1SDavid du Colombier r = p->to.reg; 6183e12c5d1SDavid du Colombier switch(p->from.reg) 6193e12c5d1SDavid du Colombier { 6203e12c5d1SDavid du Colombier default: 6213e12c5d1SDavid du Colombier diag("unknown register P%d", p->to.reg); 6223e12c5d1SDavid du Colombier case D_Y: 6233e12c5d1SDavid du Colombier o1 = OP2(40); /* rdy */ 6243e12c5d1SDavid du Colombier break; 6253e12c5d1SDavid du Colombier case D_PSR: 6263e12c5d1SDavid du Colombier o1 = OP2(41); /* rdpsr */ 6273e12c5d1SDavid du Colombier break; 6283e12c5d1SDavid du Colombier case D_WIM: 6293e12c5d1SDavid du Colombier o1 = OP2(42); /* rdwim */ 6303e12c5d1SDavid du Colombier break; 6313e12c5d1SDavid du Colombier case D_TBR: 6323e12c5d1SDavid du Colombier o1 = OP2(43); /* rdtbr */ 6333e12c5d1SDavid du Colombier break; 6343e12c5d1SDavid du Colombier } 6353e12c5d1SDavid du Colombier o1 = OP_RRR(o1, 0, 0, r); 6363e12c5d1SDavid du Colombier break; 6373e12c5d1SDavid du Colombier } 6383e12c5d1SDavid du Colombier break; 6393e12c5d1SDavid du Colombier 6403e12c5d1SDavid du Colombier case 9: /* movb r,r */ 6413e12c5d1SDavid du Colombier v = 24; 6423e12c5d1SDavid du Colombier if(p->as == AMOVH || p->as == AMOVHU) 6433e12c5d1SDavid du Colombier v = 16; 6443e12c5d1SDavid du Colombier r = ASRA; 6453e12c5d1SDavid du Colombier if(p->as == AMOVBU || p->as == AMOVHU) 6463e12c5d1SDavid du Colombier r = ASRL; 6473e12c5d1SDavid du Colombier o1 = OP_IRR(opcode(ASLL), v, p->from.reg, p->to.reg); 6483e12c5d1SDavid du Colombier o2 = OP_IRR(opcode(r), v, p->to.reg, p->to.reg); 6493e12c5d1SDavid du Colombier break; 6503e12c5d1SDavid du Colombier 6513e12c5d1SDavid du Colombier case 10: /* mov $loreg, reg */ 6523e12c5d1SDavid du Colombier r = p->from.reg; 6533e12c5d1SDavid du Colombier if(r == NREG) 6543e12c5d1SDavid du Colombier r = o->param; 6553e12c5d1SDavid du Colombier v = regoff(&p->from); 6563e12c5d1SDavid du Colombier o1 = 0x1000000 | (REGTMP<<25) | ((v>>10) & 0x3fffff); /* sethi */ 6573e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(AADD), r, REGTMP, REGTMP); 6583e12c5d1SDavid du Colombier o3 = OP_IRR(opcode(AADD), (v&0x3ff), REGTMP, p->to.reg); 6593e12c5d1SDavid du Colombier break; 6603e12c5d1SDavid du Colombier 6613e12c5d1SDavid du Colombier case 11: /* mov loreg, r */ 6623e12c5d1SDavid du Colombier r = p->from.reg; 6633e12c5d1SDavid du Colombier if(r == NREG) 6643e12c5d1SDavid du Colombier r = o->param; 6653e12c5d1SDavid du Colombier v = regoff(&p->from); 6663e12c5d1SDavid du Colombier o1 = 0x1000000 | (REGTMP<<25) | ((v>>10) & 0x3fffff); /* sethi */ 6673e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(AADD), r, REGTMP, REGTMP); 6683e12c5d1SDavid du Colombier o3 = OP_IRR(opcode(p->as), (v&0x3ff), REGTMP, p->to.reg); 6693e12c5d1SDavid du Colombier break; 6703e12c5d1SDavid du Colombier 6713e12c5d1SDavid du Colombier case 12: /* mov r, loreg */ 6723e12c5d1SDavid du Colombier r = p->to.reg; 6733e12c5d1SDavid du Colombier if(r == NREG) 6743e12c5d1SDavid du Colombier r = o->param; 6753e12c5d1SDavid du Colombier v = regoff(&p->to); 6763e12c5d1SDavid du Colombier o1 = 0x1000000 | (REGTMP<<25) | ((v>>10) & 0x3fffff); /* sethi */ 6773e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(AADD), r, REGTMP, REGTMP); 6783e12c5d1SDavid du Colombier o3 = OP_IRR(opcode(p->as+AEND), (v&0x3ff), REGTMP, p->from.reg); 6793e12c5d1SDavid du Colombier break; 6803e12c5d1SDavid du Colombier 6813e12c5d1SDavid du Colombier case 13: /* mov $ucon, r */ 6823e12c5d1SDavid du Colombier v = regoff(&p->from); 6833e12c5d1SDavid du Colombier o1 = 0x1000000 | (p->to.reg<<25) | ((v>>10) & 0x3fffff); /* sethi */ 6843e12c5d1SDavid du Colombier break; 6853e12c5d1SDavid du Colombier 6863e12c5d1SDavid du Colombier case 20: /* op $scon,r */ 6873e12c5d1SDavid du Colombier v = regoff(&p->from); 6883e12c5d1SDavid du Colombier r = p->reg; 6893e12c5d1SDavid du Colombier if(r == NREG) 6903e12c5d1SDavid du Colombier r = p->to.reg; 6913e12c5d1SDavid du Colombier o1 = OP_IRR(opcode(p->as), v, r, p->to.reg); 6923e12c5d1SDavid du Colombier break; 6933e12c5d1SDavid du Colombier 6943e12c5d1SDavid du Colombier case 21: /* op r1,r2 */ 6953e12c5d1SDavid du Colombier r = p->reg; 6963e12c5d1SDavid du Colombier if(r == NREG) 6973e12c5d1SDavid du Colombier r = p->to.reg; 6983e12c5d1SDavid du Colombier o1 = OP_RRR(opcode(p->as), p->from.reg, r, p->to.reg); 6993e12c5d1SDavid du Colombier break; 7003e12c5d1SDavid du Colombier 7013e12c5d1SDavid du Colombier case 22: /* op $lcon,r */ 7023e12c5d1SDavid du Colombier v = regoff(&p->from); 7033e12c5d1SDavid du Colombier r = p->reg; 7043e12c5d1SDavid du Colombier if(r == NREG) 7053e12c5d1SDavid du Colombier r = p->to.reg; 7063e12c5d1SDavid du Colombier o1 = 0x1000000 | (REGTMP<<25) | ((v>>10) & 0x3fffff); /* sethi */ 7073e12c5d1SDavid du Colombier o2 = OP_IRR(opcode(AADD), (v&0x3ff), REGTMP, REGTMP); 7083e12c5d1SDavid du Colombier o3 = OP_RRR(opcode(p->as), REGTMP, r, p->to.reg); 7093e12c5d1SDavid du Colombier break; 7103e12c5d1SDavid du Colombier 7113e12c5d1SDavid du Colombier case 23: /* cmp r,r */ 7123e12c5d1SDavid du Colombier o1 = OP_RRR(opcode(ASUBCC), p->to.reg, p->from.reg, REGZERO); 7133e12c5d1SDavid du Colombier break; 7143e12c5d1SDavid du Colombier 7153e12c5d1SDavid du Colombier case 24: /* cmp r,$c */ 7163e12c5d1SDavid du Colombier v = regoff(&p->to); 7173e12c5d1SDavid du Colombier o1 = OP_IRR(opcode(ASUBCC), v, p->from.reg, REGZERO); 7183e12c5d1SDavid du Colombier break; 7193e12c5d1SDavid du Colombier 7203e12c5d1SDavid du Colombier case 25: /* cmp $c,r BOTCH, fix compiler */ 7213e12c5d1SDavid du Colombier v = regoff(&p->from); 7223e12c5d1SDavid du Colombier o1 = OP_IRR(opcode(AADD), v, NREG, REGTMP); 7233e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(ASUBCC), p->to.reg, REGTMP, REGZERO); 7243e12c5d1SDavid du Colombier break; 7253e12c5d1SDavid du Colombier 7263e12c5d1SDavid du Colombier case 26: /* op $ucon,r */ 7273e12c5d1SDavid du Colombier v = regoff(&p->from); 7283e12c5d1SDavid du Colombier r = p->reg; 7293e12c5d1SDavid du Colombier if(r == NREG) 7303e12c5d1SDavid du Colombier r = p->to.reg; 7313e12c5d1SDavid du Colombier o1 = 0x1000000 | (REGTMP<<25) | ((v>>10) & 0x3fffff); /* sethi */ 7323e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(p->as), REGTMP, r, p->to.reg); 7333e12c5d1SDavid du Colombier break; 7343e12c5d1SDavid du Colombier 7353e12c5d1SDavid du Colombier case 30: /* jmp/jmpl soreg */ 7363e12c5d1SDavid du Colombier if(aflag) 7373e12c5d1SDavid du Colombier return 0; 7383e12c5d1SDavid du Colombier v = regoff(&p->to); 7393e12c5d1SDavid du Colombier r = p->reg; 7403e12c5d1SDavid du Colombier if(r == NREG && p->as == AJMPL) 7413e12c5d1SDavid du Colombier r = 15; 7423e12c5d1SDavid du Colombier o1 = OP_IRR(opcode(AJMPL), v, p->to.reg, r); 7433e12c5d1SDavid du Colombier break; 7443e12c5d1SDavid du Colombier 7453e12c5d1SDavid du Colombier case 31: /* ba jmp */ 7463e12c5d1SDavid du Colombier if(aflag) 7473e12c5d1SDavid du Colombier return 0; 7483e12c5d1SDavid du Colombier r = p->as; 7493e12c5d1SDavid du Colombier if(r == AJMP) 7503e12c5d1SDavid du Colombier r = ABA; 7513e12c5d1SDavid du Colombier v = 0; 7523e12c5d1SDavid du Colombier if(p->cond) 7533e12c5d1SDavid du Colombier v = p->cond->pc - p->pc; 7543e12c5d1SDavid du Colombier o1 = OP_BRA(opcode(r), v/4); 755219b2ee8SDavid du Colombier if(r == ABA && p->link && p->cond && isnop(p->link)) { 7563e12c5d1SDavid du Colombier o2 = asmout(p->cond, oplook(p->cond), 1); 7573e12c5d1SDavid du Colombier if(o2) { 7583e12c5d1SDavid du Colombier o1 += 1; 7593e12c5d1SDavid du Colombier if(debug['a']) 7603e12c5d1SDavid du Colombier Bprint(&bso, " %.8lux: %.8lux %.8lux%P\n", p->pc, o1, o2, p); 7613e12c5d1SDavid du Colombier LPUT(o1); 7623e12c5d1SDavid du Colombier LPUT(o2); 7633e12c5d1SDavid du Colombier return 1; 7643e12c5d1SDavid du Colombier } 7653e12c5d1SDavid du Colombier /* cant set annul here because pc has already been counted */ 7663e12c5d1SDavid du Colombier } 7673e12c5d1SDavid du Colombier break; 7683e12c5d1SDavid du Colombier 7693e12c5d1SDavid du Colombier case 32: /* jmpl lbra */ 7703e12c5d1SDavid du Colombier if(aflag) 7713e12c5d1SDavid du Colombier return 0; 7723e12c5d1SDavid du Colombier v = 0; 7733e12c5d1SDavid du Colombier if(p->cond) 7743e12c5d1SDavid du Colombier v = p->cond->pc - p->pc; 7753e12c5d1SDavid du Colombier r = p->reg; 7763e12c5d1SDavid du Colombier if(r != NREG && r != 15) 7776b6b9ac8SDavid du Colombier diag("cant jmpl other than R15"); 7783e12c5d1SDavid du Colombier o1 = 0x40000000 | ((v/4) & 0x3fffffffL); /* call */ 779219b2ee8SDavid du Colombier if(p->link && p->cond && isnop(p->link)) { 7803e12c5d1SDavid du Colombier o2 = asmout(p->cond, oplook(p->cond), 1); 7813e12c5d1SDavid du Colombier if(o2) { 7823e12c5d1SDavid du Colombier o1 += 1; 7833e12c5d1SDavid du Colombier if(debug['a']) 7843e12c5d1SDavid du Colombier Bprint(&bso, " %.8lux: %.8lux %.8lux%P\n", p->pc, o1, o2, p); 7853e12c5d1SDavid du Colombier LPUT(o1); 7863e12c5d1SDavid du Colombier LPUT(o2); 7873e12c5d1SDavid du Colombier return 1; 7883e12c5d1SDavid du Colombier } 7893e12c5d1SDavid du Colombier } 7903e12c5d1SDavid du Colombier break; 7913e12c5d1SDavid du Colombier 7923e12c5d1SDavid du Colombier case 33: /* trap r */ 7933e12c5d1SDavid du Colombier if(aflag) 7943e12c5d1SDavid du Colombier return 0; 7953e12c5d1SDavid du Colombier o1 = opcode(p->as) | (p->from.reg<<14); 7963e12c5d1SDavid du Colombier break; 7973e12c5d1SDavid du Colombier 7983e12c5d1SDavid du Colombier case 34: /* rett r1,r2 -> jmpl (r1); rett (r2) */ 7993e12c5d1SDavid du Colombier if(aflag) 8003e12c5d1SDavid du Colombier return 0; 8013e12c5d1SDavid du Colombier o1 = OP_IRR(opcode(AJMPL), 0, p->from.reg, REGZERO); 8023e12c5d1SDavid du Colombier o2 = OP_IRR(opcode(ARETT), 0, p->to.reg, REGZERO); 8033e12c5d1SDavid du Colombier break; 8043e12c5d1SDavid du Colombier 8053e12c5d1SDavid du Colombier case 40: /* ldfsr, stfsr, stdq */ 8063e12c5d1SDavid du Colombier if(p->to.type == D_PREG) { 8073e12c5d1SDavid du Colombier r = p->from.reg; 8083e12c5d1SDavid du Colombier if(r == NREG) 8093e12c5d1SDavid du Colombier r = o->param; 8103e12c5d1SDavid du Colombier v = regoff(&p->from); 8113e12c5d1SDavid du Colombier if(p->to.reg == D_FSR) { 8123e12c5d1SDavid du Colombier o1 = OP_IRR(OP3(33), v, r, 0); 8133e12c5d1SDavid du Colombier break; 8143e12c5d1SDavid du Colombier } 8153e12c5d1SDavid du Colombier diag("unknown reg load %d", p->to.reg); 8163e12c5d1SDavid du Colombier } else { 8173e12c5d1SDavid du Colombier r = p->to.reg; 8183e12c5d1SDavid du Colombier if(r == NREG) 8193e12c5d1SDavid du Colombier r = o->param; 8203e12c5d1SDavid du Colombier v = regoff(&p->to); 8213e12c5d1SDavid du Colombier if(p->from.reg == D_FSR) { 8223e12c5d1SDavid du Colombier o1 = OP_IRR(OP3(37), v, r, 0); 8233e12c5d1SDavid du Colombier break; 8243e12c5d1SDavid du Colombier } 8253e12c5d1SDavid du Colombier if(p->as == AMOVD && p->from.reg == D_FPQ) { 8263e12c5d1SDavid du Colombier o1 = OP_IRR(OP3(38), v, r, 0); 8273e12c5d1SDavid du Colombier break; 8283e12c5d1SDavid du Colombier } 8293e12c5d1SDavid du Colombier diag("unknown reg store %d", p->from.reg); 8303e12c5d1SDavid du Colombier } 8313e12c5d1SDavid du Colombier break; 8323e12c5d1SDavid du Colombier 8333e12c5d1SDavid du Colombier case 41: /* ldf,ldd */ 8343e12c5d1SDavid du Colombier r = p->from.reg; 8353e12c5d1SDavid du Colombier if(r == NREG) 8363e12c5d1SDavid du Colombier r = o->param; 8373e12c5d1SDavid du Colombier v = regoff(&p->from); 8383e12c5d1SDavid du Colombier if(p->as == AFMOVF || p->as == AMOVW) { 8393e12c5d1SDavid du Colombier o1 = OP_IRR(OP3(32), v, r, p->to.reg); 8403e12c5d1SDavid du Colombier break; 8413e12c5d1SDavid du Colombier } 8423e12c5d1SDavid du Colombier if(p->as == AMOVD || p->as == AFMOVD) { 8433e12c5d1SDavid du Colombier o1 = OP_IRR(OP3(35), v, r, p->to.reg); 8443e12c5d1SDavid du Colombier break; 8453e12c5d1SDavid du Colombier } 8463e12c5d1SDavid du Colombier diag("only MOVD and MOVW to FREG"); 8473e12c5d1SDavid du Colombier break; 8483e12c5d1SDavid du Colombier 8493e12c5d1SDavid du Colombier case 42: /* ldd -> ldf,ldf */ 8503e12c5d1SDavid du Colombier /* note should be ldd with proper allignment */ 8513e12c5d1SDavid du Colombier r = p->from.reg; 8523e12c5d1SDavid du Colombier if(r == NREG) 8533e12c5d1SDavid du Colombier r = o->param; 8543e12c5d1SDavid du Colombier v = regoff(&p->from); 8553e12c5d1SDavid du Colombier o1 = OP_IRR(OP3(32), v, r, p->to.reg); 8563e12c5d1SDavid du Colombier o2 = OP_IRR(OP3(32), v+4, r, p->to.reg+1); 8573e12c5d1SDavid du Colombier break; 8583e12c5d1SDavid du Colombier 8593e12c5d1SDavid du Colombier case 43: /* stf */ 8603e12c5d1SDavid du Colombier r = p->to.reg; 8613e12c5d1SDavid du Colombier if(r == NREG) 8623e12c5d1SDavid du Colombier r = o->param; 8633e12c5d1SDavid du Colombier v = regoff(&p->to); 8643e12c5d1SDavid du Colombier if(p->as == AFMOVF || p->as == AMOVW) { 8653e12c5d1SDavid du Colombier o1 = OP_IRR(OP3(36), v, r, p->from.reg); 8663e12c5d1SDavid du Colombier break; 8673e12c5d1SDavid du Colombier } 8683e12c5d1SDavid du Colombier if(p->as == AMOVD || p->as == AFMOVD) { 8693e12c5d1SDavid du Colombier o1 = OP_IRR(OP3(39), v, r, p->from.reg); 8703e12c5d1SDavid du Colombier break; 8713e12c5d1SDavid du Colombier } 8723e12c5d1SDavid du Colombier diag("only MOVD and MOVW from FREG"); 8733e12c5d1SDavid du Colombier break; 8743e12c5d1SDavid du Colombier 8753e12c5d1SDavid du Colombier case 44: /* std -> stf,stf */ 8763e12c5d1SDavid du Colombier /* note should be std with proper allignment */ 8773e12c5d1SDavid du Colombier r = p->to.reg; 8783e12c5d1SDavid du Colombier if(r == NREG) 8793e12c5d1SDavid du Colombier r = o->param; 8803e12c5d1SDavid du Colombier v = regoff(&p->to); 8813e12c5d1SDavid du Colombier o1 = OP_IRR(OP3(36), v, r, p->from.reg); 8823e12c5d1SDavid du Colombier o2 = OP_IRR(OP3(36), v+4, r, p->from.reg+1); 8833e12c5d1SDavid du Colombier break; 8843e12c5d1SDavid du Colombier 8853e12c5d1SDavid du Colombier case 45: /* ldf lorg */ 8863e12c5d1SDavid du Colombier r = p->from.reg; 8873e12c5d1SDavid du Colombier if(r == NREG) 8883e12c5d1SDavid du Colombier r = o->param; 8893e12c5d1SDavid du Colombier v = regoff(&p->from); 8903e12c5d1SDavid du Colombier o1 = 0x1000000 | (REGTMP<<25) | ((v>>10) & 0x3fffff); /* sethi */ 8913e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(AADD), r, REGTMP, REGTMP); 8923e12c5d1SDavid du Colombier o3 = OP_IRR(OP3(32), v&0x3ff, REGTMP, p->to.reg); 8933e12c5d1SDavid du Colombier break; 8943e12c5d1SDavid du Colombier 8953e12c5d1SDavid du Colombier case 46: /* ldd lorg -> ldf,ldf */ 8963e12c5d1SDavid du Colombier /* note should be ldd with proper allignment */ 8973e12c5d1SDavid du Colombier r = p->from.reg; 8983e12c5d1SDavid du Colombier if(r == NREG) 8993e12c5d1SDavid du Colombier r = o->param; 9003e12c5d1SDavid du Colombier v = regoff(&p->from); 9013e12c5d1SDavid du Colombier o1 = 0x1000000 | (REGTMP<<25) | ((v>>10) & 0x3fffff); /* sethi */ 9023e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(AADD), r, REGTMP, REGTMP); 9033e12c5d1SDavid du Colombier o3 = OP_IRR(OP3(32), (v&0x3ff), REGTMP, p->to.reg); 9043e12c5d1SDavid du Colombier o4 = OP_IRR(OP3(32), (v&0x3ff)+4, REGTMP, p->to.reg+1); 9053e12c5d1SDavid du Colombier break; 9063e12c5d1SDavid du Colombier 9073e12c5d1SDavid du Colombier case 47: /* stf lorg */ 9083e12c5d1SDavid du Colombier r = p->to.reg; 9093e12c5d1SDavid du Colombier if(r == NREG) 9103e12c5d1SDavid du Colombier r = o->param; 9113e12c5d1SDavid du Colombier v = regoff(&p->to); 9123e12c5d1SDavid du Colombier o1 = 0x1000000 | (REGTMP<<25) | ((v>>10) & 0x3fffff); /* sethi */ 9133e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(AADD), r, REGTMP, REGTMP); 9143e12c5d1SDavid du Colombier o3 = OP_IRR(OP3(36), v&0x3ff, REGTMP, p->from.reg); 9153e12c5d1SDavid du Colombier break; 9163e12c5d1SDavid du Colombier 9173e12c5d1SDavid du Colombier case 48: /* std lorg -> stf,stf */ 9183e12c5d1SDavid du Colombier /* note should be std with proper allignment */ 9193e12c5d1SDavid du Colombier r = p->to.reg; 9203e12c5d1SDavid du Colombier if(r == NREG) 9213e12c5d1SDavid du Colombier r = o->param; 9223e12c5d1SDavid du Colombier v = regoff(&p->to); 9233e12c5d1SDavid du Colombier o1 = 0x1000000 | (REGTMP<<25) | ((v>>10) & 0x3fffff); /* sethi */ 9243e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(AADD), r, REGTMP, REGTMP); 9253e12c5d1SDavid du Colombier o3 = OP_IRR(OP3(36), (v&0x3ff), REGTMP, p->from.reg); 9263e12c5d1SDavid du Colombier o4 = OP_IRR(OP3(36), (v&0x3ff)+4, REGTMP, p->from.reg+1); 9273e12c5d1SDavid du Colombier break; 9283e12c5d1SDavid du Colombier 9293e12c5d1SDavid du Colombier case 49: /* fmovd -> fmovf,fmovf */ 9303e12c5d1SDavid du Colombier o1 = OP_RRR(opcode(AFMOVF), p->from.reg, 0, p->to.reg); 9313e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(AFMOVF), p->from.reg+1, 0, p->to.reg+1); 9323e12c5d1SDavid du Colombier break; 9333e12c5d1SDavid du Colombier 9343e12c5d1SDavid du Colombier case 50: /* fcmp */ 9353e12c5d1SDavid du Colombier o1 = OP_RRR(opcode(p->as), p->to.reg, p->from.reg, 0); 9363e12c5d1SDavid du Colombier break; 9373e12c5d1SDavid du Colombier 9383e12c5d1SDavid du Colombier case 51: /* word */ 9393e12c5d1SDavid du Colombier if(aflag) 9403e12c5d1SDavid du Colombier return 0; 9413e12c5d1SDavid du Colombier o1 = regoff(&p->from); 9423e12c5d1SDavid du Colombier break; 9433e12c5d1SDavid du Colombier 9443e12c5d1SDavid du Colombier case 52: /* div */ 9453e12c5d1SDavid du Colombier r = p->reg; 9463e12c5d1SDavid du Colombier if(r == NREG) 9473e12c5d1SDavid du Colombier r = p->to.reg; 9483e12c5d1SDavid du Colombier o1 = OP_IRR(opcode(ASRA), 31, r, REGTMP); 9493e12c5d1SDavid du Colombier o2 = OP_IRR(OP2(48), 0, REGTMP, 0); 9503e12c5d1SDavid du Colombier o3 = OP_RRR(opcode(ADIV), p->from.reg, r, p->to.reg); 9513e12c5d1SDavid du Colombier break; 9523e12c5d1SDavid du Colombier 9533e12c5d1SDavid du Colombier case 53: /* divl */ 9543e12c5d1SDavid du Colombier r = p->reg; 9553e12c5d1SDavid du Colombier if(r == NREG) 9563e12c5d1SDavid du Colombier r = p->to.reg; 9573e12c5d1SDavid du Colombier o1 = OP_IRR(OP2(48), 0, REGZERO, 0); 9583e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(ADIVL), p->from.reg, r, p->to.reg); 9593e12c5d1SDavid du Colombier break; 9603e12c5d1SDavid du Colombier 9613e12c5d1SDavid du Colombier case 54: /* mod */ 9623e12c5d1SDavid du Colombier r = p->reg; 9633e12c5d1SDavid du Colombier if(r == NREG) 9643e12c5d1SDavid du Colombier r = p->to.reg; 9653e12c5d1SDavid du Colombier o1 = OP_IRR(opcode(ASRA), 31, r, REGTMP); 9663e12c5d1SDavid du Colombier o2 = OP_IRR(OP2(48), 0, REGTMP, 0); 9673e12c5d1SDavid du Colombier o3 = OP_RRR(opcode(ADIV), p->from.reg, r, REGTMP); 9683e12c5d1SDavid du Colombier o4 = OP_RRR(opcode(AMUL), p->from.reg, REGTMP, REGTMP); 9693e12c5d1SDavid du Colombier o5 = OP_RRR(opcode(ASUB), REGTMP, r, p->to.reg); 9703e12c5d1SDavid du Colombier break; 9713e12c5d1SDavid du Colombier 9723e12c5d1SDavid du Colombier case 55: /* modl */ 9733e12c5d1SDavid du Colombier r = p->reg; 9743e12c5d1SDavid du Colombier if(r == NREG) 9753e12c5d1SDavid du Colombier r = p->to.reg; 9763e12c5d1SDavid du Colombier o1 = OP_IRR(OP2(48), 0, REGZERO, 0); 9773e12c5d1SDavid du Colombier o2 = OP_RRR(opcode(ADIVL), p->from.reg, r, REGTMP); 9783e12c5d1SDavid du Colombier o3 = OP_RRR(opcode(AMUL), p->from.reg, REGTMP, REGTMP); 9793e12c5d1SDavid du Colombier o4 = OP_RRR(opcode(ASUB), REGTMP, r, p->to.reg); 9803e12c5d1SDavid du Colombier break; 9813e12c5d1SDavid du Colombier 9823e12c5d1SDavid du Colombier case 56: /* b(cc) -- annullable */ 9833e12c5d1SDavid du Colombier if(aflag) 9843e12c5d1SDavid du Colombier return 0; 9853e12c5d1SDavid du Colombier r = p->as; 9863e12c5d1SDavid du Colombier v = 0; 9873e12c5d1SDavid du Colombier if(p->cond) 9883e12c5d1SDavid du Colombier v = p->cond->pc - p->pc; 9893e12c5d1SDavid du Colombier o1 = OP_BRA(opcode(r), v/4); 990219b2ee8SDavid du Colombier if(p->link && p->cond && isnop(p->link)) 9913e12c5d1SDavid du Colombier if(!debug['A']) { 9923e12c5d1SDavid du Colombier o2 = asmout(p->cond, oplook(p->cond), 2); 9933e12c5d1SDavid du Colombier if(o2) { 9943e12c5d1SDavid du Colombier o1 |= 1<<29; /* annul */ 9953e12c5d1SDavid du Colombier o1 += 1; 9963e12c5d1SDavid du Colombier if(debug['a']) 9973e12c5d1SDavid du Colombier Bprint(&bso, " %.8lux: %.8lux %.8lux%P\n", p->pc, o1, o2, p); 9983e12c5d1SDavid du Colombier LPUT(o1); 9993e12c5d1SDavid du Colombier LPUT(o2); 10003e12c5d1SDavid du Colombier return 1; 10013e12c5d1SDavid du Colombier } 10023e12c5d1SDavid du Colombier } 10033e12c5d1SDavid du Colombier break; 1004*a83436dfSDavid du Colombier 1005*a83436dfSDavid du Colombier case 57: /* op r1,r2 with reserved rs1 */ 1006*a83436dfSDavid du Colombier r = 0; 1007*a83436dfSDavid du Colombier o1 = OP_RRR(opcode(p->as), p->from.reg, r, p->to.reg); 1008*a83436dfSDavid du Colombier break; 10093e12c5d1SDavid du Colombier } 10103e12c5d1SDavid du Colombier if(aflag) 10113e12c5d1SDavid du Colombier return o1; 10123e12c5d1SDavid du Colombier v = p->pc; 10133e12c5d1SDavid du Colombier switch(o->size) { 10143e12c5d1SDavid du Colombier default: 10153e12c5d1SDavid du Colombier if(debug['a']) 10163e12c5d1SDavid du Colombier Bprint(&bso, " %.8lux:\t\t%P\n", v, p); 10173e12c5d1SDavid du Colombier break; 10183e12c5d1SDavid du Colombier case 4: 10193e12c5d1SDavid du Colombier if(debug['a']) 10203e12c5d1SDavid du Colombier Bprint(&bso, " %.8lux: %.8lux\t%P\n", v, o1, p); 10213e12c5d1SDavid du Colombier LPUT(o1); 10223e12c5d1SDavid du Colombier break; 10233e12c5d1SDavid du Colombier case 8: 10243e12c5d1SDavid du Colombier if(debug['a']) 10253e12c5d1SDavid du Colombier Bprint(&bso, " %.8lux: %.8lux %.8lux%P\n", v, o1, o2, p); 10263e12c5d1SDavid du Colombier LPUT(o1); 10273e12c5d1SDavid du Colombier LPUT(o2); 10283e12c5d1SDavid du Colombier break; 10293e12c5d1SDavid du Colombier case 12: 10303e12c5d1SDavid du Colombier if(debug['a']) 10313e12c5d1SDavid du Colombier Bprint(&bso, " %.8lux: %.8lux %.8lux %.8lux%P\n", v, o1, o2, o3, p); 10323e12c5d1SDavid du Colombier LPUT(o1); 10333e12c5d1SDavid du Colombier LPUT(o2); 10343e12c5d1SDavid du Colombier LPUT(o3); 10353e12c5d1SDavid du Colombier break; 10363e12c5d1SDavid du Colombier case 16: 10373e12c5d1SDavid du Colombier if(debug['a']) 10383e12c5d1SDavid du Colombier Bprint(&bso, " %.8lux: %.8lux %.8lux %.8lux %.8lux%P\n", 10393e12c5d1SDavid du Colombier v, o1, o2, o3, o4, p); 10403e12c5d1SDavid du Colombier LPUT(o1); 10413e12c5d1SDavid du Colombier LPUT(o2); 10423e12c5d1SDavid du Colombier LPUT(o3); 10433e12c5d1SDavid du Colombier LPUT(o4); 10443e12c5d1SDavid du Colombier break; 10453e12c5d1SDavid du Colombier case 20: 10463e12c5d1SDavid du Colombier if(debug['a']) 10473e12c5d1SDavid du Colombier Bprint(&bso, " %.8lux: %.8lux %.8lux %.8lux %.8lux %.8lux%P\n", 10483e12c5d1SDavid du Colombier v, o1, o2, o3, o4, o5, p); 10493e12c5d1SDavid du Colombier LPUT(o1); 10503e12c5d1SDavid du Colombier LPUT(o2); 10513e12c5d1SDavid du Colombier LPUT(o3); 10523e12c5d1SDavid du Colombier LPUT(o4); 10533e12c5d1SDavid du Colombier LPUT(o5); 10543e12c5d1SDavid du Colombier break; 10553e12c5d1SDavid du Colombier } 10563e12c5d1SDavid du Colombier return 0; 10573e12c5d1SDavid du Colombier } 10583e12c5d1SDavid du Colombier 1059219b2ee8SDavid du Colombier int 1060219b2ee8SDavid du Colombier isnop(Prog *p) 1061219b2ee8SDavid du Colombier { 1062219b2ee8SDavid du Colombier if(p->as != AORN) 1063219b2ee8SDavid du Colombier return 0; 1064219b2ee8SDavid du Colombier if(p->reg != REGZERO && p->reg != NREG) 1065219b2ee8SDavid du Colombier return 0; 1066219b2ee8SDavid du Colombier if(p->from.type != D_REG || p->from.reg != REGZERO) 1067219b2ee8SDavid du Colombier return 0; 1068219b2ee8SDavid du Colombier if(p->to.type != D_REG || p->to.reg != REGZERO) 1069219b2ee8SDavid du Colombier return 0; 1070219b2ee8SDavid du Colombier return 1; 1071219b2ee8SDavid du Colombier } 1072219b2ee8SDavid du Colombier 10733e12c5d1SDavid du Colombier long 10743e12c5d1SDavid du Colombier opcode(int a) 10753e12c5d1SDavid du Colombier { 10763e12c5d1SDavid du Colombier switch(a) { 10773e12c5d1SDavid du Colombier case AADD: return OP2(0); 10783e12c5d1SDavid du Colombier case AADDCC: return OP2(16); 10793e12c5d1SDavid du Colombier case AADDX: return OP2(8); 10803e12c5d1SDavid du Colombier case AADDXCC: return OP2(24); 10813e12c5d1SDavid du Colombier 10823e12c5d1SDavid du Colombier case AMUL: return OP2(10); 10833e12c5d1SDavid du Colombier case ADIV: return OP2(15); 10843e12c5d1SDavid du Colombier case ADIVL: return OP2(14); 10853e12c5d1SDavid du Colombier 10863e12c5d1SDavid du Colombier case ATADDCC: return OP2(32); 10873e12c5d1SDavid du Colombier case ATADDCCTV: return OP2(34); 10883e12c5d1SDavid du Colombier 10893e12c5d1SDavid du Colombier case ASUB: return OP2(4); 10903e12c5d1SDavid du Colombier case ASUBCC: return OP2(20); 10913e12c5d1SDavid du Colombier case ASUBX: return OP2(12); 10923e12c5d1SDavid du Colombier case ASUBXCC: return OP2(28); 10933e12c5d1SDavid du Colombier 10943e12c5d1SDavid du Colombier case ATSUBCC: return OP2(33); 10953e12c5d1SDavid du Colombier case ATSUBCCTV: return OP2(35); 10963e12c5d1SDavid du Colombier 10973e12c5d1SDavid du Colombier case AMULSCC: return OP2(36); 10983e12c5d1SDavid du Colombier case ASAVE: return OP2(60); 10993e12c5d1SDavid du Colombier case ARESTORE: return OP2(61); 11003e12c5d1SDavid du Colombier 11013e12c5d1SDavid du Colombier case AAND: return OP2(1); 11023e12c5d1SDavid du Colombier case AANDCC: return OP2(17); 11033e12c5d1SDavid du Colombier case AANDN: return OP2(5); 11043e12c5d1SDavid du Colombier case AANDNCC: return OP2(21); 11053e12c5d1SDavid du Colombier 11063e12c5d1SDavid du Colombier case AOR: return OP2(2); 11073e12c5d1SDavid du Colombier case AORCC: return OP2(18); 11083e12c5d1SDavid du Colombier case AORN: return OP2(6); 11093e12c5d1SDavid du Colombier case AORNCC: return OP2(22); 11103e12c5d1SDavid du Colombier 11113e12c5d1SDavid du Colombier case AXOR: return OP2(3); 11123e12c5d1SDavid du Colombier case AXORCC: return OP2(19); 11133e12c5d1SDavid du Colombier case AXNOR: return OP2(7); 11143e12c5d1SDavid du Colombier case AXNORCC: return OP2(23); 11153e12c5d1SDavid du Colombier 11163e12c5d1SDavid du Colombier case ASLL: return OP2(37); 11173e12c5d1SDavid du Colombier case ASRL: return OP2(38); 11183e12c5d1SDavid du Colombier case ASRA: return OP2(39); 11193e12c5d1SDavid du Colombier 11203e12c5d1SDavid du Colombier case AJMPL: 11213e12c5d1SDavid du Colombier case AJMP: return OP2(56); 11223e12c5d1SDavid du Colombier case ARETT: return OP2(57); 11233e12c5d1SDavid du Colombier 11243e12c5d1SDavid du Colombier case AMOVBU: return OP3(1); /* ldub */ 11253e12c5d1SDavid du Colombier case AMOVB: return OP3(9); /* ldsb */ 11263e12c5d1SDavid du Colombier case AMOVHU: return OP3(2); /* lduh */ 11273e12c5d1SDavid du Colombier case AMOVH: return OP3(10); /* ldsh */ 11283e12c5d1SDavid du Colombier case AMOVW: return OP3(0); /* ld */ 11293e12c5d1SDavid du Colombier case AMOVD: return OP3(3); /* ldd */ 11303e12c5d1SDavid du Colombier 11313e12c5d1SDavid du Colombier case AMOVBU+AEND: 11323e12c5d1SDavid du Colombier case AMOVB+AEND:return OP3(5); /* stb */ 11333e12c5d1SDavid du Colombier 11343e12c5d1SDavid du Colombier case AMOVHU+AEND: 11353e12c5d1SDavid du Colombier case AMOVH+AEND:return OP3(6); /* sth */ 11363e12c5d1SDavid du Colombier 11373e12c5d1SDavid du Colombier case AMOVW+AEND:return OP3(4); /* st */ 11383e12c5d1SDavid du Colombier 11393e12c5d1SDavid du Colombier case AMOVD+AEND:return OP3(7); /* std */ 11403e12c5d1SDavid du Colombier 11413e12c5d1SDavid du Colombier case ASWAP: /* swap is symmetric */ 11423e12c5d1SDavid du Colombier case ASWAP+AEND:return OP3(15); 11433e12c5d1SDavid du Colombier 11443e12c5d1SDavid du Colombier case ATAS: return OP3(13); /* tas is really ldstub */ 11453e12c5d1SDavid du Colombier 11463e12c5d1SDavid du Colombier case ABN: return OPB(0); 11473e12c5d1SDavid du Colombier case ABE: return OPB(1); 11483e12c5d1SDavid du Colombier case ABLE: return OPB(2); 11493e12c5d1SDavid du Colombier case ABL: return OPB(3); 11503e12c5d1SDavid du Colombier case ABLEU: return OPB(4); 11513e12c5d1SDavid du Colombier case ABCS: return OPB(5); 11523e12c5d1SDavid du Colombier case ABNEG: return OPB(6); 11533e12c5d1SDavid du Colombier case ABVS: return OPB(7); 11543e12c5d1SDavid du Colombier case ABA: return OPB(8); 11553e12c5d1SDavid du Colombier case ABNE: return OPB(9); 11563e12c5d1SDavid du Colombier case ABG: return OPB(10); 11573e12c5d1SDavid du Colombier case ABGE: return OPB(11); 11583e12c5d1SDavid du Colombier case ABGU: return OPB(12); 11593e12c5d1SDavid du Colombier case ABCC: return OPB(13); 11603e12c5d1SDavid du Colombier case ABPOS: return OPB(14); 11613e12c5d1SDavid du Colombier case ABVC: return OPB(15); 11623e12c5d1SDavid du Colombier 11633e12c5d1SDavid du Colombier case AFBA: return OPFB(8); 11643e12c5d1SDavid du Colombier case AFBE: return OPFB(9); 11653e12c5d1SDavid du Colombier case AFBG: return OPFB(6); 11663e12c5d1SDavid du Colombier case AFBGE: return OPFB(11); 11673e12c5d1SDavid du Colombier case AFBL: return OPFB(4); 11683e12c5d1SDavid du Colombier case AFBLE: return OPFB(13); 11693e12c5d1SDavid du Colombier case AFBLG: return OPFB(2); 11703e12c5d1SDavid du Colombier case AFBN: return OPFB(0); 11713e12c5d1SDavid du Colombier case AFBNE: return OPFB(1); 11723e12c5d1SDavid du Colombier case AFBO: return OPFB(15); 11733e12c5d1SDavid du Colombier case AFBU: return OPFB(7); 11743e12c5d1SDavid du Colombier case AFBUE: return OPFB(10); 11753e12c5d1SDavid du Colombier case AFBUG: return OPFB(5); 11763e12c5d1SDavid du Colombier case AFBUGE: return OPFB(12); 11773e12c5d1SDavid du Colombier case AFBUL: return OPFB(3); 11783e12c5d1SDavid du Colombier case AFBULE: return OPFB(14); 11793e12c5d1SDavid du Colombier 11803e12c5d1SDavid du Colombier case ATN: return OPT(0); 11813e12c5d1SDavid du Colombier case ATE: return OPT(1); 11823e12c5d1SDavid du Colombier case ATLE: return OPT(2); 11833e12c5d1SDavid du Colombier case ATL: return OPT(3); 11843e12c5d1SDavid du Colombier case ATLEU: return OPT(4); 11853e12c5d1SDavid du Colombier case ATCS: return OPT(5); 11863e12c5d1SDavid du Colombier case ATNEG: return OPT(6); 11873e12c5d1SDavid du Colombier case ATVS: return OPT(7); 11883e12c5d1SDavid du Colombier case ATA: return OPT(8); 11893e12c5d1SDavid du Colombier case ATNE: return OPT(9); 11903e12c5d1SDavid du Colombier case ATG: return OPT(10); 11913e12c5d1SDavid du Colombier case ATGE: return OPT(11); 11923e12c5d1SDavid du Colombier case ATGU: return OPT(12); 11933e12c5d1SDavid du Colombier case ATCC: return OPT(13); 11943e12c5d1SDavid du Colombier case ATPOS: return OPT(14); 11953e12c5d1SDavid du Colombier case ATVC: return OPT(15); 11963e12c5d1SDavid du Colombier 11973e12c5d1SDavid du Colombier case AFADDF: return OPF1(65); 11983e12c5d1SDavid du Colombier case AFADDD: return OPF1(66); 11993e12c5d1SDavid du Colombier case AFADDX: return OPF1(67); 12003e12c5d1SDavid du Colombier case AFSUBF: return OPF1(69); 12013e12c5d1SDavid du Colombier case AFSUBD: return OPF1(70); 12023e12c5d1SDavid du Colombier case AFSUBX: return OPF1(71); 12033e12c5d1SDavid du Colombier case AFMULF: return OPF1(73); 12043e12c5d1SDavid du Colombier case AFMULD: return OPF1(74); 12053e12c5d1SDavid du Colombier case AFMULX: return OPF1(75); 12063e12c5d1SDavid du Colombier case AFDIVF: return OPF1(77); 12073e12c5d1SDavid du Colombier case AFDIVD: return OPF1(78); 12083e12c5d1SDavid du Colombier case AFDIVX: return OPF1(79); 12093e12c5d1SDavid du Colombier 12103e12c5d1SDavid du Colombier case AFMOVF: return OPF1(1); 12113e12c5d1SDavid du Colombier case AFNEGF: return OPF1(5); 12123e12c5d1SDavid du Colombier case AFABSF: return OPF1(9); 12133e12c5d1SDavid du Colombier 1214219b2ee8SDavid du Colombier case AFSQRTF: return OPF1(41); 1215219b2ee8SDavid du Colombier case AFSQRTD: return OPF1(42); 1216219b2ee8SDavid du Colombier case AFSQRTX: return OPF1(43); 1217219b2ee8SDavid du Colombier 12183e12c5d1SDavid du Colombier case AFMOVWF: return OPF1(196); 12193e12c5d1SDavid du Colombier case AFMOVWD: return OPF1(200); 12203e12c5d1SDavid du Colombier case AFMOVWX: return OPF1(204); 12213e12c5d1SDavid du Colombier case AFMOVFW: return OPF1(209); 12223e12c5d1SDavid du Colombier case AFMOVDW: return OPF1(210); 12233e12c5d1SDavid du Colombier case AFMOVXW: return OPF1(211); 12243e12c5d1SDavid du Colombier case AFMOVFD: return OPF1(201); 12253e12c5d1SDavid du Colombier case AFMOVFX: return OPF1(205); 12263e12c5d1SDavid du Colombier case AFMOVDF: return OPF1(198); 12273e12c5d1SDavid du Colombier case AFMOVDX: return OPF1(206); 12283e12c5d1SDavid du Colombier case AFMOVXF: return OPF1(199); 12293e12c5d1SDavid du Colombier case AFMOVXD: return OPF1(203); 12303e12c5d1SDavid du Colombier 12313e12c5d1SDavid du Colombier case AFCMPF: return OPF2(81); 12323e12c5d1SDavid du Colombier case AFCMPD: return OPF2(82); 12333e12c5d1SDavid du Colombier case AFCMPX: return OPF2(83); 12343e12c5d1SDavid du Colombier case AFCMPEF: return OPF2(85); 12353e12c5d1SDavid du Colombier case AFCMPED: return OPF2(86); 12363e12c5d1SDavid du Colombier case AFCMPEX: return OPF2(87); 12373e12c5d1SDavid du Colombier 12383e12c5d1SDavid du Colombier case AUNIMP: return 0; 12393e12c5d1SDavid du Colombier } 12406b6b9ac8SDavid du Colombier diag("bad opcode %A", a); 12413e12c5d1SDavid du Colombier return 0; 12423e12c5d1SDavid du Colombier } 1243