不好意思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久前收集的东东。
