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 17*3ec63e64SDavid 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; 547dd7cddfSDavid du Colombier char as; 557dd7cddfSDavid du Colombier char reg; 567dd7cddfSDavid du Colombier uchar scond; 577dd7cddfSDavid du Colombier }; 587dd7cddfSDavid du Colombier #define P ((Prog*)0) 597dd7cddfSDavid du Colombier 607dd7cddfSDavid du Colombier struct Case 617dd7cddfSDavid du Colombier { 627dd7cddfSDavid du Colombier Case* link; 63afa28516SDavid du Colombier vlong val; 647dd7cddfSDavid du Colombier long label; 657dd7cddfSDavid du Colombier char def; 664ac975e2SDavid du Colombier char isv; 677dd7cddfSDavid du Colombier }; 687dd7cddfSDavid du Colombier #define C ((Case*)0) 697dd7cddfSDavid du Colombier 707dd7cddfSDavid du Colombier struct C1 717dd7cddfSDavid du Colombier { 72afa28516SDavid du Colombier vlong val; 737dd7cddfSDavid du Colombier long label; 747dd7cddfSDavid du Colombier }; 757dd7cddfSDavid du Colombier 767dd7cddfSDavid du Colombier struct Multab 777dd7cddfSDavid du Colombier { 787dd7cddfSDavid du Colombier long val; 797dd7cddfSDavid du Colombier char code[20]; 807dd7cddfSDavid du Colombier }; 817dd7cddfSDavid du Colombier 827dd7cddfSDavid du Colombier struct Hintab 837dd7cddfSDavid du Colombier { 847dd7cddfSDavid du Colombier ushort val; 857dd7cddfSDavid du Colombier char hint[10]; 867dd7cddfSDavid du Colombier }; 877dd7cddfSDavid du Colombier 887dd7cddfSDavid du Colombier struct Var 897dd7cddfSDavid du Colombier { 907dd7cddfSDavid du Colombier long offset; 917dd7cddfSDavid du Colombier Sym* sym; 927dd7cddfSDavid du Colombier char name; 937dd7cddfSDavid du Colombier char etype; 947dd7cddfSDavid du Colombier }; 957dd7cddfSDavid du Colombier 967dd7cddfSDavid du Colombier struct Reg 977dd7cddfSDavid du Colombier { 987dd7cddfSDavid du Colombier long pc; 997dd7cddfSDavid du Colombier long rpo; /* reverse post ordering */ 1007dd7cddfSDavid du Colombier 1017dd7cddfSDavid du Colombier Bits set; 1027dd7cddfSDavid du Colombier Bits use1; 1037dd7cddfSDavid du Colombier Bits use2; 1047dd7cddfSDavid du Colombier 1057dd7cddfSDavid du Colombier Bits refbehind; 1067dd7cddfSDavid du Colombier Bits refahead; 1077dd7cddfSDavid du Colombier Bits calbehind; 1087dd7cddfSDavid du Colombier Bits calahead; 1097dd7cddfSDavid du Colombier Bits regdiff; 1107dd7cddfSDavid du Colombier Bits act; 1117dd7cddfSDavid du Colombier 1127dd7cddfSDavid du Colombier long regu; 1137dd7cddfSDavid du Colombier long loop; /* could be shorter */ 1147dd7cddfSDavid du Colombier 11559cc4ca5SDavid du Colombier 1167dd7cddfSDavid du Colombier Reg* log5; 1177dd7cddfSDavid du Colombier long active; 1187dd7cddfSDavid du Colombier 1197dd7cddfSDavid du Colombier Reg* p1; 1207dd7cddfSDavid du Colombier Reg* p2; 1217dd7cddfSDavid du Colombier Reg* p2link; 1227dd7cddfSDavid du Colombier Reg* s1; 1237dd7cddfSDavid du Colombier Reg* s2; 1247dd7cddfSDavid du Colombier Reg* link; 1257dd7cddfSDavid du Colombier Prog* prog; 1267dd7cddfSDavid du Colombier }; 1277dd7cddfSDavid du Colombier #define R ((Reg*)0) 1287dd7cddfSDavid du Colombier 1294e3613abSDavid du Colombier #define NRGN 1000 /* was 600; raised for paranoia.c */ 1307dd7cddfSDavid du Colombier struct Rgn 1317dd7cddfSDavid du Colombier { 1327dd7cddfSDavid du Colombier Reg* enter; 1337dd7cddfSDavid du Colombier short cost; 1347dd7cddfSDavid du Colombier short varno; 1357dd7cddfSDavid du Colombier short regno; 1367dd7cddfSDavid du Colombier }; 1377dd7cddfSDavid du Colombier 1387dd7cddfSDavid du Colombier EXTERN long breakpc; 1394ac975e2SDavid du Colombier EXTERN long nbreak; 1407dd7cddfSDavid du Colombier EXTERN Case* cases; 1417dd7cddfSDavid du Colombier EXTERN Node constnode; 1427dd7cddfSDavid du Colombier EXTERN Node fconstnode; 1437dd7cddfSDavid du Colombier EXTERN long continpc; 1447dd7cddfSDavid du Colombier EXTERN long curarg; 1457dd7cddfSDavid du Colombier EXTERN long cursafe; 1467dd7cddfSDavid du Colombier EXTERN Prog* firstp; 1477dd7cddfSDavid du Colombier EXTERN Prog* lastp; 1487dd7cddfSDavid du Colombier EXTERN long maxargsafe; 1497dd7cddfSDavid du Colombier EXTERN int mnstring; 1507dd7cddfSDavid du Colombier EXTERN Multab multab[20]; 1517dd7cddfSDavid du Colombier EXTERN int hintabsize; 1527dd7cddfSDavid du Colombier EXTERN Node* nodrat; 1537dd7cddfSDavid du Colombier EXTERN Node* nodret; 1547dd7cddfSDavid du Colombier EXTERN Node* nodsafe; 1557dd7cddfSDavid du Colombier EXTERN long nrathole; 1567dd7cddfSDavid du Colombier EXTERN long nstring; 1577dd7cddfSDavid du Colombier EXTERN Prog* p; 1587dd7cddfSDavid du Colombier EXTERN long pc; 1597dd7cddfSDavid du Colombier EXTERN Node regnode; 1607dd7cddfSDavid du Colombier EXTERN char string[NSNAME]; 1617dd7cddfSDavid du Colombier EXTERN Sym* symrathole; 1627dd7cddfSDavid du Colombier EXTERN Node znode; 1637dd7cddfSDavid du Colombier EXTERN Prog zprog; 1647dd7cddfSDavid du Colombier EXTERN char reg[NREG+NFREG]; 1657dd7cddfSDavid du Colombier EXTERN long exregoffset; 1667dd7cddfSDavid du Colombier EXTERN long exfregoffset; 1679a747e4fSDavid du Colombier EXTERN int suppress; 1687dd7cddfSDavid du Colombier 1697dd7cddfSDavid du Colombier #define BLOAD(r) band(bnot(r->refbehind), r->refahead) 1707dd7cddfSDavid du Colombier #define BSTORE(r) band(bnot(r->calbehind), r->calahead) 1717dd7cddfSDavid du Colombier #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z]) 1727dd7cddfSDavid du Colombier #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z]) 1737dd7cddfSDavid du Colombier 1747dd7cddfSDavid du Colombier #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32)) 1757dd7cddfSDavid du Colombier 1767dd7cddfSDavid du Colombier #define CLOAD 4 1777dd7cddfSDavid du Colombier #define CREF 5 1787dd7cddfSDavid du Colombier #define CINF 1000 1797dd7cddfSDavid du Colombier #define LOOP 3 1807dd7cddfSDavid du Colombier 1817dd7cddfSDavid du Colombier EXTERN Rgn region[NRGN]; 1827dd7cddfSDavid du Colombier EXTERN Rgn* rgp; 1837dd7cddfSDavid du Colombier EXTERN int nregion; 1847dd7cddfSDavid du Colombier EXTERN int nvar; 1857dd7cddfSDavid du Colombier 1867dd7cddfSDavid du Colombier EXTERN Bits externs; 1877dd7cddfSDavid du Colombier EXTERN Bits params; 1887dd7cddfSDavid du Colombier EXTERN Bits consts; 1897dd7cddfSDavid du Colombier EXTERN Bits addrs; 1907dd7cddfSDavid du Colombier 1917dd7cddfSDavid du Colombier EXTERN long regbits; 1927dd7cddfSDavid du Colombier EXTERN long exregbits; 1937dd7cddfSDavid du Colombier 1947dd7cddfSDavid du Colombier EXTERN int change; 1957dd7cddfSDavid du Colombier 1967dd7cddfSDavid du Colombier EXTERN Reg* firstr; 1977dd7cddfSDavid du Colombier EXTERN Reg* lastr; 1987dd7cddfSDavid du Colombier EXTERN Reg zreg; 1997dd7cddfSDavid du Colombier EXTERN Reg* freer; 2007dd7cddfSDavid du Colombier EXTERN Var var[NVAR]; 20159cc4ca5SDavid du Colombier EXTERN long* idom; 20259cc4ca5SDavid du Colombier EXTERN Reg** rpo2r; 20359cc4ca5SDavid du Colombier EXTERN long maxnr; 2047dd7cddfSDavid du Colombier 2057dd7cddfSDavid du Colombier extern char* anames[]; 2067dd7cddfSDavid du Colombier extern Hintab hintab[]; 2077dd7cddfSDavid du Colombier 2087dd7cddfSDavid du Colombier /* 2097dd7cddfSDavid du Colombier * sgen.c 2107dd7cddfSDavid du Colombier */ 2117dd7cddfSDavid du Colombier void codgen(Node*, Node*); 2127dd7cddfSDavid du Colombier void gen(Node*); 2137dd7cddfSDavid du Colombier void noretval(int); 2147dd7cddfSDavid du Colombier void usedset(Node*, int); 2157dd7cddfSDavid du Colombier void xcom(Node*); 2169a747e4fSDavid du Colombier int bcomplex(Node*, Node*); 2177dd7cddfSDavid du Colombier 2187dd7cddfSDavid du Colombier /* 2197dd7cddfSDavid du Colombier * cgen.c 2207dd7cddfSDavid du Colombier */ 2214ac975e2SDavid du Colombier void cgen(Node*, Node*); 2224ac975e2SDavid du Colombier void cgenrel(Node*, Node*, int); 2237dd7cddfSDavid du Colombier void reglcgen(Node*, Node*, Node*); 2247dd7cddfSDavid du Colombier void lcgen(Node*, Node*); 2257dd7cddfSDavid du Colombier void bcgen(Node*, int); 2267dd7cddfSDavid du Colombier void boolgen(Node*, int, Node*); 2277dd7cddfSDavid du Colombier void sugen(Node*, Node*, long); 2287dd7cddfSDavid du Colombier void layout(Node*, Node*, int, int, Node*); 2297dd7cddfSDavid du Colombier 2307dd7cddfSDavid du Colombier /* 2317dd7cddfSDavid du Colombier * txt.c 2327dd7cddfSDavid du Colombier */ 2337dd7cddfSDavid du Colombier void ginit(void); 2347dd7cddfSDavid du Colombier void gclean(void); 2357dd7cddfSDavid du Colombier void nextpc(void); 2367dd7cddfSDavid du Colombier void gargs(Node*, Node*, Node*); 2377dd7cddfSDavid du Colombier void garg1(Node*, Node*, Node*, int, Node**); 2387dd7cddfSDavid du Colombier Node* nodconst(long); 2397dd7cddfSDavid du Colombier Node* nod32const(vlong); 2407dd7cddfSDavid du Colombier Node* nodfconst(double); 2417dd7cddfSDavid du Colombier void nodreg(Node*, Node*, int); 2427dd7cddfSDavid du Colombier void regret(Node*, Node*); 24359cc4ca5SDavid du Colombier int tmpreg(void); 2447dd7cddfSDavid du Colombier void regalloc(Node*, Node*, Node*); 2457dd7cddfSDavid du Colombier void regfree(Node*); 2467dd7cddfSDavid du Colombier void regialloc(Node*, Node*, Node*); 2477dd7cddfSDavid du Colombier void regsalloc(Node*, Node*); 2487dd7cddfSDavid du Colombier void regaalloc1(Node*, Node*); 2497dd7cddfSDavid du Colombier void regaalloc(Node*, Node*); 2507dd7cddfSDavid du Colombier void regind(Node*, Node*); 2517dd7cddfSDavid du Colombier void gprep(Node*, Node*); 2527dd7cddfSDavid du Colombier void raddr(Node*, Prog*); 2537dd7cddfSDavid du Colombier void naddr(Node*, Adr*); 25459cc4ca5SDavid du Colombier void gmovm(Node*, Node*, int); 2557dd7cddfSDavid du Colombier void gmove(Node*, Node*); 256375daca8SDavid du Colombier void gmover(Node*, Node*); 2577dd7cddfSDavid du Colombier void gins(int a, Node*, Node*); 2587dd7cddfSDavid du Colombier void gopcode(int, Node*, Node*, Node*); 2597dd7cddfSDavid du Colombier int samaddr(Node*, Node*); 2607dd7cddfSDavid du Colombier void gbranch(int); 2617dd7cddfSDavid du Colombier void patch(Prog*, long); 2627dd7cddfSDavid du Colombier int sconst(Node*); 2637dd7cddfSDavid du Colombier int sval(long); 2647dd7cddfSDavid du Colombier void gpseudo(int, Sym*, Node*); 2657dd7cddfSDavid du Colombier 2667dd7cddfSDavid du Colombier /* 2677dd7cddfSDavid du Colombier * swt.c 2687dd7cddfSDavid du Colombier */ 2697dd7cddfSDavid du Colombier int swcmp(const void*, const void*); 2707dd7cddfSDavid du Colombier void doswit(Node*); 2714ac975e2SDavid du Colombier void swit1(C1*, int, long, Node*); 2724ac975e2SDavid du Colombier void swit2(C1*, int, long, Node*, Node*); 273ff4cd143SDavid du Colombier void casf(void); 2747dd7cddfSDavid du Colombier void bitload(Node*, Node*, Node*, Node*, Node*); 2757dd7cddfSDavid du Colombier void bitstore(Node*, Node*, Node*, Node*, Node*); 2767dd7cddfSDavid du Colombier long outstring(char*, long); 2777dd7cddfSDavid du Colombier int mulcon(Node*, Node*); 2787dd7cddfSDavid du Colombier Multab* mulcon0(long); 2797dd7cddfSDavid du Colombier void nullwarn(Node*, Node*); 2807dd7cddfSDavid du Colombier void gextern(Sym*, Node*, long, long); 2817dd7cddfSDavid du Colombier void outcode(void); 2827dd7cddfSDavid du Colombier void ieeedtod(Ieee*, double); 2837dd7cddfSDavid du Colombier 2847dd7cddfSDavid du Colombier /* 2857dd7cddfSDavid du Colombier * list 2867dd7cddfSDavid du Colombier */ 2877dd7cddfSDavid du Colombier void listinit(void); 2889a747e4fSDavid du Colombier int Pconv(Fmt*); 2899a747e4fSDavid du Colombier int Aconv(Fmt*); 2909a747e4fSDavid du Colombier int Dconv(Fmt*); 2919a747e4fSDavid du Colombier int Sconv(Fmt*); 2929a747e4fSDavid du Colombier int Nconv(Fmt*); 2939a747e4fSDavid du Colombier int Bconv(Fmt*); 2949a747e4fSDavid du Colombier int Rconv(Fmt*); 2957dd7cddfSDavid du Colombier 2967dd7cddfSDavid du Colombier /* 2977dd7cddfSDavid du Colombier * reg.c 2987dd7cddfSDavid du Colombier */ 2997dd7cddfSDavid du Colombier Reg* rega(void); 3007dd7cddfSDavid du Colombier int rcmp(const void*, const void*); 3017dd7cddfSDavid du Colombier void regopt(Prog*); 3027dd7cddfSDavid du Colombier void addmove(Reg*, int, int, int); 3037dd7cddfSDavid du Colombier Bits mkvar(Adr*, int); 3047dd7cddfSDavid du Colombier void prop(Reg*, Bits, Bits); 3057dd7cddfSDavid du Colombier void loopit(Reg*, long); 3067dd7cddfSDavid du Colombier void synch(Reg*, Bits); 3077dd7cddfSDavid du Colombier ulong allreg(ulong, Rgn*); 3087dd7cddfSDavid du Colombier void paint1(Reg*, int); 3097dd7cddfSDavid du Colombier ulong paint2(Reg*, int); 3107dd7cddfSDavid du Colombier void paint3(Reg*, int, long, int); 3117dd7cddfSDavid du Colombier void addreg(Adr*, int); 3127dd7cddfSDavid du Colombier 3137dd7cddfSDavid du Colombier /* 3147dd7cddfSDavid du Colombier * peep.c 3157dd7cddfSDavid du Colombier */ 3167dd7cddfSDavid du Colombier void peep(void); 3177dd7cddfSDavid du Colombier void excise(Reg*); 3187dd7cddfSDavid du Colombier Reg* uniqp(Reg*); 3197dd7cddfSDavid du Colombier Reg* uniqs(Reg*); 3207dd7cddfSDavid du Colombier int regtyp(Adr*); 3217dd7cddfSDavid du Colombier int regzer(Adr*); 3227dd7cddfSDavid du Colombier int anyvar(Adr*); 3237dd7cddfSDavid du Colombier int subprop(Reg*); 3247dd7cddfSDavid du Colombier int copyprop(Reg*); 32559cc4ca5SDavid du Colombier int shiftprop(Reg*); 32659cc4ca5SDavid du Colombier void constprop(Adr*, Adr*, Reg*); 3277dd7cddfSDavid du Colombier int copy1(Adr*, Adr*, Reg*, int); 3287dd7cddfSDavid du Colombier int copyu(Prog*, Adr*, Adr*); 3297dd7cddfSDavid du Colombier 3307dd7cddfSDavid du Colombier int copyas(Adr*, Adr*); 3317dd7cddfSDavid du Colombier int copyau(Adr*, Adr*); 3327dd7cddfSDavid du Colombier int copyau1(Prog*, Adr*); 3337dd7cddfSDavid du Colombier int copysub(Adr*, Adr*, Adr*, int); 3347dd7cddfSDavid du Colombier int copysub1(Prog*, Adr*, Adr*, int); 3357dd7cddfSDavid du Colombier 3367dd7cddfSDavid du Colombier long RtoB(int); 3377dd7cddfSDavid du Colombier long FtoB(int); 3387dd7cddfSDavid du Colombier int BtoR(long); 3397dd7cddfSDavid du Colombier int BtoF(long); 3407dd7cddfSDavid du Colombier 3417dd7cddfSDavid du Colombier void predicate(void); 3427dd7cddfSDavid du Colombier int isbranch(Prog *); 3437dd7cddfSDavid du Colombier int predicable(Prog *p); 3447dd7cddfSDavid du Colombier int modifiescpsr(Prog *p); 3457dd7cddfSDavid du Colombier 3467dd7cddfSDavid du Colombier #pragma varargck type "A" int 3477dd7cddfSDavid du Colombier #pragma varargck type "B" Bits 3487dd7cddfSDavid du Colombier #pragma varargck type "D" Adr* 3497dd7cddfSDavid du Colombier #pragma varargck type "N" Adr* 35059cc4ca5SDavid du Colombier #pragma varargck type "R" Adr* 3517dd7cddfSDavid du Colombier #pragma varargck type "P" Prog* 3527dd7cddfSDavid du Colombier #pragma varargck type "S" char* 353