gc.h 5.6 KB

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