13e12c5d1SDavid du Colombier #include "../cc/cc.h" 23e12c5d1SDavid du Colombier #include "../vc/v.out.h" 33e12c5d1SDavid du Colombier 43e12c5d1SDavid du Colombier #define TINT TLONG 53e12c5d1SDavid du Colombier #define TFIELD TLONG 63e12c5d1SDavid du Colombier #define SZ_CHAR 1 73e12c5d1SDavid du Colombier #define SZ_SHORT 2 83e12c5d1SDavid du Colombier #define SZ_LONG 4 93e12c5d1SDavid du Colombier #define SZ_VLONG 8 103e12c5d1SDavid du Colombier #define SZ_IND 4 113e12c5d1SDavid du Colombier #define SZ_FLOAT 4 123e12c5d1SDavid du Colombier #define SZ_DOUBLE 8 133e12c5d1SDavid du Colombier #define SU_ALLIGN SZ_LONG 143e12c5d1SDavid du Colombier #define SU_PAD SZ_LONG 153e12c5d1SDavid du Colombier #define FNX 100 163e12c5d1SDavid du Colombier #define INLINE (5*SZ_LONG) 173e12c5d1SDavid du Colombier 183e12c5d1SDavid du Colombier typedef struct Adr Adr; 193e12c5d1SDavid du Colombier typedef struct Prog Prog; 203e12c5d1SDavid du Colombier typedef struct Case Case; 213e12c5d1SDavid du Colombier typedef struct C1 C1; 22*219b2ee8SDavid du Colombier typedef struct Multab Multab; 23*219b2ee8SDavid du Colombier typedef struct Hintab Hintab; 243e12c5d1SDavid du Colombier typedef struct Bits Bits; 253e12c5d1SDavid du Colombier typedef struct Var Var; 263e12c5d1SDavid du Colombier typedef struct Reg Reg; 273e12c5d1SDavid du Colombier typedef struct Rgn Rgn; 283e12c5d1SDavid du Colombier 293e12c5d1SDavid du Colombier 303e12c5d1SDavid du Colombier struct Adr 313e12c5d1SDavid du Colombier { 323e12c5d1SDavid du Colombier union 333e12c5d1SDavid du Colombier { 343e12c5d1SDavid du Colombier long offset; 353e12c5d1SDavid du Colombier double dval; 363e12c5d1SDavid du Colombier char sval[NSNAME]; 373e12c5d1SDavid du Colombier Ieee ieee; 383e12c5d1SDavid du Colombier }; 393e12c5d1SDavid du Colombier Sym* sym; 403e12c5d1SDavid du Colombier char type; 413e12c5d1SDavid du Colombier char reg; 423e12c5d1SDavid du Colombier char name; 433e12c5d1SDavid du Colombier char etype; 443e12c5d1SDavid du Colombier }; 453e12c5d1SDavid du Colombier #define A ((Adr*)0) 463e12c5d1SDavid du Colombier 473e12c5d1SDavid du Colombier #define INDEXED 9 483e12c5d1SDavid du Colombier struct Prog 493e12c5d1SDavid du Colombier { 503e12c5d1SDavid du Colombier Adr from; 513e12c5d1SDavid du Colombier Adr to; 523e12c5d1SDavid du Colombier Prog* link; 533e12c5d1SDavid du Colombier long lineno; 543e12c5d1SDavid du Colombier char as; 553e12c5d1SDavid du Colombier char reg; 563e12c5d1SDavid du Colombier }; 573e12c5d1SDavid du Colombier #define P ((Prog*)0) 583e12c5d1SDavid du Colombier 593e12c5d1SDavid du Colombier struct Case 603e12c5d1SDavid du Colombier { 613e12c5d1SDavid du Colombier Case* link; 623e12c5d1SDavid du Colombier long val; 633e12c5d1SDavid du Colombier long label; 643e12c5d1SDavid du Colombier char def; 653e12c5d1SDavid du Colombier }; 663e12c5d1SDavid du Colombier #define C ((Case*)0) 673e12c5d1SDavid du Colombier 683e12c5d1SDavid du Colombier struct C1 693e12c5d1SDavid du Colombier { 703e12c5d1SDavid du Colombier long val; 713e12c5d1SDavid du Colombier long label; 723e12c5d1SDavid du Colombier }; 733e12c5d1SDavid du Colombier 74*219b2ee8SDavid du Colombier struct Multab 75*219b2ee8SDavid du Colombier { 76*219b2ee8SDavid du Colombier long val; 77*219b2ee8SDavid du Colombier char code[20]; 78*219b2ee8SDavid du Colombier }; 79*219b2ee8SDavid du Colombier 80*219b2ee8SDavid du Colombier struct Hintab 81*219b2ee8SDavid du Colombier { 82*219b2ee8SDavid du Colombier ushort val; 83*219b2ee8SDavid du Colombier char hint[10]; 84*219b2ee8SDavid du Colombier }; 85*219b2ee8SDavid du Colombier 86*219b2ee8SDavid du Colombier #define BITS 6 873e12c5d1SDavid du Colombier #define NVAR (BITS*sizeof(ulong)*8) 883e12c5d1SDavid du Colombier struct Bits 893e12c5d1SDavid du Colombier { 903e12c5d1SDavid du Colombier ulong b[BITS]; 913e12c5d1SDavid du Colombier }; 923e12c5d1SDavid du Colombier 933e12c5d1SDavid du Colombier struct Var 943e12c5d1SDavid du Colombier { 953e12c5d1SDavid du Colombier long offset; 963e12c5d1SDavid du Colombier Sym* sym; 973e12c5d1SDavid du Colombier char name; 983e12c5d1SDavid du Colombier char etype; 993e12c5d1SDavid du Colombier }; 1003e12c5d1SDavid du Colombier 1013e12c5d1SDavid du Colombier struct Reg 1023e12c5d1SDavid du Colombier { 1033e12c5d1SDavid du Colombier long pc; 1043e12c5d1SDavid du Colombier 1053e12c5d1SDavid du Colombier Bits set; 1063e12c5d1SDavid du Colombier Bits use1; 1073e12c5d1SDavid du Colombier Bits use2; 1083e12c5d1SDavid du Colombier 1093e12c5d1SDavid du Colombier Bits refbehind; 1103e12c5d1SDavid du Colombier Bits refahead; 1113e12c5d1SDavid du Colombier Bits calbehind; 1123e12c5d1SDavid du Colombier Bits calahead; 1133e12c5d1SDavid du Colombier Bits regdiff; 1143e12c5d1SDavid du Colombier Bits act; 1153e12c5d1SDavid du Colombier 1163e12c5d1SDavid du Colombier long regu; 1173e12c5d1SDavid du Colombier long loop; /* could be shorter */ 1183e12c5d1SDavid du Colombier 1193e12c5d1SDavid du Colombier union { 1203e12c5d1SDavid du Colombier Reg* log5; 1213e12c5d1SDavid du Colombier int active; 1223e12c5d1SDavid du Colombier }; 1233e12c5d1SDavid du Colombier Reg* p1; 1243e12c5d1SDavid du Colombier Reg* p2; 1253e12c5d1SDavid du Colombier Reg* p2link; 1263e12c5d1SDavid du Colombier Reg* s1; 1273e12c5d1SDavid du Colombier Reg* s2; 1283e12c5d1SDavid du Colombier Reg* link; 1293e12c5d1SDavid du Colombier Prog* prog; 1303e12c5d1SDavid du Colombier }; 1313e12c5d1SDavid du Colombier #define R ((Reg*)0) 1323e12c5d1SDavid du Colombier 1333e12c5d1SDavid du Colombier #define NRGN 600 1343e12c5d1SDavid du Colombier struct Rgn 1353e12c5d1SDavid du Colombier { 1363e12c5d1SDavid du Colombier Reg* enter; 1373e12c5d1SDavid du Colombier short cost; 1383e12c5d1SDavid du Colombier short varno; 1393e12c5d1SDavid du Colombier short regno; 1403e12c5d1SDavid du Colombier }; 1413e12c5d1SDavid du Colombier 1423e12c5d1SDavid du Colombier long breakpc; 1433e12c5d1SDavid du Colombier Case* cases; 1443e12c5d1SDavid du Colombier Node constnode; 1453e12c5d1SDavid du Colombier Node fconstnode; 1463e12c5d1SDavid du Colombier long continpc; 1473e12c5d1SDavid du Colombier long curarg; 1483e12c5d1SDavid du Colombier long cursafe; 1493e12c5d1SDavid du Colombier Prog* firstp; 1503e12c5d1SDavid du Colombier Prog* lastp; 1513e12c5d1SDavid du Colombier long maxargsafe; 1523e12c5d1SDavid du Colombier int mnstring; 153*219b2ee8SDavid du Colombier Multab multab[20]; 1543e12c5d1SDavid du Colombier int retok; 155*219b2ee8SDavid du Colombier int hintabsize; 1563e12c5d1SDavid du Colombier Node* nodrat; 1573e12c5d1SDavid du Colombier Node* nodret; 1583e12c5d1SDavid du Colombier Node* nodsafe; 1593e12c5d1SDavid du Colombier long nrathole; 1603e12c5d1SDavid du Colombier long nstring; 1613e12c5d1SDavid du Colombier Prog* p; 1623e12c5d1SDavid du Colombier long pc; 1633e12c5d1SDavid du Colombier Node regnode; 1643e12c5d1SDavid du Colombier char string[NSNAME]; 1653e12c5d1SDavid du Colombier Sym* symrathole; 1663e12c5d1SDavid du Colombier Node znode; 1673e12c5d1SDavid du Colombier Prog zprog; 1683e12c5d1SDavid du Colombier char reg[NREG+NREG]; 1693e12c5d1SDavid du Colombier long exregoffset; 1703e12c5d1SDavid du Colombier long exfregoffset; 1713e12c5d1SDavid du Colombier 1723e12c5d1SDavid du Colombier #define BLOAD(r) band(bnot(r->refbehind), r->refahead) 1733e12c5d1SDavid du Colombier #define BSTORE(r) band(bnot(r->calbehind), r->calahead) 1743e12c5d1SDavid du Colombier #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z]) 1753e12c5d1SDavid du Colombier #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z]) 1763e12c5d1SDavid du Colombier 1773e12c5d1SDavid du Colombier #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32)) 1783e12c5d1SDavid du Colombier 179*219b2ee8SDavid du Colombier #define CLOAD 4 1803e12c5d1SDavid du Colombier #define CREF 5 1813e12c5d1SDavid du Colombier #define CINF 1000 1823e12c5d1SDavid du Colombier #define LOOP 3 1833e12c5d1SDavid du Colombier 1843e12c5d1SDavid du Colombier Rgn region[NRGN]; 1853e12c5d1SDavid du Colombier Rgn* rgp; 1863e12c5d1SDavid du Colombier int nregion; 1873e12c5d1SDavid du Colombier int nvar; 1883e12c5d1SDavid du Colombier 1893e12c5d1SDavid du Colombier Bits externs; 1903e12c5d1SDavid du Colombier Bits params; 1913e12c5d1SDavid du Colombier Bits consts; 1923e12c5d1SDavid du Colombier Bits addrs; 1933e12c5d1SDavid du Colombier Bits zbits; 1943e12c5d1SDavid du Colombier 1953e12c5d1SDavid du Colombier long regbits; 1963e12c5d1SDavid du Colombier long exregbits; 1973e12c5d1SDavid du Colombier 1983e12c5d1SDavid du Colombier int change; 1993e12c5d1SDavid du Colombier 2003e12c5d1SDavid du Colombier Reg* firstr; 2013e12c5d1SDavid du Colombier Reg* lastr; 2023e12c5d1SDavid du Colombier Reg zreg; 2033e12c5d1SDavid du Colombier Reg* freer; 2043e12c5d1SDavid du Colombier Var var[NVAR]; 2053e12c5d1SDavid du Colombier 2063e12c5d1SDavid du Colombier extern char* anames[]; 207*219b2ee8SDavid du Colombier extern Hintab hintab[]; 2083e12c5d1SDavid du Colombier 2093e12c5d1SDavid du Colombier /* 2103e12c5d1SDavid du Colombier * sgen.c 2113e12c5d1SDavid du Colombier */ 2123e12c5d1SDavid du Colombier void codgen(Node*, Node*); 2133e12c5d1SDavid du Colombier void gen(Node*); 2143e12c5d1SDavid du Colombier void noretval(int); 2153e12c5d1SDavid du Colombier void xcom(Node*); 2163e12c5d1SDavid du Colombier void bcomplex(Node*); 2173e12c5d1SDavid du Colombier 2183e12c5d1SDavid du Colombier /* 2193e12c5d1SDavid du Colombier * cgen.c 2203e12c5d1SDavid du Colombier */ 2213e12c5d1SDavid du Colombier void cgen(Node*, Node*); 2223e12c5d1SDavid du Colombier void reglcgen(Node*, Node*, Node*); 2233e12c5d1SDavid du Colombier void lcgen(Node*, Node*); 2243e12c5d1SDavid du Colombier void bcgen(Node*, int); 2253e12c5d1SDavid du Colombier void boolgen(Node*, int, Node*); 2263e12c5d1SDavid du Colombier void sugen(Node*, Node*, long); 2273e12c5d1SDavid du Colombier void layout(Node*, Node*, int, int, Node*); 2283e12c5d1SDavid du Colombier 2293e12c5d1SDavid du Colombier /* 2303e12c5d1SDavid du Colombier * txt.c 2313e12c5d1SDavid du Colombier */ 2323e12c5d1SDavid du Colombier void ginit(void); 2333e12c5d1SDavid du Colombier void gclean(void); 2343e12c5d1SDavid du Colombier void nextpc(void); 2353e12c5d1SDavid du Colombier void gargs(Node*, Node*, Node*); 2363e12c5d1SDavid du Colombier void garg1(Node*, Node*, Node*, int, Node**); 2373e12c5d1SDavid du Colombier Node* nodconst(long); 238*219b2ee8SDavid du Colombier Node* nod32const(vlong); 239bd389b36SDavid du Colombier Node* nodfconst(double); 2403e12c5d1SDavid du Colombier void nodreg(Node*, Node*, int); 2413e12c5d1SDavid du Colombier void regret(Node*, Node*); 2423e12c5d1SDavid du Colombier void regalloc(Node*, Node*, Node*); 2433e12c5d1SDavid du Colombier void regfree(Node*); 2443e12c5d1SDavid du Colombier void regialloc(Node*, Node*, Node*); 2453e12c5d1SDavid du Colombier void regsalloc(Node*, Node*); 2463e12c5d1SDavid du Colombier void regaalloc1(Node*, Node*); 2473e12c5d1SDavid du Colombier void regaalloc(Node*, Node*); 2483e12c5d1SDavid du Colombier void regind(Node*, Node*); 2493e12c5d1SDavid du Colombier void gprep(Node*, Node*); 2503e12c5d1SDavid du Colombier void raddr(Node*, Prog*); 2513e12c5d1SDavid du Colombier void naddr(Node*, Adr*); 2523e12c5d1SDavid du Colombier void gmove(Node*, Node*); 2533e12c5d1SDavid du Colombier void gins(int a, Node*, Node*); 2543e12c5d1SDavid du Colombier void gopcode(int, Node*, Node*, Node*); 2553e12c5d1SDavid du Colombier int samaddr(Node*, Node*); 2563e12c5d1SDavid du Colombier void gbranch(int); 2573e12c5d1SDavid du Colombier void patch(Prog*, long); 2583e12c5d1SDavid du Colombier int sconst(Node*); 2593e12c5d1SDavid du Colombier int sval(long); 2603e12c5d1SDavid du Colombier void gpseudo(int, Sym*, Node*); 2613e12c5d1SDavid du Colombier 2623e12c5d1SDavid du Colombier /* 2633e12c5d1SDavid du Colombier * swt.c 2643e12c5d1SDavid du Colombier */ 2653e12c5d1SDavid du Colombier int swcmp(void*, void*); 2663e12c5d1SDavid du Colombier void doswit(Node*); 2673e12c5d1SDavid du Colombier void swit1(C1*, int, long, Node*, Node*); 2683e12c5d1SDavid du Colombier void cas(void); 2693e12c5d1SDavid du Colombier void bitload(Node*, Node*, Node*, Node*, Node*); 2703e12c5d1SDavid du Colombier void bitstore(Node*, Node*, Node*, Node*, Node*); 2713e12c5d1SDavid du Colombier long outstring(char*, long); 2723e12c5d1SDavid du Colombier int vlog(Node*); 273*219b2ee8SDavid du Colombier int mulcon(Node*, Node*); 274*219b2ee8SDavid du Colombier Multab* mulcon0(long); 2753e12c5d1SDavid du Colombier void nullwarn(Node*, Node*); 2763e12c5d1SDavid du Colombier void sextern(Sym*, Node*, long, long); 2773e12c5d1SDavid du Colombier void gextern(Sym*, Node*, long, long); 2783e12c5d1SDavid du Colombier void outcode(void); 2793e12c5d1SDavid du Colombier void ieeedtod(Ieee*, double); 2803e12c5d1SDavid du Colombier 2813e12c5d1SDavid du Colombier /* 2823e12c5d1SDavid du Colombier * list 2833e12c5d1SDavid du Colombier */ 2843e12c5d1SDavid du Colombier void listinit(void); 285bd389b36SDavid du Colombier int Pconv(void*, Fconv*); 286bd389b36SDavid du Colombier int Aconv(void*, Fconv*); 287bd389b36SDavid du Colombier int Dconv(void*, Fconv*); 288bd389b36SDavid du Colombier int Sconv(void*, Fconv*); 289bd389b36SDavid du Colombier int Nconv(void*, Fconv*); 290bd389b36SDavid du Colombier int Bconv(void*, Fconv*); 2913e12c5d1SDavid du Colombier 2923e12c5d1SDavid du Colombier /* 2933e12c5d1SDavid du Colombier * reg.c 2943e12c5d1SDavid du Colombier */ 2953e12c5d1SDavid du Colombier Reg* rega(void); 2963e12c5d1SDavid du Colombier int rcmp(void*, void*); 2973e12c5d1SDavid du Colombier void regopt(Prog*); 2983e12c5d1SDavid du Colombier void addmove(Reg*, int, int, int); 2993e12c5d1SDavid du Colombier Bits mkvar(Adr*, int); 3003e12c5d1SDavid du Colombier void prop(Reg*, Bits, Bits); 3013e12c5d1SDavid du Colombier int loopit(Reg*); 3023e12c5d1SDavid du Colombier void synch(Reg*, Bits); 3033e12c5d1SDavid du Colombier ulong allreg(ulong, Rgn*); 3043e12c5d1SDavid du Colombier void paint1(Reg*, int); 3053e12c5d1SDavid du Colombier ulong paint2(Reg*, int); 3063e12c5d1SDavid du Colombier void paint3(Reg*, int, long, int); 3073e12c5d1SDavid du Colombier void addreg(Adr*, int); 3083e12c5d1SDavid du Colombier 3093e12c5d1SDavid du Colombier /* 3103e12c5d1SDavid du Colombier * peep.c 3113e12c5d1SDavid du Colombier */ 3123e12c5d1SDavid du Colombier void peep(void); 3133e12c5d1SDavid du Colombier void excise(Reg*); 3143e12c5d1SDavid du Colombier Reg* uniqp(Reg*); 3153e12c5d1SDavid du Colombier Reg* uniqs(Reg*); 3163e12c5d1SDavid du Colombier int regtyp(Adr*); 3173e12c5d1SDavid du Colombier int regzer(Adr*); 3183e12c5d1SDavid du Colombier int anyvar(Adr*); 3193e12c5d1SDavid du Colombier int subprop(Reg*); 3203e12c5d1SDavid du Colombier int copyprop(Reg*); 3213e12c5d1SDavid du Colombier int copy1(Adr*, Adr*, Reg*, int); 3223e12c5d1SDavid du Colombier int copyu(Prog*, Adr*, Adr*); 3233e12c5d1SDavid du Colombier 3243e12c5d1SDavid du Colombier int copyas(Adr*, Adr*); 3253e12c5d1SDavid du Colombier int copyau(Adr*, Adr*); 3263e12c5d1SDavid du Colombier int copyau1(Prog*, Adr*); 3273e12c5d1SDavid du Colombier int copysub(Adr*, Adr*, Adr*, int); 3283e12c5d1SDavid du Colombier int copysub1(Prog*, Adr*, Adr*, int); 3293e12c5d1SDavid du Colombier 3303e12c5d1SDavid du Colombier long RtoB(int); 3313e12c5d1SDavid du Colombier long FtoB(int); 3323e12c5d1SDavid du Colombier int BtoR(long); 3333e12c5d1SDavid du Colombier int BtoF(long); 3343e12c5d1SDavid du Colombier 3353e12c5d1SDavid du Colombier /* 3363e12c5d1SDavid du Colombier * bits.c 3373e12c5d1SDavid du Colombier */ 3383e12c5d1SDavid du Colombier Bits bor(Bits, Bits); 3393e12c5d1SDavid du Colombier Bits band(Bits, Bits); 3403e12c5d1SDavid du Colombier Bits bnot(Bits); 3413e12c5d1SDavid du Colombier int bany(Bits*); 3423e12c5d1SDavid du Colombier int bnum(Bits); 3433e12c5d1SDavid du Colombier Bits blsh(unsigned); 3443e12c5d1SDavid du Colombier int beq(Bits, Bits); 345