gc.h 5.8 KB

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