17dd7cddfSDavid du Colombier #include "../cc/cc.h" 27dd7cddfSDavid du Colombier #include "../5c/5.out.h" 37dd7cddfSDavid du Colombier 47dd7cddfSDavid du Colombier /* 57dd7cddfSDavid du Colombier * 5c/arm 627acba7cSDavid du Colombier * Arm 77dd7cddfSDavid du Colombier */ 87dd7cddfSDavid du Colombier #define SZ_CHAR 1 97dd7cddfSDavid du Colombier #define SZ_SHORT 2 107dd7cddfSDavid du Colombier #define SZ_INT 4 117dd7cddfSDavid du Colombier #define SZ_LONG 4 127dd7cddfSDavid du Colombier #define SZ_IND 4 137dd7cddfSDavid du Colombier #define SZ_FLOAT 4 147dd7cddfSDavid du Colombier #define SZ_VLONG 8 157dd7cddfSDavid du Colombier #define SZ_DOUBLE 8 167dd7cddfSDavid du Colombier #define FNX 100 173ec63e64SDavid du Colombier #define BTRUE 0x1000 187dd7cddfSDavid du Colombier 197dd7cddfSDavid du Colombier typedef struct Adr Adr; 207dd7cddfSDavid du Colombier typedef struct Prog Prog; 217dd7cddfSDavid du Colombier typedef struct Case Case; 227dd7cddfSDavid du Colombier typedef struct C1 C1; 237dd7cddfSDavid du Colombier typedef struct Multab Multab; 247dd7cddfSDavid du Colombier typedef struct Hintab Hintab; 257dd7cddfSDavid du Colombier typedef struct Var Var; 267dd7cddfSDavid du Colombier typedef struct Reg Reg; 277dd7cddfSDavid du Colombier typedef struct Rgn Rgn; 287dd7cddfSDavid du Colombier 2959cc4ca5SDavid du Colombier 307dd7cddfSDavid du Colombier #define R0ISZERO 0 317dd7cddfSDavid du Colombier 327dd7cddfSDavid du Colombier struct Adr 337dd7cddfSDavid du Colombier { 347dd7cddfSDavid du Colombier long offset; 357dd7cddfSDavid du Colombier double dval; 367dd7cddfSDavid du Colombier char sval[NSNAME]; 377dd7cddfSDavid du Colombier Ieee ieee; 387dd7cddfSDavid du Colombier 397dd7cddfSDavid du Colombier Sym* sym; 407dd7cddfSDavid du Colombier char type; 417dd7cddfSDavid du Colombier char reg; 427dd7cddfSDavid du Colombier char name; 437dd7cddfSDavid du Colombier char etype; 447dd7cddfSDavid du Colombier }; 457dd7cddfSDavid du Colombier #define A ((Adr*)0) 467dd7cddfSDavid du Colombier 477dd7cddfSDavid du Colombier #define INDEXED 9 487dd7cddfSDavid du Colombier struct Prog 497dd7cddfSDavid du Colombier { 507dd7cddfSDavid du Colombier Adr from; 517dd7cddfSDavid du Colombier Adr to; 527dd7cddfSDavid du Colombier Prog* link; 537dd7cddfSDavid du Colombier long lineno; 54*40d01547SDavid du Colombier uchar as; 557dd7cddfSDavid du Colombier char reg; 56*40d01547SDavid du Colombier char reghi; /* for long multiply, double loads */ 577dd7cddfSDavid du Colombier uchar scond; 587dd7cddfSDavid du Colombier }; 597dd7cddfSDavid du Colombier #define P ((Prog*)0) 607dd7cddfSDavid du Colombier 617dd7cddfSDavid du Colombier struct Case 627dd7cddfSDavid du Colombier { 637dd7cddfSDavid du Colombier Case* link; 64afa28516SDavid du Colombier vlong val; 657dd7cddfSDavid du Colombier long label; 667dd7cddfSDavid du Colombier char def; 674ac975e2SDavid du Colombier char isv; 687dd7cddfSDavid du Colombier }; 697dd7cddfSDavid du Colombier #define C ((Case*)0) 707dd7cddfSDavid du Colombier 717dd7cddfSDavid du Colombier struct C1 727dd7cddfSDavid du Colombier { 73afa28516SDavid du Colombier vlong val; 747dd7cddfSDavid du Colombier long label; 757dd7cddfSDavid du Colombier }; 767dd7cddfSDavid du Colombier 777dd7cddfSDavid du Colombier struct Multab 787dd7cddfSDavid du Colombier { 797dd7cddfSDavid du Colombier long val; 807dd7cddfSDavid du Colombier char code[20]; 817dd7cddfSDavid du Colombier }; 827dd7cddfSDavid du Colombier 837dd7cddfSDavid du Colombier struct Hintab 847dd7cddfSDavid du Colombier { 857dd7cddfSDavid du Colombier ushort val; 867dd7cddfSDavid du Colombier char hint[10]; 877dd7cddfSDavid du Colombier }; 887dd7cddfSDavid du Colombier 897dd7cddfSDavid du Colombier struct Var 907dd7cddfSDavid du Colombier { 917dd7cddfSDavid du Colombier long offset; 927dd7cddfSDavid du Colombier Sym* sym; 937dd7cddfSDavid du Colombier char name; 947dd7cddfSDavid du Colombier char etype; 957dd7cddfSDavid du Colombier }; 967dd7cddfSDavid du Colombier 977dd7cddfSDavid du Colombier struct Reg 987dd7cddfSDavid du Colombier { 997dd7cddfSDavid du Colombier long pc; 1007dd7cddfSDavid du Colombier long rpo; /* reverse post ordering */ 1017dd7cddfSDavid du Colombier 1027dd7cddfSDavid du Colombier Bits set; 1037dd7cddfSDavid du Colombier Bits use1; 1047dd7cddfSDavid du Colombier Bits use2; 1057dd7cddfSDavid du Colombier 1067dd7cddfSDavid du Colombier Bits refbehind; 1077dd7cddfSDavid du Colombier Bits refahead; 1087dd7cddfSDavid du Colombier Bits calbehind; 1097dd7cddfSDavid du Colombier Bits calahead; 1107dd7cddfSDavid du Colombier Bits regdiff; 1117dd7cddfSDavid du Colombier Bits act; 1127dd7cddfSDavid du Colombier 1137dd7cddfSDavid du Colombier long regu; 1147dd7cddfSDavid du Colombier long loop; /* could be shorter */ 1157dd7cddfSDavid du Colombier 11659cc4ca5SDavid du Colombier 1177dd7cddfSDavid du Colombier Reg* log5; 1187dd7cddfSDavid du Colombier long active; 1197dd7cddfSDavid du Colombier 1207dd7cddfSDavid du Colombier Reg* p1; 1217dd7cddfSDavid du Colombier Reg* p2; 1227dd7cddfSDavid du Colombier Reg* p2link; 1237dd7cddfSDavid du Colombier Reg* s1; 1247dd7cddfSDavid du Colombier Reg* s2; 1257dd7cddfSDavid du Colombier Reg* link; 1267dd7cddfSDavid du Colombier Prog* prog; 1277dd7cddfSDavid du Colombier }; 1287dd7cddfSDavid du Colombier #define R ((Reg*)0) 1297dd7cddfSDavid du Colombier 130*40d01547SDavid du Colombier #define NRGN 1000 1317dd7cddfSDavid du Colombier struct Rgn 1327dd7cddfSDavid du Colombier { 1337dd7cddfSDavid du Colombier Reg* enter; 1347dd7cddfSDavid du Colombier short cost; 1357dd7cddfSDavid du Colombier short varno; 1367dd7cddfSDavid du Colombier short regno; 1377dd7cddfSDavid du Colombier }; 1387dd7cddfSDavid du Colombier 1397dd7cddfSDavid du Colombier EXTERN long breakpc; 1404ac975e2SDavid du Colombier EXTERN long nbreak; 1417dd7cddfSDavid du Colombier EXTERN Case* cases; 1427dd7cddfSDavid du Colombier EXTERN Node constnode; 1437dd7cddfSDavid du Colombier EXTERN Node fconstnode; 1447dd7cddfSDavid du Colombier EXTERN long continpc; 1457dd7cddfSDavid du Colombier EXTERN long curarg; 1467dd7cddfSDavid du Colombier EXTERN long cursafe; 1477dd7cddfSDavid du Colombier EXTERN Prog* firstp; 1487dd7cddfSDavid du Colombier EXTERN Prog* lastp; 1497dd7cddfSDavid du Colombier EXTERN long maxargsafe; 1507dd7cddfSDavid du Colombier EXTERN int mnstring; 1517dd7cddfSDavid du Colombier EXTERN Multab multab[20]; 1527dd7cddfSDavid du Colombier EXTERN int hintabsize; 1537dd7cddfSDavid du Colombier EXTERN Node* nodrat; 1547dd7cddfSDavid du Colombier EXTERN Node* nodret; 1557dd7cddfSDavid du Colombier EXTERN Node* nodsafe; 1567dd7cddfSDavid du Colombier EXTERN long nrathole; 1577dd7cddfSDavid du Colombier EXTERN long nstring; 1587dd7cddfSDavid du Colombier EXTERN Prog* p; 1597dd7cddfSDavid du Colombier EXTERN long pc; 1607dd7cddfSDavid du Colombier EXTERN Node regnode; 1617dd7cddfSDavid du Colombier EXTERN char string[NSNAME]; 1627dd7cddfSDavid du Colombier EXTERN Sym* symrathole; 1637dd7cddfSDavid du Colombier EXTERN Node znode; 1647dd7cddfSDavid du Colombier EXTERN Prog zprog; 1657dd7cddfSDavid du Colombier EXTERN char reg[NREG+NFREG]; 1667dd7cddfSDavid du Colombier EXTERN long exregoffset; 1677dd7cddfSDavid du Colombier EXTERN long exfregoffset; 1689a747e4fSDavid du Colombier EXTERN int suppress; 1697dd7cddfSDavid du Colombier 1707dd7cddfSDavid du Colombier #define BLOAD(r) band(bnot(r->refbehind), r->refahead) 1717dd7cddfSDavid du Colombier #define BSTORE(r) band(bnot(r->calbehind), r->calahead) 1727dd7cddfSDavid du Colombier #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z]) 1737dd7cddfSDavid du Colombier #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z]) 1747dd7cddfSDavid du Colombier 1757dd7cddfSDavid du Colombier #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32)) 1767dd7cddfSDavid du Colombier 177*40d01547SDavid du Colombier #define isbigendian() align(0, types[TCHAR], Aarg1) 178*40d01547SDavid du Colombier 1797dd7cddfSDavid du Colombier #define CLOAD 4 1807dd7cddfSDavid du Colombier #define CREF 5 1817dd7cddfSDavid du Colombier #define CINF 1000 1827dd7cddfSDavid du Colombier #define LOOP 3 1837dd7cddfSDavid du Colombier 1847dd7cddfSDavid du Colombier EXTERN Rgn region[NRGN]; 1857dd7cddfSDavid du Colombier EXTERN Rgn* rgp; 1867dd7cddfSDavid du Colombier EXTERN int nregion; 1877dd7cddfSDavid du Colombier EXTERN int nvar; 1887dd7cddfSDavid du Colombier 1897dd7cddfSDavid du Colombier EXTERN Bits externs; 1907dd7cddfSDavid du Colombier EXTERN Bits params; 1917dd7cddfSDavid du Colombier EXTERN Bits consts; 1927dd7cddfSDavid du Colombier EXTERN Bits addrs; 1937dd7cddfSDavid du Colombier 1947dd7cddfSDavid du Colombier EXTERN long regbits; 1957dd7cddfSDavid du Colombier EXTERN long exregbits; 1967dd7cddfSDavid du Colombier 1977dd7cddfSDavid du Colombier EXTERN int change; 1987dd7cddfSDavid du Colombier 1997dd7cddfSDavid du Colombier EXTERN Reg* firstr; 2007dd7cddfSDavid du Colombier EXTERN Reg* lastr; 2017dd7cddfSDavid du Colombier EXTERN Reg zreg; 2027dd7cddfSDavid du Colombier EXTERN Reg* freer; 2037dd7cddfSDavid du Colombier EXTERN Var var[NVAR]; 20459cc4ca5SDavid du Colombier EXTERN long* idom; 20559cc4ca5SDavid du Colombier EXTERN Reg** rpo2r; 20659cc4ca5SDavid du Colombier EXTERN long maxnr; 2077dd7cddfSDavid du Colombier 2087dd7cddfSDavid du Colombier extern char* anames[]; 2097dd7cddfSDavid du Colombier extern Hintab hintab[]; 2107dd7cddfSDavid du Colombier 2117dd7cddfSDavid du Colombier /* 2127dd7cddfSDavid du Colombier * sgen.c 2137dd7cddfSDavid du Colombier */ 2147dd7cddfSDavid du Colombier void codgen(Node*, Node*); 2157dd7cddfSDavid du Colombier void gen(Node*); 2167dd7cddfSDavid du Colombier void noretval(int); 2177dd7cddfSDavid du Colombier void usedset(Node*, int); 2187dd7cddfSDavid du Colombier void xcom(Node*); 2199a747e4fSDavid du Colombier int bcomplex(Node*, Node*); 2207dd7cddfSDavid du Colombier 2217dd7cddfSDavid du Colombier /* 2227dd7cddfSDavid du Colombier * cgen.c 2237dd7cddfSDavid du Colombier */ 2244ac975e2SDavid du Colombier void cgen(Node*, Node*); 2254ac975e2SDavid du Colombier void cgenrel(Node*, Node*, int); 2267dd7cddfSDavid du Colombier void reglcgen(Node*, Node*, Node*); 2277dd7cddfSDavid du Colombier void lcgen(Node*, Node*); 2287dd7cddfSDavid du Colombier void bcgen(Node*, int); 2297dd7cddfSDavid du Colombier void boolgen(Node*, int, Node*); 2307dd7cddfSDavid du Colombier void sugen(Node*, Node*, long); 2317dd7cddfSDavid du Colombier void layout(Node*, Node*, int, int, Node*); 2327dd7cddfSDavid du Colombier 2337dd7cddfSDavid du Colombier /* 2347dd7cddfSDavid du Colombier * txt.c 2357dd7cddfSDavid du Colombier */ 2367dd7cddfSDavid du Colombier void ginit(void); 2377dd7cddfSDavid du Colombier void gclean(void); 2387dd7cddfSDavid du Colombier void nextpc(void); 2397dd7cddfSDavid du Colombier void gargs(Node*, Node*, Node*); 2407dd7cddfSDavid du Colombier void garg1(Node*, Node*, Node*, int, Node**); 2417dd7cddfSDavid du Colombier Node* nodconst(long); 2427dd7cddfSDavid du Colombier Node* nod32const(vlong); 2437dd7cddfSDavid du Colombier Node* nodfconst(double); 2447dd7cddfSDavid du Colombier void nodreg(Node*, Node*, int); 2457dd7cddfSDavid du Colombier void regret(Node*, Node*); 24659cc4ca5SDavid du Colombier int tmpreg(void); 2477dd7cddfSDavid du Colombier void regalloc(Node*, Node*, Node*); 2487dd7cddfSDavid du Colombier void regfree(Node*); 2497dd7cddfSDavid du Colombier void regialloc(Node*, Node*, Node*); 2507dd7cddfSDavid du Colombier void regsalloc(Node*, Node*); 2517dd7cddfSDavid du Colombier void regaalloc1(Node*, Node*); 2527dd7cddfSDavid du Colombier void regaalloc(Node*, Node*); 2537dd7cddfSDavid du Colombier void regind(Node*, Node*); 2547dd7cddfSDavid du Colombier void gprep(Node*, Node*); 2557dd7cddfSDavid du Colombier void raddr(Node*, Prog*); 2567dd7cddfSDavid du Colombier void naddr(Node*, Adr*); 25759cc4ca5SDavid du Colombier void gmovm(Node*, Node*, int); 2587dd7cddfSDavid du Colombier void gmove(Node*, Node*); 259375daca8SDavid du Colombier void gmover(Node*, Node*); 2607dd7cddfSDavid du Colombier void gins(int a, Node*, Node*); 2617dd7cddfSDavid du Colombier void gopcode(int, Node*, Node*, Node*); 2627dd7cddfSDavid du Colombier int samaddr(Node*, Node*); 2637dd7cddfSDavid du Colombier void gbranch(int); 2647dd7cddfSDavid du Colombier void patch(Prog*, long); 2657dd7cddfSDavid du Colombier int sconst(Node*); 2667dd7cddfSDavid du Colombier int sval(long); 2677dd7cddfSDavid du Colombier void gpseudo(int, Sym*, Node*); 2687dd7cddfSDavid du Colombier 2697dd7cddfSDavid du Colombier /* 2707dd7cddfSDavid du Colombier * swt.c 2717dd7cddfSDavid du Colombier */ 2727dd7cddfSDavid du Colombier int swcmp(const void*, const void*); 2737dd7cddfSDavid du Colombier void doswit(Node*); 2744ac975e2SDavid du Colombier void swit1(C1*, int, long, Node*); 2754ac975e2SDavid du Colombier void swit2(C1*, int, long, Node*, Node*); 276ff4cd143SDavid du Colombier void casf(void); 2777dd7cddfSDavid du Colombier void bitload(Node*, Node*, Node*, Node*, Node*); 2787dd7cddfSDavid du Colombier void bitstore(Node*, Node*, Node*, Node*, Node*); 2797dd7cddfSDavid du Colombier long outstring(char*, long); 2807dd7cddfSDavid du Colombier int mulcon(Node*, Node*); 2817dd7cddfSDavid du Colombier Multab* mulcon0(long); 2827dd7cddfSDavid du Colombier void nullwarn(Node*, Node*); 2837dd7cddfSDavid du Colombier void gextern(Sym*, Node*, long, long); 2847dd7cddfSDavid du Colombier void outcode(void); 2857dd7cddfSDavid du Colombier void ieeedtod(Ieee*, double); 2867dd7cddfSDavid du Colombier 2877dd7cddfSDavid du Colombier /* 2887dd7cddfSDavid du Colombier * list 2897dd7cddfSDavid du Colombier */ 2907dd7cddfSDavid du Colombier void listinit(void); 2919a747e4fSDavid du Colombier int Pconv(Fmt*); 2929a747e4fSDavid du Colombier int Aconv(Fmt*); 2939a747e4fSDavid du Colombier int Dconv(Fmt*); 2949a747e4fSDavid du Colombier int Sconv(Fmt*); 2959a747e4fSDavid du Colombier int Nconv(Fmt*); 2969a747e4fSDavid du Colombier int Bconv(Fmt*); 2979a747e4fSDavid du Colombier int Rconv(Fmt*); 2987dd7cddfSDavid du Colombier 2997dd7cddfSDavid du Colombier /* 3007dd7cddfSDavid du Colombier * reg.c 3017dd7cddfSDavid du Colombier */ 3027dd7cddfSDavid du Colombier Reg* rega(void); 3037dd7cddfSDavid du Colombier int rcmp(const void*, const void*); 3047dd7cddfSDavid du Colombier void regopt(Prog*); 3057dd7cddfSDavid du Colombier void addmove(Reg*, int, int, int); 3067dd7cddfSDavid du Colombier Bits mkvar(Adr*, int); 3077dd7cddfSDavid du Colombier void prop(Reg*, Bits, Bits); 3087dd7cddfSDavid du Colombier void loopit(Reg*, long); 3097dd7cddfSDavid du Colombier void synch(Reg*, Bits); 3107dd7cddfSDavid du Colombier ulong allreg(ulong, Rgn*); 3117dd7cddfSDavid du Colombier void paint1(Reg*, int); 3127dd7cddfSDavid du Colombier ulong paint2(Reg*, int); 3137dd7cddfSDavid du Colombier void paint3(Reg*, int, long, int); 3147dd7cddfSDavid du Colombier void addreg(Adr*, int); 3157dd7cddfSDavid du Colombier 3167dd7cddfSDavid du Colombier /* 3177dd7cddfSDavid du Colombier * peep.c 3187dd7cddfSDavid du Colombier */ 3197dd7cddfSDavid du Colombier void peep(void); 3207dd7cddfSDavid du Colombier void excise(Reg*); 3217dd7cddfSDavid du Colombier Reg* uniqp(Reg*); 3227dd7cddfSDavid du Colombier Reg* uniqs(Reg*); 3237dd7cddfSDavid du Colombier int regtyp(Adr*); 3247dd7cddfSDavid du Colombier int regzer(Adr*); 3257dd7cddfSDavid du Colombier int anyvar(Adr*); 3267dd7cddfSDavid du Colombier int subprop(Reg*); 3277dd7cddfSDavid du Colombier int copyprop(Reg*); 32859cc4ca5SDavid du Colombier int shiftprop(Reg*); 32959cc4ca5SDavid du Colombier void constprop(Adr*, Adr*, Reg*); 3307dd7cddfSDavid du Colombier int copy1(Adr*, Adr*, Reg*, int); 3317dd7cddfSDavid du Colombier int copyu(Prog*, Adr*, Adr*); 3327dd7cddfSDavid du Colombier 3337dd7cddfSDavid du Colombier int copyas(Adr*, Adr*); 3347dd7cddfSDavid du Colombier int copyau(Adr*, Adr*); 3357dd7cddfSDavid du Colombier int copyau1(Prog*, Adr*); 3367dd7cddfSDavid du Colombier int copysub(Adr*, Adr*, Adr*, int); 3377dd7cddfSDavid du Colombier int copysub1(Prog*, Adr*, Adr*, int); 3387dd7cddfSDavid du Colombier 3397dd7cddfSDavid du Colombier long RtoB(int); 3407dd7cddfSDavid du Colombier long FtoB(int); 3417dd7cddfSDavid du Colombier int BtoR(long); 3427dd7cddfSDavid du Colombier int BtoF(long); 3437dd7cddfSDavid du Colombier 3447dd7cddfSDavid du Colombier void predicate(void); 3457dd7cddfSDavid du Colombier int isbranch(Prog *); 3467dd7cddfSDavid du Colombier int predicable(Prog *p); 3477dd7cddfSDavid du Colombier int modifiescpsr(Prog *p); 3487dd7cddfSDavid du Colombier 3497dd7cddfSDavid du Colombier #pragma varargck type "A" int 350*40d01547SDavid du Colombier #pragma varargck type "A" uint 3517dd7cddfSDavid du Colombier #pragma varargck type "B" Bits 3527dd7cddfSDavid du Colombier #pragma varargck type "D" Adr* 3537dd7cddfSDavid du Colombier #pragma varargck type "N" Adr* 35459cc4ca5SDavid du Colombier #pragma varargck type "R" Adr* 3557dd7cddfSDavid du Colombier #pragma varargck type "P" Prog* 3567dd7cddfSDavid du Colombier #pragma varargck type "S" char* 357