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

📄 fastidctmmx32.c

📁 idct mmx technology implement
💻 C
📖 第 1 页 / 共 2 页
字号:
					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 + -