📄 image.c
字号:
PSLLW mm6,4
PSLLW mm7,2
paddw mm6,mm7
paddw mm3,mm6
movq mm6,mm1
PSLLW mm6,2
paddw mm6,mm1
psubw mm3,mm6
paddw mm3,mm2
pxor mm6,mm6
movq [edi],mm3
paddw mm3,f16
PSRAW mm3,5
PACKUSWB mm3,mm6
PUNPCKLBW mm3,mm6
movq2dq xmm0,mm3
movq [ebx],mm3
paddw mm3,mm5
paddw mm3,f1
PSRAw mm3,1
movq [ecx],mm3
movdq2q mm3,xmm0
paddw mm3,mm0
paddw mm3,f1
PSRAw mm3,1
movq [edx],mm3
emms
}
}
static void calcj(_int16*pt1,_int32*pt2)
{
static _int64 zero[2]={0,0};
static _int64 f512[2]={0x0000020000000200,0x0000020000000200};
_int64 *pt=f512;
_int64 *ptz=zero;
int imgw=(img->width+4*IMG_PAD_SIZE)*2;
_asm
{
mov eax,pt1
mov ebx,pt2
mov ecx,pt
mov edx,ptz
//计算第一列
MOVQ mm0,[eax]
add eax,imgw
MOVQ mm1,[eax]
add eax,imgw
MOVQ mm2,[eax]
add eax,imgw
MOVQ mm3,[eax]
//转秩
movq mm4,mm0
movq mm5,mm1
movq mm6,mm2
PUNPCKLWD mm0,mm1
PUNPCKLWD mm2,mm3
movq mm1,mm0
PUNPCKLDQ mm0,mm2
PUNPCKHDQ mm1,mm2
PUNPCKHWD mm4,mm5
PUNPCKHWD mm6,mm3
movq mm3,mm4
PUNPCKLDQ mm4,mm6
PUNPCKHDQ mm3,mm6
movq mm2,mm4
MOVQ2DQ XMM0,MM0
MOVQ2DQ XMM1,MM1
MOVQ2DQ XMM2,MM2
MOVQ2DQ XMM3,MM3
pxor xmm6,xmm6
PUNPCKLWD xmm0,xmm6//扩展为32位
PUNPCKLWD xmm1,xmm6
PUNPCKLWD xmm2,xmm6
PUNPCKLWD xmm3,xmm6
MOVDQU xmm6,xmm1
PSLLD xmm6,2
paddd xmm6,xmm1
psubd xmm0,xmm6
MOVDQU xmm6,xmm2
MOVDQU xmm7,xmm2
PSLLD xmm6,4
PSLLD xmm7,2
paddd xmm6,xmm7
paddd xmm0,xmm6
MOVDQU xmm6,xmm3
MOVDQU xmm7,xmm3
PSLLD xmm6,4
PSLLD xmm7,2
paddd xmm6,xmm7
paddd xmm0,xmm6
//再读入两列
mov eax,pt1
add eax,8
movd mm4,[eax]
add eax,imgw
movd mm5,[eax]
add eax,imgw
movd mm6,[eax]
add eax,imgw
movd mm7,[eax]
//转秩
PUNPCKLWD mm4,mm5
PUNPCKLWD mm6,mm7
movq mm5,mm4
PUNPCKLDQ mm4,mm6
PUNPCKHDQ mm5,mm6
MOVQ2DQ XMM4,MM4
MOVQ2DQ XMM5,MM5
pxor xmm6,xmm6
PUNPCKLWD xmm4,xmm6//扩展为32位
PUNPCKLWD xmm5,xmm6
MOVDQU xmm6,xmm4
PSLLd xmm6,2
paddd xmm6,xmm4
psubd xmm0,xmm6
paddd xmm0,xmm5
MOVDQU xmm6,[ecx]
paddd xmm0,xmm6
PSRAd xmm0,10
pxor xmm6,xmm6
PACKUSwb xmm0,xmm6
PUNPCKLbw xmm0,xmm6
MOVDQU [ebx],xmm0
add ebx,16
//计算第二列
//再读入两列
mov eax,pt1
add eax,10
movd mm5,[eax]
add eax,imgw
movd mm0,[eax]
add eax,imgw
movd mm6,[eax]
add eax,imgw
movd mm7,[eax]
//转秩
PUNPCKLWD mm5,mm0
PUNPCKLWD mm6,mm7
movq mm0,mm5
PUNPCKLDQ mm5,mm6
PUNPCKHDQ mm0,mm6
MOVQ2DQ XMM0,MM0
MOVQ2DQ XMM5,MM5
pxor xmm6,xmm6
PUNPCKLWD xmm0,xmm6//扩展为32位
PUNPCKLWD xmm5,xmm6
MOVDQU xmm6,xmm2
PSLLD xmm6,2
paddd xmm6,xmm2
psubd xmm1,xmm6
MOVDQU xmm6,xmm3
MOVDQU xmm7,xmm3
PSLLd xmm6,4
PSLLd xmm7,2
paddd xmm6,xmm7
paddd xmm1,xmm6
MOVDQU xmm6,xmm4
MOVDQU xmm7,xmm4
PSLLd xmm6,4
PSLLd xmm7,2
paddd xmm6,xmm7
paddd xmm1,xmm6
MOVDQU xmm6,xmm5
PSLLd xmm6,2
paddd xmm6,xmm5
psubd xmm1,xmm6
paddd xmm1,xmm0
MOVDQU xmm6,[ecx]
paddd xmm1,xmm6
PSRAd xmm1,10
pxor xmm6,xmm6
PACKUSwb xmm1,xmm6
PUNPCKLbw xmm1,xmm6
MOVDQU [ebx],xmm1
add ebx,16
//计算第三列
//再读入两列
mov eax,pt1
add eax,12
movd mm0,[eax]
add eax,imgw
movd mm1,[eax]
add eax,imgw
movd mm6,[eax]
add eax,imgw
movd mm7,[eax]
//转秩
PUNPCKLWD mm0,mm1
PUNPCKLWD mm6,mm7
movq mm1,mm0
PUNPCKLDQ mm0,mm6
PUNPCKHDQ mm1,mm6
MOVQ2DQ XMM0,MM0
MOVQ2DQ XMM1,MM1
pxor xmm6,xmm6
PUNPCKLWD xmm0,xmm6//扩展为32位
PUNPCKLWD xmm1,xmm6
MOVDQU xmm6,xmm3
PSLLD xmm6,2
paddd xmm6,xmm3
psubd xmm2,xmm6
MOVDQU xmm6,xmm4
MOVDQU xmm7,xmm4
PSLLd xmm6,4
PSLLd xmm7,2
paddd xmm6,xmm7
paddd xmm2,xmm6
MOVDQU xmm6,xmm5
MOVDQU xmm7,xmm5
PSLLd xmm6,4
PSLLd xmm7,2
paddd xmm6,xmm7
paddd xmm2,xmm6
MOVDQU xmm6,xmm0
PSLLd xmm6,2
paddd xmm6,xmm0
psubd xmm2,xmm6
paddd xmm2,xmm1
MOVDQU xmm6,[ecx]
paddd xmm2,xmm6
PSRAd xmm2,10
pxor xmm6,xmm6
PACKUSWB xmm2,xmm6
PUNPCKLBW xmm2,xmm6
MOVDQU [ebx],xmm2
add ebx,16
//计算第四列
//再读入两列
mov eax,pt1
add eax,14
movd mm1,[eax]
add eax,imgw
movd mm2,[eax]
add eax,imgw
movd mm6,[eax]
add eax,imgw
movd mm7,[eax]
//转秩
PUNPCKLWD mm1,mm2
PUNPCKLWD mm6,mm7
movq mm2,mm1
PUNPCKLDQ mm1,mm6
PUNPCKHDQ mm2,mm6
MOVQ2DQ XMM2,MM2
MOVQ2DQ XMM1,MM1
pxor xmm6,xmm6
PUNPCKLWD xmm1,xmm6//扩展为32位
PUNPCKLWD xmm2,xmm6
MOVDQU xmm6,xmm4
PSLLd xmm6,2
paddd xmm6,xmm4
psubd xmm3,xmm6
MOVDQU xmm6,xmm5
MOVDQU xmm7,xmm5
PSLLd xmm6,4
PSLLd xmm7,2
paddd xmm6,xmm7
paddd xmm3,xmm6
MOVDQU xmm6,xmm0
MOVDQU xmm7,xmm0
PSLLd xmm6,4
PSLLd xmm7,2
paddd xmm6,xmm7
paddd xmm3,xmm6
MOVDQU xmm6,xmm1
PSLLd xmm6,2
paddd xmm6,xmm1
psubd xmm3,xmm6
paddd xmm3,xmm2
MOVDQU xmm6,[ecx]
paddd xmm3,xmm6
PSRAd xmm3,10
pxor xmm6,xmm6
PACKUSWB xmm3,xmm6
PUNPCKLBW xmm3,xmm6
MOVDQU [ebx],xmm3
emms
}
}
static void UnifiedOneForthPix (pel_t ** imgY, pel_t ** imgU, pel_t ** imgV,
pel_t ** out4Y, pel_t ** outU, pel_t ** outV,
pel_t ** ref11)
{
int is;
int i, j, j4,i4;
int ie2, je2, jj, maxy;
static _int16 buff[8][4][4];
static _int32 buff1[4][4],*ptbuff1=buff1[0];
int indj,indi,j1,i1,indj1,indi1;
int maxheight=(img->height+2*IMG_PAD_SIZE)<<2;
int maxwidth=(img->width+2*IMG_PAD_SIZE)<<2;
int w=(img->width+4*IMG_PAD_SIZE)*2;
byte *pt1,*pt2;
_int16 *pt3,*pbuff0=buff[0][0],*pbuff1=buff[1][0],*pbuff2=buff[2][0],*pbuff3=buff[3][0],*pbuff4=buff[4][0],*pbuff5=buff[5][0],*pbuff6=buff[6][0],*pbuff7=buff[7][0];
int imgwp32=img->width+32;
copyframewithextend16(&(tmpImgY[0][0]),&(imgY[0][0]),img->height,img->width);
for (j = -IMG_PAD_SIZE; j < img->height + IMG_PAD_SIZE; j+=4)
{
indj=(IMG_PAD_SIZE+j)<<2;
for (i = -IMG_PAD_SIZE; i < img->width + IMG_PAD_SIZE; i+=4)
{
calcabc(&(tmpImgY[j][i-2]),&(buff[0][0][0]),&(buff[1][0][0]),&(buff[2][0][0]),&(buff[3][0][0]));
calcdhn(&(tmpImgY[j-2][i]),&(buff[4][0][0]),&(buff[5][0][0]),&(buff[6][0][0]),&(buff[7][0][0]));
indi=(IMG_PAD_SIZE+i)<<2;
pt1=&(out4Y[indj][indi]);
pt2=&(tmpImgY[j][i]);
pt3=&(img4Y_tmp[(IMG_PAD_SIZE+j)][(2*IMG_PAD_SIZE+i)]);
_asm
{
mov edi,pt1
mov esi,pt2
mov eax,imgwp32
mov ebx,maxwidth
shl ebx,2
pxor mm7,mm7
pxor xmm7,xmm7
movd mm0,[esi]
PUNPCKLBW mm0,mm7
movq2dq xmm0,mm0
PUNPCKLWD xmm0,xmm7
add esi,eax
movd mm0,[esi]
PUNPCKLBW mm0,mm7
movq2dq xmm1,mm0
PUNPCKLWD xmm1,xmm7
add esi,eax
movd mm0,[esi]
PUNPCKLBW mm0,mm7
movq2dq xmm2,mm0
PUNPCKLWD xmm2,xmm7
add esi,eax
movd mm0,[esi]
PUNPCKLBW mm0,mm7
movq2dq xmm3,mm0
PUNPCKLWD xmm3,xmm7
mov esi,pbuff1
movq mm0,[esi]
movq mm1,[esi+8]
movq mm2,[esi+16]
movq mm3,[esi+24]
//转秩
movq mm4,mm0
movq mm5,mm1
movq mm6,mm2
PUNPCKLWD mm0,mm1
PUNPCKLWD mm2,mm3
movq mm1,mm0
PUNPCKLDQ mm0,mm2
PUNPCKHDQ mm1,mm2
PUNPCKHWD mm4,mm5
PUNPCKHWD mm6,mm3
movq mm3,mm4
PUNPCKLDQ mm4,mm6
PUNPCKHDQ mm3,mm6
movq mm2,mm4
movq2dq xmm4,mm0
PUNPCKLWD xmm4,xmm7
pslld xmm4,8
por xmm0,xmm4
movq2dq xmm4,mm1
PUNPCKLWD xmm4,xmm7
pslld xmm4,8
por xmm1,xmm4
movq2dq xmm4,mm2
PUNPCKLWD xmm4,xmm7
pslld xmm4,8
por xmm2,xmm4
movq2dq xmm4,mm3
PUNPCKLWD xmm4,xmm7
pslld xmm4,8
por xmm3,xmm4
mov esi,pbuff0
movq mm0,[esi]
movq mm1,[esi+8]
movq mm2,[esi+16]
movq mm3,[esi+24]
//转秩
movq mm4,mm0
movq mm5,mm1
movq mm6,mm2
PUNPCKLWD mm0,mm1
PUNPCKLWD mm2,mm3
movq mm1,mm0
PUNPCKLDQ mm0,mm2
PUNPCKHDQ mm1,mm2
PUNPCKHWD mm4,mm5
PUNPCKHWD mm6,mm3
movq mm3,mm4
PUNPCKLDQ mm4,mm6
PUNPCKHDQ mm3,mm6
movq mm2,mm4
movq2dq xmm4,mm0
PUNPCKLWD xmm4,xmm7
pslld xmm4,16
por xmm0,xmm4
movq2dq xmm4,mm1
PUNPCKLWD xmm4,xmm7
pslld xmm4,16
por xmm1,xmm4
movq2dq xmm4,mm2
PUNPCKLWD xmm4,xmm7
pslld xmm4,16
por xmm2,xmm4
movq2dq xmm4,mm3
PUNPCKLWD xmm4,xmm7
pslld xmm4,16
por xmm3,xmm4
mov esi,pbuff2
movq mm0,[esi]
movq mm1,[esi+8]
movq mm2,[esi+16]
movq mm3,[esi+24]
//转秩
movq mm4,mm0
movq mm5,mm1
movq mm6,mm2
PUNPCKLWD mm0,mm1
PUNPCKLWD mm2,mm3
movq mm1,mm0
PUNPCKLDQ mm0,mm2
PUNPCKHDQ mm1,mm2
PUNPCKHWD mm4,mm5
PUNPCKHWD mm6,mm3
movq mm3,mm4
PUNPCKLDQ mm4,mm6
PUNPCKHDQ mm3,mm6
movq mm2,mm4
movq2dq xmm4,mm0
PUNPCKLWD xmm4,xmm7
pslld xmm4,24
por xmm0,xmm4
movq2dq xmm4,mm1
PUNPCKLWD xmm4,xmm7
pslld xmm4,24
por xmm1,xmm4
movq2dq xmm4,mm2
PUNPCKLWD xmm4,xmm7
pslld xmm4,24
por xmm2,xmm4
movq2dq xmm4,mm3
PUNPCKLWD xmm4,xmm7
pslld xmm4,24
por xmm3,xmm4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -