📄 idct.cpp
字号:
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 + -