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