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