Advertisement
Lauda

Untitled

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