1*fbadb1c4SDavid du Colombier #include "../cc/cc.h" 2*fbadb1c4SDavid du Colombier #include "../9c/9.out.h" 3*fbadb1c4SDavid du Colombier 4*fbadb1c4SDavid du Colombier /* 5*fbadb1c4SDavid du Colombier * 9c/powerpc64 6*fbadb1c4SDavid du Colombier */ 7*fbadb1c4SDavid du Colombier #define SZ_CHAR 1 8*fbadb1c4SDavid du Colombier #define SZ_SHORT 2 9*fbadb1c4SDavid du Colombier #define SZ_INT 4 10*fbadb1c4SDavid du Colombier #define SZ_LONG 4 11*fbadb1c4SDavid du Colombier #define SZ_IND 8 12*fbadb1c4SDavid du Colombier #define SZ_FLOAT 4 13*fbadb1c4SDavid du Colombier #define SZ_VLONG 8 14*fbadb1c4SDavid du Colombier #define SZ_DOUBLE 8 15*fbadb1c4SDavid du Colombier #define FNX 100 16*fbadb1c4SDavid du Colombier 17*fbadb1c4SDavid du Colombier typedef struct Adr Adr; 18*fbadb1c4SDavid du Colombier typedef struct Prog Prog; 19*fbadb1c4SDavid du Colombier typedef struct Case Case; 20*fbadb1c4SDavid du Colombier typedef struct C1 C1; 21*fbadb1c4SDavid du Colombier typedef struct Multab Multab; 22*fbadb1c4SDavid du Colombier typedef struct Hintab Hintab; 23*fbadb1c4SDavid du Colombier typedef struct Var Var; 24*fbadb1c4SDavid du Colombier typedef struct Reg Reg; 25*fbadb1c4SDavid du Colombier typedef struct Rgn Rgn; 26*fbadb1c4SDavid du Colombier 27*fbadb1c4SDavid du Colombier struct Adr 28*fbadb1c4SDavid du Colombier { 29*fbadb1c4SDavid du Colombier union 30*fbadb1c4SDavid du Colombier { 31*fbadb1c4SDavid du Colombier vlong offset; 32*fbadb1c4SDavid du Colombier double dval; 33*fbadb1c4SDavid du Colombier char sval[NSNAME]; 34*fbadb1c4SDavid du Colombier }; 35*fbadb1c4SDavid du Colombier Sym* sym; 36*fbadb1c4SDavid du Colombier char type; 37*fbadb1c4SDavid du Colombier char reg; 38*fbadb1c4SDavid du Colombier char name; 39*fbadb1c4SDavid du Colombier char etype; 40*fbadb1c4SDavid du Colombier }; 41*fbadb1c4SDavid du Colombier #define A ((Adr*)0) 42*fbadb1c4SDavid du Colombier 43*fbadb1c4SDavid du Colombier #define INDEXED 9 44*fbadb1c4SDavid du Colombier struct Prog 45*fbadb1c4SDavid du Colombier { 46*fbadb1c4SDavid du Colombier Adr from; 47*fbadb1c4SDavid du Colombier Adr from3; /* third argument for fmadd, fmsub, ... */ 48*fbadb1c4SDavid du Colombier Adr to; 49*fbadb1c4SDavid du Colombier Prog* link; 50*fbadb1c4SDavid du Colombier long lineno; 51*fbadb1c4SDavid du Colombier short as; 52*fbadb1c4SDavid du Colombier char reg; 53*fbadb1c4SDavid du Colombier }; 54*fbadb1c4SDavid du Colombier #define P ((Prog*)0) 55*fbadb1c4SDavid du Colombier 56*fbadb1c4SDavid du Colombier struct Case 57*fbadb1c4SDavid du Colombier { 58*fbadb1c4SDavid du Colombier Case* link; 59*fbadb1c4SDavid du Colombier vlong val; 60*fbadb1c4SDavid du Colombier long label; 61*fbadb1c4SDavid du Colombier char def; 62*fbadb1c4SDavid du Colombier char isv; 63*fbadb1c4SDavid du Colombier }; 64*fbadb1c4SDavid du Colombier #define C ((Case*)0) 65*fbadb1c4SDavid du Colombier 66*fbadb1c4SDavid du Colombier struct C1 67*fbadb1c4SDavid du Colombier { 68*fbadb1c4SDavid du Colombier vlong val; 69*fbadb1c4SDavid du Colombier long label; 70*fbadb1c4SDavid du Colombier }; 71*fbadb1c4SDavid du Colombier 72*fbadb1c4SDavid du Colombier struct Multab 73*fbadb1c4SDavid du Colombier { 74*fbadb1c4SDavid du Colombier long val; 75*fbadb1c4SDavid du Colombier char code[20]; 76*fbadb1c4SDavid du Colombier }; 77*fbadb1c4SDavid du Colombier 78*fbadb1c4SDavid du Colombier struct Hintab 79*fbadb1c4SDavid du Colombier { 80*fbadb1c4SDavid du Colombier ushort val; 81*fbadb1c4SDavid du Colombier char hint[10]; 82*fbadb1c4SDavid du Colombier }; 83*fbadb1c4SDavid du Colombier 84*fbadb1c4SDavid du Colombier struct Var 85*fbadb1c4SDavid du Colombier { 86*fbadb1c4SDavid du Colombier vlong offset; 87*fbadb1c4SDavid du Colombier Sym* sym; 88*fbadb1c4SDavid du Colombier char name; 89*fbadb1c4SDavid du Colombier char etype; 90*fbadb1c4SDavid du Colombier }; 91*fbadb1c4SDavid du Colombier 92*fbadb1c4SDavid du Colombier struct Reg 93*fbadb1c4SDavid du Colombier { 94*fbadb1c4SDavid du Colombier long pc; 95*fbadb1c4SDavid du Colombier long rpo; /* reverse post ordering */ 96*fbadb1c4SDavid du Colombier 97*fbadb1c4SDavid du Colombier Bits set; 98*fbadb1c4SDavid du Colombier Bits use1; 99*fbadb1c4SDavid du Colombier Bits use2; 100*fbadb1c4SDavid du Colombier 101*fbadb1c4SDavid du Colombier Bits refbehind; 102*fbadb1c4SDavid du Colombier Bits refahead; 103*fbadb1c4SDavid du Colombier Bits calbehind; 104*fbadb1c4SDavid du Colombier Bits calahead; 105*fbadb1c4SDavid du Colombier Bits regdiff; 106*fbadb1c4SDavid du Colombier Bits act; 107*fbadb1c4SDavid du Colombier 108*fbadb1c4SDavid du Colombier long regu; 109*fbadb1c4SDavid du Colombier long loop; /* could be shorter */ 110*fbadb1c4SDavid du Colombier 111*fbadb1c4SDavid du Colombier union 112*fbadb1c4SDavid du Colombier { 113*fbadb1c4SDavid du Colombier Reg* log5; 114*fbadb1c4SDavid du Colombier long active; 115*fbadb1c4SDavid du Colombier }; 116*fbadb1c4SDavid du Colombier Reg* p1; 117*fbadb1c4SDavid du Colombier Reg* p2; 118*fbadb1c4SDavid du Colombier Reg* p2link; 119*fbadb1c4SDavid du Colombier Reg* s1; 120*fbadb1c4SDavid du Colombier Reg* s2; 121*fbadb1c4SDavid du Colombier Reg* link; 122*fbadb1c4SDavid du Colombier Prog* prog; 123*fbadb1c4SDavid du Colombier }; 124*fbadb1c4SDavid du Colombier #define R ((Reg*)0) 125*fbadb1c4SDavid du Colombier 126*fbadb1c4SDavid du Colombier #define NRGN 600 127*fbadb1c4SDavid du Colombier struct Rgn 128*fbadb1c4SDavid du Colombier { 129*fbadb1c4SDavid du Colombier Reg* enter; 130*fbadb1c4SDavid du Colombier short cost; 131*fbadb1c4SDavid du Colombier short varno; 132*fbadb1c4SDavid du Colombier short regno; 133*fbadb1c4SDavid du Colombier }; 134*fbadb1c4SDavid du Colombier 135*fbadb1c4SDavid du Colombier EXTERN long breakpc; 136*fbadb1c4SDavid du Colombier EXTERN long nbreak; 137*fbadb1c4SDavid du Colombier EXTERN Case* cases; 138*fbadb1c4SDavid du Colombier EXTERN Node constnode; 139*fbadb1c4SDavid du Colombier EXTERN Node fconstnode; 140*fbadb1c4SDavid du Colombier EXTERN Node vconstnode; 141*fbadb1c4SDavid du Colombier EXTERN long continpc; 142*fbadb1c4SDavid du Colombier EXTERN long curarg; 143*fbadb1c4SDavid du Colombier EXTERN long cursafe; 144*fbadb1c4SDavid du Colombier EXTERN Prog* firstp; 145*fbadb1c4SDavid du Colombier EXTERN Prog* lastp; 146*fbadb1c4SDavid du Colombier EXTERN int hintabsize; 147*fbadb1c4SDavid du Colombier EXTERN long maxargsafe; 148*fbadb1c4SDavid du Colombier EXTERN Multab multab[20]; 149*fbadb1c4SDavid du Colombier EXTERN int mnstring; 150*fbadb1c4SDavid du Colombier EXTERN Node* nodrat; 151*fbadb1c4SDavid du Colombier EXTERN Node* nodret; 152*fbadb1c4SDavid du Colombier EXTERN Node* nodsafe; 153*fbadb1c4SDavid du Colombier EXTERN long nrathole; 154*fbadb1c4SDavid du Colombier EXTERN long nstring; 155*fbadb1c4SDavid du Colombier EXTERN Prog* p; 156*fbadb1c4SDavid du Colombier EXTERN long pc; 157*fbadb1c4SDavid du Colombier EXTERN Node regnode; 158*fbadb1c4SDavid du Colombier EXTERN Node qregnode; 159*fbadb1c4SDavid du Colombier EXTERN char string[NSNAME]; 160*fbadb1c4SDavid du Colombier EXTERN Sym* symrathole; 161*fbadb1c4SDavid du Colombier EXTERN Node znode; 162*fbadb1c4SDavid du Colombier EXTERN Prog zprog; 163*fbadb1c4SDavid du Colombier EXTERN int reg[NREG+NREG]; 164*fbadb1c4SDavid du Colombier EXTERN long exregoffset; 165*fbadb1c4SDavid du Colombier EXTERN long exfregoffset; 166*fbadb1c4SDavid du Colombier EXTERN uchar typechlpv[NTYPE]; 167*fbadb1c4SDavid du Colombier 168*fbadb1c4SDavid du Colombier #define BLOAD(r) band(bnot(r->refbehind), r->refahead) 169*fbadb1c4SDavid du Colombier #define BSTORE(r) band(bnot(r->calbehind), r->calahead) 170*fbadb1c4SDavid du Colombier #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z]) 171*fbadb1c4SDavid du Colombier #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z]) 172*fbadb1c4SDavid du Colombier 173*fbadb1c4SDavid du Colombier #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32)) 174*fbadb1c4SDavid du Colombier 175*fbadb1c4SDavid du Colombier #define CLOAD 5 176*fbadb1c4SDavid du Colombier #define CREF 5 177*fbadb1c4SDavid du Colombier #define CINF 1000 178*fbadb1c4SDavid du Colombier #define LOOP 3 179*fbadb1c4SDavid du Colombier 180*fbadb1c4SDavid du Colombier EXTERN Rgn region[NRGN]; 181*fbadb1c4SDavid du Colombier EXTERN Rgn* rgp; 182*fbadb1c4SDavid du Colombier EXTERN int nregion; 183*fbadb1c4SDavid du Colombier EXTERN int nvar; 184*fbadb1c4SDavid du Colombier 185*fbadb1c4SDavid du Colombier EXTERN Bits externs; 186*fbadb1c4SDavid du Colombier EXTERN Bits params; 187*fbadb1c4SDavid du Colombier EXTERN Bits consts; 188*fbadb1c4SDavid du Colombier EXTERN Bits addrs; 189*fbadb1c4SDavid du Colombier 190*fbadb1c4SDavid du Colombier EXTERN long regbits; 191*fbadb1c4SDavid du Colombier EXTERN long exregbits; 192*fbadb1c4SDavid du Colombier 193*fbadb1c4SDavid du Colombier EXTERN int change; 194*fbadb1c4SDavid du Colombier EXTERN int suppress; 195*fbadb1c4SDavid du Colombier 196*fbadb1c4SDavid du Colombier EXTERN Reg* firstr; 197*fbadb1c4SDavid du Colombier EXTERN Reg* lastr; 198*fbadb1c4SDavid du Colombier EXTERN Reg zreg; 199*fbadb1c4SDavid du Colombier EXTERN Reg* freer; 200*fbadb1c4SDavid du Colombier EXTERN Var var[NVAR]; 201*fbadb1c4SDavid du Colombier EXTERN long* idom; 202*fbadb1c4SDavid du Colombier EXTERN Reg** rpo2r; 203*fbadb1c4SDavid du Colombier EXTERN long maxnr; 204*fbadb1c4SDavid du Colombier 205*fbadb1c4SDavid du Colombier #define R0ISZERO (debug['0']==0) 206*fbadb1c4SDavid du Colombier 207*fbadb1c4SDavid du Colombier extern char* anames[]; 208*fbadb1c4SDavid du Colombier extern Hintab hintab[]; 209*fbadb1c4SDavid du Colombier 210*fbadb1c4SDavid du Colombier /* 211*fbadb1c4SDavid du Colombier * sgen.c 212*fbadb1c4SDavid du Colombier */ 213*fbadb1c4SDavid du Colombier void codgen(Node*, Node*); 214*fbadb1c4SDavid du Colombier void gen(Node*); 215*fbadb1c4SDavid du Colombier void usedset(Node*, int); 216*fbadb1c4SDavid du Colombier void noretval(int); 217*fbadb1c4SDavid du Colombier void xcom(Node*); 218*fbadb1c4SDavid du Colombier int bcomplex(Node*, Node*); 219*fbadb1c4SDavid du Colombier 220*fbadb1c4SDavid du Colombier /* 221*fbadb1c4SDavid du Colombier * cgen.c 222*fbadb1c4SDavid du Colombier */ 223*fbadb1c4SDavid du Colombier void cgen(Node*, Node*); 224*fbadb1c4SDavid du Colombier void reglcgen(Node*, Node*, Node*); 225*fbadb1c4SDavid du Colombier void lcgen(Node*, Node*); 226*fbadb1c4SDavid du Colombier void bcgen(Node*, int); 227*fbadb1c4SDavid du Colombier void boolgen(Node*, int, Node*); 228*fbadb1c4SDavid du Colombier void sugen(Node*, Node*, long); 229*fbadb1c4SDavid du Colombier void layout(Node*, Node*, int, int, Node*); 230*fbadb1c4SDavid du Colombier 231*fbadb1c4SDavid du Colombier /* 232*fbadb1c4SDavid du Colombier * txt.c 233*fbadb1c4SDavid du Colombier */ 234*fbadb1c4SDavid du Colombier void ginit(void); 235*fbadb1c4SDavid du Colombier void gclean(void); 236*fbadb1c4SDavid du Colombier void nextpc(void); 237*fbadb1c4SDavid du Colombier void gargs(Node*, Node*, Node*); 238*fbadb1c4SDavid du Colombier void garg1(Node*, Node*, Node*, int, Node**); 239*fbadb1c4SDavid du Colombier Node* nodconst(long); 240*fbadb1c4SDavid du Colombier Node* nod32const(vlong); 241*fbadb1c4SDavid du Colombier Node* nodfconst(double); 242*fbadb1c4SDavid du Colombier void nodreg(Node*, Node*, int); 243*fbadb1c4SDavid du Colombier void regret(Node*, Node*); 244*fbadb1c4SDavid du Colombier void regalloc(Node*, Node*, Node*); 245*fbadb1c4SDavid du Colombier void regfree(Node*); 246*fbadb1c4SDavid du Colombier void regialloc(Node*, Node*, Node*); 247*fbadb1c4SDavid du Colombier void regsalloc(Node*, Node*); 248*fbadb1c4SDavid du Colombier void regaalloc1(Node*, Node*); 249*fbadb1c4SDavid du Colombier void regaalloc(Node*, Node*); 250*fbadb1c4SDavid du Colombier void regind(Node*, Node*); 251*fbadb1c4SDavid du Colombier void gprep(Node*, Node*); 252*fbadb1c4SDavid du Colombier void raddr(Node*, Prog*); 253*fbadb1c4SDavid du Colombier void naddr(Node*, Adr*); 254*fbadb1c4SDavid du Colombier void gmove(Node*, Node*); 255*fbadb1c4SDavid du Colombier void gins(int a, Node*, Node*); 256*fbadb1c4SDavid du Colombier void gopcode(int, Node*, Node*, Node*); 257*fbadb1c4SDavid du Colombier int samaddr(Node*, Node*); 258*fbadb1c4SDavid du Colombier void gbranch(int); 259*fbadb1c4SDavid du Colombier int immconst(Node*); 260*fbadb1c4SDavid du Colombier void patch(Prog*, long); 261*fbadb1c4SDavid du Colombier int sconst(Node*); 262*fbadb1c4SDavid du Colombier int sval(long); 263*fbadb1c4SDavid du Colombier int uconst(Node*); 264*fbadb1c4SDavid du Colombier void gpseudo(int, Sym*, Node*); 265*fbadb1c4SDavid du Colombier 266*fbadb1c4SDavid du Colombier /* 267*fbadb1c4SDavid du Colombier * swt.c 268*fbadb1c4SDavid du Colombier */ 269*fbadb1c4SDavid du Colombier int swcmp(void*, void*); 270*fbadb1c4SDavid du Colombier void doswit(Node*); 271*fbadb1c4SDavid du Colombier void swit1(C1*, int, long, Node*); 272*fbadb1c4SDavid du Colombier void swit2(C1*, int, long, Node*, Node*); 273*fbadb1c4SDavid du Colombier void casf(void); 274*fbadb1c4SDavid du Colombier void bitload(Node*, Node*, Node*, Node*, Node*); 275*fbadb1c4SDavid du Colombier void bitstore(Node*, Node*, Node*, Node*, Node*); 276*fbadb1c4SDavid du Colombier long outstring(char*, long); 277*fbadb1c4SDavid du Colombier int mulcon(Node*, Node*); 278*fbadb1c4SDavid du Colombier Multab* mulcon0(Node*, long); 279*fbadb1c4SDavid du Colombier int mulcon1(Node*, long, Node*); 280*fbadb1c4SDavid du Colombier void nullwarn(Node*, Node*); 281*fbadb1c4SDavid du Colombier void sextern(Sym*, Node*, long, long); 282*fbadb1c4SDavid du Colombier void gextern(Sym*, Node*, long, long); 283*fbadb1c4SDavid du Colombier void outcode(void); 284*fbadb1c4SDavid du Colombier void ieeedtod(Ieee*, double); 285*fbadb1c4SDavid du Colombier 286*fbadb1c4SDavid du Colombier /* 287*fbadb1c4SDavid du Colombier * list 288*fbadb1c4SDavid du Colombier */ 289*fbadb1c4SDavid du Colombier void listinit(void); 290*fbadb1c4SDavid du Colombier int Pconv(Fmt*); 291*fbadb1c4SDavid du Colombier int Aconv(Fmt*); 292*fbadb1c4SDavid du Colombier int Dconv(Fmt*); 293*fbadb1c4SDavid du Colombier int Sconv(Fmt*); 294*fbadb1c4SDavid du Colombier int Nconv(Fmt*); 295*fbadb1c4SDavid du Colombier int Bconv(Fmt*); 296*fbadb1c4SDavid du Colombier 297*fbadb1c4SDavid du Colombier /* 298*fbadb1c4SDavid du Colombier * reg.c 299*fbadb1c4SDavid du Colombier */ 300*fbadb1c4SDavid du Colombier Reg* rega(void); 301*fbadb1c4SDavid du Colombier int rcmp(void*, void*); 302*fbadb1c4SDavid du Colombier void regopt(Prog*); 303*fbadb1c4SDavid du Colombier void addmove(Reg*, int, int, int); 304*fbadb1c4SDavid du Colombier Bits mkvar(Adr*, int); 305*fbadb1c4SDavid du Colombier void prop(Reg*, Bits, Bits); 306*fbadb1c4SDavid du Colombier void loopit(Reg*, long); 307*fbadb1c4SDavid du Colombier void synch(Reg*, Bits); 308*fbadb1c4SDavid du Colombier ulong allreg(ulong, Rgn*); 309*fbadb1c4SDavid du Colombier void paint1(Reg*, int); 310*fbadb1c4SDavid du Colombier ulong paint2(Reg*, int); 311*fbadb1c4SDavid du Colombier void paint3(Reg*, int, long, int); 312*fbadb1c4SDavid du Colombier void addreg(Adr*, int); 313*fbadb1c4SDavid du Colombier 314*fbadb1c4SDavid du Colombier /* 315*fbadb1c4SDavid du Colombier * peep.c 316*fbadb1c4SDavid du Colombier */ 317*fbadb1c4SDavid du Colombier void peep(void); 318*fbadb1c4SDavid du Colombier void excise(Reg*); 319*fbadb1c4SDavid du Colombier Reg* uniqp(Reg*); 320*fbadb1c4SDavid du Colombier Reg* uniqs(Reg*); 321*fbadb1c4SDavid du Colombier int regtyp(Adr*); 322*fbadb1c4SDavid du Colombier int regzer(Adr*); 323*fbadb1c4SDavid du Colombier int anyvar(Adr*); 324*fbadb1c4SDavid du Colombier int subprop(Reg*); 325*fbadb1c4SDavid du Colombier int copyprop(Reg*); 326*fbadb1c4SDavid du Colombier int copy1(Adr*, Adr*, Reg*, int); 327*fbadb1c4SDavid du Colombier int copyu(Prog*, Adr*, Adr*); 328*fbadb1c4SDavid du Colombier 329*fbadb1c4SDavid du Colombier int copyas(Adr*, Adr*); 330*fbadb1c4SDavid du Colombier int copyau(Adr*, Adr*); 331*fbadb1c4SDavid du Colombier int copyau1(Prog*, Adr*); 332*fbadb1c4SDavid du Colombier int copysub(Adr*, Adr*, Adr*, int); 333*fbadb1c4SDavid du Colombier int copysub1(Prog*, Adr*, Adr*, int); 334*fbadb1c4SDavid du Colombier 335*fbadb1c4SDavid du Colombier long RtoB(int); 336*fbadb1c4SDavid du Colombier long FtoB(int); 337*fbadb1c4SDavid du Colombier int BtoR(long); 338*fbadb1c4SDavid du Colombier int BtoF(long); 339*fbadb1c4SDavid du Colombier 340*fbadb1c4SDavid du Colombier /* 341*fbadb1c4SDavid du Colombier * com64.c 342*fbadb1c4SDavid du Colombier */ 343*fbadb1c4SDavid du Colombier int com64(Node*); 344*fbadb1c4SDavid du Colombier void com64init(void); 345*fbadb1c4SDavid du Colombier void bool64(Node*); 346*fbadb1c4SDavid du Colombier 347*fbadb1c4SDavid du Colombier #pragma varargck type "A" int 348*fbadb1c4SDavid du Colombier #pragma varargck type "B" Bits 349*fbadb1c4SDavid du Colombier #pragma varargck type "D" Adr* 350*fbadb1c4SDavid du Colombier #pragma varargck type "N" Adr* 351*fbadb1c4SDavid du Colombier #pragma varargck type "P" Prog* 352*fbadb1c4SDavid du Colombier #pragma varargck type "S" char* 353