174a4d8c2SCharles.Forsyth #include "../cc/cc.h" 274a4d8c2SCharles.Forsyth #include "../vc/v.out.h" 374a4d8c2SCharles.Forsyth 474a4d8c2SCharles.Forsyth /* 574a4d8c2SCharles.Forsyth * 0c/spim 674a4d8c2SCharles.Forsyth * Mips 4000 little endian 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 Multab Multab; 2374a4d8c2SCharles.Forsyth typedef struct Hintab Hintab; 2474a4d8c2SCharles.Forsyth typedef struct Var Var; 2574a4d8c2SCharles.Forsyth typedef struct Reg Reg; 2674a4d8c2SCharles.Forsyth typedef struct Rgn Rgn; 2774a4d8c2SCharles.Forsyth 2874a4d8c2SCharles.Forsyth struct Adr 2974a4d8c2SCharles.Forsyth { 3074a4d8c2SCharles.Forsyth long offset; 3174a4d8c2SCharles.Forsyth double dval; 3274a4d8c2SCharles.Forsyth vlong vval; 3374a4d8c2SCharles.Forsyth char sval[NSNAME]; 3474a4d8c2SCharles.Forsyth Ieee ieee; 3574a4d8c2SCharles.Forsyth 3674a4d8c2SCharles.Forsyth Sym* sym; 3774a4d8c2SCharles.Forsyth char type; 3874a4d8c2SCharles.Forsyth char reg; 3974a4d8c2SCharles.Forsyth char name; 4074a4d8c2SCharles.Forsyth char etype; 4174a4d8c2SCharles.Forsyth }; 4274a4d8c2SCharles.Forsyth #define A ((Adr*)0) 4374a4d8c2SCharles.Forsyth 4474a4d8c2SCharles.Forsyth #define INDEXED 9 4574a4d8c2SCharles.Forsyth struct Prog 4674a4d8c2SCharles.Forsyth { 4774a4d8c2SCharles.Forsyth Adr from; 4874a4d8c2SCharles.Forsyth Adr to; 4974a4d8c2SCharles.Forsyth Prog* link; 5074a4d8c2SCharles.Forsyth long lineno; 5174a4d8c2SCharles.Forsyth char as; 5274a4d8c2SCharles.Forsyth char reg; 5374a4d8c2SCharles.Forsyth }; 5474a4d8c2SCharles.Forsyth #define P ((Prog*)0) 5574a4d8c2SCharles.Forsyth 5674a4d8c2SCharles.Forsyth struct Case 5774a4d8c2SCharles.Forsyth { 5874a4d8c2SCharles.Forsyth Case* link; 5974a4d8c2SCharles.Forsyth long val; 6074a4d8c2SCharles.Forsyth long label; 6174a4d8c2SCharles.Forsyth char def; 6274a4d8c2SCharles.Forsyth }; 6374a4d8c2SCharles.Forsyth #define C ((Case*)0) 6474a4d8c2SCharles.Forsyth 6574a4d8c2SCharles.Forsyth struct C1 6674a4d8c2SCharles.Forsyth { 6774a4d8c2SCharles.Forsyth long val; 6874a4d8c2SCharles.Forsyth long label; 6974a4d8c2SCharles.Forsyth }; 7074a4d8c2SCharles.Forsyth 7174a4d8c2SCharles.Forsyth struct Multab 7274a4d8c2SCharles.Forsyth { 7374a4d8c2SCharles.Forsyth long val; 7474a4d8c2SCharles.Forsyth char code[20]; 7574a4d8c2SCharles.Forsyth }; 7674a4d8c2SCharles.Forsyth 7774a4d8c2SCharles.Forsyth struct Hintab 7874a4d8c2SCharles.Forsyth { 7974a4d8c2SCharles.Forsyth ushort val; 8074a4d8c2SCharles.Forsyth char hint[10]; 8174a4d8c2SCharles.Forsyth }; 8274a4d8c2SCharles.Forsyth 8374a4d8c2SCharles.Forsyth struct Var 8474a4d8c2SCharles.Forsyth { 8574a4d8c2SCharles.Forsyth long offset; 8674a4d8c2SCharles.Forsyth Sym* sym; 8774a4d8c2SCharles.Forsyth char name; 8874a4d8c2SCharles.Forsyth char etype; 8974a4d8c2SCharles.Forsyth }; 9074a4d8c2SCharles.Forsyth 9174a4d8c2SCharles.Forsyth struct Reg 9274a4d8c2SCharles.Forsyth { 9374a4d8c2SCharles.Forsyth long pc; 9474a4d8c2SCharles.Forsyth long rpo; /* reverse post ordering */ 9574a4d8c2SCharles.Forsyth 9674a4d8c2SCharles.Forsyth Bits set; 9774a4d8c2SCharles.Forsyth Bits use1; 9874a4d8c2SCharles.Forsyth Bits use2; 9974a4d8c2SCharles.Forsyth 10074a4d8c2SCharles.Forsyth Bits refbehind; 10174a4d8c2SCharles.Forsyth Bits refahead; 10274a4d8c2SCharles.Forsyth Bits calbehind; 10374a4d8c2SCharles.Forsyth Bits calahead; 10474a4d8c2SCharles.Forsyth Bits regdiff; 10574a4d8c2SCharles.Forsyth Bits act; 10674a4d8c2SCharles.Forsyth 10774a4d8c2SCharles.Forsyth long regu; 10874a4d8c2SCharles.Forsyth long loop; /* could be shorter */ 10974a4d8c2SCharles.Forsyth 11074a4d8c2SCharles.Forsyth Reg* log5; 11174a4d8c2SCharles.Forsyth long active; 11274a4d8c2SCharles.Forsyth 11374a4d8c2SCharles.Forsyth Reg* p1; 11474a4d8c2SCharles.Forsyth Reg* p2; 11574a4d8c2SCharles.Forsyth Reg* p2link; 11674a4d8c2SCharles.Forsyth Reg* s1; 11774a4d8c2SCharles.Forsyth Reg* s2; 11874a4d8c2SCharles.Forsyth Reg* link; 11974a4d8c2SCharles.Forsyth Prog* prog; 12074a4d8c2SCharles.Forsyth }; 12174a4d8c2SCharles.Forsyth #define R ((Reg*)0) 12274a4d8c2SCharles.Forsyth 12374a4d8c2SCharles.Forsyth #define NRGN 600 12474a4d8c2SCharles.Forsyth struct Rgn 12574a4d8c2SCharles.Forsyth { 12674a4d8c2SCharles.Forsyth Reg* enter; 12774a4d8c2SCharles.Forsyth short cost; 12874a4d8c2SCharles.Forsyth short varno; 12974a4d8c2SCharles.Forsyth short regno; 13074a4d8c2SCharles.Forsyth }; 13174a4d8c2SCharles.Forsyth 13274a4d8c2SCharles.Forsyth EXTERN long breakpc; 13374a4d8c2SCharles.Forsyth EXTERN Case* cases; 13474a4d8c2SCharles.Forsyth EXTERN Node constnode; 13574a4d8c2SCharles.Forsyth EXTERN Node fconstnode; 13674a4d8c2SCharles.Forsyth EXTERN long continpc; 13774a4d8c2SCharles.Forsyth EXTERN long curarg; 13874a4d8c2SCharles.Forsyth EXTERN long cursafe; 13974a4d8c2SCharles.Forsyth EXTERN Prog* firstp; 14074a4d8c2SCharles.Forsyth EXTERN Prog* lastp; 14174a4d8c2SCharles.Forsyth EXTERN long maxargsafe; 14274a4d8c2SCharles.Forsyth EXTERN int mnstring; 14374a4d8c2SCharles.Forsyth EXTERN Multab multab[20]; 14474a4d8c2SCharles.Forsyth EXTERN int retok; 14574a4d8c2SCharles.Forsyth EXTERN int hintabsize; 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 char string[NSNAME]; 15574a4d8c2SCharles.Forsyth EXTERN Sym* symrathole; 15674a4d8c2SCharles.Forsyth EXTERN Node znode; 15774a4d8c2SCharles.Forsyth EXTERN Prog zprog; 15874a4d8c2SCharles.Forsyth EXTERN int reg[NREG+NREG]; 15974a4d8c2SCharles.Forsyth EXTERN long exregoffset; 16074a4d8c2SCharles.Forsyth EXTERN long exfregoffset; 16174a4d8c2SCharles.Forsyth 16274a4d8c2SCharles.Forsyth #define BLOAD(r) band(bnot(r->refbehind), r->refahead) 16374a4d8c2SCharles.Forsyth #define BSTORE(r) band(bnot(r->calbehind), r->calahead) 16474a4d8c2SCharles.Forsyth #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z]) 16574a4d8c2SCharles.Forsyth #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z]) 16674a4d8c2SCharles.Forsyth 16774a4d8c2SCharles.Forsyth #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32)) 16874a4d8c2SCharles.Forsyth 16974a4d8c2SCharles.Forsyth #define CLOAD 4 17074a4d8c2SCharles.Forsyth #define CREF 5 17174a4d8c2SCharles.Forsyth #define CINF 1000 17274a4d8c2SCharles.Forsyth #define LOOP 3 17374a4d8c2SCharles.Forsyth 17474a4d8c2SCharles.Forsyth EXTERN Rgn region[NRGN]; 17574a4d8c2SCharles.Forsyth EXTERN Rgn* rgp; 17674a4d8c2SCharles.Forsyth EXTERN int nregion; 17774a4d8c2SCharles.Forsyth EXTERN int nvar; 17874a4d8c2SCharles.Forsyth 17974a4d8c2SCharles.Forsyth EXTERN Bits externs; 18074a4d8c2SCharles.Forsyth EXTERN Bits params; 18174a4d8c2SCharles.Forsyth EXTERN Bits consts; 18274a4d8c2SCharles.Forsyth EXTERN Bits addrs; 18374a4d8c2SCharles.Forsyth 18474a4d8c2SCharles.Forsyth EXTERN long regbits; 18574a4d8c2SCharles.Forsyth EXTERN long exregbits; 18674a4d8c2SCharles.Forsyth 18774a4d8c2SCharles.Forsyth EXTERN int change; 18874a4d8c2SCharles.Forsyth 18974a4d8c2SCharles.Forsyth EXTERN Reg* firstr; 19074a4d8c2SCharles.Forsyth EXTERN Reg* lastr; 19174a4d8c2SCharles.Forsyth EXTERN Reg zreg; 19274a4d8c2SCharles.Forsyth EXTERN Reg* freer; 19374a4d8c2SCharles.Forsyth EXTERN Var var[NVAR]; 19474a4d8c2SCharles.Forsyth EXTERN long* idom; 19574a4d8c2SCharles.Forsyth EXTERN Reg** rpo2r; 19674a4d8c2SCharles.Forsyth EXTERN long maxnr; 19774a4d8c2SCharles.Forsyth 19874a4d8c2SCharles.Forsyth extern char* anames[]; 19974a4d8c2SCharles.Forsyth extern Hintab hintab[]; 20074a4d8c2SCharles.Forsyth 20174a4d8c2SCharles.Forsyth /* 20274a4d8c2SCharles.Forsyth * sgen.c 20374a4d8c2SCharles.Forsyth */ 20474a4d8c2SCharles.Forsyth void codgen(Node*, Node*); 20574a4d8c2SCharles.Forsyth void gen(Node*); 20674a4d8c2SCharles.Forsyth void noretval(int); 20774a4d8c2SCharles.Forsyth void xcom(Node*); 20874a4d8c2SCharles.Forsyth void bcomplex(Node*); 20974a4d8c2SCharles.Forsyth void usedset(Node*, int); 21074a4d8c2SCharles.Forsyth 21174a4d8c2SCharles.Forsyth /* 21274a4d8c2SCharles.Forsyth * cgen.c 21374a4d8c2SCharles.Forsyth */ 21474a4d8c2SCharles.Forsyth void cgen(Node*, Node*); 21574a4d8c2SCharles.Forsyth void reglcgen(Node*, Node*, Node*); 21674a4d8c2SCharles.Forsyth void lcgen(Node*, Node*); 21774a4d8c2SCharles.Forsyth void bcgen(Node*, int); 21874a4d8c2SCharles.Forsyth void boolgen(Node*, int, Node*); 21974a4d8c2SCharles.Forsyth void sugen(Node*, Node*, long); 22074a4d8c2SCharles.Forsyth void layout(Node*, Node*, int, int, Node*); 22174a4d8c2SCharles.Forsyth 22274a4d8c2SCharles.Forsyth /* 22374a4d8c2SCharles.Forsyth * txt.c 22474a4d8c2SCharles.Forsyth */ 22574a4d8c2SCharles.Forsyth void ginit(void); 22674a4d8c2SCharles.Forsyth void gclean(void); 22774a4d8c2SCharles.Forsyth void nextpc(void); 22874a4d8c2SCharles.Forsyth void gargs(Node*, Node*, Node*); 22974a4d8c2SCharles.Forsyth void garg1(Node*, Node*, Node*, int, Node**); 23074a4d8c2SCharles.Forsyth Node* nodconst(long); 23174a4d8c2SCharles.Forsyth Node* nodfconst(double); 23274a4d8c2SCharles.Forsyth void nodreg(Node*, Node*, int); 23374a4d8c2SCharles.Forsyth void regret(Node*, Node*); 23474a4d8c2SCharles.Forsyth void regalloc(Node*, Node*, Node*); 23574a4d8c2SCharles.Forsyth void regfree(Node*); 23674a4d8c2SCharles.Forsyth void regialloc(Node*, Node*, Node*); 23774a4d8c2SCharles.Forsyth void regsalloc(Node*, Node*); 23874a4d8c2SCharles.Forsyth void regaalloc1(Node*, Node*); 23974a4d8c2SCharles.Forsyth void regaalloc(Node*, Node*); 24074a4d8c2SCharles.Forsyth void regind(Node*, Node*); 24174a4d8c2SCharles.Forsyth void gprep(Node*, Node*); 24274a4d8c2SCharles.Forsyth void raddr(Node*, Prog*); 24374a4d8c2SCharles.Forsyth void naddr(Node*, Adr*); 24474a4d8c2SCharles.Forsyth void gmove(Node*, Node*); 24574a4d8c2SCharles.Forsyth void gins(int a, Node*, Node*); 24674a4d8c2SCharles.Forsyth void gopcode(int, Node*, Node*, Node*); 24774a4d8c2SCharles.Forsyth int samaddr(Node*, Node*); 24874a4d8c2SCharles.Forsyth void gbranch(int); 24974a4d8c2SCharles.Forsyth void patch(Prog*, long); 25074a4d8c2SCharles.Forsyth int sconst(Node*); 25174a4d8c2SCharles.Forsyth int llconst(Node*); 25274a4d8c2SCharles.Forsyth int sval(long); 25374a4d8c2SCharles.Forsyth void gpseudo(int, Sym*, Node*); 25474a4d8c2SCharles.Forsyth 25574a4d8c2SCharles.Forsyth /* 25674a4d8c2SCharles.Forsyth * swt.c 25774a4d8c2SCharles.Forsyth */ 258*45a20ab7Sforsyth int swcmp(void*, void*); 25974a4d8c2SCharles.Forsyth void doswit(Node*); 26074a4d8c2SCharles.Forsyth void swit1(C1*, int, long, Node*, Node*); 261d67b7dadSforsyth void casf(void); 26274a4d8c2SCharles.Forsyth void bitload(Node*, Node*, Node*, Node*, Node*); 26374a4d8c2SCharles.Forsyth void bitstore(Node*, Node*, Node*, Node*, Node*); 26474a4d8c2SCharles.Forsyth long outstring(char*, long); 26574a4d8c2SCharles.Forsyth int mulcon(Node*, Node*); 26674a4d8c2SCharles.Forsyth Multab* mulcon0(long); 26774a4d8c2SCharles.Forsyth void nullwarn(Node*, Node*); 26874a4d8c2SCharles.Forsyth void sextern(Sym*, Node*, long, long); 26974a4d8c2SCharles.Forsyth void gextern(Sym*, Node*, long, long); 27074a4d8c2SCharles.Forsyth void outcode(void); 27174a4d8c2SCharles.Forsyth void ieeedtod(Ieee*, double); 27274a4d8c2SCharles.Forsyth 27374a4d8c2SCharles.Forsyth /* 27474a4d8c2SCharles.Forsyth * list 27574a4d8c2SCharles.Forsyth */ 27674a4d8c2SCharles.Forsyth void listinit(void); 27774a4d8c2SCharles.Forsyth int Pconv(Fmt*); 27874a4d8c2SCharles.Forsyth int Aconv(Fmt*); 27974a4d8c2SCharles.Forsyth int Dconv(Fmt*); 28074a4d8c2SCharles.Forsyth int Sconv(Fmt*); 28174a4d8c2SCharles.Forsyth int Nconv(Fmt*); 28274a4d8c2SCharles.Forsyth int Bconv(Fmt*); 28374a4d8c2SCharles.Forsyth 28474a4d8c2SCharles.Forsyth /* 28574a4d8c2SCharles.Forsyth * reg.c 28674a4d8c2SCharles.Forsyth */ 28774a4d8c2SCharles.Forsyth Reg* rega(void); 288*45a20ab7Sforsyth int rcmp(void*, void*); 28974a4d8c2SCharles.Forsyth void regopt(Prog*); 29074a4d8c2SCharles.Forsyth void addmove(Reg*, int, int, int); 29174a4d8c2SCharles.Forsyth Bits mkvar(Adr*, int); 29274a4d8c2SCharles.Forsyth void prop(Reg*, Bits, Bits); 29374a4d8c2SCharles.Forsyth void loopit(Reg*, long); 29474a4d8c2SCharles.Forsyth void synch(Reg*, Bits); 29574a4d8c2SCharles.Forsyth ulong allreg(ulong, Rgn*); 29674a4d8c2SCharles.Forsyth void paint1(Reg*, int); 29774a4d8c2SCharles.Forsyth ulong paint2(Reg*, int); 29874a4d8c2SCharles.Forsyth void paint3(Reg*, int, long, int); 29974a4d8c2SCharles.Forsyth void addreg(Adr*, int); 30074a4d8c2SCharles.Forsyth 30174a4d8c2SCharles.Forsyth /* 30274a4d8c2SCharles.Forsyth * peep.c 30374a4d8c2SCharles.Forsyth */ 30474a4d8c2SCharles.Forsyth void peep(void); 30574a4d8c2SCharles.Forsyth void excise(Reg*); 30674a4d8c2SCharles.Forsyth Reg* uniqp(Reg*); 30774a4d8c2SCharles.Forsyth Reg* uniqs(Reg*); 30874a4d8c2SCharles.Forsyth int regtyp(Adr*); 30974a4d8c2SCharles.Forsyth int regzer(Adr*); 31074a4d8c2SCharles.Forsyth int anyvar(Adr*); 31174a4d8c2SCharles.Forsyth int subprop(Reg*); 31274a4d8c2SCharles.Forsyth int copyprop(Reg*); 31374a4d8c2SCharles.Forsyth int copy1(Adr*, Adr*, Reg*, int); 31474a4d8c2SCharles.Forsyth int copyu(Prog*, Adr*, Adr*); 31574a4d8c2SCharles.Forsyth 31674a4d8c2SCharles.Forsyth int copyas(Adr*, Adr*); 31774a4d8c2SCharles.Forsyth int copyau(Adr*, Adr*); 31874a4d8c2SCharles.Forsyth int copyau1(Prog*, Adr*); 31974a4d8c2SCharles.Forsyth int copysub(Adr*, Adr*, Adr*, int); 32074a4d8c2SCharles.Forsyth int copysub1(Prog*, Adr*, Adr*, int); 32174a4d8c2SCharles.Forsyth 32274a4d8c2SCharles.Forsyth long RtoB(int); 32374a4d8c2SCharles.Forsyth long FtoB(int); 32474a4d8c2SCharles.Forsyth int BtoR(long); 32574a4d8c2SCharles.Forsyth int BtoF(long); 32674a4d8c2SCharles.Forsyth 32774a4d8c2SCharles.Forsyth #pragma varargck type "A" int 32874a4d8c2SCharles.Forsyth #pragma varargck type "B" Bits 32974a4d8c2SCharles.Forsyth #pragma varargck type "D" Adr* 33074a4d8c2SCharles.Forsyth #pragma varargck type "N" Adr* 33174a4d8c2SCharles.Forsyth #pragma varargck type "P" Prog* 33274a4d8c2SCharles.Forsyth #pragma varargck type "S" char* 333