gc.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. #include "../cc/cc.h"
  2. #include "../9c/9.out.h"
  3. /*
  4. * 9c/powerpc64
  5. */
  6. #define SZ_CHAR 1
  7. #define SZ_SHORT 2
  8. #define SZ_INT 4
  9. #define SZ_LONG 4
  10. #define SZ_IND 8
  11. #define SZ_FLOAT 4
  12. #define SZ_VLONG 8
  13. #define SZ_DOUBLE 8
  14. #define FNX 100
  15. typedef struct Adr Adr;
  16. typedef struct Prog Prog;
  17. typedef struct Case Case;
  18. typedef struct C1 C1;
  19. typedef struct Multab Multab;
  20. typedef struct Hintab Hintab;
  21. typedef struct Var Var;
  22. typedef struct Reg Reg;
  23. typedef struct Rgn Rgn;
  24. struct Adr
  25. {
  26. union
  27. {
  28. vlong offset;
  29. double dval;
  30. char sval[NSNAME];
  31. };
  32. Sym* sym;
  33. char type;
  34. char reg;
  35. char name;
  36. char etype;
  37. };
  38. #define A ((Adr*)0)
  39. #define INDEXED 9
  40. struct Prog
  41. {
  42. Adr from;
  43. Adr from3; /* third argument for fmadd, fmsub, ... */
  44. Adr to;
  45. Prog* link;
  46. long lineno;
  47. short as;
  48. char reg;
  49. };
  50. #define P ((Prog*)0)
  51. struct Case
  52. {
  53. Case* link;
  54. vlong val;
  55. long label;
  56. char def;
  57. char isv;
  58. };
  59. #define C ((Case*)0)
  60. struct C1
  61. {
  62. vlong val;
  63. long label;
  64. };
  65. struct Multab
  66. {
  67. long val;
  68. char code[20];
  69. };
  70. struct Hintab
  71. {
  72. ushort val;
  73. char hint[10];
  74. };
  75. struct Var
  76. {
  77. vlong offset;
  78. Sym* sym;
  79. char name;
  80. char etype;
  81. };
  82. struct Reg
  83. {
  84. long pc;
  85. long rpo; /* reverse post ordering */
  86. Bits set;
  87. Bits use1;
  88. Bits use2;
  89. Bits refbehind;
  90. Bits refahead;
  91. Bits calbehind;
  92. Bits calahead;
  93. Bits regdiff;
  94. Bits act;
  95. long regu;
  96. long loop; /* could be shorter */
  97. union
  98. {
  99. Reg* log5;
  100. long active;
  101. };
  102. Reg* p1;
  103. Reg* p2;
  104. Reg* p2link;
  105. Reg* s1;
  106. Reg* s2;
  107. Reg* link;
  108. Prog* prog;
  109. };
  110. #define R ((Reg*)0)
  111. #define NRGN 600
  112. struct Rgn
  113. {
  114. Reg* enter;
  115. short cost;
  116. short varno;
  117. short regno;
  118. };
  119. EXTERN long breakpc;
  120. EXTERN long nbreak;
  121. EXTERN Case* cases;
  122. EXTERN Node constnode;
  123. EXTERN Node fconstnode;
  124. EXTERN Node vconstnode;
  125. EXTERN long continpc;
  126. EXTERN long curarg;
  127. EXTERN long cursafe;
  128. EXTERN Prog* firstp;
  129. EXTERN Prog* lastp;
  130. EXTERN int hintabsize;
  131. EXTERN long maxargsafe;
  132. EXTERN Multab multab[20];
  133. EXTERN int mnstring;
  134. EXTERN Node* nodrat;
  135. EXTERN Node* nodret;
  136. EXTERN Node* nodsafe;
  137. EXTERN long nrathole;
  138. EXTERN long nstring;
  139. EXTERN Prog* p;
  140. EXTERN long pc;
  141. EXTERN Node regnode;
  142. EXTERN Node qregnode;
  143. EXTERN char string[NSNAME];
  144. EXTERN Sym* symrathole;
  145. EXTERN Node znode;
  146. EXTERN Prog zprog;
  147. EXTERN int reg[NREG+NREG];
  148. EXTERN long exregoffset;
  149. EXTERN long exfregoffset;
  150. EXTERN uchar typechlpv[NTYPE];
  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 5
  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. #define R0ISZERO (debug['0']==0)
  181. extern char* anames[];
  182. extern Hintab hintab[];
  183. /*
  184. * sgen.c
  185. */
  186. void codgen(Node*, Node*);
  187. void gen(Node*);
  188. void usedset(Node*, int);
  189. void noretval(int);
  190. void xcom(Node*);
  191. int bcomplex(Node*, Node*);
  192. /*
  193. * cgen.c
  194. */
  195. void cgen(Node*, Node*);
  196. void reglcgen(Node*, Node*, Node*);
  197. void lcgen(Node*, Node*);
  198. void bcgen(Node*, int);
  199. void boolgen(Node*, int, Node*);
  200. void sugen(Node*, Node*, long);
  201. void layout(Node*, Node*, int, int, Node*);
  202. /*
  203. * txt.c
  204. */
  205. void ginit(void);
  206. void gclean(void);
  207. void nextpc(void);
  208. void gargs(Node*, Node*, Node*);
  209. void garg1(Node*, Node*, Node*, int, Node**);
  210. Node* nodconst(long);
  211. Node* nod32const(vlong);
  212. Node* nodfconst(double);
  213. void nodreg(Node*, Node*, int);
  214. void regret(Node*, Node*);
  215. void regalloc(Node*, Node*, Node*);
  216. void regfree(Node*);
  217. void regialloc(Node*, Node*, Node*);
  218. void regsalloc(Node*, Node*);
  219. void regaalloc1(Node*, Node*);
  220. void regaalloc(Node*, Node*);
  221. void regind(Node*, Node*);
  222. void gprep(Node*, Node*);
  223. void raddr(Node*, Prog*);
  224. void naddr(Node*, Adr*);
  225. void gmove(Node*, Node*);
  226. void gins(int a, Node*, Node*);
  227. void gopcode(int, Node*, Node*, Node*);
  228. int samaddr(Node*, Node*);
  229. void gbranch(int);
  230. int immconst(Node*);
  231. void patch(Prog*, long);
  232. int sconst(Node*);
  233. int sval(long);
  234. int uconst(Node*);
  235. void gpseudo(int, Sym*, Node*);
  236. /*
  237. * swt.c
  238. */
  239. int swcmp(void*, void*);
  240. void doswit(Node*);
  241. void swit1(C1*, int, long, Node*);
  242. void swit2(C1*, int, long, Node*, Node*);
  243. void casf(void);
  244. void bitload(Node*, Node*, Node*, Node*, Node*);
  245. void bitstore(Node*, Node*, Node*, Node*, Node*);
  246. long outstring(char*, long);
  247. int mulcon(Node*, Node*);
  248. Multab* mulcon0(Node*, long);
  249. int mulcon1(Node*, long, Node*);
  250. void nullwarn(Node*, Node*);
  251. void sextern(Sym*, Node*, long, long);
  252. void gextern(Sym*, Node*, long, long);
  253. void outcode(void);
  254. void ieeedtod(Ieee*, double);
  255. /*
  256. * list
  257. */
  258. void listinit(void);
  259. int Pconv(Fmt*);
  260. int Aconv(Fmt*);
  261. int Dconv(Fmt*);
  262. int Sconv(Fmt*);
  263. int Nconv(Fmt*);
  264. int Bconv(Fmt*);
  265. /*
  266. * reg.c
  267. */
  268. Reg* rega(void);
  269. int rcmp(void*, void*);
  270. void regopt(Prog*);
  271. void addmove(Reg*, int, int, int);
  272. Bits mkvar(Adr*, int);
  273. void prop(Reg*, Bits, Bits);
  274. void loopit(Reg*, long);
  275. void synch(Reg*, Bits);
  276. ulong allreg(ulong, Rgn*);
  277. void paint1(Reg*, int);
  278. ulong paint2(Reg*, int);
  279. void paint3(Reg*, int, long, int);
  280. void addreg(Adr*, int);
  281. /*
  282. * peep.c
  283. */
  284. void peep(void);
  285. void excise(Reg*);
  286. Reg* uniqp(Reg*);
  287. Reg* uniqs(Reg*);
  288. int regtyp(Adr*);
  289. int regzer(Adr*);
  290. int anyvar(Adr*);
  291. int subprop(Reg*);
  292. int copyprop(Reg*);
  293. int copy1(Adr*, Adr*, Reg*, int);
  294. int copyu(Prog*, Adr*, Adr*);
  295. int copyas(Adr*, Adr*);
  296. int copyau(Adr*, Adr*);
  297. int copyau1(Prog*, Adr*);
  298. int copysub(Adr*, Adr*, Adr*, int);
  299. int copysub1(Prog*, Adr*, Adr*, int);
  300. long RtoB(int);
  301. long FtoB(int);
  302. int BtoR(long);
  303. int BtoF(long);
  304. /*
  305. * com64.c
  306. */
  307. int com64(Node*);
  308. void com64init(void);
  309. void bool64(Node*);
  310. #pragma varargck type "A" int
  311. #pragma varargck type "B" Bits
  312. #pragma varargck type "D" Adr*
  313. #pragma varargck type "N" Adr*
  314. #pragma varargck type "P" Prog*
  315. #pragma varargck type "S" char*