gc.h 5.6 KB

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