⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcomp.cpp

📁 鼎鼎有名的手机mpeg4播放器smart movie-智能影院 解码内核
💻 CPP
📖 第 1 页 / 共 4 页
字号:
         dc.Byte(); dc.Ldr(dc.r6, dc.r0, 3);
         dc.Orr(dc.r5, dc.r5, dc.r7, dc.LSL, 16);
         dc.Byte(); dc.Ldr(dc.r7, dc.r0, 7);
         dc.Orr(dc.r4, dc.r4, dc.r6, dc.LSL, 24);
         dc.Byte(); dc.Ldr(dc.r6, dc.r0, 8);
         dc.Orr(dc.r5, dc.r5, dc.r7, dc.LSL, 24);
         dc.Add(dc.r0, dc.r0, dc.r2);
         
         dc.Mov(dc.r2, dc.r4, dc.LSR, 8);
         dc.Mov(dc.r3, dc.r5, dc.LSR, 8);
         dc.Orr(dc.r2, dc.r2, dc.r5, dc.LSL, 24);
         dc.Orr(dc.r3, dc.r3, dc.r6, dc.LSL, 24);
      }else{
         dc.Ldr(dc.r5, dc.r0, 4);
         dc.Ldr(dc.r6, dc.r0, 8);
         dc.LdrAdvance(dc.r4, dc.r0, dc.r2);
         
         if(Pos+8 < 32){
            dc.Mov(dc.r3, dc.r5, dc.LSR, Pos+8);
            dc.Orr(dc.r3, dc.r3, dc.r6, dc.LSL, 32-Pos-8);
            dc.Mov(dc.r2, dc.r4, dc.LSR, Pos+8);
            dc.Orr(dc.r2, dc.r2, dc.r5, dc.LSL, 32-Pos-8);
         }else{
            dc.Mov(dc.r2, dc.r5);
            dc.Mov(dc.r3, dc.r6);
         }
         
         if(Pos > 0){
            dc.Mov(dc.r4, dc.r4, dc.LSR, Pos);
            dc.Mov(dc.r6, dc.r6, dc.LSL, 32-Pos);
            dc.Orr(dc.r4, dc.r4, dc.r5, dc.LSL, 32-Pos);
            dc.Orr(dc.r5, dc.r6, dc.r5, dc.LSR, Pos);
         }
      }
      dc.And(dc.r6, dc.r2, dc.r14);
      dc.And(dc.r2, dc.r12, dc.r2, dc.LSR, 2);
      dc.And(dc.r7, dc.r4, dc.r14);
      dc.And(dc.r4, dc.r12, dc.r4, dc.LSR, 2);
      dc.Add(dc.r4, dc.r4, dc.r2);
      dc.Add(dc.r6, dc.r6, dc.r7);
      
      dc.And(dc.r2, dc.r3, dc.r14);
      dc.And(dc.r3, dc.r12, dc.r3, dc.LSR, 2);
      dc.And(dc.r7, dc.r5, dc.r14);
      dc.And(dc.r5, dc.r12, dc.r5, dc.LSR, 2);
      dc.Add(dc.r5, dc.r5, dc.r3);
      dc.Add(dc.r7, dc.r2, dc.r7);
   }else{
                              //read result r8, dc.r9 dc.And(dc.r2, dc.r3 (one pixel to right)
                              //r10, dc.r11 can be used
      if(Pos<0){
         
         dc.Byte(); dc.Ldr(dc.r8, dc.r0, 0);
         dc.Byte(); dc.Ldr(dc.r10, dc.r0, 1);
         dc.Byte(); dc.Ldr(dc.r9, dc.r0, 4);
         dc.Byte(); dc.Ldr(dc.r11, dc.r0, 5);
         dc.Orr(dc.r8, dc.r8, dc.r10, dc.LSL, 8);
         dc.Byte(); dc.Ldr(dc.r10, dc.r0, 2);
         dc.Orr(dc.r9, dc.r9, dc.r11, dc.LSL, 8);
         dc.Byte(); dc.Ldr(dc.r11, dc.r0, 6);
         dc.Orr(dc.r8, dc.r8, dc.r10, dc.LSL, 16);
         dc.Byte(); dc.Ldr(dc.r10, dc.r0, 3);
         dc.Orr(dc.r9, dc.r9, dc.r11, dc.LSL, 16);
         dc.Byte(); dc.Ldr(dc.r11, dc.r0, 7);
         dc.Orr(dc.r8, dc.r8, dc.r10, dc.LSL, 24);
         dc.Byte(); dc.Ldr(dc.r10, dc.r0, 8);
         dc.Orr(dc.r9, dc.r9, dc.r11, dc.LSL, 24);
         dc.Add(dc.r0, dc.r0, dc.r2);
         
         dc.Mov(dc.r2, dc.r8, dc.LSR, 8);
         dc.Mov(dc.r3, dc.r9, dc.LSR, 8);
         dc.Orr(dc.r2, dc.r2, dc.r9, dc.LSL, 24);
         dc.Orr(dc.r3, dc.r3, dc.r10, dc.LSL, 24);
         
      }else{
         dc.Ldr(dc.r9, dc.r0, 4);
         dc.Ldr(dc.r10, dc.r0, 8);
         dc.LdrAdvance(dc.r8, dc.r0, dc.r2);
         
         if(Pos+8 < 32){
            dc.Mov(dc.r3, dc.r9, dc.LSR, Pos+8);
            dc.Orr(dc.r3, dc.r3, dc.r10, dc.LSL, 32-Pos-8);
            dc.Mov(dc.r2, dc.r8, dc.LSR, Pos+8);
            dc.Orr(dc.r2, dc.r2, dc.r9, dc.LSL, 32-Pos-8);
         }else{
            dc.Mov(dc.r2, dc.r9);
            dc.Mov(dc.r3, dc.r10);
         }
         
         if(Pos > 0){
            dc.Mov(dc.r8, dc.r8, dc.LSR, Pos);
            dc.Mov(dc.r10, dc.r10, dc.LSL, 32-Pos);
            dc.Orr(dc.r8, dc.r8, dc.r9, dc.LSL, 32-Pos);
            dc.Orr(dc.r9, dc.r10, dc.r9, dc.LSR, Pos);
         }
      }
      
      dc.And(dc.r10, dc.r2, dc.r14);
      dc.And(dc.r2, dc.r12, dc.r2, dc.LSR, 2);
      dc.And(dc.r11, dc.r8, dc.r14);
      dc.And(dc.r8, dc.r12, dc.r8, dc.LSR, 2);
      dc.Add(dc.r8, dc.r8, dc.r2);
      dc.Add(dc.r10, dc.r10, dc.r11);
      
      dc.And(dc.r2, dc.r3, dc.r14);
      dc.And(dc.r3, dc.r12, dc.r3, dc.LSR, 2);
      dc.And(dc.r11, dc.r9, dc.r14);
      dc.And(dc.r9, dc.r12, dc.r9, dc.LSR, 2);
      dc.Add(dc.r9, dc.r9, dc.r3);
      dc.Add(dc.r11, dc.r2, dc.r11);
   }
   dc.Ldr(dc.r2, dc.sp, 0);
}

