cgcode.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. #ifndef CGCODE_H
  2. #define CGCODE_H
  3. //calling conventions
  4. enum{
  5. CG_CDECL=1,
  6. CG_STDCALL=2
  7. };
  8. //data types
  9. enum{
  10. CG_VOID=-1,
  11. CG_PTR,
  12. CG_INT8,CG_INT16,
  13. CG_INT32,CG_INT64,
  14. CG_FLOAT32,CG_FLOAT64,
  15. CG_CSTRING,CG_BSTRING,CG_BINFILE,CG_LABEL
  16. };
  17. //condition codes
  18. enum{
  19. CG_EQ,CG_NE,
  20. CG_LT,CG_GT,CG_LE,CG_GE,
  21. CG_LTU,CG_GTU,CG_LEU,CG_GEU
  22. };
  23. //unary operators for cguop
  24. enum{
  25. CG_NEG,CG_NOT,CG_ABS,CG_SGN
  26. };
  27. //binary operators for cgbop
  28. enum{
  29. CG_ADD,CG_SUB,CG_MUL,CG_DIV,CG_MOD,
  30. CG_AND,CG_ORL,CG_XOR,CG_SHL,CG_SHR,CG_SAR,
  31. CG_MIN,CG_MAX
  32. };
  33. //linkage flags
  34. enum{
  35. CG_INTERNAL,CG_IMPORT,CG_EXPORT
  36. };
  37. //statements
  38. struct CGStm;
  39. struct CGNop;
  40. struct CGXop;
  41. struct CGRem;
  42. struct CGAti;
  43. struct CGAtd;
  44. struct CGMov;
  45. struct CGLab;
  46. struct CGBra;
  47. struct CGBcc;
  48. struct CGEva;
  49. struct CGRet;
  50. struct CGSeq;
  51. //expressions
  52. struct CGExp;
  53. struct CGMem;
  54. struct CGLea;
  55. struct CGCvt;
  56. struct CGUop;
  57. struct CGBop;
  58. struct CGJsr;
  59. struct CGVfn;
  60. struct CGScc;
  61. struct CGEsq;
  62. //leaf expressions
  63. struct CGFrm;
  64. struct CGTmp;
  65. struct CGLit;
  66. struct CGSym;
  67. struct CGDat;
  68. //private!
  69. struct CGReg;
  70. struct CGVisitor{
  71. virtual CGStm *visit( CGStm *stm );
  72. virtual CGExp *visit( CGExp *exp );
  73. };
  74. struct CGStm{
  75. virtual ~CGStm()=0;
  76. virtual CGNop *nop();
  77. virtual CGXop *xop();
  78. virtual CGRem *rem();
  79. virtual CGAti *ati();
  80. virtual CGAtd *atd();
  81. virtual CGMov *mov();
  82. virtual CGLab *lab();
  83. virtual CGBra *bra();
  84. virtual CGBcc *bcc();
  85. virtual CGEva *eva();
  86. virtual CGRet *ret();
  87. virtual CGSeq *seq();
  88. virtual CGStm *visit( CGVisitor &vis );
  89. };
  90. typedef std::vector<CGStm*> CGStmSeq;
  91. struct CGExp{
  92. int type;
  93. virtual ~CGExp()=0;
  94. virtual CGMem *mem();
  95. virtual CGLea *lea();
  96. virtual CGCvt *cvt();
  97. virtual CGUop *uop();
  98. virtual CGBop *bop();
  99. virtual CGJsr *jsr();
  100. virtual CGVfn *vfn();
  101. virtual CGScc *scc();
  102. virtual CGEsq *esq();
  103. virtual CGFrm *frm();
  104. virtual CGTmp *tmp();
  105. virtual CGLit *lit();
  106. virtual CGSym *sym();
  107. virtual CGDat *dat();
  108. virtual CGReg *reg();
  109. virtual CGExp *nonEsq();
  110. virtual bool sideEffects();
  111. virtual bool equals( CGExp *exp );
  112. virtual CGExp *visit( CGVisitor &vis );
  113. bool isint(){ return !isfloat(); }
  114. bool isfloat(){ return type==CG_FLOAT32||type==CG_FLOAT64; }
  115. };
  116. struct CGNop : public CGStm{
  117. CGNop *nop();
  118. CGStm *visit( CGVisitor &vis );
  119. };
  120. struct CGXop : public CGStm{
  121. int op;
  122. CGReg *def;
  123. CGExp *exp;
  124. CGXop *xop();
  125. CGStm *visit( CGVisitor &vis );
  126. };
  127. struct CGRem : public CGStm{
  128. string comment;
  129. CGRem *rem();
  130. CGStm *visit( CGVisitor &vis );
  131. };
  132. struct CGAti : public CGStm{
  133. CGMem *mem;
  134. CGAti *ati();
  135. CGStm *visit( CGVisitor &vis );
  136. };
  137. struct CGAtd : public CGStm{
  138. CGMem *mem;
  139. CGSym *sym;
  140. CGAtd *atd();
  141. CGStm *visit( CGVisitor &vis );
  142. };
  143. struct CGMov : public CGStm{
  144. CGExp *lhs,*rhs;
  145. CGMov *mov();
  146. CGStm *visit( CGVisitor &vis );
  147. };
  148. struct CGLab : public CGStm{
  149. CGSym *sym;
  150. CGLab *lab();
  151. CGStm *visit( CGVisitor &vis );
  152. };
  153. struct CGBra : public CGStm{
  154. CGSym *sym;
  155. CGBra *bra();
  156. CGStm *visit( CGVisitor &vis );
  157. };
  158. struct CGBcc : public CGStm{
  159. int cc;
  160. CGExp *lhs,*rhs;
  161. CGSym *sym;
  162. CGBcc *bcc();
  163. CGStm *visit( CGVisitor &vis );
  164. };
  165. struct CGEva : public CGStm{
  166. CGExp *exp;
  167. CGEva *eva();
  168. CGStm *visit( CGVisitor &vis );
  169. };
  170. struct CGRet : public CGStm{
  171. CGExp *exp;
  172. CGRet *ret();
  173. CGStm *visit( CGVisitor &vis );
  174. };
  175. struct CGSeq : public CGStm{
  176. vector<CGStm*> stms;
  177. CGSeq *seq();
  178. CGStm *visit( CGVisitor &vis );
  179. void push_back( CGStm *stm );
  180. void push_front( CGStm *stm );
  181. };
  182. struct CGMem : public CGExp{
  183. CGExp *exp;
  184. int offset,flags;
  185. CGMem *mem();
  186. bool sideEffects();
  187. bool equals( CGExp *exp );
  188. CGExp *visit( CGVisitor &vis );
  189. };
  190. struct CGLea : public CGExp{
  191. CGExp *exp;
  192. CGLea *lea();
  193. bool sideEffects();
  194. bool equals( CGExp *exp );
  195. CGExp *visit( CGVisitor &vis );
  196. };
  197. struct CGCvt : public CGExp{
  198. CGExp *exp;
  199. CGCvt *cvt();
  200. bool sideEffects();
  201. bool equals( CGExp *exp );
  202. CGExp *visit( CGVisitor &vis );
  203. };
  204. struct CGUop : public CGExp{
  205. int op;
  206. CGExp *exp;
  207. CGUop *uop();
  208. bool sideEffects();
  209. bool equals( CGExp *exp );
  210. CGExp *visit( CGVisitor &vis );
  211. };
  212. struct CGBop : public CGExp{
  213. int op;
  214. CGExp *lhs,*rhs;
  215. CGBop *bop();
  216. bool commutes();
  217. bool sideEffects();
  218. bool equals( CGExp *exp );
  219. CGExp *visit( CGVisitor &vis );
  220. };
  221. struct CGJsr : public CGExp{
  222. int call_conv;
  223. CGExp *exp;
  224. std::vector<CGExp*> args;
  225. CGJsr *jsr();
  226. bool sideEffects();
  227. bool equals( CGExp *exp );
  228. CGExp *visit( CGVisitor &vis );
  229. };
  230. struct CGVfn : public CGExp{
  231. CGExp *exp,*self;
  232. CGVfn *vfn();
  233. bool sideEffects();
  234. bool equals( CGExp *exp );
  235. CGExp *visit( CGVisitor &vis );
  236. };
  237. struct CGScc : public CGExp{
  238. int cc;
  239. CGExp *lhs,*rhs;
  240. CGScc *scc();
  241. bool sideEffects();
  242. bool equals( CGExp *exp );
  243. CGExp *visit( CGVisitor &vis );
  244. };
  245. struct CGEsq : public CGExp{
  246. CGStm *lhs;
  247. CGExp *rhs;
  248. CGEsq *esq();
  249. CGExp *nonEsq();
  250. bool sideEffects();
  251. bool equals( CGExp *exp );
  252. CGExp *visit( CGVisitor &vis );
  253. };
  254. struct CGFrm : public CGExp{
  255. CGFrm *frm();
  256. bool equals( CGExp *exp );
  257. CGExp *visit( CGVisitor &vis );
  258. };
  259. struct CGTmp : public CGExp{
  260. string ident;
  261. CGTmp *owner;
  262. CGTmp *tmp();
  263. bool equals( CGExp *exp );
  264. CGExp *visit( CGVisitor &vis );
  265. };
  266. struct CGReg : public CGExp{
  267. int id,color;
  268. CGReg *owner;
  269. CGReg *reg();
  270. bool equals( CGExp *e );
  271. CGExp *visit( CGVisitor &vis );
  272. };
  273. struct CGLit : public CGExp{
  274. int64 int_value;
  275. double float_value;
  276. bstring string_value;
  277. CGLit *lit();
  278. bool equals( CGExp *exp );
  279. CGExp *visit( CGVisitor &vis );
  280. };
  281. struct CGSym : public CGExp{
  282. string value;
  283. int linkage;
  284. CGSym *sym();
  285. bool equals( CGExp *exp );
  286. CGExp *visit( CGVisitor &vis );
  287. };
  288. struct CGDat : public CGSym{
  289. std::vector<CGExp*> exps;
  290. CGDat *dat();
  291. bool equals( CGExp *exp );
  292. CGExp *visit( CGVisitor &vis );
  293. void push_back( CGExp *exp );
  294. };
  295. struct CGFun : public CGExp{
  296. int call_conv;
  297. CGSym *sym;
  298. CGExp *self;
  299. std::vector<CGExp*> args;
  300. std::vector<CGStm*> stms;
  301. };
  302. #endif