Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;--- assemble: jwasm -coff xxxx.asm
- .686
- .xmm
- .model flat
- .code
- ;##########################################################################
- ;### Macroes, consts ###
- ;##########################################################################
- _ macro args:VARARG ; multiple instructions per line macro
- asm_txt TEXTEQU <>
- FORC char,<&args>
- IFDIF <&char>,<!\>
- asm_txt CATSTR asm_txt,<&char>
- ELSE
- asm_txt
- asm_txt TEXTEQU <>
- ENDIF
- ENDM
- asm_txt
- endm
- SHUFFLE_1230 equ 57
- ;##########################################################################
- ;### SSE_Blur ###
- ;##########################################################################
- mSSE_BlurLoadColumn macro src, width ;--- xmm7:16bytes read from a column, xmm6:temp
- _ push ecx \ push src ;--- all regs are preserved
- _ mov cl,[src] \ ror ecx,8
- _ mov cl,[src+width] \ ror ecx,8 \lea src,[src+width*2]
- _ mov cl,[src] \ ror ecx,8
- _ mov cl,[src+width] \ ror ecx,8 \lea src,[src+width*2] \ movd xmm7,ecx
- _ mov cl,[src] \ ror ecx,8 \ shufps xmm7,xmm7, SHUFFLE_1230
- _ mov cl,[src+width] \ ror ecx,8 \lea src,[src+width*2]
- _ mov cl,[src] \ ror ecx,8
- _ mov cl,[src+width] \ ror ecx,8 \lea src,[src+width*2] \ movd xmm6,ecx
- _ mov cl,[src] \ ror ecx,8 \ movss xmm7,xmm6
- _ mov cl,[src+width] \ ror ecx,8 \lea src,[src+width*2] \ shufps xmm7,xmm7, SHUFFLE_1230
- _ mov cl,[src] \ ror ecx,8
- _ mov cl,[src+width] \ ror ecx,8 \lea src,[src+width*2] \ movd xmm6,ecx
- _ mov cl,[src] \ ror ecx,8 \ movss xmm7,xmm6
- _ mov cl,[src+width] \ ror ecx,8 \lea src,[src+width*2] \ shufps xmm7,xmm7, SHUFFLE_1230
- _ mov cl,[src] \ ror ecx,8
- _ mov cl,[src+width] \ ror ecx,8 \lea src,[src+width*2] \ movd xmm6,ecx
- movss xmm7,xmm6
- shufps xmm7,xmm7, SHUFFLE_1230
- _ pop src \ pop ecx
- endm
- mSSE_BlurClearAccum macro ;--- Clear accum_lo, accum_hi (xmm0,xmm1)
- pxor xmm0,xmm0
- pxor xmm1,xmm1
- endm
- mSSE_BlurAccumAdd macro ;--- Adds xmm7 bytes to (xmm0,xmm1) words
- _ movdqa xmm2,xmm7 \ movdqa xmm3,xmm7
- _ punpcklbw xmm2,xmm4 \ punpckhbw xmm3,xmm4
- _ paddw xmm0,xmm2 \ paddw xmm1,xmm3
- endm
- mSSE_BlurAccumSub macro ;--- Sub xmm7 bytes from (xmm0,xmm1) words
- _ movdqa xmm2,xmm7 \ movdqa xmm3,xmm7
- _ punpcklbw xmm2,xmm4 \ punpckhbw xmm3,xmm4
- _ psubw xmm0,xmm2 \ psubw xmm1,xmm3
- endm
- mSSE_BlurMulStoreRow macro dst ;--- Mul (xmm0,xmm1)words with Multiplier(xmm5) and store 16bytes az Dst
- _ movdqa xmm2, xmm5 \ movdqa xmm3, xmm5
- _ pmulhw xmm2, xmm0 \ pmulhw xmm3, xmm1
- packuswb xmm2, xmm3
- movdqa [dst],xmm2
- endm
- ;void SSE_BlurProcess16Rows(char *src,char *dst,int y,int w,int h,int windowSize) //pseudo code
- ;{
- ; src+=y*w; //calc src row address
- ; dst+=y; //calc dst column address
- ;
- ; char *tail = src-windowSize;
- ; int half = windowSize>>1;
- ; SSE_BlurClearAccum();
- ; for(int x=-half; x < w; x++, src++, tail++) {
- ; if(x < w-half){ SSE_BlurLoadColumn(src , w); SSE_BlurAccumAdd(); }
- ; if(x > half) { SSE_BlurLoadColumn(tail, w); SSE_BlurAccumSub(); }
- ; if(x >= 0) { SSE_BlurMulStoreRow(dst); dst += h; }
- ; }
- ;}
- SSE_BlurProcess16Rows proc c public ASrc:sdword, ADst:sdword, Ay:sdword, AWidth:sdword, AHeight:sdword, AWindowSize:sdword, AMult:sdword ;--- xmm5:multiplier
- ; Processes 16 pixelrows of (AWidth x AHeight) image (ASrc), and blurs it,
- ; then writes the result 16 pixelcolumns into (AHeight x AWidth) image (ADst)
- ; Ay: the starting row index in ASrc, and also the column index in ADst
- ; AMult: must be set to (0x10000/windowSize)*0x10001
- _ push ebx \ push esi \ push edi
- movd xmm5,AMult
- pshufd xmm5,xmm5,0
- head textequ <esi>
- dst textequ <edi>
- _ mov eax,AWidth \ mov ebx,Ay \ mul ebx \ mov head,ASrc \ add head, eax ;esi:src+y*w calculate src row addr
- _ mov dst,ADst \ add dst,Ay ;edi:dst+y calculate dst col addr
- tail textequ <edx>
- half textequ <ebx>
- w textequ <eax>
- _ mov tail,head \ sub tail,AWindowSize ; edx: tail
- _ mov half,AWindowSize \ shr half,1 ; ebx: half
- _ mov w,AWidth ; eax: width
- _ mSSE_BlurClearAccum ; clear accum
- wHalf textequ <[ebp-32]>
- sub w,half
- mov wHalf,w
- add w,half ; wHalf = w-half
- i textequ <sdword ptr ecx> ;x is reserved?
- _ mov i,half \ neg i ; ecx:x = -half
- .while sdword ptr i<eax
- .if i<wHalf ; i<w-half
- mSSE_BlurLoadColumn head,w
- mSSE_BlurAccumAdd
- .endif
- .if i>half
- mSSE_BlurLoadColumn tail,w
- mSSE_BlurAccumSub
- .endif
- .if i>=0
- mSSE_BlurMulStoreRow dst
- add dst,AHeight
- .endif
- inc i
- inc head
- inc tail
- .endw
- _ pop edi \ pop esi \ pop ebx
- ret
- SSE_BlurProcess16Rows endp
- ;##########################################################################
- ;### ###
- ;##########################################################################
- END
Advertisement
Add Comment
Please, Sign In to add comment