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

📄 idct.cpp

📁 鼎鼎有名的手机mpeg4播放器smart movie-智能影院 解码内核
💻 CPP
📖 第 1 页 / 共 3 页
字号:

      dc.Ldr(dc.r10, W7);
      dc.Ldr(dc.r11, W1);
      dc.Mov(dc.r2, 4);
      dc.Add(dc.r0, dc.r0, 32);
      dc.Mov(dc.r0, dc.r0, dc.LSL, 8);     //x0
      dc.Mla(dc.r14, dc.r3, dc.r10, dc.r2);   //x5 = x4 * W7 + 4
      dc.Ldr(dc.r10, W3);
      dc.Mla(dc.r3, dc.r11, dc.r3, dc.r2);    //x4 = x4 * W1 + 4
      dc.Mov(dc.r14, dc.r14, dc.ASR, 3);   //x5 >>= 3
      dc.Ldr(dc.r11, minus_W5);
      dc.Mla(dc.r12, dc.r5, dc.r10, dc.r2);   //x6 = x7 * W3 + 4
      dc.Mov(dc.r3, dc.r3, dc.ASR, 3);     //x4 >>= 3
      dc.Ldr(dc.r10, W6);
      dc.Mla(dc.r5, dc.r11, dc.r5, dc.r2);    //x7 = x7 * minus_W5 + 4
      dc.Ldr(dc.r11, W2);
      dc.Add(dc.r9, dc.r3, dc.r12, dc.ASR, 3);   //x1 = x4 + (x6 >> 3)
      dc.Sub(dc.r3, dc.r3, dc.r12, dc.ASR, 3); //x4 = x4 - (x6 >> 3)
      dc.Mla(dc.r12, dc.r4, dc.r10, dc.r2);   //x2 = x3 * W6 + 4
      dc.Mla(dc.r4, dc.r11, dc.r4, dc.r2);    //x3 = x3 * W2 + 4
      dc.Add(dc.r2, dc.r14, dc.r5, dc.ASR, 3);   //x6 = x5 + (x7 >> 3)
      dc.Sub(dc.r5, dc.r14, dc.r5, dc.ASR, 3); //x5 = x5 - (x7 >> 3)
      dc.Add(dc.r14, dc.r0, dc.r4, dc.ASR, 3); //x7 = x0 + (x3 >> 3)
      dc.Sub(dc.r4, dc.r0, dc.r4, dc.ASR, 3); //x8 = x0 - (x3 >> 3)
      dc.Add(dc.r10, dc.r0, dc.r12, dc.ASR, 3);//x3 = x0 + (x2 >> 3)
      dc.Sub(dc.r0, dc.r0, dc.r12, dc.ASR, 3);   //x0 = x0 - (x2 >> 3)
      dc.Add(dc.r1, dc.r5, dc.r3);
      dc.Mov(dc.r11, 181);
      dc.Mul(dc.r12, dc.r1, dc.r11);    //x2 = 181 * (x5 + x4)
      dc.Sub(dc.r3, dc.r3, dc.r5);
      dc.Mul(dc.r1, dc.r3, dc.r11);        //x4 = 181 * (x4 - x5)
      dc.Add(dc.r12, dc.r12, 128);     //x2 += 128
      dc.Add(dc.r3, dc.r1, 128);    //x4 += 128
      dc.Add(dc.r1, dc.r14, dc.r9);        //x5 = x7 + x1
      dc.Sub(dc.r5, dc.r14, dc.r9);        //x1 = x7 - x1
      dc.Add(dc.r11, dc.r10, dc.r12, dc.ASR, 8); //x7 = x3 + (x2 >> 8)
      dc.Sub(dc.r14, dc.r10, dc.r12, dc.ASR, 8); //x2 = x3 - (x2 >> 8)
      dc.Add(dc.r9, dc.r0, dc.r3, dc.ASR, 8); //x3 = x0 + (x4 >> 8)
      dc.Sub(dc.r3, dc.r0, dc.r3, dc.ASR, 8);  //x4 = x0 - (x4 >> 8)
      dc.Add(dc.r12, dc.r4, dc.r2);        //x0 = x8 + x6
      dc.Sub(dc.r4, dc.r4, dc.r2);        //x6 = x8 - x6

      dc.Branch(dc.EQ, Row4_NoSrc);

      dc.Byte(); dc.Ldr(dc.r0, dc.r7, 0);
      dc.Byte(); dc.Ldr(dc.r2, dc.r7, 7);
      dc.Byte(); dc.Ldr(dc.r10, dc.r7, 1);
      dc.Add(dc.r1, dc.r0, dc.r1, dc.ASR, 14);
      dc.Add(dc.r5, dc.r2, dc.r5, dc.ASR, 14);
      dc.Add(dc.r11, dc.r10, dc.r11, dc.ASR, 14);
      dc.Byte(); dc.Ldr(dc.r2, dc.r7, 6);
      dc.Byte(); dc.Ldr(dc.r0, dc.r7, 2);
      dc.Byte(); dc.Ldr(dc.r10, dc.r7, 5);
      dc.Add(dc.r14, dc.r2, dc.r14, dc.ASR, 14);
      dc.Add(dc.r9, dc.r0, dc.r9, dc.ASR, 14);
      dc.Byte(); dc.Ldr(dc.r0, dc.r7, 3);
      dc.Byte(); dc.Ldr(dc.r2, dc.r7, 4);
      dc.Add(dc.r3, dc.r10, dc.r3, dc.ASR, 14);
      dc.Add(dc.r12, dc.r0, dc.r12, dc.ASR, 14);
      dc.Add(dc.r4, dc.r2, dc.r4, dc.ASR, 14);
      dc.Add(dc.r7, dc.r7, 8);        //source stride

   dc.PutLabel(Row4_Sat);
      dc.Orr(dc.r0, dc.r5, dc.r14);
      dc.Orr(dc.r0, dc.r0, dc.r4);
      dc.Orr(dc.r0, dc.r0, dc.r1);
      dc.Orr(dc.r0, dc.r0, dc.r12);
      dc.Orr(dc.r0, dc.r0, dc.r11);
      dc.Orr(dc.r0, dc.r0, dc.r9);
      dc.Orr(dc.r0, dc.r0, dc.r3);
      dc.Set(); dc.Bic(dc.r0, dc.r0, 255);
      void *Row4_Write = dc.Label(false);
      dc.Branch(dc.EQ, Row4_Write);

      dc.Mov(dc.r0, 0xffffff00);

      dc.Tst(dc.r1, dc.r0);
      dc.Cond(dc.NE); dc.Mov(dc.r1, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r1, 0x00);

      dc.Tst(dc.r11, dc.r0);
      dc.Cond(dc.NE); dc.Mov(dc.r11, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r11, 0x00);

      dc.Tst(dc.r9, dc.r0);
      dc.Cond(dc.NE); dc.Mov(dc.r9, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r9, 0x00);

      dc.Tst(dc.r12, dc.r0);
      dc.Cond(dc.NE); dc.Mov(dc.r12, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r12, 0x00);

      dc.Tst(dc.r4, dc.r0);
      dc.Cond(dc.NE); dc.Mov(dc.r4, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r4, 0x00);

      dc.Tst(dc.r3, dc.r0);
      dc.Cond(dc.NE); dc.Mov(dc.r3, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r3, 0x00);

      dc.Tst(dc.r14, dc.r0);
      dc.Cond(dc.NE); dc.Mov(dc.r14, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r14, 0x00);

      dc.Tst(dc.r5, dc.r0);
      dc.Cond(dc.NE); dc.Mov(dc.r5, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r5, 0x00);

   dc.PutLabel(Row4_Write);
      dc.Byte(); dc.Str(dc.r1, dc.r8, 0);
      dc.Byte(); dc.Str(dc.r11, dc.r8, 1);
      dc.Byte(); dc.Str(dc.r9, dc.r8, 2);
      dc.Byte(); dc.Str(dc.r12, dc.r8, 3);
      dc.Byte(); dc.Str(dc.r4, dc.r8, 4);
      dc.Byte(); dc.Str(dc.r3, dc.r8, 5);
      dc.Byte(); dc.Str(dc.r14, dc.r8, 6);
      dc.Byte(); dc.Str(dc.r5, dc.r8, 7);

   dc.PutLabel(Row4_Next);
      dc.Ldr(dc.r2, dc.sp, OffsetOf(S_stack, dst_pitch));
      dc.Ldr(dc.r1, dc.sp, OffsetOf(S_stack, end_ptr));

      dc.Add(dc.r6, dc.r6, 16);      //Block += 16
      dc.Add(dc.r8, dc.r8, dc.r2);    //Dst += DstStride

      dc.Cmp(dc.r6, dc.r1);
      dc.Branch(dc.NE, Row4_Loop);
   }
   dc.FunctionEnd();

