Advertisement
Lauda

mips, asm

May 23rd, 2013
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.42 KB | None | 0 0
  1. #include "Munch.h"
  2. #include "Assem.h"
  3. #include "RegAlloc.h"
  4.  
  5. #include <cstdarg>
  6. #include <assert.h>
  7. #include <string>
  8.  
  9. using namespace std;
  10.  
  11.  
  12. static list<AS_instr> il;
  13.  
  14. string toString(int value)
  15. {
  16.     char buffer[15];
  17.     sprintf(buffer, "%d", value);
  18.     return buffer;
  19. }
  20.  
  21.  
  22. void emit(AS_instr instruction)
  23. {
  24.     il.push_back(instruction);
  25. }
  26.  
  27.  
  28. list<AS_instr>* getInstructionList()
  29. {
  30.     return &il;
  31. }
  32.  
  33.  
  34. Regs LL(Reg reg, ...)
  35. {
  36.     va_list arglist;
  37.     va_start(arglist, reg);
  38.  
  39.     Regs reglist = new list<Reg>();
  40.  
  41.     while (reg != (Reg)-1)
  42.     {
  43.         reglist->push_back(reg);
  44.         reg = va_arg(arglist, Reg);
  45.     }
  46.  
  47.     va_end(arglist);
  48.  
  49.     return reglist;
  50. }
  51.  
  52.  
  53. void munchStm(T_stm s)
  54. {
  55.     switch (s->kind)
  56.     {
  57.         case T_MOVE:
  58.         {
  59.             T_exp dstExp = s->u.MOVE.dst;
  60.             T_exp srcExp = s->u.MOVE.src;
  61.  
  62.             if (dstExp->kind == T_MEM)
  63.             {
  64.                 if (dstExp->u.MEM->kind == T_BINOP)
  65.                 {
  66.                     if (dstExp->u.MEM->u.BINOP.op == T_PLUS)
  67.                     {
  68.                         if (dstExp->u.MEM->u.BINOP.right->kind == T_CONST)
  69.                         {
  70.                             T_exp e1 = srcExp;
  71.                             T_exp e2 = dstExp->u.MEM->u.BINOP.left;
  72.                             T_exp c = dstExp->u.MEM->u.BINOP.right;
  73.  
  74.                             string assem = "sw `s," + toString(c->u.CONST) + "(`s)";
  75.  
  76.                             AS_instr instr = AS_Oper(assem, NULL, LL(munchExp(e1), munchExp(e2), -1));
  77.                             emit(instr);
  78.                         }
  79.                         else if (dstExp->u.MEM->u.BINOP.left->kind == T_CONST)
  80.                         {
  81.                             T_exp e1 = srcExp;
  82.                             T_exp e2 = dstExp->u.MEM->u.BINOP.right;
  83.                             T_exp c = dstExp->u.MEM->u.BINOP.left;
  84.  
  85.                             string assem = "sw `s," + toString(c->u.CONST) + "(`s)";
  86.  
  87.                             AS_instr instr = AS_Oper(assem, NULL, LL(munchExp(e1), munchExp(e2), -1));
  88.                             emit(instr);
  89.                         }
  90.                         else
  91.                         {
  92.                             T_exp e1 = srcExp;
  93.  
  94.                             AS_instr instr = AS_Oper("sw `s,0(`s)", NULL, LL(munchExp(e1), munchExp(dstExp->u.MEM), -1));
  95.                             emit(instr);
  96.                         }
  97.                     }
  98.                     else
  99.                     {
  100.                         T_exp e1 = srcExp;
  101.  
  102.                         AS_instr instr = AS_Oper("sw `s,0(`s)", NULL, LL(munchExp(e1), munchExp(dstExp->u.MEM), -1));
  103.                         emit(instr);
  104.                     }
  105.                 }
  106.                 else if (dstExp->u.MEM->kind == T_CONST)
  107.                 {
  108.                     T_exp e1 = srcExp;
  109.  
  110.                     string assem = "sw `s," + toString(dstExp->u.MEM->u.CONST) + "($zero)";
  111.  
  112.                     AS_instr instr = AS_Oper(assem, NULL, LL(munchExp(e1), -1));
  113.                     emit(instr);
  114.                 }
  115.                 else
  116.                 {
  117.                     T_exp e1 = srcExp;
  118.  
  119.                     AS_instr instr = AS_Oper("sw `s,0(`s)", NULL, LL(munchExp(e1), munchExp(dstExp->u.MEM), -1));
  120.                     emit(instr);
  121.                 }
  122.             }
  123.             else
  124.             {
  125.                 assert(0);
  126.             }
  127.         }
  128.         break;
  129.  
  130.  
  131.         case T_SEQ:
  132.         {
  133.             T_stm left = s->u.SEQ.left;
  134.             T_stm right = s->u.SEQ.right;
  135.  
  136.             munchStm(left);
  137.             munchStm(right);
  138.         }
  139.         break;
  140.  
  141.  
  142.         case T_EXP:
  143.         {
  144.             T_exp exp = s->u.EXP;
  145.             munchExp(exp);
  146.         }
  147.         break;
  148.  
  149.  
  150.         default:
  151.             assert(0);
  152.     }
  153. }
  154.  
  155.  
  156. Reg munchExp(T_exp e)
  157. {
  158.     switch (e->kind)
  159.     {
  160. case T_MEM:
  161. {
  162.     // Here goes the code for lw instruction
  163.     if (e->u.MEM->kind == T_BINOP)
  164.     {
  165.         if (e->u.MEM->u.BINOP.op == T_PLUS)
  166.         {
  167.             if (e->u.MEM->u.BINOP.right->kind == T_CONST && e->u.MEM->u.BINOP.left->kind == T_TEMP)
  168.                 {
  169.                     T_exp Right = e->u.MEM->u.BINOP.right;
  170.                     T_exp Left = e->u.MEM->u.BINOP.left;
  171.                     Reg reg = getNewReg();
  172.                     string assem = "lw `d," + toString(Right->u.CONST) + "(`s)";
  173.                     AS_instr instr = AS_Oper(assem, LL(reg, -1), LL(munchExp(Left), -1));
  174.                     emit(instr);
  175.                    
  176.                     return reg;
  177.                 }
  178.             else if (e->u.MEM->u.BINOP.left->kind == T_CONST && e->u.MEM->u.BINOP.right->kind == T_TEMP)
  179.             {
  180.                 T_exp Right = e->u.MEM->u.BINOP.right;
  181.                 T_exp Left = e->u.MEM->u.BINOP.left;
  182.                 Reg reg = getNewReg();
  183.                 string assem = "lw `d," + toString(Left->u.CONST) + "(`s)";
  184.                 AS_instr instr = AS_Oper(assem, LL(reg, -1), LL(munchExp(Right), -1));
  185.                 emit(instr);
  186.                
  187.                 return reg;
  188.             }
  189.         }
  190.     }
  191.     else if (e->u.MEM->kind == T_CONST)
  192.     {
  193.         int Const = e->u.MEM->u.CONST;
  194.         Reg reg = getNewReg();
  195.         string assem = "lw `d," + toString(Const) + "($zero) ";
  196.         AS_instr instr = AS_Oper(assem, LL(reg, -1), NULL);
  197.         emit(instr);
  198.        
  199.         return reg;
  200.     }
  201.     else
  202.     {
  203.         Reg reg = getNewReg();
  204.         string assem= "lw `d," +toString(0) + "(`s)";
  205.         AS_instr instr = AS_Oper(assem, LL(reg, -1), LL(reg, -1));
  206.         emit(instr);
  207.        
  208.         return reg;
  209.     }
  210. }
  211. break;
  212.  
  213.  
  214.         case T_BINOP:
  215.         {
  216.             if (e->u.BINOP.op == T_PLUS)
  217.             {
  218.                 if (e->u.BINOP.right->kind == T_CONST)
  219.                 {
  220.                     T_exp e1 = e->u.BINOP.left;
  221.                     T_exp c = e->u.BINOP.right;
  222.                     Reg reg = getNewReg();
  223.  
  224.                     string assem = "addi `d,`s, " + toString(c->u.CONST);
  225.  
  226.                     AS_instr instr = AS_Oper(assem, LL(reg, -1), LL(munchExp(e1), -1));
  227.                     emit(instr);
  228.                     return reg;
  229.                 }
  230.                 else if (e->u.BINOP.left->kind == T_CONST)
  231.                 {
  232.                     T_exp e1 = e->u.BINOP.right;
  233.                     T_exp c = e->u.BINOP.left;
  234.                     Reg reg = getNewReg();
  235.  
  236.                     string assem = "addi `d,`s," + toString(c->u.CONST);
  237.  
  238.                     AS_instr instr = AS_Oper(assem, LL(reg, -1), LL(munchExp(e1), -1));
  239.                     emit(instr);
  240.                     return reg;
  241.                 }
  242.             }
  243.             else
  244.             {
  245.                 assert(0);
  246.                 return NULL;
  247.             }
  248.         }
  249.         break;
  250.  
  251.  
  252.         case T_TEMP:
  253.         {
  254.             return e->u.TEMP;
  255.         }
  256.         break;
  257.  
  258.  
  259.         case T_CONST:
  260.         {
  261.             Reg reg = getNewReg();
  262.  
  263.             string assem = "li `d, " + toString(e->u.CONST);
  264.  
  265.             AS_instr instr = AS_Oper(assem, LL(reg, -1), NULL);
  266.             emit(instr);
  267.             return reg;
  268.         }
  269.         break;
  270.  
  271.  
  272.         case T_ESEQ:
  273.         {
  274.             Reg reg = munchExp(e->u.ESEQ.exp);
  275.             munchStm(e->u.ESEQ.stm);
  276.  
  277.             return reg;
  278.         }
  279.         break;
  280.  
  281.         default:
  282.             assert(0);
  283.             return NULL;
  284.     }
  285. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement