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 67dd7cddfSDavid du Colombier * Arm 7500 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 177dd7cddfSDavid du Colombier 187dd7cddfSDavid du Colombier typedef struct Adr Adr; 197dd7cddfSDavid du Colombier typedef struct Prog Prog; 207dd7cddfSDavid du Colombier typedef struct Case Case; 217dd7cddfSDavid du Colombier typedef struct C1 C1; 227dd7cddfSDavid du Colombier typedef struct Multab Multab; 237dd7cddfSDavid du Colombier typedef struct Hintab Hintab; 247dd7cddfSDavid du Colombier typedef struct Var Var; 257dd7cddfSDavid du Colombier typedef struct Reg Reg; 267dd7cddfSDavid du Colombier typedef struct Rgn Rgn; 277dd7cddfSDavid du Colombier 2859cc4ca5SDavid du Colombier 297dd7cddfSDavid du Colombier #define R0ISZERO 0 307dd7cddfSDavid du Colombier 317dd7cddfSDavid du Colombier struct Adr 327dd7cddfSDavid du Colombier { 337dd7cddfSDavid du Colombier long offset; 347dd7cddfSDavid du Colombier double dval; 357dd7cddfSDavid du Colombier char sval[NSNAME]; 367dd7cddfSDavid du Colombier Ieee ieee; 377dd7cddfSDavid du Colombier 387dd7cddfSDavid du Colombier Sym* sym; 397dd7cddfSDavid du Colombier char type; 407dd7cddfSDavid du Colombier char reg; 417dd7cddfSDavid du Colombier char name; 427dd7cddfSDavid du Colombier char etype; 437dd7cddfSDavid du Colombier }; 447dd7cddfSDavid du Colombier #define A ((Adr*)0) 457dd7cddfSDavid du Colombier 467dd7cddfSDavid du Colombier #define INDEXED 9 477dd7cddfSDavid du Colombier struct Prog 487dd7cddfSDavid du Colombier { 497dd7cddfSDavid du Colombier Adr from; 507dd7cddfSDavid du Colombier Adr to; 517dd7cddfSDavid du Colombier Prog* link; 527dd7cddfSDavid du Colombier long lineno; 537dd7cddfSDavid du Colombier char as; 547dd7cddfSDavid du Colombier char reg; 557dd7cddfSDavid du Colombier uchar scond; 567dd7cddfSDavid du Colombier }; 577dd7cddfSDavid du Colombier #define P ((Prog*)0) 587dd7cddfSDavid du Colombier 597dd7cddfSDavid du Colombier struct Case 607dd7cddfSDavid du Colombier { 617dd7cddfSDavid du Colombier Case* link; 627dd7cddfSDavid du Colombier long val; 637dd7cddfSDavid du Colombier long label; 647dd7cddfSDavid du Colombier char def; 65*4ac975e2SDavid du Colombier char isv; 667dd7cddfSDavid du Colombier }; 677dd7cddfSDavid du Colombier #define C ((Case*)0) 687dd7cddfSDavid du Colombier 697dd7cddfSDavid du Colombier struct C1 707dd7cddfSDavid du Colombier { 717dd7cddfSDavid du Colombier long val; 727dd7cddfSDavid du Colombier long label; 737dd7cddfSDavid du Colombier }; 747dd7cddfSDavid du Colombier 757dd7cddfSDavid du Colombier struct Multab 767dd7cddfSDavid du Colombier { 777dd7cddfSDavid du Colombier long val; 787dd7cddfSDavid du Colombier char code[20]; 797dd7cddfSDavid du Colombier }; 807dd7cddfSDavid du Colombier 817dd7cddfSDavid du Colombier struct Hintab 827dd7cddfSDavid du Colombier { 837dd7cddfSDavid du Colombier ushort val; 847dd7cddfSDavid du Colombier char hint[10]; 857dd7cddfSDavid du Colombier }; 867dd7cddfSDavid du Colombier 877dd7cddfSDavid du Colombier struct Var 887dd7cddfSDavid du Colombier { 897dd7cddfSDavid du Colombier long offset; 907dd7cddfSDavid du Colombier Sym* sym; 917dd7cddfSDavid du Colombier char name; 927dd7cddfSDavid du Colombier char etype; 937dd7cddfSDavid du Colombier }; 947dd7cddfSDavid du Colombier 957dd7cddfSDavid du Colombier struct Reg 967dd7cddfSDavid du Colombier { 977dd7cddfSDavid du Colombier long pc; 987dd7cddfSDavid du Colombier long rpo; /* reverse post ordering */ 997dd7cddfSDavid du Colombier 1007dd7cddfSDavid du Colombier Bits set; 1017dd7cddfSDavid du Colombier Bits use1; 1027dd7cddfSDavid du Colombier Bits use2; 1037dd7cddfSDavid du Colombier 1047dd7cddfSDavid du Colombier Bits refbehind; 1057dd7cddfSDavid du Colombier Bits refahead; 1067dd7cddfSDavid du Colombier Bits calbehind; 1077dd7cddfSDavid du Colombier Bits calahead; 1087dd7cddfSDavid du Colombier Bits regdiff; 1097dd7cddfSDavid du Colombier Bits act; 1107dd7cddfSDavid du Colombier 1117dd7cddfSDavid du Colombier long regu; 1127dd7cddfSDavid du Colombier long loop; /* could be shorter */ 1137dd7cddfSDavid du Colombier 11459cc4ca5SDavid du Colombier 1157dd7cddfSDavid du Colombier Reg* log5; 1167dd7cddfSDavid du Colombier long active; 1177dd7cddfSDavid du Colombier 1187dd7cddfSDavid du Colombier Reg* p1; 1197dd7cddfSDavid du Colombier Reg* p2; 1207dd7cddfSDavid du Colombier Reg* p2link; 1217dd7cddfSDavid du Colombier Reg* s1; 1227dd7cddfSDavid du Colombier Reg* s2; 1237dd7cddfSDavid du Colombier Reg* link; 1247dd7cddfSDavid du Colombier Prog* prog; 1257dd7cddfSDavid du Colombier }; 1267dd7cddfSDavid du Colombier #define R ((Reg*)0) 1277dd7cddfSDavid du Colombier 1287dd7cddfSDavid du Colombier #define NRGN 600 1297dd7cddfSDavid du Colombier struct Rgn 1307dd7cddfSDavid du Colombier { 1317dd7cddfSDavid du Colombier Reg* enter; 1327dd7cddfSDavid du Colombier short cost; 1337dd7cddfSDavid du Colombier short varno; 1347dd7cddfSDavid du Colombier short regno; 1357dd7cddfSDavid du Colombier }; 1367dd7cddfSDavid du Colombier 1377dd7cddfSDavid du Colombier EXTERN long breakpc; 138*4ac975e2SDavid du Colombier EXTERN long nbreak; 1397dd7cddfSDavid du Colombier EXTERN Case* cases; 1407dd7cddfSDavid du Colombier EXTERN Node constnode; 1417dd7cddfSDavid du Colombier EXTERN Node fconstnode; 1427dd7cddfSDavid du Colombier EXTERN long continpc; 1437dd7cddfSDavid du Colombier EXTERN long curarg; 1447dd7cddfSDavid du Colombier EXTERN long cursafe; 1457dd7cddfSDavid du Colombier EXTERN Prog* firstp; 1467dd7cddfSDavid du Colombier EXTERN Prog* lastp; 1477dd7cddfSDavid du Colombier EXTERN long maxargsafe; 1487dd7cddfSDavid du Colombier EXTERN int mnstring; 1497dd7cddfSDavid du Colombier EXTERN Multab multab[20]; 1507dd7cddfSDavid du Colombier EXTERN int retok; 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 */ 221*4ac975e2SDavid du Colombier void cgen(Node*, Node*); 222*4ac975e2SDavid 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*); 271*4ac975e2SDavid du Colombier void swit1(C1*, int, long, Node*); 272*4ac975e2SDavid du Colombier void swit2(C1*, int, long, Node*, Node*); 2737dd7cddfSDavid du Colombier void cas(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 sextern(Sym*, Node*, long, long); 2817dd7cddfSDavid du Colombier void gextern(Sym*, Node*, long, long); 2827dd7cddfSDavid du Colombier void outcode(void); 2837dd7cddfSDavid du Colombier void ieeedtod(Ieee*, double); 2847dd7cddfSDavid du Colombier 2857dd7cddfSDavid du Colombier /* 2867dd7cddfSDavid du Colombier * list 2877dd7cddfSDavid du Colombier */ 2887dd7cddfSDavid du Colombier void listinit(void); 2899a747e4fSDavid du Colombier int Pconv(Fmt*); 2909a747e4fSDavid du Colombier int Aconv(Fmt*); 2919a747e4fSDavid du Colombier int Dconv(Fmt*); 2929a747e4fSDavid du Colombier int Sconv(Fmt*); 2939a747e4fSDavid du Colombier int Nconv(Fmt*); 2949a747e4fSDavid du Colombier int Bconv(Fmt*); 2959a747e4fSDavid du Colombier int Rconv(Fmt*); 2967dd7cddfSDavid du Colombier 2977dd7cddfSDavid du Colombier /* 2987dd7cddfSDavid du Colombier * reg.c 2997dd7cddfSDavid du Colombier */ 3007dd7cddfSDavid du Colombier Reg* rega(void); 3017dd7cddfSDavid du Colombier int rcmp(const void*, const void*); 3027dd7cddfSDavid du Colombier void regopt(Prog*); 3037dd7cddfSDavid du Colombier void addmove(Reg*, int, int, int); 3047dd7cddfSDavid du Colombier Bits mkvar(Adr*, int); 3057dd7cddfSDavid du Colombier void prop(Reg*, Bits, Bits); 3067dd7cddfSDavid du Colombier void loopit(Reg*, long); 3077dd7cddfSDavid du Colombier void synch(Reg*, Bits); 3087dd7cddfSDavid du Colombier ulong allreg(ulong, Rgn*); 3097dd7cddfSDavid du Colombier void paint1(Reg*, int); 3107dd7cddfSDavid du Colombier ulong paint2(Reg*, int); 3117dd7cddfSDavid du Colombier void paint3(Reg*, int, long, int); 3127dd7cddfSDavid du Colombier void addreg(Adr*, int); 3137dd7cddfSDavid du Colombier 3147dd7cddfSDavid du Colombier /* 3157dd7cddfSDavid du Colombier * peep.c 3167dd7cddfSDavid du Colombier */ 3177dd7cddfSDavid du Colombier void peep(void); 3187dd7cddfSDavid du Colombier void excise(Reg*); 3197dd7cddfSDavid du Colombier Reg* uniqp(Reg*); 3207dd7cddfSDavid du Colombier Reg* uniqs(Reg*); 3217dd7cddfSDavid du Colombier int regtyp(Adr*); 3227dd7cddfSDavid du Colombier int regzer(Adr*); 3237dd7cddfSDavid du Colombier int anyvar(Adr*); 3247dd7cddfSDavid du Colombier int subprop(Reg*); 3257dd7cddfSDavid du Colombier int copyprop(Reg*); 32659cc4ca5SDavid du Colombier int shiftprop(Reg*); 32759cc4ca5SDavid du Colombier void constprop(Adr*, Adr*, Reg*); 3287dd7cddfSDavid du Colombier int copy1(Adr*, Adr*, Reg*, int); 3297dd7cddfSDavid du Colombier int copyu(Prog*, Adr*, Adr*); 3307dd7cddfSDavid du Colombier 3317dd7cddfSDavid du Colombier int copyas(Adr*, Adr*); 3327dd7cddfSDavid du Colombier int copyau(Adr*, Adr*); 3337dd7cddfSDavid du Colombier int copyau1(Prog*, Adr*); 3347dd7cddfSDavid du Colombier int copysub(Adr*, Adr*, Adr*, int); 3357dd7cddfSDavid du Colombier int copysub1(Prog*, Adr*, Adr*, int); 3367dd7cddfSDavid du Colombier 3377dd7cddfSDavid du Colombier long RtoB(int); 3387dd7cddfSDavid du Colombier long FtoB(int); 3397dd7cddfSDavid du Colombier int BtoR(long); 3407dd7cddfSDavid du Colombier int BtoF(long); 3417dd7cddfSDavid du Colombier 3427dd7cddfSDavid du Colombier void predicate(void); 3437dd7cddfSDavid du Colombier int isbranch(Prog *); 3447dd7cddfSDavid du Colombier int predicable(Prog *p); 3457dd7cddfSDavid du Colombier int modifiescpsr(Prog *p); 3467dd7cddfSDavid du Colombier 3477dd7cddfSDavid du Colombier #pragma varargck type "A" int 3487dd7cddfSDavid du Colombier #pragma varargck type "B" Bits 3497dd7cddfSDavid du Colombier #pragma varargck type "D" Adr* 3507dd7cddfSDavid du Colombier #pragma varargck type "N" Adr* 35159cc4ca5SDavid du Colombier #pragma varargck type "R" Adr* 3527dd7cddfSDavid du Colombier #pragma varargck type "P" Prog* 3537dd7cddfSDavid du Colombier #pragma varargck type "S" char* 354