gc.h 6.3 KB

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