gc.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #include "../cc/cc.h"
  10. #include "../vc/v.out.h"
  11. /*
  12. * vc/mips
  13. * Mips 3000
  14. */
  15. #define SZ_CHAR 1
  16. #define SZ_SHORT 2
  17. #define SZ_INT 4
  18. #define SZ_LONG 4
  19. #define SZ_IND 4
  20. #define SZ_FLOAT 4
  21. #define SZ_VLONG 8
  22. #define SZ_DOUBLE 8
  23. #define FNX 100
  24. typedef struct Adr Adr;
  25. typedef struct Prog Prog;
  26. typedef struct Case Case;
  27. typedef struct C1 C1;
  28. typedef struct Multab Multab;
  29. typedef struct Hintab Hintab;
  30. typedef struct Var Var;
  31. typedef struct Reg Reg;
  32. typedef struct Rgn Rgn;
  33. struct Adr
  34. {
  35. long offset;
  36. double dval;
  37. char sval[NSNAME];
  38. Ieee ieee;
  39. Sym* sym;
  40. char type;
  41. char reg;
  42. char name;
  43. char etype;
  44. };
  45. #define A ((Adr*)0)
  46. #define INDEXED 9
  47. struct Prog
  48. {
  49. Adr from;
  50. Adr to;
  51. Prog* link;
  52. long lineno;
  53. char as;
  54. char reg;
  55. };
  56. #define P ((Prog*)0)
  57. struct Case
  58. {
  59. Case* link;
  60. vlong val;
  61. long label;
  62. char def;
  63. char isv;
  64. };
  65. #define C ((Case*)0)
  66. struct C1
  67. {
  68. vlong val;
  69. long label;
  70. };
  71. struct Multab
  72. {
  73. long val;
  74. char code[20];
  75. };
  76. struct Hintab
  77. {
  78. ushort val;
  79. char hint[10];
  80. };
  81. struct Var
  82. {
  83. long offset;
  84. Sym* sym;
  85. char name;
  86. char etype;
  87. };
  88. struct Reg
  89. {
  90. long pc;
  91. long rpo; /* reverse post ordering */
  92. Bits set;
  93. Bits use1;
  94. Bits use2;
  95. Bits refbehind;
  96. Bits refahead;
  97. Bits calbehind;
  98. Bits calahead;
  99. Bits regdiff;
  100. Bits act;
  101. long regu;
  102. long loop; /* could be shorter */
  103. Reg* log5;
  104. long active;
  105. Reg* p1;
  106. Reg* p2;
  107. Reg* p2link;
  108. Reg* s1;
  109. Reg* s2;
  110. Reg* link;
  111. Prog* prog;
  112. };
  113. #define R ((Reg*)0)
  114. #define NRGN 1000 /* was 600; raised for paranoia.c */
  115. struct Rgn
  116. {
  117. Reg* enter;
  118. short cost;
  119. short varno;
  120. short regno;
  121. };
  122. EXTERN long breakpc;
  123. EXTERN long nbreak;
  124. EXTERN Case* cases;
  125. EXTERN Node constnode;
  126. EXTERN Node fconstnode;
  127. EXTERN long continpc;
  128. EXTERN long curarg;
  129. EXTERN long cursafe;
  130. EXTERN Prog* firstp;
  131. EXTERN Prog* lastp;
  132. EXTERN long maxargsafe;
  133. EXTERN int mnstring;
  134. EXTERN Multab multab[20];
  135. EXTERN int hintabsize;
  136. EXTERN Node* nodrat;
  137. EXTERN Node* nodret;
  138. EXTERN Node* nodsafe;
  139. EXTERN long nrathole;
  140. EXTERN long nstring;
  141. EXTERN Prog* p;
  142. EXTERN long pc;
  143. EXTERN Node regnode;
  144. EXTERN char string[NSNAME];
  145. EXTERN Sym* symrathole;
  146. EXTERN Node znode;
  147. EXTERN Prog zprog;
  148. EXTERN int reg[NREG+NREG];
  149. EXTERN long exregoffset;
  150. EXTERN long exfregoffset;
  151. #define BLOAD(r) band(bnot(r->refbehind), r->refahead)
  152. #define BSTORE(r) band(bnot(r->calbehind), r->calahead)
  153. #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z])
  154. #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z])
  155. #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32))
  156. #define CLOAD 4
  157. #define CREF 5
  158. #define CINF 1000
  159. #define LOOP 3
  160. EXTERN Rgn region[NRGN];
  161. EXTERN Rgn* rgp;
  162. EXTERN int nregion;
  163. EXTERN int nvar;
  164. EXTERN Bits externs;
  165. EXTERN Bits params;
  166. EXTERN Bits consts;
  167. EXTERN Bits addrs;
  168. EXTERN long regbits;
  169. EXTERN long exregbits;
  170. EXTERN int change;
  171. EXTERN int suppress;
  172. EXTERN Reg* firstr;
  173. EXTERN Reg* lastr;
  174. EXTERN Reg zreg;
  175. EXTERN Reg* freer;
  176. EXTERN Var var[NVAR];
  177. EXTERN long* idom;
  178. EXTERN Reg** rpo2r;
  179. EXTERN long maxnr;
  180. extern char* anames[];
  181. extern Hintab hintab[];
  182. /*
  183. * sgen.c
  184. */
  185. void codgen(Node*, Node*);
  186. void gen(Node*);
  187. void noretval(int);
  188. void xcom(Node*);
  189. int bcomplex(Node*, Node*);
  190. void usedset(Node*, int);
  191. /*
  192. * cgen.c
  193. */
  194. void cgen(Node*, Node*);
  195. void reglcgen(Node*, Node*, Node*);
  196. void lcgen(Node*, Node*);
  197. void bcgen(Node*, int);
  198. void boolgen(Node*, int, Node*);
  199. void sugen(Node*, Node*, long);
  200. void layout(Node*, Node*, int, int, Node*);
  201. /*
  202. * txt.c
  203. */
  204. void ginit(void);
  205. void gclean(void);
  206. void nextpc(void);
  207. void gargs(Node*, Node*, Node*);
  208. void garg1(Node*, Node*, Node*, int, Node**);
  209. Node* nodconst(long);
  210. Node* nod32const(vlong);
  211. Node* nodfconst(double);
  212. void nodreg(Node*, Node*, int);
  213. void regret(Node*, Node*);
  214. void regalloc(Node*, Node*, Node*);
  215. void regfree(Node*);
  216. void regialloc(Node*, Node*, Node*);
  217. void regsalloc(Node*, Node*);
  218. void regaalloc1(Node*, Node*);
  219. void regaalloc(Node*, Node*);
  220. void regind(Node*, Node*);
  221. void gprep(Node*, Node*);
  222. void raddr(Node*, Prog*);
  223. void naddr(Node*, Adr*);
  224. void gmove(Node*, Node*);
  225. void gins(int a, Node*, Node*);
  226. void gopcode(int, Node*, Node*, Node*);
  227. int samaddr(Node*, Node*);
  228. void gbranch(int);
  229. void patch(Prog*, long);
  230. int sconst(Node*);
  231. int sval(long);
  232. void gpseudo(int, Sym*, Node*);
  233. /*
  234. * swt.c
  235. */
  236. int swcmp(const void*, const void*);
  237. void doswit(Node*);
  238. void swit1(C1*, int, long, Node*);
  239. void swit2(C1*, int, long, Node*, Node*);
  240. void casf(void);
  241. void bitload(Node*, Node*, Node*, Node*, Node*);
  242. void bitstore(Node*, Node*, Node*, Node*, Node*);
  243. long outstring(char*, long);
  244. int mulcon(Node*, Node*);
  245. Multab* mulcon0(long);
  246. void nullwarn(Node*, Node*);
  247. void gextern(Sym*, Node*, long, long);
  248. void outcode(void);
  249. void ieeedtod(Ieee*, double);
  250. /*
  251. * list
  252. */
  253. void listinit(void);
  254. int Pconv(Fmt*);
  255. int Aconv(Fmt*);
  256. int Dconv(Fmt*);
  257. int Sconv(Fmt*);
  258. int Nconv(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(Adr*, int);
  268. void prop(Reg*, Bits, Bits);
  269. void loopit(Reg*, long);
  270. void synch(Reg*, Bits);
  271. uint32_t allreg(uint32_t, Rgn*);
  272. void paint1(Reg*, int);
  273. uint32_t 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 regzer(Adr*);
  285. int anyvar(Adr*);
  286. int subprop(Reg*);
  287. int copyprop(Reg*);
  288. int copy1(Adr*, Adr*, Reg*, int);
  289. int copyu(Prog*, Adr*, Adr*);
  290. int copyas(Adr*, Adr*);
  291. int copyau(Adr*, Adr*);
  292. int copyau1(Prog*, Adr*);
  293. int copysub(Adr*, Adr*, Adr*, int);
  294. int copysub1(Prog*, Adr*, Adr*, int);
  295. long RtoB(int);
  296. long FtoB(int);
  297. int BtoR(long);
  298. int BtoF(long);
  299. #pragma varargck type "A" int
  300. #pragma varargck type "B" Bits
  301. #pragma varargck type "D" Adr*
  302. #pragma varargck type "N" Adr*
  303. #pragma varargck type "P" Prog*
  304. #pragma varargck type "S" char*