//----------------------------
  
static void CopyHorVerRow(C_dyn_code &dc, int Pos, bool parity, bool round, bool add){

                              //r14 03030303
                              //r12 3f3f3f3f
   LoadHorVerRow(dc, Pos, parity);

   if(round){
      dc.And(dc.r3, dc.r14, dc.r14, dc.LSR, 1);    //0x01010101
   }else{
      dc.And(dc.r3, dc.r14, dc.r14, dc.LSL, 1);    //0x02020202
   }
   if(parity){
      dc.Add(dc.r8, dc.r8, dc.r4);
      dc.Add(dc.r9, dc.r9, dc.r5);
      dc.Add(dc.r10, dc.r10, dc.r6);
      dc.Add(dc.r11, dc.r11, dc.r7);
      
      dc.Add(dc.r10, dc.r10, dc.r3);
      dc.Add(dc.r11, dc.r11, dc.r3);
      dc.And(dc.r10, dc.r14, dc.r10, dc.LSR, 2);
      dc.And(dc.r11, dc.r14, dc.r11, dc.LSR, 2);
      
      if(add){
         dc.Add(dc. r8, dc.r8, dc.r10);
         dc.Add(dc. r9, dc.r9, dc.r11);
         dc.Orr(dc.  r12, dc.r12, dc.r12, dc.LSL, 1);  //0x7F7F7F7F
         dc.Ldr(dc.r11, dc.r1, 4);
         dc.Ldr(dc.r10, dc.r1, 0);
         dc.And(dc. r3, dc.r12, dc.r9, dc.LSR, 1);
         dc.Orr(dc.r9, dc.r11, dc.r9);
         dc.And(dc. r11, dc.r12, dc.r11, dc.LSR, 1);
         dc.Add(dc.r11, dc.r11, dc.r3);
         dc.And(dc. r3, dc.r12, dc.r8, dc.LSR, 1);
         dc.Orr(dc.r8, dc.r10, dc.r8);
         dc.And(dc. r10, dc.r12, dc.r10, dc.LSR, 1);
         dc.Add(dc.r10, dc.r10, dc.r3);
         dc.And(dc.r3, dc.r14, dc.r14, dc.LSR, 1); //0x01010101
         dc.Mvn(dc.r12, dc.r14, dc.LSL, 6);    //restore r12
         dc.And(dc.r9, dc.r9, dc.r3);
         dc.And(dc.r8, dc.r8, dc.r3);
         dc.Add(dc.r11, dc.r11, dc.r9);
         dc.Add(dc.r10, dc.r10, dc.r8);
         dc.Ldr(dc.r3, dc.sp, 4);  //end src for loop compare
         dc.Str(dc.r11, dc.r1, 4);
         dc.StrAdvance(dc.r10, dc.r1, 8);
      }else{
         dc.Add(dc. r8, dc.r8, dc.r10);
         dc.Ldr(dc.r10, dc.sp, 8);  //dstpitch
         dc.Add(dc. r9, dc.r9, dc.r11);
         dc.Ldr(dc.r3, dc.sp, 4);  //end src for loop compare
         dc.Str(dc.r9, dc.r1, 4);
         dc.StrAdvance(dc.r8, dc.r1, dc.r10);
      }
   }else{
      dc.Add(dc.r4, dc.r4, dc.r8);
      dc.Add(dc.r5, dc.r5, dc.r9);
      dc.Add(dc.r6, dc.r6, dc.r10);
      dc.Add(dc.r7, dc.r7, dc.r11);
      
      dc.Add(dc.r6, dc.r6, dc.r3);
      dc.Add(dc.r7, dc.r7, dc.r3);
      dc.And(dc.r6, dc.r14, dc.r6, dc.LSR, 2);
      dc.And(dc.r7, dc.r14, dc.r7, dc.LSR, 2);
      
      if(add){
         dc.Add(dc. r4, dc.r4, dc.r6);
         dc.Add(dc. r5, dc.r5, dc.r7);
         dc.Orr(dc.  r12, dc.r12, dc.r12, dc.LSL, 1);  //0x7F7F7F7F
         dc.Ldr(dc.r7, dc.r1, 4);
         dc.Ldr(dc.r6, dc.r1, 0);
         dc.And(dc. r3, dc.r12, dc.r5, dc.LSR, 1);
         dc.Orr(dc.r5, dc.r7, dc.r5);
         dc.And(dc. r7, dc.r12, dc.r7, dc.LSR, 1);
         dc.Add(dc.r7, dc.r7, dc.r3);
         dc.And(dc. r3, dc.r12, dc.r4, dc.LSR, 1);
         dc.Orr(dc.r4, dc.r6, dc.r4);
         dc.And(dc. r6, dc.r12, dc.r6, dc.LSR, 1);
         dc.Add(dc.r6, dc.r6, dc.r3);
         dc.And(dc.r3, dc.r14, dc.r14, dc.LSR, 1); //0x01010101
         dc.Mvn(dc.r12, dc.r14, dc.LSL, 6);    //restore r12
         dc.And(dc.r5, dc.r5, dc.r3);
         dc.And(dc.r4, dc.r4, dc.r3);
         dc.Add(dc.r7, dc.r7, dc.r5);
         dc.Add(dc.r6, dc.r6, dc.r4);
         dc.Str(dc.r7, dc.r1, 4);
         dc.StrAdvance(dc.r6, dc.r1, 8);
      }else{
         dc.Ldr(dc.r3, dc.sp, 8);  //dstpitch
         dc.Add(dc. r4, dc.r4, dc.r6);
         dc.Add(dc. r5, dc.r5, dc.r7);
         dc.Str(dc.r5, dc.r1, 4);
         dc.StrAdvance(dc.r4, dc.r1, dc.r3);
      }
   }
}

