cgasm.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "cgstd.h"
  2. #include "cgasm.h"
  3. #include "cgutil.h"
  4. struct UseFinder : public CGVisitor{
  5. CGAsm *as;
  6. UseFinder( CGAsm *as ):as(as){}
  7. CGExp *visit( CGExp *e ){
  8. CGReg *r=e->reg();
  9. while( r ){
  10. as->use.insert(r->id);
  11. r=r->owner;
  12. }
  13. return e;
  14. }
  15. };
  16. CGAsm::CGAsm( CGStm *t,const char *s ):succ(0),pred(0),stm(t),assem(strdup(s)){
  17. assert(stm);
  18. assert(assem);
  19. genUseDef();
  20. }
  21. void CGAsm::genUseDef(){
  22. use.clear();
  23. def.clear();
  24. UseFinder uf(this);
  25. if( CGXop *t=stm->xop() ){
  26. if( CGReg *r=t->def ){
  27. def.insert( r->id );
  28. }
  29. if( t->exp ) t->exp->visit( uf );
  30. return;
  31. }
  32. if( CGMov *t=stm->mov() ){
  33. if( CGReg *r=t->lhs->reg() ){
  34. def.insert( r->id );
  35. t->rhs->visit( uf );
  36. return;
  37. }
  38. }
  39. stm->visit( uf );
  40. }
  41. CGAsmSeq::CGAsmSeq():begin(0),end(0){
  42. clear();
  43. }
  44. void CGAsmSeq::clear(){
  45. begin=end=new CGAsm(CG::nop(),"");
  46. }
  47. CGAsm *CGAsmSeq::erase( CGAsm *as ){
  48. CGAsm *succ=as->succ;
  49. if( as->pred ) as->pred->succ=succ;
  50. else begin=succ;
  51. succ->pred=as->pred;
  52. return succ;
  53. }
  54. CGAsm *CGAsmSeq::insert( CGAsm *as,CGAsm *succ ){
  55. as->succ=succ;
  56. if( as->pred=succ->pred ) as->pred->succ=as;
  57. else begin=as;
  58. succ->pred=as;
  59. return as;
  60. }