.686 ; create 32 bit code
.mmx
.xmm
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
byt equ byte ptr
wot equ word ptr
dwot equ dword ptr
qdwot equ mmword ptr
qqdwot equ xmmword ptr
.data
include TLB.inc
.code
s32alpha proc C ; lpsrc, spitch, xpos, ypos, width, height, ahpc
option prologue:none, epilogue:none
push ebx ; U - save old frame
push ebp ; V - save old frame
push esi ; U - save old frame
push edi ; V - save old frame
mov edi, [esp+16+4] ; U - load vram pointer
mov eax, [esp+16+28] ; V - load alpha count
test ah, ah ; U - not MAX ?
je @F ; V - JCC
pop edi
pop esi
pop ebp
pop ebx
ret
align 16
@@:
mov ebx, [esp+16+8] ; U - ebx <- pitch
mov ecx, [esp+16+12] ; V - ecx <- xpos
mov esi, ebx ; U - esi <- pitch
mov ebp, [esp+16+16] ; V - ebp <- ypos
imul ebx, ebp ; N - ebx <- height*pitch
lea edi, [edi+ecx*4]
mov ecx, [esp+16+20]
add edi, ebx ; + Y POS
lea edx, [ecx*4] ; edx <- width * 4
mov ebp, [esp+16+24]
sub esi, edx ; RVA pitch
mov ebx, ecx ; save
cmp ecx, 8
jb LN
and ecx, 7 ; do mod
je L8
movd xmm4, esp ; save stack
shl eax, 4 ; eax = TLB index
mov esp, ecx ; esp = ecx = mini widtch
shr ebx, 3 ; ebx = large width cnt
movdqa xmm7, qqdwot[eax+AlphaTLB]
pcmpeqb xmm5, xmm5
psrlw xmm5, 8
pxor xmm6, xmm6
mov edx, 32 ; per deal pixels block bytes
mov eax, ebx ; eax = ebx
align 16
msc_loop:
movdqu xmm0, qqdwot[edi]
movdqu xmm2, qqdwot[edi+16]
movdqa xmm1, xmm0
punpcklbw xmm0, xmm6
pmulhuw xmm0, xmm7
punpckhbw xmm1, xmm6
pmulhuw xmm1, xmm7
movdqa xmm3, xmm2
punpcklbw xmm2, xmm6
packuswb xmm0, xmm1
pmulhuw xmm2, xmm7
punpckhbw xmm3, xmm6
pmulhuw xmm3, xmm7
packuswb xmm2, xmm3
movdqu qqdwot[edi], xmm0
movdqu qqdwot[edi+16], xmm2
lea edi, [edi+edx]
mov ebp, ebp
dec eax
jne msc_loop
@@:
movd xmm0, dwot[edi]
punpcklbw xmm0, xmm6
pmulhuw xmm0, xmm7
packuswb xmm0, xmm0
movd dwot[edi], xmm0
add edi, 4
sub ecx, 1
jne @B
mov eax, ebx
add edi, esi
mov ecx, esp
dec ebp
jne msc_loop
movd esp, xmm4
pop edi
pop esi
pop ebp
pop ebx
ret
align 16
L8:
shr ebx, 3
mov edx, 32
lea eax, [eax*4]
mov ecx, ebx
movdqa xmm7, qqdwot[eax*4+AlphaTLB]
pcmpeqb xmm5, xmm5
psrlw xmm5, 8
pxor xmm6, xmm6
align 16
@@:
movdqu xmm0, qqdwot[edi]
movdqu xmm2, qqdwot[edi+16]
movdqa xmm1, xmm0
punpcklbw xmm0, xmm6
pmulhuw xmm0, xmm7
punpckhbw xmm1, xmm6
pmulhuw xmm1, xmm7
movdqa xmm3, xmm2
punpcklbw xmm2, xmm6
packuswb xmm0, xmm1
pmulhuw xmm2, xmm7
punpckhbw xmm3, xmm6
pmulhuw xmm3, xmm7
packuswb xmm2, xmm3
movdqu qqdwot[edi], xmm0
movdqu qqdwot[edi+16], xmm2
lea edi, [edi+edx]
mov ebp, ebp
dec ecx
jne @B
add edi, esi
mov ecx, ebx
dec ebp
jne @B
pop edi
pop esi
pop ebp
pop ebx
ret
align 16
LN:
mov edx, 4
lea eax, [eax*4]
mov ecx, ebx
movq mm7, qdwot[eax*4+AlphaTLB]
pcmpeqb mm5, mm5
psrlw mm5, 8
pxor mm6, mm6
align 16
@@:
movd mm0, dwot[edi]
punpcklbw mm0, mm6
pmulhuw mm0, mm7
packuswb mm0, mm0
movd dwot[edi], mm0
lea edi, [edi+edx]
mov ebp, ebp
dec ecx
jne @B
add edi, esi
mov ecx, ebx
dec ebp
jne @B
emms
pop edi
pop esi
pop ebp
pop ebx
ret
s32alpha endp
end
TLB.inc
AlphaTLB dd 000000000h, 000000000h, 000000000h, 000000000h
dd 001000100h, 000000100h, 001000100h, 000000100h
dd 002000200h, 000000200h, 002000200h, 000000200h
dd 003000300h, 000000300h, 003000300h, 000000300h
dd 004000400h, 000000400h, 004000400h, 000000400h
dd 005000500h, 000000500h, 005000500h, 000000500h
dd 006000600h, 000000600h, 006000600h, 000000600h
dd 007000700h, 000000700h, 007000700h, 000000700h
dd 008000800h, 000000800h, 008000800h, 000000800h
dd 009000900h, 000000900h, 009000900h, 000000900h
dd 00A000A00h, 000000A00h, 00A000A00h, 000000A00h
dd 00B000B00h, 000000B00h, 00B000B00h, 000000B00h
dd 00C000C00h, 000000C00h, 00C000C00h, 000000C00h
dd 00D000D00h, 000000D00h, 00D000D00h, 000000D00h
dd 00E000E00h, 000000E00h, 00E000E00h, 000000E00h
dd 00F000F00h, 000000F00h, 00F000F00h, 000000F00h
dd 010001000h, 000001000h, 010001000h, 000001000h
dd 011001100h, 000001100h, 011001100h, 000001100h
dd 012001200h, 000001200h, 012001200h, 000001200h
dd 013001300h, 000001300h, 013001300h, 000001300h
dd 014001400h, 000001400h, 014001400h, 000001400h
dd 015001500h, 000001500h, 015001500h, 000001500h
dd 016001600h, 000001600h, 016001600h, 000001600h
dd 017001700h, 000001700h, 017001700h, 000001700h
dd 018001800h, 000001800h, 018001800h, 000001800h
dd 019001900h, 000001900h, 019001900h, 000001900h
dd 01A001A00h, 000001A00h, 01A001A00h, 000001A00h
dd 01B001B00h, 000001B00h, 01B001B00h, 000001B00h
dd 01C001C00h, 000001C00h, 01C001C00h, 000001C00h
dd 01D001D00h, 000001D00h, 01D001D00h, 000001D00h
dd 01E001E00h, 000001E00h, 01E001E00h, 000001E00h
dd 01F001F00h, 000001F00h, 01F001F00h, 000001F00h
dd 020002000h, 000002000h, 020002000h, 000002000h
dd 021002100h, 000002100h, 021002100h, 000002100h
dd 022002200h, 000002200h, 022002200h, 000002200h
dd 023002300h, 000002300h, 023002300h, 000002300h
dd 024002400h, 000002400h, 024002400h, 000002400h
dd 025002500h, 000002500h, 025002500h, 000002500h
dd 026002600h, 000002600h, 026002600h, 000002600h
dd 027002700h, 000002700h, 027002700h, 000002700h
dd 028002800h, 000002800h, 028002800h, 000002800h
dd 029002900h, 000002900h, 029002900h, 000002900h
dd 02A002A00h, 000002A00h, 02A002A00h, 000002A00h
dd 02B002B00h, 000002B00h, 02B002B00h, 000002B00h
dd 02C002C00h, 000002C00h, 02C002C00h, 000002C00h
dd 02D002D00h, 000002D00h, 02D002D00h, 000002D00h
dd 02E002E00h, 000002E00h, 02E002E00h, 000002E00h
dd 02F002F00h, 000002F00h, 02F002F00h, 000002F00h
dd 030003000h, 000003000h, 030003000h, 000003000h
dd 031003100h, 000003100h, 031003100h, 000003100h
dd 032003200h, 000003200h, 032003200h, 000003200h
dd 033003300h, 000003300h, 033003300h, 000003300h
dd 034003400h, 000003400h, 034003400h, 000003400h
dd 035003500h, 000003500h, 035003500h, 000003500h
dd 036003600h, 000003600h, 036003600h, 000003600h
dd 037003700h, 000003700h, 037003700h, 000003700h
dd 038003800h, 000003800h, 038003800h, 000003800h
dd 039003900h, 000003900h, 039003900h, 000003900h
dd 03A003A00h, 000003A00h, 03A003A00h, 000003A00h
dd 03B003B00h, 000003B00h, 03B003B00h, 000003B00h
dd 03C003C00h, 000003C00h, 03C003C00h, 000003C00h
dd 03D003D00h, 000003D00h, 03D003D00h, 000003D00h
dd 03E003E00h, 000003E00h, 03E003E00h, 000003E00h
dd 03F003F00h, 000003F00h, 03F003F00h, 000003F00h
dd 040004000h, 000004000h, 040004000h, 000004000h
dd 041004100h, 000004100h, 041004100h, 000004100h
dd 042004200h, 000004200h, 042004200h, 000004200h
dd 043004300h, 000004300h, 043004300h, 000004300h
dd 044004400h, 000004400h, 044004400h, 000004400h
dd 045004500h, 000004500h, 045004500h, 000004500h
dd 046004600h, 000004600h, 046004600h, 000004600h
dd 047004700h, 000004700h, 047004700h, 000004700h
dd 048004800h, 000004800h, 048004800h, 000004800h
dd 049004900h, 000004900h, 049004900h, 000004900h
dd 04A004A00h, 000004A00h, 04A004A00h, 000004A00h
dd 04B004B00h, 000004B00h, 04B004B00h, 000004B00h
dd 04C004C00h, 000004C00h, 04C004C00h, 000004C00h
dd 04D004D00h, 000004D00h, 04D004D00h, 000004D00h
dd 04E004E00h, 000004E00h, 04E004E00h, 000004E00h
dd 04F004F00h, 000004F00h, 04F004F00h, 000004F00h
dd 050005000h, 000005000h, 050005000h, 000005000h
dd 051005100h, 000005100h, 051005100h, 000005100h
dd 052005200h, 000005200h, 052005200h, 000005200h
dd 053005300h, 000005300h, 053005300h, 000005300h
dd 054005400h, 000005400h, 054005400h, 000005400h
dd 055005500h, 000005500h, 055005500h, 000005500h
dd 056005600h, 000005600h, 056005600h, 000005600h
dd 057005700h, 000005700h, 057005700h, 000005700h
dd 058005800h, 000005800h, 058005800h, 000005800h
dd 059005900h, 000005900h, 059005900h, 000005900h
dd 05A005A00h, 000005A00h, 05A005A00h, 000005A00h
dd 05B005B00h, 000005B00h, 05B005B00h, 000005B00h
dd 05C005C00h, 000005C00h, 05C005C00h, 000005C00h
dd 05D005D00h, 000005D00h, 05D005D00h, 000005D00h
dd 05E005E00h, 000005E00h, 05E005E00h, 000005E00h
dd 05F005F00h, 000005F00h, 05F005F00h, 000005F00h
dd 060006000h, 000006000h, 060006000h, 000006000h
dd 061006100h, 000006100h, 061006100h, 000006100h
dd 062006200h, 000006200h, 062006200h, 000006200h
dd 063006300h, 000006300h, 063006300h, 000006300h
dd 064006400h, 000006400h, 064006400h, 000006400h
dd 065006500h, 000006500h, 065006500h, 000006500h
dd 066006600h, 000006600h, 066006600h, 000006600h
dd 067006700h, 000006700h, 067006700h, 000006700h
dd 068006800h, 000006800h, 068006800h, 000006800h
dd 069006900h, 000006900h, 069006900h, 000006900h
dd 06A006A00h, 000006A00h, 06A006A00h, 000006A00h
dd 06B006B00h, 000006B00h, 06B006B00h, 000006B00h
dd 06C006C00h, 000006C00h, 06C006C00h, 000006C00h
dd 06D006D00h, 000006D00h, 06D006D00h, 000006D00h
dd 06E006E00h, 000006E00h, 06E006E00h, 000006E00h
dd 06F006F00h, 000006F00h, 06F006F00h, 000006F00h
dd 070007000h, 000007000h, 070007000h, 000007000h
dd 071007100h, 000007100h, 071007100h, 000007100h
dd 072007200h, 000007200h, 072007200h, 000007200h
dd 073007300h, 000007300h, 073007300h, 000007300h
dd 074007400h, 000007400h, 074007400h, 000007400h
dd 075007500h, 000007500h, 075007500h, 000007500h
dd 076007600h, 000007600h, 076007600h, 000007600h
dd 077007700h, 000007700h, 077007700h, 000007700h
dd 078007800h, 000007800h, 078007800h, 000007800h
dd 079007900h, 000007900h, 079007900h, 000007900h
dd 07A007A00h, 000007A00h, 07A007A00h, 000007A00h
dd 07B007B00h, 000007B00h, 07B007B00h, 000007B00h
dd 07C007C00h, 000007C00h, 07C007C00h, 000007C00h
dd 07D007D00h, 000007D00h, 07D007D00h, 000007D00h
dd 07E007E00h, 000007E00h, 07E007E00h, 000007E00h
dd 07F007F00h, 000007F00h, 07F007F00h, 000007F00h
dd 080008000h, 000008000h, 080008000h, 000008000h
dd 081008100h, 000008100h, 081008100h, 000008100h
dd 082008200h, 000008200h, 082008200h, 000008200h
dd 083008300h, 000008300h, 083008300h, 000008300h
dd 084008400h, 000008400h, 084008400h, 000008400h
dd 085008500h, 000008500h, 085008500h, 000008500h
dd 086008600h, 000008600h, 086008600h, 000008600h
dd 087008700h, 000008700h, 087008700h, 000008700h
dd 088008800h, 000008800h, 088008800h, 000008800h
dd 089008900h, 000008900h, 089008900h, 000008900h
dd 08A008A00h, 000008A00h, 08A008A00h, 000008A00h
dd 08B008B00h, 000008B00h, 08B008B00h, 000008B00h
dd 08C008C00h, 000008C00h, 08C008C00h, 000008C00h
dd 08D008D00h, 000008D00h, 08D008D00h, 000008D00h
dd 08E008E00h, 000008E00h, 08E008E00h, 000008E00h
dd 08F008F00h, 000008F00h, 08F008F00h, 000008F00h
dd 090009000h, 000009000h, 090009000h, 000009000h
dd 091009100h, 000009100h, 091009100h, 000009100h
dd 092009200h, 000009200h, 092009200h, 000009200h
dd 093009300h, 000009300h, 093009300h, 000009300h
dd 094009400h, 000009400h, 094009400h, 000009400h
dd 095009500h, 000009500h, 095009500h, 000009500h
dd 096009600h, 000009600h, 096009600h, 000009600h
dd 097009700h, 000009700h, 097009700h, 000009700h
dd 098009800h, 000009800h, 098009800h, 000009800h
dd 099009900h, 000009900h, 099009900h, 000009900h
dd 09A009A00h, 000009A00h, 09A009A00h, 000009A00h
dd 09B009B00h, 000009B00h, 09B009B00h, 000009B00h
dd 09C009C00h, 000009C00h, 09C009C00h, 000009C00h
dd 09D009D00h, 000009D00h, 09D009D00h, 000009D00h
dd 09E009E00h, 000009E00h, 09E009E00h, 000009E00h
dd 09F009F00h, 000009F00h, 09F009F00h, 000009F00h
dd 0A000A000h, 00000A000h, 0A000A000h, 00000A000h
dd 0A100A100h, 00000A100h, 0A100A100h, 00000A100h
dd 0A200A200h, 00000A200h, 0A200A200h, 00000A200h
dd 0A300A300h, 00000A300h, 0A300A300h, 00000A300h
dd 0A400A400h, 00000A400h, 0A400A400h, 00000A400h
dd 0A500A500h, 00000A500h, 0A500A500h, 00000A500h
dd 0A600A600h, 00000A600h, 0A600A600h, 00000A600h
dd 0A700A700h, 00000A700h, 0A700A700h, 00000A700h
dd 0A800A800h, 00000A800h, 0A800A800h, 00000A800h
dd 0A900A900h, 00000A900h, 0A900A900h, 00000A900h
dd 0AA00AA00h, 00000AA00h, 0AA00AA00h, 00000AA00h
dd 0AB00AB00h, 00000AB00h, 0AB00AB00h, 00000AB00h
dd 0AC00AC00h, 00000AC00h, 0AC00AC00h, 00000AC00h
dd 0AD00AD00h, 00000AD00h, 0AD00AD00h, 00000AD00h
dd 0AE00AE00h, 00000AE00h, 0AE00AE00h, 00000AE00h
dd 0AF00AF00h, 00000AF00h, 0AF00AF00h, 00000AF00h
dd 0B000B000h, 00000B000h, 0B000B000h, 00000B000h
dd 0B100B100h, 00000B100h, 0B100B100h, 00000B100h
dd 0B200B200h, 00000B200h, 0B200B200h, 00000B200h
dd 0B300B300h, 00000B300h, 0B300B300h, 00000B300h
dd 0B400B400h, 00000B400h, 0B400B400h, 00000B400h
dd 0B500B500h, 00000B500h, 0B500B500h, 00000B500h
dd 0B600B600h, 00000B600h, 0B600B600h, 00000B600h
dd 0B700B700h, 00000B700h, 0B700B700h, 00000B700h
dd 0B800B800h, 00000B800h, 0B800B800h, 00000B800h
dd 0B900B900h, 00000B900h, 0B900B900h, 00000B900h
dd 0BA00BA00h, 00000BA00h, 0BA00BA00h, 00000BA00h
dd 0BB00BB00h, 00000BB00h, 0BB00BB00h, 00000BB00h
dd 0BC00BC00h, 00000BC00h, 0BC00BC00h, 00000BC00h
dd 0BD00BD00h, 00000BD00h, 0BD00BD00h, 00000BD00h
dd 0BE00BE00h, 00000BE00h, 0BE00BE00h, 00000BE00h
dd 0BF00BF00h, 00000BF00h, 0BF00BF00h, 00000BF00h
dd 0C000C000h, 00000C000h, 0C000C000h, 00000C000h
dd 0C100C100h, 00000C100h, 0C100C100h, 00000C100h
dd 0C200C200h, 00000C200h, 0C200C200h, 00000C200h
dd 0C300C300h, 00000C300h, 0C300C300h, 00000C300h
dd 0C400C400h, 00000C400h, 0C400C400h, 00000C400h
dd 0C500C500h, 00000C500h, 0C500C500h, 00000C500h
dd 0C600C600h, 00000C600h, 0C600C600h, 00000C600h
dd 0C700C700h, 00000C700h, 0C700C700h, 00000C700h
dd 0C800C800h, 00000C800h, 0C800C800h, 00000C800h
dd 0C900C900h, 00000C900h, 0C900C900h, 00000C900h
dd 0CA00CA00h, 00000CA00h, 0CA00CA00h, 00000CA00h
dd 0CB00CB00h, 00000CB00h, 0CB00CB00h, 00000CB00h
dd 0CC00CC00h, 00000CC00h, 0CC00CC00h, 00000CC00h
dd 0CD00CD00h, 00000CD00h, 0CD00CD00h, 00000CD00h
dd 0CE00CE00h, 00000CE00h, 0CE00CE00h, 00000CE00h
dd 0CF00CF00h, 00000CF00h, 0CF00CF00h, 00000CF00h
dd 0D000D000h, 00000D000h, 0D000D000h, 00000D000h
dd 0D100D100h, 00000D100h, 0D100D100h, 00000D100h
dd 0D200D200h, 00000D200h, 0D200D200h, 00000D200h
dd 0D300D300h, 00000D300h, 0D300D300h, 00000D300h
dd 0D400D400h, 00000D400h, 0D400D400h, 00000D400h
dd 0D500D500h, 00000D500h, 0D500D500h, 00000D500h
dd 0D600D600h, 00000D600h, 0D600D600h, 00000D600h
dd 0D700D700h, 00000D700h, 0D700D700h, 00000D700h
dd 0D800D800h, 00000D800h, 0D800D800h, 00000D800h
dd 0D900D900h, 00000D900h, 0D900D900h, 00000D900h
dd 0DA00DA00h, 00000DA00h, 0DA00DA00h, 00000DA00h
dd 0DB00DB00h, 00000DB00h, 0DB00DB00h, 00000DB00h
dd 0DC00DC00h, 00000DC00h, 0DC00DC00h, 00000DC00h
dd 0DD00DD00h, 00000DD00h, 0DD00DD00h, 00000DD00h
dd 0DE00DE00h, 00000DE00h, 0DE00DE00h, 00000DE00h
dd 0DF00DF00h, 00000DF00h, 0DF00DF00h, 00000DF00h
dd 0E000E000h, 00000E000h, 0E000E000h, 00000E000h
dd 0E100E100h, 00000E100h, 0E100E100h, 00000E100h
dd 0E200E200h, 00000E200h, 0E200E200h, 00000E200h
dd 0E300E300h, 00000E300h, 0E300E300h, 00000E300h
dd 0E400E400h, 00000E400h, 0E400E400h, 00000E400h
dd 0E500E500h, 00000E500h, 0E500E500h, 00000E500h
dd 0E600E600h, 00000E600h, 0E600E600h, 00000E600h
dd 0E700E700h, 00000E700h, 0E700E700h, 00000E700h
dd 0E800E800h, 00000E800h, 0E800E800h, 00000E800h
dd 0E900E900h, 00000E900h, 0E900E900h, 00000E900h
dd 0EA00EA00h, 00000EA00h, 0EA00EA00h, 00000EA00h
dd 0EB00EB00h, 00000EB00h, 0EB00EB00h, 00000EB00h
dd 0EC00EC00h, 00000EC00h, 0EC00EC00h, 00000EC00h
dd 0ED00ED00h, 00000ED00h, 0ED00ED00h, 00000ED00h
dd 0EE00EE00h, 00000EE00h, 0EE00EE00h, 00000EE00h
dd 0EF00EF00h, 00000EF00h, 0EF00EF00h, 00000EF00h
dd 0F000F000h, 00000F000h, 0F000F000h, 00000F000h
dd 0F100F100h, 00000F100h, 0F100F100h, 00000F100h
dd 0F200F200h, 00000F200h, 0F200F200h, 00000F200h
dd 0F300F300h, 00000F300h, 0F300F300h, 00000F300h
dd 0F400F400h, 00000F400h, 0F400F400h, 00000F400h
dd 0F500F500h, 00000F500h, 0F500F500h, 00000F500h
dd 0F600F600h, 00000F600h, 0F600F600h, 00000F600h
dd 0F700F700h, 00000F700h, 0F700F700h, 00000F700h
dd 0F800F800h, 00000F800h, 0F800F800h, 00000F800h
dd 0F900F900h, 00000F900h, 0F900F900h, 00000F900h
dd 0FA00FA00h, 00000FA00h, 0FA00FA00h, 00000FA00h
dd 0FB00FB00h, 00000FB00h, 0FB00FB00h, 00000FB00h
dd 0FC00FC00h, 00000FC00h, 0FC00FC00h, 00000FC00h
dd 0FD00FD00h, 00000FD00h, 0FD00FD00h, 00000FD00h
dd 0FE00FE00h, 00000FE00h, 0FE00FE00h, 00000FE00h
dd 0FF00FF00h, 00000FF00h, 0FF00FF00h, 00000FF00h