//----------------------------

typedef void (*t_BuldFunc)(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5);

static void BuildAddBlock(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){

   void *data = dc.DeclareData(0x01010101);

   PreLoad2Init(dc, ARM5, -1);
   dc.Ldr(dc.r14, data);
   dc.Mov(dc.r11, 8);
   dc.Mvn(dc.r12, dc.r14, dc.LSL, 7);
   {
      void *loop = dc.Label();
      PreLoad2(dc, ARM5, Pos);
      AddBlockRow(dc, Pos);
      dc.Set(); dc.Sub(dc.r11, dc.r11, 1);
      dc.Branch(dc.NE, loop);
   }
   dc.FunctionEnd();

   dc.PutLabel(data);
}

//----------------------------

static void BuildCopyBlockHor(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){

   void *data = dc.DeclareData(0x01010101);

   PreLoad2Init(dc, ARM5, Pos);
   dc.Ldr(dc.r14, data);
   dc.Mov(dc.r11, 8);
   dc.Mvn(dc.r12, dc.r14, dc.LSL, 7);
   {
      void *loop = dc.Label();
      PreLoad2(dc, ARM5, Pos);
      CopyHorRow(dc, Pos, round, add);
      dc.Set(); dc.Sub(dc.r11, dc.r11, 1);
      dc.Branch(dc.NE, loop);
   }
   dc.FunctionEnd();

   dc.PutLabel(data);
}

