174a4d8c2SCharles.Forsyth #include "../cc/cc.h" 274a4d8c2SCharles.Forsyth #include "../8c/8.out.h" 374a4d8c2SCharles.Forsyth 474a4d8c2SCharles.Forsyth /* 574a4d8c2SCharles.Forsyth * 8c/386 674a4d8c2SCharles.Forsyth * Intel 386 774a4d8c2SCharles.Forsyth */ 874a4d8c2SCharles.Forsyth #define SZ_CHAR 1 974a4d8c2SCharles.Forsyth #define SZ_SHORT 2 1074a4d8c2SCharles.Forsyth #define SZ_INT 4 1174a4d8c2SCharles.Forsyth #define SZ_LONG 4 1274a4d8c2SCharles.Forsyth #define SZ_IND 4 1374a4d8c2SCharles.Forsyth #define SZ_FLOAT 4 1474a4d8c2SCharles.Forsyth #define SZ_VLONG 8 1574a4d8c2SCharles.Forsyth #define SZ_DOUBLE 8 1674a4d8c2SCharles.Forsyth #define FNX 100 1774a4d8c2SCharles.Forsyth 1874a4d8c2SCharles.Forsyth typedef struct Adr Adr; 1974a4d8c2SCharles.Forsyth typedef struct Prog Prog; 2074a4d8c2SCharles.Forsyth typedef struct Case Case; 2174a4d8c2SCharles.Forsyth typedef struct C1 C1; 2274a4d8c2SCharles.Forsyth typedef struct Var Var; 2374a4d8c2SCharles.Forsyth typedef struct Reg Reg; 2474a4d8c2SCharles.Forsyth typedef struct Rgn Rgn; 2574a4d8c2SCharles.Forsyth typedef struct Renv Renv; 2674a4d8c2SCharles.Forsyth 2774a4d8c2SCharles.Forsyth EXTERN struct 2874a4d8c2SCharles.Forsyth { 2974a4d8c2SCharles.Forsyth Node* regtree; 3074a4d8c2SCharles.Forsyth Node* basetree; 3174a4d8c2SCharles.Forsyth short scale; 3274a4d8c2SCharles.Forsyth short reg; 3374a4d8c2SCharles.Forsyth short ptr; 3474a4d8c2SCharles.Forsyth } idx; 3574a4d8c2SCharles.Forsyth 3674a4d8c2SCharles.Forsyth struct Adr 3774a4d8c2SCharles.Forsyth { 3874a4d8c2SCharles.Forsyth long offset; 3974a4d8c2SCharles.Forsyth double dval; 4074a4d8c2SCharles.Forsyth char sval[NSNAME]; 4174a4d8c2SCharles.Forsyth 4274a4d8c2SCharles.Forsyth Sym* sym; 4374a4d8c2SCharles.Forsyth uchar type; 4474a4d8c2SCharles.Forsyth uchar index; 4574a4d8c2SCharles.Forsyth uchar etype; 4674a4d8c2SCharles.Forsyth uchar scale; /* doubles as width in DATA op */ 4774a4d8c2SCharles.Forsyth }; 4874a4d8c2SCharles.Forsyth #define A ((Adr*)0) 4974a4d8c2SCharles.Forsyth 5074a4d8c2SCharles.Forsyth #define INDEXED 9 5174a4d8c2SCharles.Forsyth struct Prog 5274a4d8c2SCharles.Forsyth { 5374a4d8c2SCharles.Forsyth Adr from; 5474a4d8c2SCharles.Forsyth Adr to; 5574a4d8c2SCharles.Forsyth Prog* link; 5674a4d8c2SCharles.Forsyth long lineno; 5774a4d8c2SCharles.Forsyth short as; 5874a4d8c2SCharles.Forsyth }; 5974a4d8c2SCharles.Forsyth #define P ((Prog*)0) 6074a4d8c2SCharles.Forsyth 6174a4d8c2SCharles.Forsyth struct Case 6274a4d8c2SCharles.Forsyth { 6374a4d8c2SCharles.Forsyth Case* link; 64*45a20ab7Sforsyth vlong val; 6574a4d8c2SCharles.Forsyth long label; 6674a4d8c2SCharles.Forsyth char def; 67c0927006Sforsyth char isv; 6874a4d8c2SCharles.Forsyth }; 6974a4d8c2SCharles.Forsyth #define C ((Case*)0) 7074a4d8c2SCharles.Forsyth 7174a4d8c2SCharles.Forsyth struct C1 7274a4d8c2SCharles.Forsyth { 73*45a20ab7Sforsyth vlong val; 7474a4d8c2SCharles.Forsyth long label; 7574a4d8c2SCharles.Forsyth }; 7674a4d8c2SCharles.Forsyth 7774a4d8c2SCharles.Forsyth struct Var 7874a4d8c2SCharles.Forsyth { 7974a4d8c2SCharles.Forsyth long offset; 8074a4d8c2SCharles.Forsyth Sym* sym; 8174a4d8c2SCharles.Forsyth char name; 8274a4d8c2SCharles.Forsyth char etype; 8374a4d8c2SCharles.Forsyth }; 8474a4d8c2SCharles.Forsyth 8574a4d8c2SCharles.Forsyth struct Reg 8674a4d8c2SCharles.Forsyth { 8774a4d8c2SCharles.Forsyth long pc; 8874a4d8c2SCharles.Forsyth long rpo; /* reverse post ordering */ 8974a4d8c2SCharles.Forsyth 9074a4d8c2SCharles.Forsyth Bits set; 9174a4d8c2SCharles.Forsyth Bits use1; 9274a4d8c2SCharles.Forsyth Bits use2; 9374a4d8c2SCharles.Forsyth 9474a4d8c2SCharles.Forsyth Bits refbehind; 9574a4d8c2SCharles.Forsyth Bits refahead; 9674a4d8c2SCharles.Forsyth Bits calbehind; 9774a4d8c2SCharles.Forsyth Bits calahead; 9874a4d8c2SCharles.Forsyth Bits regdiff; 9974a4d8c2SCharles.Forsyth Bits act; 10074a4d8c2SCharles.Forsyth 10174a4d8c2SCharles.Forsyth long regu; 10274a4d8c2SCharles.Forsyth long loop; /* could be shorter */ 10374a4d8c2SCharles.Forsyth 10474a4d8c2SCharles.Forsyth Reg* log5; 10574a4d8c2SCharles.Forsyth long active; 10674a4d8c2SCharles.Forsyth 10774a4d8c2SCharles.Forsyth Reg* p1; 10874a4d8c2SCharles.Forsyth Reg* p2; 10974a4d8c2SCharles.Forsyth Reg* p2link; 11074a4d8c2SCharles.Forsyth Reg* s1; 11174a4d8c2SCharles.Forsyth Reg* s2; 11274a4d8c2SCharles.Forsyth Reg* link; 11374a4d8c2SCharles.Forsyth Prog* prog; 11474a4d8c2SCharles.Forsyth }; 11574a4d8c2SCharles.Forsyth #define R ((Reg*)0) 11674a4d8c2SCharles.Forsyth 11774a4d8c2SCharles.Forsyth struct Renv 11874a4d8c2SCharles.Forsyth { 11974a4d8c2SCharles.Forsyth int safe; 12074a4d8c2SCharles.Forsyth Node base; 12174a4d8c2SCharles.Forsyth Node* saved; 12274a4d8c2SCharles.Forsyth Node* scope; 12374a4d8c2SCharles.Forsyth }; 12474a4d8c2SCharles.Forsyth 12574a4d8c2SCharles.Forsyth #define NRGN 600 12674a4d8c2SCharles.Forsyth struct Rgn 12774a4d8c2SCharles.Forsyth { 12874a4d8c2SCharles.Forsyth Reg* enter; 12974a4d8c2SCharles.Forsyth short cost; 13074a4d8c2SCharles.Forsyth short varno; 13174a4d8c2SCharles.Forsyth short regno; 13274a4d8c2SCharles.Forsyth }; 13374a4d8c2SCharles.Forsyth 13474a4d8c2SCharles.Forsyth EXTERN long breakpc; 135c0927006Sforsyth EXTERN long nbreak; 13674a4d8c2SCharles.Forsyth EXTERN Case* cases; 13774a4d8c2SCharles.Forsyth EXTERN Node constnode; 13874a4d8c2SCharles.Forsyth EXTERN Node fconstnode; 13974a4d8c2SCharles.Forsyth EXTERN long continpc; 14074a4d8c2SCharles.Forsyth EXTERN long curarg; 14174a4d8c2SCharles.Forsyth EXTERN long cursafe; 14274a4d8c2SCharles.Forsyth EXTERN Prog* firstp; 14374a4d8c2SCharles.Forsyth EXTERN Prog* lastp; 14474a4d8c2SCharles.Forsyth EXTERN long maxargsafe; 14574a4d8c2SCharles.Forsyth EXTERN int mnstring; 14674a4d8c2SCharles.Forsyth EXTERN Node* nodrat; 14774a4d8c2SCharles.Forsyth EXTERN Node* nodret; 14874a4d8c2SCharles.Forsyth EXTERN Node* nodsafe; 14974a4d8c2SCharles.Forsyth EXTERN long nrathole; 15074a4d8c2SCharles.Forsyth EXTERN long nstring; 15174a4d8c2SCharles.Forsyth EXTERN Prog* p; 15274a4d8c2SCharles.Forsyth EXTERN long pc; 15374a4d8c2SCharles.Forsyth EXTERN Node regnode; 15474a4d8c2SCharles.Forsyth EXTERN Node fregnode0; 15574a4d8c2SCharles.Forsyth EXTERN Node fregnode1; 15674a4d8c2SCharles.Forsyth EXTERN char string[NSNAME]; 15774a4d8c2SCharles.Forsyth EXTERN Sym* symrathole; 15874a4d8c2SCharles.Forsyth EXTERN Node znode; 15974a4d8c2SCharles.Forsyth EXTERN Prog zprog; 16074a4d8c2SCharles.Forsyth EXTERN int reg[D_NONE]; 16174a4d8c2SCharles.Forsyth EXTERN long exregoffset; 16274a4d8c2SCharles.Forsyth EXTERN long exfregoffset; 16374a4d8c2SCharles.Forsyth 16474a4d8c2SCharles.Forsyth #define BLOAD(r) band(bnot(r->refbehind), r->refahead) 16574a4d8c2SCharles.Forsyth #define BSTORE(r) band(bnot(r->calbehind), r->calahead) 16674a4d8c2SCharles.Forsyth #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z]) 16774a4d8c2SCharles.Forsyth #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z]) 16874a4d8c2SCharles.Forsyth 16974a4d8c2SCharles.Forsyth #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32)) 17074a4d8c2SCharles.Forsyth 17174a4d8c2SCharles.Forsyth #define CLOAD 5 17274a4d8c2SCharles.Forsyth #define CREF 5 17374a4d8c2SCharles.Forsyth #define CINF 1000 17474a4d8c2SCharles.Forsyth #define LOOP 3 17574a4d8c2SCharles.Forsyth 17674a4d8c2SCharles.Forsyth EXTERN Rgn region[NRGN]; 17774a4d8c2SCharles.Forsyth EXTERN Rgn* rgp; 17874a4d8c2SCharles.Forsyth EXTERN int nregion; 17974a4d8c2SCharles.Forsyth EXTERN int nvar; 18074a4d8c2SCharles.Forsyth 18174a4d8c2SCharles.Forsyth EXTERN Bits externs; 18274a4d8c2SCharles.Forsyth EXTERN Bits params; 18374a4d8c2SCharles.Forsyth EXTERN Bits consts; 18474a4d8c2SCharles.Forsyth EXTERN Bits addrs; 18574a4d8c2SCharles.Forsyth 18674a4d8c2SCharles.Forsyth EXTERN long regbits; 18774a4d8c2SCharles.Forsyth EXTERN long exregbits; 18874a4d8c2SCharles.Forsyth 18974a4d8c2SCharles.Forsyth EXTERN int change; 19074a4d8c2SCharles.Forsyth EXTERN int suppress; 19174a4d8c2SCharles.Forsyth 19274a4d8c2SCharles.Forsyth EXTERN Reg* firstr; 19374a4d8c2SCharles.Forsyth EXTERN Reg* lastr; 19474a4d8c2SCharles.Forsyth EXTERN Reg zreg; 19574a4d8c2SCharles.Forsyth EXTERN Reg* freer; 19674a4d8c2SCharles.Forsyth EXTERN Var var[NVAR]; 19774a4d8c2SCharles.Forsyth EXTERN long* idom; 19874a4d8c2SCharles.Forsyth EXTERN Reg** rpo2r; 19974a4d8c2SCharles.Forsyth EXTERN long maxnr; 20074a4d8c2SCharles.Forsyth 20174a4d8c2SCharles.Forsyth extern char* anames[]; 20274a4d8c2SCharles.Forsyth 20374a4d8c2SCharles.Forsyth /* 20474a4d8c2SCharles.Forsyth * sgen.c 20574a4d8c2SCharles.Forsyth */ 20674a4d8c2SCharles.Forsyth void codgen(Node*, Node*); 20774a4d8c2SCharles.Forsyth void gen(Node*); 20874a4d8c2SCharles.Forsyth void noretval(int); 20974a4d8c2SCharles.Forsyth void usedset(Node*, int); 21074a4d8c2SCharles.Forsyth void xcom(Node*); 21174a4d8c2SCharles.Forsyth void indx(Node*); 21274a4d8c2SCharles.Forsyth int bcomplex(Node*, Node*); 21374a4d8c2SCharles.Forsyth 21474a4d8c2SCharles.Forsyth /* 21574a4d8c2SCharles.Forsyth * cgen.c 21674a4d8c2SCharles.Forsyth */ 21774a4d8c2SCharles.Forsyth void zeroregm(Node*); 21874a4d8c2SCharles.Forsyth void cgen(Node*, Node*); 21974a4d8c2SCharles.Forsyth void reglcgen(Node*, Node*, Node*); 22074a4d8c2SCharles.Forsyth void lcgen(Node*, Node*); 22174a4d8c2SCharles.Forsyth void bcgen(Node*, int); 22274a4d8c2SCharles.Forsyth void boolgen(Node*, int, Node*); 22374a4d8c2SCharles.Forsyth void sugen(Node*, Node*, long); 22474a4d8c2SCharles.Forsyth int needreg(Node*, int); 22574a4d8c2SCharles.Forsyth 22674a4d8c2SCharles.Forsyth /* 22774a4d8c2SCharles.Forsyth * cgen64.c 22874a4d8c2SCharles.Forsyth */ 22974a4d8c2SCharles.Forsyth int vaddr(Node*, int); 23074a4d8c2SCharles.Forsyth void loadpair(Node*, Node*); 23174a4d8c2SCharles.Forsyth int cgen64(Node*, Node*); 23274a4d8c2SCharles.Forsyth void testv(Node*, int); 23374a4d8c2SCharles.Forsyth 23474a4d8c2SCharles.Forsyth /* 23574a4d8c2SCharles.Forsyth * txt.c 23674a4d8c2SCharles.Forsyth */ 23774a4d8c2SCharles.Forsyth void ginit(void); 23874a4d8c2SCharles.Forsyth void gclean(void); 23974a4d8c2SCharles.Forsyth void nextpc(void); 24074a4d8c2SCharles.Forsyth void gargs(Node*, Node*, Node*); 24174a4d8c2SCharles.Forsyth void garg1(Node*, Node*, Node*, int, Node**); 24274a4d8c2SCharles.Forsyth Node* nodconst(long); 243*45a20ab7Sforsyth int nareg(int); 24474a4d8c2SCharles.Forsyth Node* nodfconst(double); 24574a4d8c2SCharles.Forsyth int nodreg(Node*, Node*, int); 24674a4d8c2SCharles.Forsyth int isreg(Node*, int); 24774a4d8c2SCharles.Forsyth void regret(Node*, Node*); 24874a4d8c2SCharles.Forsyth void regalloc(Node*, Node*, Node*); 24974a4d8c2SCharles.Forsyth void regfree(Node*); 25074a4d8c2SCharles.Forsyth void regialloc(Node*, Node*, Node*); 25174a4d8c2SCharles.Forsyth void regsalloc(Node*, Node*); 25274a4d8c2SCharles.Forsyth void regaalloc1(Node*, Node*); 25374a4d8c2SCharles.Forsyth void regaalloc(Node*, Node*); 25474a4d8c2SCharles.Forsyth void regind(Node*, Node*); 25574a4d8c2SCharles.Forsyth void gprep(Node*, Node*); 25674a4d8c2SCharles.Forsyth void naddr(Node*, Adr*); 25774a4d8c2SCharles.Forsyth void gmove(Node*, Node*); 25874a4d8c2SCharles.Forsyth void gins(int a, Node*, Node*); 25974a4d8c2SCharles.Forsyth void fgopcode(int, Node*, Node*, int, int); 26074a4d8c2SCharles.Forsyth void gopcode(int, Type*, Node*, Node*); 26174a4d8c2SCharles.Forsyth int samaddr(Node*, Node*); 26274a4d8c2SCharles.Forsyth void gbranch(int); 26374a4d8c2SCharles.Forsyth void patch(Prog*, long); 26474a4d8c2SCharles.Forsyth int sconst(Node*); 26574a4d8c2SCharles.Forsyth void gpseudo(int, Sym*, Node*); 26674a4d8c2SCharles.Forsyth 26774a4d8c2SCharles.Forsyth /* 26874a4d8c2SCharles.Forsyth * swt.c 26974a4d8c2SCharles.Forsyth */ 270*45a20ab7Sforsyth int swcmp(void*, void*); 27174a4d8c2SCharles.Forsyth void doswit(Node*); 27274a4d8c2SCharles.Forsyth void swit1(C1*, int, long, Node*); 273d67b7dadSforsyth void casf(void); 27474a4d8c2SCharles.Forsyth void bitload(Node*, Node*, Node*, Node*, Node*); 27574a4d8c2SCharles.Forsyth void bitstore(Node*, Node*, Node*, Node*, Node*); 27674a4d8c2SCharles.Forsyth long outstring(char*, long); 27774a4d8c2SCharles.Forsyth void nullwarn(Node*, Node*); 27874a4d8c2SCharles.Forsyth void gextern(Sym*, Node*, long, long); 27974a4d8c2SCharles.Forsyth void outcode(void); 28074a4d8c2SCharles.Forsyth void ieeedtod(Ieee*, double); 28174a4d8c2SCharles.Forsyth 28274a4d8c2SCharles.Forsyth /* 28374a4d8c2SCharles.Forsyth * list 28474a4d8c2SCharles.Forsyth */ 28574a4d8c2SCharles.Forsyth void listinit(void); 28674a4d8c2SCharles.Forsyth int Pconv(Fmt*); 28774a4d8c2SCharles.Forsyth int Aconv(Fmt*); 28874a4d8c2SCharles.Forsyth int Dconv(Fmt*); 28974a4d8c2SCharles.Forsyth int Sconv(Fmt*); 29074a4d8c2SCharles.Forsyth int Rconv(Fmt*); 29174a4d8c2SCharles.Forsyth int Xconv(Fmt*); 29274a4d8c2SCharles.Forsyth int Bconv(Fmt*); 29374a4d8c2SCharles.Forsyth 29474a4d8c2SCharles.Forsyth /* 29574a4d8c2SCharles.Forsyth * reg.c 29674a4d8c2SCharles.Forsyth */ 29774a4d8c2SCharles.Forsyth Reg* rega(void); 298*45a20ab7Sforsyth int rcmp(void*, void*); 29974a4d8c2SCharles.Forsyth void regopt(Prog*); 30074a4d8c2SCharles.Forsyth void addmove(Reg*, int, int, int); 301*45a20ab7Sforsyth Bits mkvar(Reg*, Adr*, int); 30274a4d8c2SCharles.Forsyth void prop(Reg*, Bits, Bits); 30374a4d8c2SCharles.Forsyth void loopit(Reg*, long); 30474a4d8c2SCharles.Forsyth void synch(Reg*, Bits); 30574a4d8c2SCharles.Forsyth ulong allreg(ulong, Rgn*); 30674a4d8c2SCharles.Forsyth void paint1(Reg*, int); 30774a4d8c2SCharles.Forsyth ulong paint2(Reg*, int); 30874a4d8c2SCharles.Forsyth void paint3(Reg*, int, long, int); 30974a4d8c2SCharles.Forsyth void addreg(Adr*, int); 31074a4d8c2SCharles.Forsyth 31174a4d8c2SCharles.Forsyth /* 31274a4d8c2SCharles.Forsyth * peep.c 31374a4d8c2SCharles.Forsyth */ 31474a4d8c2SCharles.Forsyth void peep(void); 31574a4d8c2SCharles.Forsyth void excise(Reg*); 31674a4d8c2SCharles.Forsyth Reg* uniqp(Reg*); 31774a4d8c2SCharles.Forsyth Reg* uniqs(Reg*); 31874a4d8c2SCharles.Forsyth int regtyp(Adr*); 31974a4d8c2SCharles.Forsyth int anyvar(Adr*); 32074a4d8c2SCharles.Forsyth int subprop(Reg*); 32174a4d8c2SCharles.Forsyth int copyprop(Reg*); 32274a4d8c2SCharles.Forsyth int copy1(Adr*, Adr*, Reg*, int); 32374a4d8c2SCharles.Forsyth int copyu(Prog*, Adr*, Adr*); 32474a4d8c2SCharles.Forsyth 32574a4d8c2SCharles.Forsyth int copyas(Adr*, Adr*); 32674a4d8c2SCharles.Forsyth int copyau(Adr*, Adr*); 32774a4d8c2SCharles.Forsyth int copysub(Adr*, Adr*, Adr*, int); 32874a4d8c2SCharles.Forsyth int copysub1(Prog*, Adr*, Adr*, int); 32974a4d8c2SCharles.Forsyth 33074a4d8c2SCharles.Forsyth long RtoB(int); 33174a4d8c2SCharles.Forsyth long FtoB(int); 33274a4d8c2SCharles.Forsyth int BtoR(long); 33374a4d8c2SCharles.Forsyth int BtoF(long); 33474a4d8c2SCharles.Forsyth 33574a4d8c2SCharles.Forsyth #define D_HI D_NONE 33674a4d8c2SCharles.Forsyth #define D_LO D_NONE 33774a4d8c2SCharles.Forsyth 33874a4d8c2SCharles.Forsyth /* 33974a4d8c2SCharles.Forsyth * com64 34074a4d8c2SCharles.Forsyth */ 34174a4d8c2SCharles.Forsyth int cond(int); 34274a4d8c2SCharles.Forsyth int com64(Node*); 34374a4d8c2SCharles.Forsyth void com64init(void); 34474a4d8c2SCharles.Forsyth void bool64(Node*); 34574a4d8c2SCharles.Forsyth long lo64v(Node*); 34674a4d8c2SCharles.Forsyth long hi64v(Node*); 34774a4d8c2SCharles.Forsyth Node* lo64(Node*); 34874a4d8c2SCharles.Forsyth Node* hi64(Node*); 34974a4d8c2SCharles.Forsyth 35074a4d8c2SCharles.Forsyth /* 35174a4d8c2SCharles.Forsyth * div/mul 35274a4d8c2SCharles.Forsyth */ 35374a4d8c2SCharles.Forsyth void sdivgen(Node*, Node*, Node*, Node*); 35474a4d8c2SCharles.Forsyth void udivgen(Node*, Node*, Node*, Node*); 35574a4d8c2SCharles.Forsyth void sdiv2(long, int, Node*, Node*); 35674a4d8c2SCharles.Forsyth void smod2(long, int, Node*, Node*); 35774a4d8c2SCharles.Forsyth void mulgen(Type*, Node*, Node*); 35874a4d8c2SCharles.Forsyth void genmuladd(Node*, Node*, int, Node*); 35974a4d8c2SCharles.Forsyth void shiftit(Type*, Node*, Node*); 36074a4d8c2SCharles.Forsyth 36174a4d8c2SCharles.Forsyth #pragma varargck type "A" int 36274a4d8c2SCharles.Forsyth #pragma varargck type "B" Bits 36374a4d8c2SCharles.Forsyth #pragma varargck type "D" Adr* 36474a4d8c2SCharles.Forsyth #pragma varargck type "P" Prog* 36574a4d8c2SCharles.Forsyth #pragma varargck type "R" int 36674a4d8c2SCharles.Forsyth #pragma varargck type "S" char* 36774a4d8c2SCharles.Forsyth 36874a4d8c2SCharles.Forsyth /* wrecklessly steal a field */ 36974a4d8c2SCharles.Forsyth 37074a4d8c2SCharles.Forsyth #define rplink label 371