dc.PutLabel(Row4_NoSrc);

   dc.Mov(dc.r5, dc.r5, dc.ASR, 14);
   dc.Mov(dc.r14, dc.r14, dc.ASR, 14);
   dc.Mov(dc.r12, dc.r12, dc.ASR, 14);
   dc.Mov(dc.r1, dc.r1, dc.ASR, 14);
   dc.Mov(dc.r11, dc.r11, dc.ASR, 14);
   dc.Mov(dc.r9, dc.r9, dc.ASR, 14);
   dc.Mov(dc.r3, dc.r3, dc.ASR, 14);
   dc.Mov(dc.r4, dc.r4, dc.ASR, 14);

   dc.Branch(Row4_Sat);

   dc.PutLabel(W1);
   dc.PutLabel(W2);
   dc.PutLabel(W3);
   dc.PutLabel(W6);
   dc.PutLabel(W7);
   dc.PutLabel(minus_W5);
}

//----------------------------
// r6 Block
// r7 Src
// r8 Dst
static void BuildIDCT_Block8x8(C_dyn_code &dc, void *l_MCol8, void *l_RowConst){

   //void *W1 = dc.DeclareData(2841);             // 2048*sqrt(2)*cos(1*pi/16)
   //void *W2 = dc.DeclareData(2676);                 // 2048*sqrt(2)*cos(2*pi/16)
   void *W3 = dc.DeclareData(2408);                 // 2048*sqrt(2)*cos(3*pi/16)
   void *W6 = dc.DeclareData(1108);                 // 2048*sqrt(2)*cos(6*pi/16)
   void *W7 = dc.DeclareData(565);  //2048*sqrt(2)*cos(7*pi/16)
   void *W1_minus_W7 = dc.DeclareData(2276);
   void *minus_W1_minus_W7 = dc.DeclareData((dword)-3406);
   void *W5_minus_W3 = dc.DeclareData((dword)-799);
   void *minus_W2_minus_W6 = dc.DeclareData((dword)-3784);
   void *Row8_NoSrc = dc.Label(false);
   void *Row8_Sat = dc.Label(false);

   struct S_stack{
      void *end_ptr;
      dword dst_pitch;
      dword saved_regs[C_dyn_code::STACKFRAME];
   };

   dc.Align(16);

   dc.FunctionBegin(OffsetOf(S_stack, saved_regs));

   dc.Mov(dc.r6, dc.r0);      //Block
   dc.Add(dc. r0, dc.r0, 128);
   dc.Str(dc.r2, dc.sp, OffsetOf(S_stack, dst_pitch));
   dc.Str(dc.r0, dc.sp, OffsetOf(S_stack, end_ptr));
   //stmdb   sp!, {r0, dc.r2, dc.r4 - dc.r12, lr}  // r0=BlockEnd r2=DstStride
   //dc.Sub(dc.r6, dc.r0, 128   //Block
   dc.Mov(dc.r7, dc.r3);         //Src
   dc.Mov(dc.r8, dc.r1);        //Dst

   dc.BranchLink(l_MCol8);  
   dc.Add(dc.r6, dc.r6, 2);
   dc.BranchLink(l_MCol8);  
   dc.Add(dc.r6, dc.r6, 2);
   dc.BranchLink(l_MCol8);  
   dc.Add(dc.r6, dc.r6, 2);
   dc.BranchLink(l_MCol8);  
   dc.Add(dc.r6, dc.r6, 2);
   dc.BranchLink(l_MCol8);  
   dc.Add(dc.r6, dc.r6, 2);
   dc.BranchLink(l_MCol8);  
   dc.Add(dc.r6, dc.r6, 2);
   dc.BranchLink(l_MCol8);  
   dc.Add(dc.r6, dc.r6, 2);
   dc.BranchLink(l_MCol8); 
   dc.Sub(dc.r6, dc.r6, 14);
   {
      void *Row8_Loop = dc.Label();

      dc.SHalf(); dc.Ldr(dc.r0, dc.r6, 0);        //x0
      dc.SHalf(); dc.Ldr(dc.r3, dc.r6, 2);    //x4
      dc.SHalf(); dc.Ldr(dc.r4, dc.r6, 4);    //x3
      dc.SHalf(); dc.Ldr(dc.r5, dc.r6, 6);    //x7
      dc.SHalf(); dc.Ldr(dc.r9, dc.r6, 8);    //x1
      dc.SHalf(); dc.Ldr(dc.r2, dc.r6, 10);      //x6
      dc.SHalf(); dc.Ldr(dc.r14,dc.r6, 12);      //x2
      dc.SHalf(); dc.Ldr(dc.r1, dc.r6, 14);      //x5
      
      dc.Orr(dc.r11, dc.r3, dc.r4);
      dc.Orr(dc.r11, dc.r11, dc.r5);
      dc.Orr(dc.r11, dc.r11, dc.r9);
      dc.Orr(dc.r11, dc.r11, dc.r2);
      dc.Orr(dc.r11, dc.r11, dc.r14);
      dc.Set(); dc.Orr(dc.r11, dc.r11, dc.r1);
      void *Row8_NoConst = dc.Label(false);
      dc.Branch(dc.NE, Row8_NoConst);

      dc.BranchLink(l_RowConst);
      //bl    RowConst
      //b     Row8_Next
      void *Row8_Next = dc.Label(false);
      dc.Branch(Row8_Next);


      /*
_W3         DCW 2408                 // 2048*sqrt(2)*cos(3*pi/16) 
_W6         DCW 1108                 // 2048*sqrt(2)*cos(6*pi/16) 
_W7         DCW 565                  // 2048*sqrt(2)*cos(7*pi/16) 

W1_minus_W7       DCW 2276
minus_W1_minus_W7 DCW 0xF2B2 //-3406
W5_minus_W3       DCW 0xFCE1 //-799
minus_W2_minus_W6 DCW 0xF138 //-3784
*/

   dc.PutLabel(Row8_NoConst);
      dc.Cmp(dc.r7, 0);

      dc.Add(dc.r0, dc.r0, 32);
      dc.Ldr(dc.r10, W7);
      dc.Mov(dc.r0, dc.r0, dc.LSL, 11);    //x0 = (x0 + 32) << 11
      dc.Ldr(dc.r12, W1_minus_W7);
      dc.Add(dc.r11, dc.r3, dc.r1);
      dc.Mul(dc.r11, dc.r10, dc.r11);       //x8 = W7 * (x4 + x5)
      dc.Ldr(dc.r10, minus_W1_minus_W7);
      dc.Mla(dc.r3, dc.r12, dc.r3, dc.r11);   //x4 = x8 + W1_minus_W7 * x4
      dc.Ldr(dc.r12, W3);
      dc.Mla(dc.r1, dc.r10, dc.r1, dc.r11);   //x5 = x8 + minus_W1_minus_W7 * x5
      dc.Ldr(dc.r10, W5_minus_W3);
      dc.Add(dc.r11, dc.r2, dc.r5);         //x6 + x7
      dc.Mul(dc.r11, dc.r12, dc.r11);       //x8 = W3 * (x6 + x7)
      dc.Mvn(dc.r12, 0xfb0);        //minus_W3_minus_W5
      dc.Mla(dc.r2, dc.r10, dc.r2, dc.r11);     //x6 = x8 + W5_minus_W3 * x6
      dc.Ldr(dc.r10, W6);
      dc.Mla(dc.r5, dc.r12, dc.r5, dc.r11);     //x7 = x8 + minus_W3_minus_W5 * x7
      dc.Ldr(dc.r12, minus_W2_minus_W6);
      dc.Add(dc.r11, dc.r0, dc.r9, dc.LSL, 11);//x8 = x0 + (x1 << 11)
      dc.Sub(dc.r0, dc.r0, dc.r9, dc.LSL, 11);  //x0 = x0 - (x1 << 11)
      dc.Add(dc.r9, dc.r4, dc.r14);
      dc.Mul(dc.r9, dc.r10, dc.r9);       //x1 = W6 * (x3 + x2)
      dc.Mov(dc.r10, 0x620);        //W2_minus_W6
      dc.Mla(dc.r14, dc.r12, dc.r14, dc.r9); //x2 = x1 + minus_W2_minus_W6 * x2
      dc.Mov(dc.r12, 181);
      dc.Mla(dc.r4, dc.r10, dc.r4, dc.r9);      //x3 = x1 + W2_minus_W6 * x3
      dc.Add(dc.r9, dc.r3, dc.r2);        //x1 = x4 + x6
      dc.Sub(dc.r3, dc.r3, dc.r2);        //x4 = x4 - x6
      dc.Add(dc.r2, dc.r1, dc.r5);        //x6 = x5 + x7
      dc.Sub(dc.r1, dc.r1, dc.r5);        //x5 = x5 - x7
      dc.Add(dc.r5, dc.r11, dc.r4);       //x7 = x8 + x3
      dc.Sub(dc.r11, dc.r11, dc.r4);      //x8 = x8 - x3
      dc.Add(dc.r4, dc.r0, dc.r14);       //x3 = x0 + x2
      dc.Sub(dc.r0, dc.r0, dc.r14);       //x0 = x0 - x2
      dc.Add(dc.r3, dc.r3, 4);        //
      dc.Add(dc.r14, dc.r3, dc.r1);       //x2 = x4 + x5 + 4
      dc.Sub(dc.r3, dc.r3, dc.r1);        //x4 = x4 - x5 + 4
      dc.Mov(dc.r10, 16);
      dc.Mov(dc.r14, dc.r14, dc.ASR, 3);
      dc.Mov(dc.r3, dc.r3, dc.ASR, 3);
      dc.Mla(dc.r14, dc.r12, dc.r14, dc.r10);   //x2 = 181 * ((x4 + x5 + 4) >> 3) + 16
      dc.Mla(dc.r3, dc.r12, dc.r3, dc.r10);  //x4 = 181 * ((x4 - x5 + 4) >> 3) + 16

      dc.Add(dc.r1, dc.r5, dc.r9);        //x5 = x7 + x1
      dc.Sub(dc.r9, dc.r5, dc.r9);        //x1 = x7 - x1
      dc.Add(dc.r5, dc.r4, dc.r14, dc.ASR, 5);  //x7 = x3 + (x2 >> 5)
      dc.Sub(dc.r14, dc.r4, dc.r14, dc.ASR, 5);  //x2 = x3 - (x2 >> 5)
      dc.Add(dc.r4, dc.r0, dc.r3, dc.ASR, 5);   //x3 = x0 + (x4 >> 5)
      dc.Sub(dc.r3, dc.r0, dc.r3, dc.ASR, 5);   //x4 = x0 - (x4 >> 5)
      dc.Add(dc.r0, dc.r11, dc.r2);       //x0 = x8 + x6
      dc.Sub(dc.r2, dc.r11, dc.r2);       //x6 = x8 - x6

      dc.Branch(dc.EQ, Row8_NoSrc);

      dc.Byte(); dc.Ldr(dc.r10, dc.r7, 0);
      dc.Byte(); dc.Ldr(dc.r12, dc.r7, 7);
      dc.Byte(); dc.Ldr(dc.r11, dc.r7, 1);
      dc.Add(dc.r1, dc.r10, dc.r1, dc.ASR, 17);
      dc.Add(dc.r9, dc.r12, dc.r9, dc.ASR, 17);
      dc.Add(dc.r5, dc.r11, dc.r5, dc.ASR, 17);
      dc.Byte(); dc.Ldr(dc.r10, dc.r7, 6);
      dc.Byte(); dc.Ldr(dc.r12, dc.r7, 2);
      dc.Byte(); dc.Ldr(dc.r11, dc.r7, 5);
      dc.Add(dc.r14, dc.r10, dc.r14, dc.ASR, 17);
      dc.Add(dc.r4, dc.r12, dc.r4, dc.ASR, 17);
      dc.Byte(); dc.Ldr(dc.r10, dc.r7, 3);
      dc.Byte(); dc.Ldr(dc.r12, dc.r7, 4);
      dc.Add(dc.r3, dc.r11, dc.r3, dc.ASR, 17);
      dc.Add(dc.r0, dc.r10, dc.r0, dc.ASR, 17);
      dc.Add(dc.r2, dc.r12, dc.r2, dc.ASR, 17);
      dc.Add(dc.r7, dc.r7, 8);        //source stride

   dc.PutLabel(Row8_Sat);
      dc.Orr(dc.r10, dc.r1, dc.r9);
      dc.Orr(dc.r10, dc.r10, dc.r5);
      dc.Orr(dc.r10, dc.r10, dc.r14);
      dc.Orr(dc.r10, dc.r10, dc.r4);
      dc.Orr(dc.r10, dc.r10, dc.r3);
      dc.Orr(dc.r10, dc.r10, dc.r0);
      dc.Orr(dc.r10, dc.r10, dc.r2);
      dc.Set(); dc.Bic(dc.r10, dc.r10, 0xff);  // 0xFF = 255
      void *Row8_Write = dc.Label(false);
      dc.Branch(dc.EQ, Row8_Write);

      dc.Mov(dc.r10, 0xffffff00);

      dc.Tst(dc.r1, dc.r10);
      dc.Cond(dc.NE); dc.Mov(dc.r1, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r1, 0x00);

      dc.Tst(dc.r9, dc.r10);
      dc.Cond(dc.NE); dc.Mov(dc.r9, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r9, 0x00);

      dc.Tst(dc.r5, dc.r10);
      dc.Cond(dc.NE); dc.Mov(dc.r5, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r5, 0x00);

      dc.Tst(dc.r14, dc.r10);
      dc.Cond(dc.NE); dc.Mov(dc.r14, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r14, 0x00);

      dc.Tst(dc.r4, dc.r10);
      dc.Cond(dc.NE); dc.Mov(dc.r4, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r4, 0x00);

      dc.Tst(dc.r3, dc.r10);
      dc.Cond(dc.NE); dc.Mov(dc.r3, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r3, 0x00);

      dc.Tst(dc.r0, dc.r10);
      dc.Cond(dc.NE); dc.Mov(dc.r0, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r0, 0x00);

      dc.Tst(dc.r2, dc.r10);
      dc.Cond(dc.NE); dc.Mov(dc.r2, 0xFF);
      dc.Cond(dc.MI); dc.Mov(dc.r2, 0x00);

   dc.PutLabel(Row8_Write);
      dc.Byte(); dc.Str(dc.r1, dc.r8, 0);
      dc.Byte(); dc.Str(dc.r5, dc.r8, 1);
      dc.Byte(); dc.Str(dc.r4, dc.r8, 2);
      dc.Byte(); dc.Str(dc.r0, dc.r8, 3);
      dc.Byte(); dc.Str(dc.r2, dc.r8, 4);
      dc.Byte(); dc.Str(dc.r3, dc.r8, 5);
      dc.Byte(); dc.Str(dc.r14,dc.r8, 6);
      dc.Byte(); dc.Str(dc.r9, dc.r8, 7);

   dc.PutLabel(Row8_Next);
      //dc.Ldr(dc. r2, [sp, 4);   //DstStride
      //dc.Ldr(dc. r1, [sp, 0);   //BlockEnd
      dc.Ldr(dc.r2, dc.sp, OffsetOf(S_stack, dst_pitch));
      dc.Ldr(dc.r1, dc.sp, OffsetOf(S_stack, end_ptr));
      
      dc.Add(dc.r6, dc.r6,16);      //Block += 16
      dc.Add(dc.r8, dc.r8, dc.r2);    //Dst += DstStride

      dc.Cmp(dc.r6, dc.r1);
      dc.Branch(dc.NE, Row8_Loop);
   }
   dc.FunctionEnd();

dc.PutLabel(Row8_NoSrc);

   dc.Mov(dc.r1, dc.r1, dc.ASR, 17);
   dc.Mov(dc.r9, dc.r9, dc.ASR, 17);
   dc.Mov(dc.r5, dc.r5, dc.ASR, 17);
   dc.Mov(dc.r14, dc.r14, dc.ASR, 17);
   dc.Mov(dc.r4, dc.r4, dc.ASR, 17);
   dc.Mov(dc.r3, dc.r3, dc.ASR, 17);
   dc.Mov(dc.r0, dc.r0, dc.ASR, 17);
   dc.Mov(dc.r2, dc.r2, dc.ASR, 17);

   dc.Branch(Row8_Sat);

   dc.PutLabel(W3);
   dc.PutLabel(W6);
   dc.PutLabel(W7);
   dc.PutLabel(W1_minus_W7);
   dc.PutLabel(minus_W1_minus_W7);
   dc.PutLabel(W5_minus_W3);
   dc.PutLabel(minus_W2_minus_W6);
}