//----------------------------

static void BuildCopyBlockVer(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){

   void *data = dc.DeclareData(0x01010101);

   dc.Sub(dc.sp, dc.sp, 4);
   dc.Add(dc.r4, dc.r0, dc.r2, dc.LSL, 3);
   dc.Add(dc.r4, dc.r4, dc.r2);
   dc.Str(dc.r4, dc.sp, 0);     //end src

   dc.Ldr(dc.r14, data);
   dc.Mvn(dc.r12, dc.r14, dc.LSL, 7);

   PreLoad(dc, ARM5, Pos);
   LoadVerRow(dc, Pos, true);
   {
      void *loop = dc.Label();
      PreLoad(dc, ARM5, Pos);
      CopyVerRow(dc, Pos, 0, round, add);
      PreLoad(dc, ARM5, Pos);
      CopyVerRow(dc, Pos, 1, round, add);

      dc.Cmp(dc.r0, dc.r7);
      dc.Branch(dc.NE, loop);
   }
   dc.Add(dc.sp, dc.sp, 4);
   dc.FunctionEnd();

   dc.PutLabel(data);
}

//----------------------------

static void BuildCopyBlockHorVer(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){

   void *data = dc.DeclareData(0x03030303);

   dc.Sub(dc.sp, dc.sp, 12);
   dc.Add(dc.r4, dc.r0, dc.r2, dc.LSL, 3);
   dc.Add(dc.r4, dc.r4, dc.r2);
   dc.Str(dc.r2, dc.sp, 0);     //srcpitch
   dc.Str(dc.r4, dc.sp, 4);  //end src
   dc.Str(dc.r3, dc.sp, 8);  //dstpitch

   dc.Ldr(dc.r14, data);
   dc.Mvn(dc.r12, dc.r14, dc.LSL, 6);
   PreLoad(dc, ARM5, Pos);
   LoadHorVerRow(dc, Pos, 1);
   {
      void *loop = dc.Label();
      PreLoad(dc, ARM5, Pos);
      CopyHorVerRow(dc, Pos, 0, round, add);
      PreLoad(dc, ARM5, Pos);
      CopyHorVerRow(dc, Pos, 1, round, add);
      dc.Cmp(dc.r0, dc.r3);
      dc.Branch(dc.NE, loop);
   }
   dc.Add(dc.sp, dc.sp, 12);
   dc.FunctionEnd();

   dc.PutLabel(data);
}

//----------------------------

static void BuildCopyBlockRow(C_dyn_code &dc, int Pos){

   if(Pos > 0){
      dc.Ldr(dc.r5, dc.r0, 8);
      dc.Ldr(dc.r6, dc.r0, 4);
      dc.LdrAdvance(dc.r4, dc.r0, dc.r2);
      
      dc.Mov(dc.r5, dc.r5, dc.LSL, 32-Pos);
      dc.Orr(dc.r5, dc.r5, dc.r6, dc.LSR, Pos);
      dc.Mov(dc.r4, dc.r4, dc.LSR, Pos);
      dc.Orr(dc.r4, dc.r4, dc.r6, dc.LSL, 32-Pos);
   }else{
      dc.Ldr(dc.r5, dc.r0, 4);
      dc.LdrAdvance(dc.r4, dc.r0, dc.r2);
   }
   dc.Str(dc.r5, dc.r1, 4);
   dc.StrAdvance(dc.r4, dc.r1, dc.r3);
}

//----------------------------

static void BuildCopyBlock(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){

   PreLoad2Init(dc, ARM5, Pos);
   PreLoad2(dc, ARM5, Pos);
   BuildCopyBlockRow(dc, Pos);
   PreLoad2(dc, ARM5, Pos);
   BuildCopyBlockRow(dc, Pos);
   PreLoad2(dc, ARM5, Pos);
   BuildCopyBlockRow(dc, Pos);
   PreLoad2(dc, ARM5, Pos);
   BuildCopyBlockRow(dc, Pos);
   PreLoad2(dc, ARM5, Pos);
   BuildCopyBlockRow(dc, Pos);
   PreLoad2(dc, ARM5, Pos);
   BuildCopyBlockRow(dc, Pos);
   PreLoad2(dc, ARM5, Pos);
   BuildCopyBlockRow(dc, Pos);
   PreLoad2(dc, ARM5, Pos);
   BuildCopyBlockRow(dc, Pos);

   dc.FunctionEnd();
}

//----------------------------

static void BuildCopyBlock8x8(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){

   dc.Mov(dc.r11, 3);
   {
      void *loop = dc.Label();
#ifdef USE_PLD
      if(ARM5)
         dc.Pld(dc.r0, dc.r2,dc.LSL, 1);
#endif
      dc.Ldr(dc.r7, dc.r0, 4);
      dc.LdrAdvance(dc.r6, dc.r0, dc.r2);
#ifdef USE_PLD
      if(ARM5)
         dc.Pld(dc.r0, dc.r2, dc.LSL, 1);
#endif
      dc.Ldr(dc.r5, dc.r0, 4);
      dc.LdrAdvance(dc.r4, dc.r0, dc.r2);
      dc.Str(dc.r7, dc.r1, 4);
      dc.StrAdvance(dc.r6, dc.r1, dc.r3);
      dc.Str(dc.r5, dc.r1, 4);
      dc.StrAdvance(dc.r4, dc.r1, dc.r3);
      dc.Set(); dc.Sub(dc.r11, dc.r11, 1);
      dc.Branch(dc.NE, loop);
   }
                              //unroll last (no preload needed)
   dc.Ldr(dc.r7, dc.r0, 4);
   dc.LdrAdvance(dc.r6,dc.r0, dc.r2);
   dc.Ldr(dc.r5, dc.r0, 4);
   dc.LdrAdvance(dc.r4,dc.r0, dc.r2);
   dc.Str(dc.r7, dc.r1, 4);
   dc.StrAdvance(dc.r6, dc.r1, dc.r3);
   dc.Str(dc.r5, dc.r1, 4);
   dc.StrAdvance(dc.r4, dc.r1, dc.r3);

   dc.FunctionEnd();
}

//----------------------------

static void CopyBlock16x16Row(C_dyn_code &dc){

   dc.Ldr(dc.r7, dc.r0, 12);
   dc.Ldr(dc.r6, dc.r0, 8);
   dc.Ldr(dc.r5, dc.r0, 4);
   dc.LdrAdvance(dc.r4, dc.r0, dc.r2);
   dc.Str(dc.r7, dc.r1, 12);
   dc.Str(dc.r6, dc.r1, 8);
   dc.Str(dc.r5, dc.r1, 4);
   dc.StrAdvance(dc.r4, dc.r1, dc.r3);
}

//----------------------------

static void BuildCopyBlock16x16(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){

   dc.Mov(dc.r11, 15);
   {
      void *loop = dc.Label();
#ifdef USE_PLD
      if(ARM5)
         dc.Pld(dc.r0, dc.r2, dc.LSL, 1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -