1 #include "../cc/cc.h" 2 #include "../vc/v.out.h" 3 4 /* 5 * 0c/spim 6 * Mips 4000 little endian 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 vlong vval; 33 char sval[NSNAME]; 34 Ieee ieee; 35 36 Sym* sym; 37 char type; 38 char reg; 39 char name; 40 char etype; 41 }; 42 #define A ((Adr*)0) 43 44 #define INDEXED 9 45 struct Prog 46 { 47 Adr from; 48 Adr to; 49 Prog* link; 50 long lineno; 51 char as; 52 char reg; 53 }; 54 #define P ((Prog*)0) 55 56 struct Case 57 { 58 Case* link; 59 long val; 60 long label; 61 char def; 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 long 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 Case* cases; 134 EXTERN Node constnode; 135 EXTERN Node fconstnode; 136 EXTERN long continpc; 137 EXTERN long curarg; 138 EXTERN long cursafe; 139 EXTERN Prog* firstp; 140 EXTERN Prog* lastp; 141 EXTERN long maxargsafe; 142 EXTERN int mnstring; 143 EXTERN Multab multab[20]; 144 EXTERN int retok; 145 EXTERN int hintabsize; 146 EXTERN Node* nodrat; 147 EXTERN Node* nodret; 148 EXTERN Node* nodsafe; 149 EXTERN long nrathole; 150 EXTERN long nstring; 151 EXTERN Prog* p; 152 EXTERN long pc; 153 EXTERN Node regnode; 154 EXTERN char string[NSNAME]; 155 EXTERN Sym* symrathole; 156 EXTERN Node znode; 157 EXTERN Prog zprog; 158 EXTERN int reg[NREG+NREG]; 159 EXTERN long exregoffset; 160 EXTERN long exfregoffset; 161 162 #define BLOAD(r) band(bnot(r->refbehind), r->refahead) 163 #define BSTORE(r) band(bnot(r->calbehind), r->calahead) 164 #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z]) 165 #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z]) 166 167 #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32)) 168 169 #define CLOAD 4 170 #define CREF 5 171 #define CINF 1000 172 #define LOOP 3 173 174 EXTERN Rgn region[NRGN]; 175 EXTERN Rgn* rgp; 176 EXTERN int nregion; 177 EXTERN int nvar; 178 179 EXTERN Bits externs; 180 EXTERN Bits params; 181 EXTERN Bits consts; 182 EXTERN Bits addrs; 183 184 EXTERN long regbits; 185 EXTERN long exregbits; 186 187 EXTERN int change; 188 189 EXTERN Reg* firstr; 190 EXTERN Reg* lastr; 191 EXTERN Reg zreg; 192 EXTERN Reg* freer; 193 EXTERN Var var[NVAR]; 194 EXTERN long* idom; 195 EXTERN Reg** rpo2r; 196 EXTERN long maxnr; 197 198 extern char* anames[]; 199 extern Hintab hintab[]; 200 201 /* 202 * sgen.c 203 */ 204 void codgen(Node*, Node*); 205 void gen(Node*); 206 void noretval(int); 207 void xcom(Node*); 208 void bcomplex(Node*); 209 void usedset(Node*, int); 210 211 /* 212 * cgen.c 213 */ 214 void cgen(Node*, Node*); 215 void reglcgen(Node*, Node*, Node*); 216 void lcgen(Node*, Node*); 217 void bcgen(Node*, int); 218 void boolgen(Node*, int, Node*); 219 void sugen(Node*, Node*, long); 220 void layout(Node*, Node*, int, int, Node*); 221 222 /* 223 * txt.c 224 */ 225 void ginit(void); 226 void gclean(void); 227 void nextpc(void); 228 void gargs(Node*, Node*, Node*); 229 void garg1(Node*, Node*, Node*, int, Node**); 230 Node* nodconst(long); 231 Node* nodfconst(double); 232 void nodreg(Node*, Node*, int); 233 void regret(Node*, Node*); 234 void regalloc(Node*, Node*, Node*); 235 void regfree(Node*); 236 void regialloc(Node*, Node*, Node*); 237 void regsalloc(Node*, Node*); 238 void regaalloc1(Node*, Node*); 239 void regaalloc(Node*, Node*); 240 void regind(Node*, Node*); 241 void gprep(Node*, Node*); 242 void raddr(Node*, Prog*); 243 void naddr(Node*, Adr*); 244 void gmove(Node*, Node*); 245 void gins(int a, Node*, Node*); 246 void gopcode(int, Node*, Node*, Node*); 247 int samaddr(Node*, Node*); 248 void gbranch(int); 249 void patch(Prog*, long); 250 int sconst(Node*); 251 int llconst(Node*); 252 int sval(long); 253 void gpseudo(int, Sym*, Node*); 254 255 /* 256 * swt.c 257 */ 258 int swcmp(const void*, const void*); 259 void doswit(Node*); 260 void swit1(C1*, int, long, Node*, Node*); 261 void casf(void); 262 void bitload(Node*, Node*, Node*, Node*, Node*); 263 void bitstore(Node*, Node*, Node*, Node*, Node*); 264 long outstring(char*, long); 265 int mulcon(Node*, Node*); 266 Multab* mulcon0(long); 267 void nullwarn(Node*, Node*); 268 void sextern(Sym*, Node*, long, long); 269 void gextern(Sym*, Node*, long, long); 270 void outcode(void); 271 void ieeedtod(Ieee*, double); 272 273 /* 274 * list 275 */ 276 void listinit(void); 277 int Pconv(Fmt*); 278 int Aconv(Fmt*); 279 int Dconv(Fmt*); 280 int Sconv(Fmt*); 281 int Nconv(Fmt*); 282 int Bconv(Fmt*); 283 284 /* 285 * reg.c 286 */ 287 Reg* rega(void); 288 int rcmp(const void*, const void*); 289 void regopt(Prog*); 290 void addmove(Reg*, int, int, int); 291 Bits mkvar(Adr*, int); 292 void prop(Reg*, Bits, Bits); 293 void loopit(Reg*, long); 294 void synch(Reg*, Bits); 295 ulong allreg(ulong, Rgn*); 296 void paint1(Reg*, int); 297 ulong paint2(Reg*, int); 298 void paint3(Reg*, int, long, int); 299 void addreg(Adr*, int); 300 301 /* 302 * peep.c 303 */ 304 void peep(void); 305 void excise(Reg*); 306 Reg* uniqp(Reg*); 307 Reg* uniqs(Reg*); 308 int regtyp(Adr*); 309 int regzer(Adr*); 310 int anyvar(Adr*); 311 int subprop(Reg*); 312 int copyprop(Reg*); 313 int copy1(Adr*, Adr*, Reg*, int); 314 int copyu(Prog*, Adr*, Adr*); 315 316 int copyas(Adr*, Adr*); 317 int copyau(Adr*, Adr*); 318 int copyau1(Prog*, Adr*); 319 int copysub(Adr*, Adr*, Adr*, int); 320 int copysub1(Prog*, Adr*, Adr*, int); 321 322 long RtoB(int); 323 long FtoB(int); 324 int BtoR(long); 325 int BtoF(long); 326 327 #pragma varargck type "A" int 328 #pragma varargck type "B" Bits 329 #pragma varargck type "D" Adr* 330 #pragma varargck type "N" Adr* 331 #pragma varargck type "P" Prog* 332 #pragma varargck type "S" char* 333