//----------------------------
#ifdef USE_IDCT_WMMX
//----------------------------

static void BuildWMMXconst8x8copyrow(C_dyn_code &dc){

   dc.Wldrd(dc.wr1, dc.r3, 0);
   dc.Add(dc.r3, dc.r3, 8);
   dc.Wldrd(dc.wr2, dc.r3, 0);
   dc.Add(dc.r3, dc.r3, 8);
   dc.Wstrd(dc.wr1, dc.r1, 0);
   dc.Add(dc.r1, dc.r1, dc.r2);
   dc.Wstrd(dc.wr2, dc.r1, 0);
   dc.Add(dc.r1, dc.r1, dc.r2);
}

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

static void BuildWMMXconst8x8addrow(C_dyn_code &dc){
   dc.Wldrd(dc.wr1, dc.r3, 0);
   dc.Add(dc.r3, dc.r3, 8);
   dc.Wldrd(dc.wr2, dc.r3, 0);
   dc.Add(dc.r3, dc.r3, 8);
   dc.Waddbus(dc.wr1, dc.wr1, dc.wr0);
   dc.Waddbus(dc.wr2, dc.wr2, dc.wr0);
   dc.Wstrd(dc.wr1, dc.r1, 0);
   dc.Add(dc.r1, dc.r1, dc.r2);
   dc.Wstrd(dc.wr2, dc.r1, 0);
   dc.Add(dc.r1, dc.r1, dc.r2);
}

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

