不好意思MMX我也没用过
等下周有时间时我把Intel的手册翻一下可能就知道原因了
等下周有时间时我把Intel的手册翻一下可能就知道原因了
为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
_asm { mov edi,dst mov esi,src mov edx,h //Height of image. pxor mm6,mm6 pxor mm7,mm7 xor eax,eax scan_loop: mov ecx,w //Width of image. xor ebx,ebx pix_loop: movq mm4,[esi+ebx*8] // mm4 = src (RG BA RG BA) movq mm5,[edi+ebx*8] // mm5 = dst (RG BA RG BA) // FIRST PIXEL movq mm0,mm4 // mm0 = src (-- -- RG BA) movq mm1,mm5 // mm1 = dst (-- -- RG BA) punpcklbw mm0,mm6 // mm0 = (0R 0G 0B 0A) mov al,[esi+ebx*8+3] // eax = pixel alpha (0 - 255) punpcklbw mm1,mm7 // mm1 = (0R 0G 0B 0A) movd mm2,eax // 00 00 00 0A movq mm3,mm1 // mm3 = mm1: dst (0R 0G 0B 0A) punpcklwd mm2,mm2 // 00 00 0A 0A psubw mm0,mm1 // mm0 = mm0 - mm1 punpckldq mm2,mm2 // 0A 0A 0A 0A psllw mm3,8 // mm3 = mm1 * 256 pmullw mm0,mm2 // mm0 = (src - dst) * alpha paddw mm0,mm3 // mm0 = (src - dst) * alpha + dst * 256 psrlw mm0,8 // mm0 = ((src - dst) * alpha + dst * 256) / 256 packuswb mm0,mm6 // mm0 = RGBA // SECOND PIXEL punpckhbw mm4,mm6 // mm4 = (0R 0G 0B 0A) mov al,[esi+ebx*8+7] // eax = pixel alpha (0 - 255) punpckhbw mm5,mm7 // mm5 = (0R 0G 0B 0A) movd mm2,eax // 00 00 00 0A movq mm3,mm5 // mm3 = mm5: dst (0R 0G 0B 0A) punpcklwd mm2,mm2 // 00 00 0A 0A psubw mm4,mm5 // mm4 = mm4 - mm5 punpckldq mm2,mm2 // 0A 0A 0A 0A psllw mm3,8 // mm3 = mm5 * 256 pmullw mm4,mm2 // mm4 = (src - dst) * alpha paddw mm4,mm3 // mm4 = (src - dst) * alpha + dst * 256 psrlw mm4,8 // mm4 = ((src - dst) * alpha + dst * 256) / 256 packuswb mm4,mm6 // mm4 = RGBA punpckldq mm0,mm4 // mm0 = RG BA RG BA movq [edi+ebx*8],mm0 // dst = mm0 inc ebx // REPEAT loop pix_loop mov ebx, wmul4 add esi, ebx add edi, ebx dec edx jnz scan_loop }//FOR SSE
_asm { mov edi,dst mov esi,src mov edx,h pxor mm6,mm6 pxor mm7,mm7 xor eax,eax scan_loop: mov ecx,w xor ebx,ebx pix_loop: movq mm4,[esi+ebx*8] // mm0 = src (RG BA RG BA) movq mm5,[edi+ebx*8] // mm1 = dst (RG BA RG BA) // FIRST PIXEL movq mm0,mm4 // mm0 = 00 00 RG BA movq mm1,mm5 // mm1 = 00 00 RG BA punpcklbw mm0,mm6 // mm0 = (0R 0G 0B 0A) punpcklbw mm1,mm7 // mm0 = (0R 0G 0B 0A) pshufw mm2,mm0,0ffh // mm2 = 0A 0A 0A 0A movq mm3,mm1 // mm3 = mm1 psubw mm0,mm1 // mm0 = mm0 - mm1 psllw mm3,8 // mm3 = mm1 * 256 pmullw mm0,mm2 // mm0 = (src-dst)*alpha paddw mm0,mm3 // mm0 = (src-dst)*alpha+dst*256 psrlw mm0,8 // mm0 = ((src - dst) * alpha + dst * 256) / 256 // SECOND PIXEL punpckhbw mm5,mm7 // mm5 = (0R 0G 0B 0A) punpckhbw mm4,mm6 // mm4 = (0R 0G 0B 0A) movq mm3,mm5 // mm3 = mm5 pshufw mm2,mm4,0ffh // mm2 = 0A 0A 0A 0A psllw mm3,8 // mm3 = mm5 * 256 psubw mm4,mm5 // mm4 = mm4 - mm5 pmullw mm4,mm2 // mm4 = (src-dst)*alpha paddw mm4,mm3 // mm4 = (src-dst)*alpha+dst*256 psrlw mm4,8 // mm4 = ((src - dst) * alpha + dst * 256) / 256 packuswb mm0,mm4 // mm0 = RG BA RG BA movq [edi+ebx*8],mm0 // dst = mm0 inc ebx loop pix_loop // mov ebx, wmul4 add esi, ebx add edi, ebx dec edx jnz scan_loop }N久前收集的东东。