gc.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. #include "../cc/cc.h"
  2. #include "../2c/2.out.h"
  3. /*
  4. * 2c/68020
  5. * Motorola 68020
  6. */
  7. #define SZ_CHAR 1
  8. #define SZ_SHORT 2
  9. #define SZ_INT 4
  10. #define SZ_LONG 4
  11. #define SZ_IND 4
  12. #define SZ_FLOAT 4
  13. #define SZ_VLONG 8
  14. #define SZ_DOUBLE 8
  15. #define ALLOP OEND
  16. #define NRGN 300
  17. #define FNX 100
  18. #define INDEXED 9
  19. #define PRE 1
  20. #define POST 2
  21. #define TEST 4
  22. typedef struct Adr Adr;
  23. typedef struct Prog Prog;
  24. typedef struct Txt Txt;
  25. typedef struct Cases Case;
  26. typedef struct Reg Reg;
  27. typedef struct Rgn Rgn;
  28. typedef struct Var Var;
  29. typedef struct Multab Multab;
  30. typedef struct C1 C1;
  31. typedef struct Index Index;
  32. struct Index
  33. {
  34. int o0;
  35. int o1;
  36. };
  37. EXTERN struct
  38. {
  39. Node* regtree;
  40. Node* basetree;
  41. short scale;
  42. } idx;
  43. struct Adr
  44. {
  45. long displace;
  46. long offset;
  47. char sval[NSNAME];
  48. double dval;
  49. Sym* sym;
  50. short type;
  51. short index;
  52. short scale;
  53. short field;
  54. short etype;
  55. };
  56. #define A ((Adr*)0)
  57. struct Prog
  58. {
  59. Adr from;
  60. Adr to;
  61. Prog* link;
  62. long lineno;
  63. short as;
  64. };
  65. #define P ((Prog*)0)
  66. struct Txt
  67. {
  68. short movas;
  69. short postext;
  70. char preclr;
  71. };
  72. struct Cases
  73. {
  74. long val;
  75. long label;
  76. uchar def;
  77. Case* link;
  78. };
  79. #define C ((Case*)0)
  80. struct Var
  81. {
  82. long offset;
  83. Sym* sym;
  84. char type;
  85. char etype;
  86. };
  87. struct Reg
  88. {
  89. long pc;
  90. long rpo; /* reverse post ordering */
  91. Bits set;
  92. Bits use1;
  93. Bits use2;
  94. Bits refbehind;
  95. Bits refahead;
  96. Bits calbehind;
  97. Bits calahead;
  98. Bits regdiff;
  99. Bits act;
  100. ulong regu;
  101. long loop; /* could be shorter */
  102. Reg* log5;
  103. long active;
  104. Reg* p1;
  105. Reg* p2;
  106. Reg* p2link;
  107. Reg* s1;
  108. Reg* s2;
  109. Reg* link;
  110. Prog* prog;
  111. };
  112. #define R ((Reg*)0)
  113. struct Rgn
  114. {
  115. Reg* enter;
  116. short costr;
  117. short costa;
  118. short varno;
  119. short regno;
  120. };
  121. struct Multab
  122. {
  123. short val;
  124. char code[6];
  125. };
  126. struct C1
  127. {
  128. long val;
  129. long label;
  130. };
  131. #define BLOAD(r) band(bnot(r->refbehind), r->refahead)
  132. #define BSTORE(r) band(bnot(r->calbehind), r->calahead)
  133. #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z])
  134. #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z])
  135. #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32))
  136. #define CLOAD 8
  137. #define CREF 5
  138. #define CTEST 2
  139. #define CXREF 3
  140. #define CINF 1000
  141. #define LOOP 3
  142. EXTERN Bits externs;
  143. EXTERN Bits params;
  144. EXTERN Bits addrs;
  145. EXTERN ulong regbits;
  146. #define B_INDIR (1<<0)
  147. #define B_ADDR (1<<1)
  148. EXTERN int mvbits;
  149. EXTERN int changer;
  150. EXTERN int changea;
  151. EXTERN Txt txt[NTYPE][NTYPE];
  152. EXTERN short opxt[ALLOP][NTYPE];
  153. EXTERN Txt* txtp;
  154. EXTERN int multabsize;
  155. EXTERN Reg* firstr;
  156. EXTERN Reg* lastr;
  157. EXTERN Reg zreg;
  158. EXTERN Reg* freer;
  159. EXTERN long argoff;
  160. EXTERN long breakpc;
  161. EXTERN long nbreak;
  162. EXTERN Case* cases;
  163. EXTERN long continpc;
  164. EXTERN Prog* firstp;
  165. EXTERN Reg* firstr;
  166. EXTERN int inargs;
  167. EXTERN Prog* lastp;
  168. EXTERN int retok;
  169. EXTERN long mnstring;
  170. EXTERN Node* nodrat;
  171. EXTERN Node* nodret;
  172. EXTERN long nrathole;
  173. EXTERN long nstatic;
  174. EXTERN int nregion;
  175. EXTERN long nstring;
  176. EXTERN int nvar;
  177. EXTERN Prog* p;
  178. EXTERN long pc;
  179. EXTERN Rgn region[NRGN];
  180. EXTERN Rgn* rgp;
  181. EXTERN char string[NSNAME];
  182. EXTERN Sym* symrathole;
  183. EXTERN Sym* symstatic;
  184. EXTERN Var var[NVAR];
  185. EXTERN long* idom;
  186. EXTERN Reg** rpo2r;
  187. EXTERN long maxnr;
  188. EXTERN Prog zprog;
  189. EXTERN uchar regused[NREG];
  190. EXTERN uchar aregused[NREG];
  191. EXTERN uchar fregused[NREG];
  192. EXTERN uchar regbase[I_MASK];
  193. EXTERN long exregoffset;
  194. EXTERN long exaregoffset;
  195. EXTERN long exfregoffset;
  196. extern char* anames[];
  197. extern Multab multab[];
  198. void cgen(Node*, int, Node*);
  199. void lcgen(Node*, int, Node*);
  200. void bcgen(Node*, int);
  201. void boolgen(Node*, int, int, Node*, Node*);
  202. void sugen(Node*, int, Node*, long);
  203. void listinit(void);
  204. int Bconv(Fmt*);
  205. int Pconv(Fmt*);
  206. int Aconv(Fmt*);
  207. int Xconv(Fmt*);
  208. int Dconv(Fmt*);
  209. int Rconv(Fmt*);
  210. int Sconv(Fmt*);
  211. void peep(void);
  212. void excise(Reg*);
  213. Reg* uniqp(Reg*);
  214. Reg* uniqs(Reg*);
  215. int findtst(Reg*, Prog*, int);
  216. int setcc(Prog*, Prog*);
  217. int compat(Adr*, Adr*);
  218. int aregind(Adr*);
  219. int asize(int);
  220. int usedin(int, Adr*);
  221. Reg* findccr(Reg*);
  222. int setccr(Prog*);
  223. Reg* findop(Reg*, int, int, int);
  224. int regtyp(int);
  225. int anyvar(Adr*);
  226. int subprop(Reg*);
  227. int copyprop(Reg*);
  228. int copy1(Adr*, Adr*, Reg*, int);
  229. int copyu(Prog*, Adr*, Adr*);
  230. int copyas(Adr*, Adr*);
  231. int tasas(Adr*, Adr*);
  232. int copyau(Adr*, Adr*);
  233. int copysub(Adr*, Adr*, Adr*, Prog*, int);
  234. ulong RtoB(int);
  235. ulong AtoB(int);
  236. ulong FtoB(int);
  237. int BtoR(ulong);
  238. int BtoA(ulong);
  239. int BtoF(ulong);
  240. Reg* rega(void);
  241. int rcmp(const void*, const void*);
  242. void regopt(Prog*);
  243. void addmove(Reg*, int, int, int);
  244. Bits mkvar(Adr*, int);
  245. void prop(Reg*, Bits, Bits);
  246. void loopit(Reg*, long);
  247. void synch(Reg*, Bits);
  248. ulong allreg(ulong, Rgn*);
  249. void paint1(Reg*, int);
  250. ulong paint2(Reg*, int);
  251. void paint3(Reg*, int, ulong, int);
  252. void addreg(Adr*, int);
  253. void codgen(Node*, Node*);
  254. void gen(Node*);
  255. void usedset(Node*, int);
  256. void noretval(int);
  257. Node* nodconst(long);
  258. int swcmp(const void*, const void*);
  259. void doswit(int, Node*);
  260. void swit1(C1*, int, long, int, Node*);
  261. void cas(void);
  262. int bitload(Node*, int, int, int, Node*);
  263. void bitstore(Node*, int, int, int, int, Node*);
  264. long outstring(char*, long);
  265. int doinc(Node*, int);
  266. void setsp(void);
  267. void adjsp(long);
  268. int simplv(Node*);
  269. int eval(Node*, int);
  270. void outcode(void);
  271. void ieeedtod(Ieee*, double);
  272. int nodalloc(Type*, int, Node*);
  273. int mulcon(Node*, Node*, int, Node*);
  274. int shlcon(Node*, Node*, int, Node*);
  275. int mulcon1(Node*, long, int, Node*);
  276. void nullwarn(Node*, Node*);
  277. void tindex(Type*, Type*);
  278. void ginit(void);
  279. void gclean(void);
  280. void oinit(int, int, int, int, int, int);
  281. Prog* prg(void);
  282. void nextpc(void);
  283. void gargs(Node*);
  284. void naddr(Node*, Adr*, int);
  285. int regalloc(Type*, int);
  286. int regaddr(int);
  287. int regpair(int);
  288. int regret(Type*);
  289. void regfree(int);
  290. void gmove(Type*, Type*, int, Node*, int, Node*);
  291. void gopcode(int, Type*, int, Node*, int, Node*);
  292. void asopt(void);
  293. int relindex(int);
  294. void gbranch(int);
  295. void fpbranch(void);
  296. void patch(Prog*, long);
  297. void gpseudo(int, Sym*, int, long);
  298. void gpseudotree(int, Sym*, Node*);
  299. void indx(Node*);
  300. void bcomplex(Node*);
  301. /*
  302. * com64
  303. */
  304. int com64(Node*);
  305. void com64init(void);
  306. void bool64(Node*);
  307. #pragma varargck type "A" int
  308. #pragma varargck type "B" Bits
  309. #pragma varargck type "D" Adr*
  310. #pragma varargck type "N" Adr*
  311. #pragma varargck type "P" Prog*
  312. #pragma varargck type "S" char*
  313. #pragma varargck type "R" int
  314. #pragma varargck type "X" Index