static void BuildWMMXconst8x8subrow(C_dyn_code &dc){
   
   dc.Wldrd(dc.wr1, dc.r3, 0);
   dc.Add(dc.r3, dc.r3, 8);
   dc.Wldrd(dc.wr2, dc.r3, 0);
   dc.Add(dc.r3, dc.r3, 8);
   dc.Wsubbus(dc.wr1, dc.wr1, dc.wr0);
   dc.Wsubbus(dc.wr2, dc.wr2, dc.wr0);
   dc.Wstrd(dc.wr1, dc.r1, 0);
   dc.Add(dc.r1, dc.r1, dc.r2);
   dc.Wstrd(dc.wr2, dc.r1, 0);
   dc.Add(dc.r1, dc.r1, dc.r2);
}

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

static void BuildWMMXIDCT_Const8x8(C_dyn_code &dc){
   
   void *l_const8x8add = dc.Label(false);
   void *l_const8x8sub = dc.Label(false);
   void *l_const8x8done = dc.Label(false);

   dc.Align(16);
   dc.FunctionBegin();

   dc.Cmp(dc.r0, 0);
   dc.Branch(dc.GT, l_const8x8add);
   dc.Branch(dc.LT, l_const8x8sub);
   dc.Cmp(dc.r1, dc.r3);
   dc.Branch(dc.EQ, l_const8x8done);

   BuildWMMXconst8x8copyrow(dc);
   BuildWMMXconst8x8copyrow(dc);
   BuildWMMXconst8x8copyrow(dc);
   BuildWMMXconst8x8copyrow(dc);

dc.PutLabel(l_const8x8done);
   dc.FunctionEnd();

dc.PutLabel(l_const8x8add);   
   dc.Tbcstb(dc.wr0, dc.r0);
   BuildWMMXconst8x8addrow(dc);
   BuildWMMXconst8x8addrow(dc);

⌨️ 快捷键说明

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