Jia PD

Northwestern Polytechnical University

0%

每日记录-2020/08/02

    今天改了一天代码,早上洗了一早上衣服,然后下午主要是想看下struct释放内存的操作,但是不太对,然后就释放了几个函数内的局部malloc,然而并没有改变测评还是CE的局面。晚上自己写了matrix_add的测试用例,发现了一个立即数的bug,但是还是没有什么影响。

修改的错误

  1. 这个是自己写测试样例发现的错误

    • 具体如图:

    1

    • 具体修改代码

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      /* codegen.cpp */
      if(i < 200 && i>-200){
      sprintf(inst, "\tstr 's0, ['s1, #%d]\n", i);
      emit(AS_Oper(inst, NULL, L(munchExp(e2), L(munchExp(e1), NULL)), NULL));
      }
      else{
      Temp_temp r1 = Temp_newTemp();
      sprintf(inst, "\tldr 'd0, =%d\n", i);
      emit(AS_Oper(inst, L(r1,NULL), NULL, NULL));
      sprintf(inst2, "\tstr 's0, ['s1, 's2]\n");
      emit(AS_Oper(inst2, NULL, L(munchExp(e2), L(munchExp(e1) , L(r1,NULL))), NULL));
      }
    • 修改后结果

    2

    1. 针对上一个问题的修改

      • 参考
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      // 曾老师给的参考代码
      /*
      加载立即数 ldr r0,=#100
      */
      void ILoc::load_imm(string rsReg, int num)
      {
      if (PlatformArm::constExpr(num)) {
      // mov r8,#12
      emit("mov", rsReg, toStr(num));
      } else {
      // ldr r8,=0xfff0
      load_label(rsReg, toStr(num, false));
      }
      }

      if (PlatformArm::constExpr(off)) {
      // sub sp,sp,#16
      emit("sub", "sp", "sp", toStr(off));
      } else {
      //ldr r8,=257
      load_imm(tmpReg, off);

      //sub sp,sp,r8
      emit("sub", "sp", "sp", tmpReg);
      }

      /*
      循环左移两位
      */
      void PlatformArm::roundLeftShiftTwoBit(unsigned int &num)
      {
      unsigned int overFlow = num & 0xc0000000;//取左移即将溢出的两位
      num = (num << 2) | (overFlow >> 30);//将溢出部分追加到尾部
      }

      /*
      判断num是否是常数表达式,8位数字循环右移偶数位得到
      */
      bool PlatformArm::__constExpr(int num)
      {
      unsigned int new_num = (unsigned int) num;

      for (int i = 0; i < 16; i++) {

      if (new_num <= 0xff) {
      // 有效表达式
      return true;
      }

      //循环左移2位
      roundLeftShiftTwoBit(new_num);
      }

      return false;
      }

      /*
      同时处理正数和负数
      */
      bool PlatformArm::constExpr(int num)
      {
      return __constExpr(num) || __constExpr(-num);
      }
      • 实际处理

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        //codegen.cpp 70-106
        /*
        循环左移两位
        */
        void roundLeftShiftTwoBit(unsigned int &num)
        {
        unsigned int overFlow = num & 0xc0000000;//取左移即将溢出的两位
        num = (num << 2) | (overFlow >> 30);//将溢出部分追加到尾部
        }

        /*
        判断num是否是8位可放的,8位数字循环右移偶数位得到
        */
        bool __constExpr(int num)
        {
        unsigned int new_num = (unsigned int) num;

        for (int i = 0; i < 16; i++) {

        if (new_num <= 0xff) {
        // 有效表达式
        return true;
        }

        //循环左移2位
        roundLeftShiftTwoBit(new_num);
        }

        return false;
        }

        /*
        同时处理正数和负数
        */
        bool constExpr(int num)
        {
        return __constExpr(num) || __constExpr(-num);
        }

        实例

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        //codegen.cpp 124-133
        if(constExpr(i)){
        sprintf(inst, "\tldr 'd0, ['s0, #%d]\n", i);
        emit(AS_Oper(inst, L(r, NULL), L(munchExp(e1), NULL), NULL));
        }
        else{
        sprintf(inst,"\tldr 'd0,=%d\n",i);
        emit(AS_Oper(inst, L(r, NULL), NULL, NULL));
        sprintf(inst2, "\tldr 'd0, ['s0, 'd0]\n");
        emit(AS_Oper(inst2,L(r,NULL),L(munchExp(e1),NULL),NULL));
        }
    2. 修复字节长度warning

      3

      1
      2
      3
      4
      C:\Users\13948\Desktop\C0\Compiler_GIT\liveness.cpp: In function 'void solveLiveness(Live_graph*, G_graph, G_table, G_table)':
      C:\Users\13948\Desktop\C0\Compiler_GIT\liveness.cpp:149:49: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
      Temp_enterPtr(spillCost, ti, (void*)spills);
      ^~~~~~
      1
      2
      3
      //liviness.cpp
      long spills ==> long long spills
      void* 为8个字节
------------- Ending,Thanks for your reading!-------------