📄 fastidctmmx32.c
字号:
movq [esi+8],mm0
add esi,16
jmp AnalyseRow // 40 clocks used to skip
PrevTranse:
movq [esi],mm0
movq [esi+8],mm0
transposition:
movq mm0,qword ptr [edi] // a3 a2 a1 a0
movq mm1,qword ptr [edi+16] // b3 b2 b1 b0
movq mm4,mm0
punpckhwd mm4,mm1 //b3 a3 b2 a2 -->mm4
punpcklwd mm0,mm1 //b1 a1 b0 a0 -->mm0
movq mm2,qword ptr [edi+32] // c3 c2 c1 c0
movq mm3,qword ptr [edi+48] // d3 d2 d1 d0
movq mm1,mm2
punpckhwd mm2,mm3 //d3 c3 d2 c2 -->mm2
punpcklwd mm1,mm3 //d1 c1 d0 c0 -->mm1
movq mm3,mm4
punpckhdq mm4,mm2 //d3 c3 b3 a3 -->mm4
punpckldq mm3,mm2 //d2 c2 b2 a2 -->mm3
movq qword ptr [edi+48],mm4
movq mm2,mm0
movq qword ptr [edi+32],mm3
punpckhdq mm2,mm1 //d1 c1 b1 a1 -->mm2
punpckldq mm0,mm1 //d0 c0 b0 a0 -->mm0
movq qword ptr [edi+16],mm2
movq qword ptr [edi],mm0
//matrix 3
movq mm0,qword ptr [edi+72] // a3 a3 a1 a0
movq mm1,qword ptr [edi+88] // b3 b2 b1 b0
movq mm4,mm0
movq mm2,qword ptr [edi+104] // c3 c2 c1 c0
punpckhwd mm4,mm1 //b3 a3 b2 a2 -->mm4
movq mm3,qword ptr [edi+120] // d3 d2 d1 d0
punpcklwd mm0,mm1 //b1 a1 b0 a0 -->mm0
movq mm1,mm2
punpckhwd mm2,mm3 //d3 c3 d2 c2 -->mm2
punpcklwd mm1,mm3 //d1 c1 d0 c0 -->mm1
movq mm3,mm4
punpckhdq mm4,mm2 //d3 c3 b3 a3 -->mm4
punpckldq mm3,mm2 //d2 c2 b2 a2 -->mm3
movq qword ptr [edi+120],mm4
movq mm2,mm0
movq qword ptr [edi+104],mm3
punpckhdq mm2,mm1 //d1 c1 b1 a1 -->mm2
punpckldq mm0,mm1 //d0 c0 b0 a0 -->mm0
movq qword ptr [edi+88],mm2
movq qword ptr [edi+72],mm0
//matrix 0
movq mm0,qword ptr [edi+8] // a3 a3 a1 a0
movq mm1,qword ptr [edi+24] // b3 b2 b1 b0
movq mm2,qword ptr [edi+40] // c3 c2 c1 c0
movq mm3,qword ptr [edi+56] // d3 d2 d1 d0
movq mm4,mm0
punpckhwd mm4,mm1 //b3 a3 b2 a2 -->mm4
punpcklwd mm0,mm1 //b1 a1 b0 a0 -->mm0
movq mm1,mm2
punpckhwd mm2,mm3 //d3 c3 d2 c2 -->mm2
punpcklwd mm1,mm3 //d1 c1 d0 c0 -->mm1
movq mm3,mm4
punpckhdq mm4,mm2 //d3 c3 b3 a3 -->mm4
punpckldq mm3,mm2 //d2 c2 b2 a2 -->mm3
movq mm5,qword ptr [edi+96]
movq mm6,qword ptr [edi+112]
movq qword ptr [edi+112],mm4
movq qword ptr [edi+96],mm3
movq mm4,qword ptr [edi+64]
movq mm7,qword ptr [edi+80]
movq mm2,mm0
punpckhdq mm2,mm1 //d1 c1 b1 a1 -->mm2
punpckldq mm0,mm1 //d0 c0 b0 a0 -->mm0
movq qword ptr[edi+80],mm2
movq qword ptr [edi+64],mm0
//matrix 2
movq mm2,mm4 //a3 a2 a1 a0
punpckhwd mm4,mm7 //b3 a3 b2 a2 -->mm4
punpcklwd mm2,mm7 //b1 a1 b0 a0 -->mm2
movq mm3,mm5
punpckhwd mm3,mm4 //d3 c3 d2 c2 -->mm3
punpcklwd mm5,mm4 //d1 c1 d0 c0 -->mm5
movq mm0,mm4
punpckhdq mm0,mm3 //d3 c3 b3 a3 -->mm0
punpckldq mm4,mm3 //d2 c2 b2 a2 -->mm4
movq mm1,mm2
punpckhdq mm2,mm5 //d1 c1 b1 a1 -->mm2
punpckldq mm1,mm5 //d0 c0 b0 a0 -->mm1
movq qword ptr [edi+56],mm0
movq qword ptr [edi+40],mm4
movq qword ptr [edi+24],mm2
movq qword ptr [edi+8],mm1
mov esi,edi
mov edx,8
AnalyseCol: pxor mm7,mm7
movq mm2, [esi]
movq mm1, [esi+8]
movq mm0,mm2
pand mm2,x12f0000 // x3 x2 x1 00
por mm2,mm1
pcmpeqw mm2,mm7
xor ebx,ebx//
pmovmskb ebx,mm2
cmp ebx,0xff
je SkipCol
movq mm2,mm1
punpcklwd mm1,mm0 // b1 b5 b0 b4
punpckhwd mm0,mm2 // b7 b3 b6 b2
movq mm4,mm1
punpckhwd mm1,mm0 // b7 b1 b3 b5 ---mm1
punpckldq mm0,mm0 // b6 b2 b6 b2 ---mm0 x2 x3 x2 x3
punpckldq mm4,mm4 // b0 b4 b0 b4 ---mm4 x0 x1 x0 x1
movq mm5,mm1
punpckhdq mm1,mm1 // b7 b1 b7 b1 ---mm1 x5 x4 x5 x4
punpckldq mm5,mm5 // b3 b5 b3 b5 ---mm5 x7 x6 x7 x6
pmaddwd mm1,W7_W1_sW1_W7 // 1x4 1x5 ---mm1
pmaddwd mm5,W3_W5_sW5_W3 // 1x6 1x7 ---mm5
psrad mm1,3
psrad mm5,3
// stage 2
pmaddwd mm4,x256_s256_256_256 // x2k_s2k_2k_2k
paddd mm4,x8192_8192 // 2x8 2x0 ---mm4
pmaddwd mm0,sW2_W6_W6_W2 // 2x2 2x3 ---mm0 2 3?
movq mm6,mm1 // 1x4 1x5
psrad mm0,3
paddd mm1,mm5 // 2x1 2x6 ---mm1
psubd mm6,mm5 // 2x4 2x5 ---mm6
// stage 3
movq mm5,mm4 // 2x0 2x8
paddd mm4,mm0 // 3x3 3x7 ---mm4
psubd mm5,mm0 // 3x0 3x8 ---mm5 free mm0
movq mm0,mm6 // 2x4 2x5
movq mm7,mm6
psrlq mm0,32 // 00 2x4
psllq mm7,32 // 2x5 00
paddd mm6,mm0 // 2x4 2x4+2x5
psubd mm6,mm7 // 2x4-2x5 2x5+2x4 --mm6 free mm7,mm0
movq mm7,mm1 // x1 x6
movd eax,mm6
psrlq mm6,32
imul eax,181
movd ebx,mm6
imul ebx,181
movd mm6,eax
movd mm0,ebx
psllq mm6,32
por mm6,mm0 // (x4+x5)*181 (x4-x5)*181
paddd mm6,x128_128
psrad mm6,8 // 3x2 3x4 ---mm6
// stage 4
// 37--mm4 24--mm6 08--mm5 16--mm1
movq mm3,mm4 // x3 x7
punpckldq mm1,mm6 // x4 x6 ---mm1
punpckhdq mm7,mm6 // x2 x1 ---mm7
paddd mm4,mm7 // b1 b0 ---mm4
psubd mm3,mm7 // b6 b7 ---mm3
movq mm7,mm5 // x0 x8
paddd mm5,mm1 // b2 b3 ---mm5
psubd mm7,mm1 // b5 b4 ---mm7
psrad mm4,14
psrad mm5,14
psrad mm3,14
psrad mm7,14
//output
packssdw mm5,mm3 // b6 b7 b2 b3
packssdw mm4,mm7 // b5 b4 b1 b0
movq mm7,mm5 // b6 b7 b2 b3
psrld mm5,16 // 00 b6 00 b2
pslld mm7,16 // b7 00 b3 00
por mm7,mm5 // b7 b6 b3 b2
movq mm5,mm4
punpckldq mm4,mm7 // b3 b2 b1 b0
punpckhdq mm5,mm7 // b7 b6 b5 b4
movq [esi],mm4
movq [esi+8],mm5
dec edx
jz over
add esi,16
jmp AnalyseCol
SkipCol: paddsw mm0,x120s20
psraw mm0,6
add esi,16
pshufw mm0,mm0,0
dec edx
jz outlast
movq [esi-16],mm0
movq [esi-8],mm0
jmp AnalyseCol
outlast:
movq [esi-16],mm0
movq [esi-8],mm0
over: emms
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -