17dd7cddfSDavid du Colombier #include "../cc/cc.h" 27dd7cddfSDavid du Colombier #include "../qc/q.out.h" 37dd7cddfSDavid du Colombier 47dd7cddfSDavid du Colombier /* 57dd7cddfSDavid du Colombier * qc/power 67dd7cddfSDavid du Colombier * powerpc 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 287dd7cddfSDavid du Colombier struct Adr 297dd7cddfSDavid du Colombier { 307dd7cddfSDavid du Colombier union 317dd7cddfSDavid du Colombier { 327dd7cddfSDavid du Colombier long offset; 337dd7cddfSDavid du Colombier double dval; 347dd7cddfSDavid du Colombier char sval[NSNAME]; 357dd7cddfSDavid du Colombier }; 367dd7cddfSDavid du Colombier Sym* sym; 377dd7cddfSDavid du Colombier char type; 387dd7cddfSDavid du Colombier char reg; 397dd7cddfSDavid du Colombier char name; 407dd7cddfSDavid du Colombier char etype; 417dd7cddfSDavid du Colombier }; 427dd7cddfSDavid du Colombier #define A ((Adr*)0) 437dd7cddfSDavid du Colombier 447dd7cddfSDavid du Colombier #define INDEXED 9 457dd7cddfSDavid du Colombier struct Prog 467dd7cddfSDavid du Colombier { 477dd7cddfSDavid du Colombier Adr from; 487dd7cddfSDavid du Colombier Adr from3; /* third argument for fmadd, fmsub, ... */ 497dd7cddfSDavid du Colombier Adr to; 507dd7cddfSDavid du Colombier Prog* link; 517dd7cddfSDavid du Colombier long lineno; 527dd7cddfSDavid du Colombier short as; 537dd7cddfSDavid du Colombier char reg; 547dd7cddfSDavid du Colombier }; 557dd7cddfSDavid du Colombier #define P ((Prog*)0) 567dd7cddfSDavid du Colombier 577dd7cddfSDavid du Colombier struct Case 587dd7cddfSDavid du Colombier { 597dd7cddfSDavid du Colombier Case* link; 60*3a276d32SDavid du Colombier vlong val; 617dd7cddfSDavid du Colombier long label; 627dd7cddfSDavid du Colombier char def; 634ac975e2SDavid du Colombier char isv; 647dd7cddfSDavid du Colombier }; 657dd7cddfSDavid du Colombier #define C ((Case*)0) 667dd7cddfSDavid du Colombier 677dd7cddfSDavid du Colombier struct C1 687dd7cddfSDavid du Colombier { 69*3a276d32SDavid du Colombier vlong val; 707dd7cddfSDavid du Colombier long label; 717dd7cddfSDavid du Colombier }; 727dd7cddfSDavid du Colombier 737dd7cddfSDavid du Colombier struct Multab 747dd7cddfSDavid du Colombier { 757dd7cddfSDavid du Colombier long val; 767dd7cddfSDavid du Colombier char code[20]; 777dd7cddfSDavid du Colombier }; 787dd7cddfSDavid du Colombier 797dd7cddfSDavid du Colombier struct Hintab 807dd7cddfSDavid du Colombier { 817dd7cddfSDavid du Colombier ushort val; 827dd7cddfSDavid du Colombier char hint[10]; 837dd7cddfSDavid du Colombier }; 847dd7cddfSDavid du Colombier 857dd7cddfSDavid du Colombier struct Var 867dd7cddfSDavid du Colombier { 877dd7cddfSDavid du Colombier long offset; 887dd7cddfSDavid du Colombier Sym* sym; 897dd7cddfSDavid du Colombier char name; 907dd7cddfSDavid du Colombier char etype; 917dd7cddfSDavid du Colombier }; 927dd7cddfSDavid du Colombier 937dd7cddfSDavid du Colombier struct Reg 947dd7cddfSDavid du Colombier { 957dd7cddfSDavid du Colombier long pc; 967dd7cddfSDavid du Colombier long rpo; /* reverse post ordering */ 977dd7cddfSDavid du Colombier 987dd7cddfSDavid du Colombier Bits set; 997dd7cddfSDavid du Colombier Bits use1; 1007dd7cddfSDavid du Colombier Bits use2; 1017dd7cddfSDavid du Colombier 1027dd7cddfSDavid du Colombier Bits refbehind; 1037dd7cddfSDavid du Colombier Bits refahead; 1047dd7cddfSDavid du Colombier Bits calbehind; 1057dd7cddfSDavid du Colombier Bits calahead; 1067dd7cddfSDavid du Colombier Bits regdiff; 1077dd7cddfSDavid du Colombier Bits act; 1087dd7cddfSDavid du Colombier 1097dd7cddfSDavid du Colombier long regu; 1107dd7cddfSDavid du Colombier long loop; /* could be shorter */ 1117dd7cddfSDavid du Colombier 1127dd7cddfSDavid du Colombier union 1137dd7cddfSDavid du Colombier { 1147dd7cddfSDavid du Colombier Reg* log5; 1157dd7cddfSDavid du Colombier long active; 1167dd7cddfSDavid du Colombier }; 1177dd7cddfSDavid du Colombier Reg* p1; 1187dd7cddfSDavid du Colombier Reg* p2; 1197dd7cddfSDavid du Colombier Reg* p2link; 1207dd7cddfSDavid du Colombier Reg* s1; 1217dd7cddfSDavid du Colombier Reg* s2; 1227dd7cddfSDavid du Colombier Reg* link; 1237dd7cddfSDavid du Colombier Prog* prog; 1247dd7cddfSDavid du Colombier }; 1257dd7cddfSDavid du Colombier #define R ((Reg*)0) 1267dd7cddfSDavid du Colombier 1277dd7cddfSDavid du Colombier #define NRGN 600 1287dd7cddfSDavid du Colombier struct Rgn 1297dd7cddfSDavid du Colombier { 1307dd7cddfSDavid du Colombier Reg* enter; 1317dd7cddfSDavid du Colombier short cost; 1327dd7cddfSDavid du Colombier short varno; 1337dd7cddfSDavid du Colombier short regno; 1347dd7cddfSDavid du Colombier }; 1357dd7cddfSDavid du Colombier 13659cc4ca5SDavid du Colombier EXTERN long breakpc; 1374ac975e2SDavid du Colombier EXTERN long nbreak; 13859cc4ca5SDavid du Colombier EXTERN Case* cases; 13959cc4ca5SDavid du Colombier EXTERN Node constnode; 14059cc4ca5SDavid du Colombier EXTERN Node fconstnode; 14159cc4ca5SDavid du Colombier EXTERN long continpc; 14259cc4ca5SDavid du Colombier EXTERN long curarg; 14359cc4ca5SDavid du Colombier EXTERN long cursafe; 14459cc4ca5SDavid du Colombier EXTERN Prog* firstp; 14559cc4ca5SDavid du Colombier EXTERN Prog* lastp; 14659cc4ca5SDavid du Colombier EXTERN int hintabsize; 14759cc4ca5SDavid du Colombier EXTERN long maxargsafe; 14859cc4ca5SDavid du Colombier EXTERN Multab multab[20]; 14959cc4ca5SDavid du Colombier EXTERN int mnstring; 15059cc4ca5SDavid du Colombier EXTERN Node* nodrat; 15159cc4ca5SDavid du Colombier EXTERN Node* nodret; 15259cc4ca5SDavid du Colombier EXTERN Node* nodsafe; 1536891d857SDavid du Colombier EXTERN Node* nodretv; 15459cc4ca5SDavid du Colombier EXTERN long nrathole; 15559cc4ca5SDavid du Colombier EXTERN long nstring; 15659cc4ca5SDavid du Colombier EXTERN Prog* p; 15759cc4ca5SDavid du Colombier EXTERN long pc; 15859cc4ca5SDavid du Colombier EXTERN Node regnode; 15959cc4ca5SDavid du Colombier EXTERN char string[NSNAME]; 16059cc4ca5SDavid du Colombier EXTERN Sym* symrathole; 16159cc4ca5SDavid du Colombier EXTERN Node znode; 16259cc4ca5SDavid du Colombier EXTERN Prog zprog; 163375daca8SDavid du Colombier EXTERN int reg[NREG+NREG]; 16459cc4ca5SDavid du Colombier EXTERN long exregoffset; 16559cc4ca5SDavid du Colombier EXTERN long exfregoffset; 1667dd7cddfSDavid du Colombier 1677dd7cddfSDavid du Colombier #define BLOAD(r) band(bnot(r->refbehind), r->refahead) 1687dd7cddfSDavid du Colombier #define BSTORE(r) band(bnot(r->calbehind), r->calahead) 1697dd7cddfSDavid du Colombier #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z]) 1707dd7cddfSDavid du Colombier #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z]) 1717dd7cddfSDavid du Colombier 1727dd7cddfSDavid du Colombier #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32)) 1737dd7cddfSDavid du Colombier 1747dd7cddfSDavid du Colombier #define CLOAD 5 1757dd7cddfSDavid du Colombier #define CREF 5 1767dd7cddfSDavid du Colombier #define CINF 1000 1777dd7cddfSDavid du Colombier #define LOOP 3 1787dd7cddfSDavid du Colombier 17959cc4ca5SDavid du Colombier EXTERN Rgn region[NRGN]; 18059cc4ca5SDavid du Colombier EXTERN Rgn* rgp; 18159cc4ca5SDavid du Colombier EXTERN int nregion; 18259cc4ca5SDavid du Colombier EXTERN int nvar; 1837dd7cddfSDavid du Colombier 18459cc4ca5SDavid du Colombier EXTERN Bits externs; 18559cc4ca5SDavid du Colombier EXTERN Bits params; 18659cc4ca5SDavid du Colombier EXTERN Bits consts; 18759cc4ca5SDavid du Colombier EXTERN Bits addrs; 1887dd7cddfSDavid du Colombier 18959cc4ca5SDavid du Colombier EXTERN long regbits; 19059cc4ca5SDavid du Colombier EXTERN long exregbits; 1917dd7cddfSDavid du Colombier 19259cc4ca5SDavid du Colombier EXTERN int change; 193375daca8SDavid du Colombier EXTERN int suppress; 1947dd7cddfSDavid du Colombier 19559cc4ca5SDavid du Colombier EXTERN Reg* firstr; 19659cc4ca5SDavid du Colombier EXTERN Reg* lastr; 19759cc4ca5SDavid du Colombier EXTERN Reg zreg; 19859cc4ca5SDavid du Colombier EXTERN Reg* freer; 19959cc4ca5SDavid du Colombier EXTERN Var var[NVAR]; 20059cc4ca5SDavid du Colombier EXTERN long* idom; 20159cc4ca5SDavid du Colombier EXTERN Reg** rpo2r; 20259cc4ca5SDavid du Colombier EXTERN long maxnr; 2037dd7cddfSDavid du Colombier 204375daca8SDavid du Colombier #define R0ISZERO (debug['0']==0) 205375daca8SDavid du Colombier 2067dd7cddfSDavid du Colombier extern char* anames[]; 2077dd7cddfSDavid du Colombier extern Hintab hintab[]; 2087dd7cddfSDavid du Colombier 2097dd7cddfSDavid du Colombier /* 2107dd7cddfSDavid du Colombier * sgen.c 2117dd7cddfSDavid du Colombier */ 2127dd7cddfSDavid du Colombier void codgen(Node*, Node*); 2137dd7cddfSDavid du Colombier void gen(Node*); 2147dd7cddfSDavid du Colombier void usedset(Node*, int); 2157dd7cddfSDavid du Colombier void noretval(int); 2167dd7cddfSDavid du Colombier void xcom(Node*); 217375daca8SDavid du Colombier int bcomplex(Node*, Node*); 2187dd7cddfSDavid du Colombier 2197dd7cddfSDavid du Colombier /* 2207dd7cddfSDavid du Colombier * cgen.c 2217dd7cddfSDavid du Colombier */ 2227dd7cddfSDavid du Colombier void cgen(Node*, Node*); 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*); 2437dd7cddfSDavid du Colombier void regalloc(Node*, Node*, Node*); 2447dd7cddfSDavid du Colombier void regfree(Node*); 2457dd7cddfSDavid du Colombier void regialloc(Node*, Node*, Node*); 2467dd7cddfSDavid du Colombier void regsalloc(Node*, Node*); 2477dd7cddfSDavid du Colombier void regaalloc1(Node*, Node*); 2487dd7cddfSDavid du Colombier void regaalloc(Node*, Node*); 2497dd7cddfSDavid du Colombier void regind(Node*, Node*); 2507dd7cddfSDavid du Colombier void gprep(Node*, Node*); 2517dd7cddfSDavid du Colombier void raddr(Node*, Prog*); 2527dd7cddfSDavid du Colombier void naddr(Node*, Adr*); 2536891d857SDavid du Colombier void gloadhi(Node*, Node*, int); 2546891d857SDavid du Colombier void gloadlo(Node*, Node*, int); 2557dd7cddfSDavid du Colombier void gmove(Node*, Node*); 2567dd7cddfSDavid du Colombier void gins(int a, Node*, Node*); 2576891d857SDavid du Colombier void gins3(int a, Node*, 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 int uconst(Node*); 2656891d857SDavid du Colombier long hi64v(Node*); 2666891d857SDavid du Colombier long lo64v(Node*); 2676891d857SDavid du Colombier Node* hi64(Node*); 2686891d857SDavid du Colombier Node* lo64(Node*); 2697dd7cddfSDavid du Colombier void gpseudo(int, Sym*, Node*); 2707dd7cddfSDavid du Colombier 2717dd7cddfSDavid du Colombier /* 2727dd7cddfSDavid du Colombier * swt.c 2737dd7cddfSDavid du Colombier */ 2747dd7cddfSDavid du Colombier int swcmp(void*, void*); 2757dd7cddfSDavid du Colombier void doswit(Node*); 2764ac975e2SDavid du Colombier void swit1(C1*, int, long, Node*); 2774ac975e2SDavid du Colombier void swit2(C1*, int, long, Node*, Node*); 278ff4cd143SDavid du Colombier void casf(void); 2797dd7cddfSDavid du Colombier void bitload(Node*, Node*, Node*, Node*, Node*); 2807dd7cddfSDavid du Colombier void bitstore(Node*, Node*, Node*, Node*, Node*); 2817dd7cddfSDavid du Colombier long outstring(char*, long); 2827dd7cddfSDavid du Colombier int mulcon(Node*, Node*); 2837dd7cddfSDavid du Colombier Multab* mulcon0(Node*, long); 2847dd7cddfSDavid du Colombier int mulcon1(Node*, long, Node*); 2857dd7cddfSDavid du Colombier void nullwarn(Node*, Node*); 2867dd7cddfSDavid du Colombier void gextern(Sym*, Node*, long, long); 2877dd7cddfSDavid du Colombier void outcode(void); 2887dd7cddfSDavid du Colombier void ieeedtod(Ieee*, double); 2897dd7cddfSDavid du Colombier 2907dd7cddfSDavid du Colombier /* 2917dd7cddfSDavid du Colombier * list 2927dd7cddfSDavid du Colombier */ 2937dd7cddfSDavid du Colombier void listinit(void); 2949a747e4fSDavid du Colombier int Pconv(Fmt*); 2959a747e4fSDavid du Colombier int Aconv(Fmt*); 2969a747e4fSDavid du Colombier int Dconv(Fmt*); 2979a747e4fSDavid du Colombier int Sconv(Fmt*); 2989a747e4fSDavid du Colombier int Nconv(Fmt*); 2999a747e4fSDavid du Colombier int Bconv(Fmt*); 3007dd7cddfSDavid du Colombier 3017dd7cddfSDavid du Colombier /* 3027dd7cddfSDavid du Colombier * reg.c 3037dd7cddfSDavid du Colombier */ 3047dd7cddfSDavid du Colombier Reg* rega(void); 3057dd7cddfSDavid du Colombier int rcmp(void*, void*); 3067dd7cddfSDavid du Colombier void regopt(Prog*); 3077dd7cddfSDavid du Colombier void addmove(Reg*, int, int, int); 3087dd7cddfSDavid du Colombier Bits mkvar(Adr*, int); 3097dd7cddfSDavid du Colombier void prop(Reg*, Bits, Bits); 3107dd7cddfSDavid du Colombier void loopit(Reg*, long); 3117dd7cddfSDavid du Colombier void synch(Reg*, Bits); 3127dd7cddfSDavid du Colombier ulong allreg(ulong, Rgn*); 3137dd7cddfSDavid du Colombier void paint1(Reg*, int); 3147dd7cddfSDavid du Colombier ulong paint2(Reg*, int); 3157dd7cddfSDavid du Colombier void paint3(Reg*, int, long, int); 3167dd7cddfSDavid du Colombier void addreg(Adr*, int); 3177dd7cddfSDavid du Colombier 3187dd7cddfSDavid du Colombier /* 3197dd7cddfSDavid du Colombier * peep.c 3207dd7cddfSDavid du Colombier */ 3217dd7cddfSDavid du Colombier void peep(void); 3227dd7cddfSDavid du Colombier void excise(Reg*); 3237dd7cddfSDavid du Colombier Reg* uniqp(Reg*); 3247dd7cddfSDavid du Colombier Reg* uniqs(Reg*); 3257dd7cddfSDavid du Colombier int regtyp(Adr*); 3267dd7cddfSDavid du Colombier int regzer(Adr*); 3277dd7cddfSDavid du Colombier int anyvar(Adr*); 3287dd7cddfSDavid du Colombier int subprop(Reg*); 3297dd7cddfSDavid du Colombier int copyprop(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 /* 3457dd7cddfSDavid du Colombier * com64.c 3467dd7cddfSDavid du Colombier */ 3477dd7cddfSDavid du Colombier int com64(Node*); 3487dd7cddfSDavid du Colombier void com64init(void); 3497dd7cddfSDavid du Colombier void bool64(Node*); 3507dd7cddfSDavid du Colombier 3517dd7cddfSDavid du Colombier #pragma varargck type "A" int 3527dd7cddfSDavid du Colombier #pragma varargck type "B" Bits 3537dd7cddfSDavid du Colombier #pragma varargck type "D" Adr* 3547dd7cddfSDavid du Colombier #pragma varargck type "N" Adr* 3557dd7cddfSDavid du Colombier #pragma varargck type "P" Prog* 3567dd7cddfSDavid du Colombier #pragma varargck type "S" char* 357