gc.h 6.8 KB

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