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