gc.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  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 "../qc/q.out.h"
  11. /*
  12. * qc/power
  13. * powerpc
  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. union
  36. {
  37. long offset;
  38. double dval;
  39. char sval[NSNAME];
  40. };
  41. Sym* sym;
  42. char type;
  43. char reg;
  44. char name;
  45. char etype;
  46. };
  47. #define A ((Adr*)0)
  48. #define INDEXED 9
  49. struct Prog
  50. {
  51. Adr from;
  52. Adr from3; /* third argument for fmadd, fmsub, ... */
  53. Adr to;
  54. Prog* link;
  55. long lineno;
  56. short as;
  57. char reg;
  58. };
  59. #define P ((Prog*)0)
  60. struct Case
  61. {
  62. Case* link;
  63. vlong val;
  64. long label;
  65. char def;
  66. char isv;
  67. };
  68. #define C ((Case*)0)
  69. struct C1
  70. {
  71. vlong val;
  72. long label;
  73. };
  74. struct Multab
  75. {
  76. long val;
  77. char code[20];
  78. };
  79. struct Hintab
  80. {
  81. ushort val;
  82. char hint[10];
  83. };
  84. struct Var
  85. {
  86. long offset;
  87. Sym* sym;
  88. char name;
  89. char etype;
  90. };
  91. struct Reg
  92. {
  93. long pc;
  94. long rpo; /* reverse post ordering */
  95. Bits set;
  96. Bits use1;
  97. Bits use2;
  98. Bits refbehind;
  99. Bits refahead;
  100. Bits calbehind;
  101. Bits calahead;
  102. Bits regdiff;
  103. Bits act;
  104. long regu;
  105. long loop; /* could be shorter */
  106. union
  107. {
  108. Reg* log5;
  109. long active;
  110. };
  111. Reg* p1;
  112. Reg* p2;
  113. Reg* p2link;
  114. Reg* s1;
  115. Reg* s2;
  116. Reg* link;
  117. Prog* prog;
  118. };
  119. #define R ((Reg*)0)
  120. #define NRGN 600
  121. struct Rgn
  122. {
  123. Reg* enter;
  124. short cost;
  125. short varno;
  126. short regno;
  127. };
  128. EXTERN long breakpc;
  129. EXTERN long nbreak;
  130. EXTERN Case* cases;
  131. EXTERN Node constnode;
  132. EXTERN Node fconstnode;
  133. EXTERN long continpc;
  134. EXTERN long curarg;
  135. EXTERN long cursafe;
  136. EXTERN Prog* firstp;
  137. EXTERN Prog* lastp;
  138. EXTERN int hintabsize;
  139. EXTERN long maxargsafe;
  140. EXTERN Multab multab[20];
  141. EXTERN int mnstring;
  142. EXTERN Node* nodrat;
  143. EXTERN Node* nodret;
  144. EXTERN Node* nodsafe;
  145. EXTERN Node* nodretv;
  146. EXTERN long nrathole;
  147. EXTERN long nstring;
  148. EXTERN Prog* p;
  149. EXTERN long pc;
  150. EXTERN Node regnode;
  151. EXTERN char string[NSNAME];
  152. EXTERN Sym* symrathole;
  153. EXTERN Node znode;
  154. EXTERN Prog zprog;
  155. EXTERN int reg[NREG+NREG];
  156. EXTERN long exregoffset;
  157. EXTERN long exfregoffset;
  158. #define BLOAD(r) band(bnot(r->refbehind), r->refahead)
  159. #define BSTORE(r) band(bnot(r->calbehind), r->calahead)
  160. #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z])
  161. #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z])
  162. #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32))
  163. #define CLOAD 5
  164. #define CREF 5
  165. #define CINF 1000
  166. #define LOOP 3
  167. EXTERN Rgn region[NRGN];
  168. EXTERN Rgn* rgp;
  169. EXTERN int nregion;
  170. EXTERN int nvar;
  171. EXTERN Bits externs;
  172. EXTERN Bits params;
  173. EXTERN Bits consts;
  174. EXTERN Bits addrs;
  175. EXTERN long regbits;
  176. EXTERN long exregbits;
  177. EXTERN int change;
  178. EXTERN int suppress;
  179. EXTERN Reg* firstr;
  180. EXTERN Reg* lastr;
  181. EXTERN Reg zreg;
  182. EXTERN Reg* freer;
  183. EXTERN Var var[NVAR];
  184. EXTERN long* idom;
  185. EXTERN Reg** rpo2r;
  186. EXTERN long maxnr;
  187. #define R0ISZERO (debug['0']==0)
  188. extern char* anames[];
  189. extern Hintab hintab[];
  190. /*
  191. * sgen.c
  192. */
  193. void codgen(Node*, Node*);
  194. void gen(Node*);
  195. void usedset(Node*, int);
  196. void noretval(int);
  197. void xcom(Node*);
  198. int bcomplex(Node*, Node*);
  199. /*
  200. * cgen.c
  201. */
  202. void cgen(Node*, Node*);
  203. void reglcgen(Node*, Node*, Node*);
  204. void lcgen(Node*, Node*);
  205. void bcgen(Node*, int);
  206. void boolgen(Node*, int, Node*);
  207. void sugen(Node*, Node*, long);
  208. void layout(Node*, Node*, int, int, Node*);
  209. /*
  210. * txt.c
  211. */
  212. void ginit(void);
  213. void gclean(void);
  214. void nextpc(void);
  215. void gargs(Node*, Node*, Node*);
  216. void garg1(Node*, Node*, Node*, int, Node**);
  217. Node* nodconst(long);
  218. Node* nod32const(vlong);
  219. Node* nodfconst(double);
  220. void nodreg(Node*, Node*, int);
  221. void regret(Node*, Node*);
  222. void regalloc(Node*, Node*, Node*);
  223. void regfree(Node*);
  224. void regialloc(Node*, Node*, Node*);
  225. void regsalloc(Node*, Node*);
  226. void regaalloc1(Node*, Node*);
  227. void regaalloc(Node*, Node*);
  228. void regind(Node*, Node*);
  229. void gprep(Node*, Node*);
  230. void raddr(Node*, Prog*);
  231. void naddr(Node*, Adr*);
  232. void gloadhi(Node*, Node*, int);
  233. void gloadlo(Node*, Node*, int);
  234. void gmove(Node*, Node*);
  235. void gins(int a, Node*, Node*);
  236. void gins3(int a, Node*, Node*, Node*);
  237. void gopcode(int, Node*, Node*, Node*);
  238. int samaddr(Node*, Node*);
  239. void gbranch(int);
  240. void patch(Prog*, long);
  241. int sconst(Node*);
  242. int sval(long);
  243. int uconst(Node*);
  244. long hi64v(Node*);
  245. long lo64v(Node*);
  246. Node* hi64(Node*);
  247. Node* lo64(Node*);
  248. void gpseudo(int, Sym*, Node*);
  249. /*
  250. * swt.c
  251. */
  252. int swcmp(void*, void*);
  253. void doswit(Node*);
  254. void swit1(C1*, int, long, Node*);
  255. void swit2(C1*, int, long, Node*, Node*);
  256. void casf(void);
  257. void bitload(Node*, Node*, Node*, Node*, Node*);
  258. void bitstore(Node*, Node*, Node*, Node*, Node*);
  259. long outstring(char*, long);
  260. int mulcon(Node*, Node*);
  261. Multab* mulcon0(Node*, long);
  262. int mulcon1(Node*, long, Node*);
  263. void nullwarn(Node*, Node*);
  264. void gextern(Sym*, Node*, long, long);
  265. void outcode(void);
  266. void ieeedtod(Ieee*, double);
  267. /*
  268. * list
  269. */
  270. void listinit(void);
  271. int Pconv(Fmt*);
  272. int Aconv(Fmt*);
  273. int Dconv(Fmt*);
  274. int Sconv(Fmt*);
  275. int Nconv(Fmt*);
  276. int Bconv(Fmt*);
  277. /*
  278. * reg.c
  279. */
  280. Reg* rega(void);
  281. int rcmp(void*, void*);
  282. void regopt(Prog*);
  283. void addmove(Reg*, int, int, int);
  284. Bits mkvar(Adr*, int);
  285. void prop(Reg*, Bits, Bits);
  286. void loopit(Reg*, long);
  287. void synch(Reg*, Bits);
  288. uint32_t allreg(uint32_t, Rgn*);
  289. void paint1(Reg*, int);
  290. uint32_t paint2(Reg*, int);
  291. void paint3(Reg*, int, long, int);
  292. void addreg(Adr*, int);
  293. /*
  294. * peep.c
  295. */
  296. void peep(void);
  297. void excise(Reg*);
  298. Reg* uniqp(Reg*);
  299. Reg* uniqs(Reg*);
  300. int regtyp(Adr*);
  301. int regzer(Adr*);
  302. int anyvar(Adr*);
  303. int subprop(Reg*);
  304. int copyprop(Reg*);
  305. int copy1(Adr*, Adr*, Reg*, int);
  306. int copyu(Prog*, Adr*, Adr*);
  307. int copyas(Adr*, Adr*);
  308. int copyau(Adr*, Adr*);
  309. int copyau1(Prog*, Adr*);
  310. int copysub(Adr*, Adr*, Adr*, int);
  311. int copysub1(Prog*, Adr*, Adr*, int);
  312. long RtoB(int);
  313. long FtoB(int);
  314. int BtoR(long);
  315. int BtoF(long);
  316. /*
  317. * com64.c
  318. */
  319. int com64(Node*);
  320. void com64init(void);
  321. void bool64(Node*);
  322. #pragma varargck type "A" int
  323. #pragma varargck type "B" Bits
  324. #pragma varargck type "D" Adr*
  325. #pragma varargck type "N" Adr*
  326. #pragma varargck type "P" Prog*
  327. #pragma varargck type "S" char*