#include "assyntax.h"


#if !defined(NASM_ASSEMBLER) && !defined(MASM_ASSEMBLER)
#define LLBL(a) .L ## a
#else
#define LLBL(a) a
#endif


SEG_TEXT


ALIGNTEXT16
GLOBL GLNAME(gl_mmx_blend_transparency)

GLNAME( gl_mmx_blend_transparency ):
    PUSH_L    ( EBP )
    MOV_L     ( ESP, EBP )
    SUB_L     ( CONST(52), ESP )
    PUSH_L    ( EBX )
    MOV_L     ( CONST(16711680), REGOFF(-8, EBP) )
    MOV_L     ( CONST(16711680), REGOFF(-4, EBP) )
    MOV_L     ( CONST(0), REGOFF(-16, EBP) )
    MOV_L     ( CONST(-1), REGOFF(-12, EBP) )
    MOV_L     ( CONST(-1), REGOFF(-24, EBP) )
    MOV_L     ( CONST(0), REGOFF(-20, EBP) )
    MOV_L     ( REGOFF(24, EBP), EAX )
    ADD_L     ( CONST(4), EAX )
    MOV_L     ( EAX, EDX )
    AND_L     ( REGOFF(20, EBP), EDX )
    MOV_L     ( EDX, EAX )
    AND_L     ( CONST(4), EAX )
    CMP_L     ( CONST(8), EAX )
    JNE       ( LLBL(GMBT_2) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    ADD_L     ( CONST(3), EAX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(EAX), DL )
    MOV_L     ( EDX, REGOFF(-32, EBP) )
    MOV_L     ( CONST(255), EAX )
    MOV_L     ( EAX, EBX )
    SUB_L     ( REGOFF(-32, EBP), EBX )
    MOV_L     ( EBX, REGOFF(-36, EBP) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(EAX), DL )
    MOV_L     ( EDX, EAX )
    IMUL_L    ( REGOFF(-32, EBP), EAX )
    MOV_L     ( REGOFF(24, EBP), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EDX )
    IMUL_L    ( REGOFF(-36, EBP), EDX )
    ADD_L     ( EDX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-40, EBP) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    INC_L     ( EAX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(EAX), DL )
    MOV_L     ( EDX, EAX )
    IMUL_L    ( REGOFF(-32, EBP), EAX )
    MOV_L     ( REGOFF(24, EBP), EDX )
    INC_L     ( EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EDX )
    IMUL_L    ( REGOFF(-36, EBP), EDX )
    ADD_L     ( EDX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-44, EBP) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    ADD_L     ( CONST(2), EAX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(EAX), DL )
    MOV_L     ( EDX, EAX )
    IMUL_L    ( REGOFF(-32, EBP), EAX )
    MOV_L     ( REGOFF(24, EBP), EDX )
    ADD_L     ( CONST(2), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EDX )
    IMUL_L    ( REGOFF(-36, EBP), EDX )
    ADD_L     ( EDX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-48, EBP) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    ADD_L     ( CONST(3), EAX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(EAX), DL )
    MOV_L     ( EDX, EAX )
    IMUL_L    ( REGOFF(-32, EBP), EAX )
    MOV_L     ( REGOFF(24, EBP), EDX )
    ADD_L     ( CONST(3), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EDX )
    IMUL_L    ( REGOFF(-36, EBP), EDX )
    ADD_L     ( EDX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-52, EBP) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    MOV_B     ( REGOFF(-40, EBP), DL )
    MOV_B     ( DL, REGIND(EAX) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    INC_L     ( EAX )
    MOV_B     ( REGOFF(-44, EBP), DL )
    MOV_B     ( DL, REGIND(EAX) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    ADD_L     ( CONST(2), EAX )
    MOV_B     ( REGOFF(-48, EBP), DL )
    MOV_B     ( DL, REGIND(EAX) )
    MOV_L     ( REGOFF(20, EBP), EAX )
    ADD_L     ( CONST(3), EAX )
    MOV_B     ( REGOFF(-52, EBP), DL )
    MOV_B     ( DL, REGIND(EAX) )
    INC_L     ( REGOFF(16, EBP) )
    ADD_L     ( CONST(4), REGOFF(20, EBP) )
    ADD_L     ( CONST(4), REGOFF(24, EBP) )
    DEC_L     ( REGOFF(12, EBP) )
LLBL( GMBT_2 ):

    CMP_L     ( CONST(0), REGOFF(12, EBP) )
    JE        ( LLBL(GMBT_3) )
    MOV_L     ( CONST(0), REGOFF(-28, EBP) )
ALIGNTEXT4
LLBL( GMBT_4 ):

    MOV_L     ( REGOFF(12, EBP), EDX )
    MOV_L     ( EDX, EAX )
    SHR_L     ( CONST(1), EAX )
    CMP_L     ( EAX, REGOFF(-28, EBP) )
    JB        ( LLBL(GMBT_7) )
    JMP       ( LLBL(GMBT_5) )
ALIGNTEXT16
LLBL( GMBT_7 ):

    MOV_L     ( REGOFF(-28, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,2), EDX )
    MOV_L     ( REGOFF(16, EBP), EAX )
    CMP_B     ( CONST(0), REGBI(EAX,EDX) )
    JE        ( LLBL(GMBT_6) )
    MOV_L     ( REGOFF(-28, EBP), EAX )
    MOV_L     ( EAX, EDX )
    LEA_L     ( REGDIS(0,EDX,8), ECX )
    MOV_L     ( ECX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    MOV_L     ( REGOFF(-28, EBP), EDX )
    MOV_L     ( EDX, ECX )
    LEA_L     ( REGDIS(0,ECX,8), EDX )
    MOV_L     ( EDX, ECX )
    ADD_L     ( REGOFF(24, EBP), ECX )

    MOVQ      ( REGIND(EAX), MM4 )
    PXOR      ( MM5, MM5 )
    MOVQ      ( MM4, MM1 )
    MOVQ      ( REGIND(ECX), MM7 )
    PUNPCKLBW ( MM5, MM1 )
    MOVQ      ( MM7, MM6 )
    MOVQ      ( MM1, MM0 )
    PUNPCKLBW ( MM5, MM6 )
    MOVQ      ( MM1, MM2 )
    PSRLQ     ( CONST(48), MM0 )
    PUNPCKHBW ( MM5, MM4 )
    PACKSSDW  ( MM0, MM0 )
    MOVQ      ( MM0, MM3 )
    PUNPCKHBW ( MM5, MM7 )
    PSLLQ     ( CONST(16), MM3 )
    POR       ( REGOFF(-8, EBP), MM0 )
    PUNPCKLWD ( MM6, MM1 )
    PSUBW     ( MM3, MM0 )
    PUNPCKHWD ( MM6, MM2 )
    MOVQ      ( MM4, MM3 )
    PSRLQ     ( CONST(48), MM3 )
    PACKSSDW  ( MM3, MM3 )
    MOVQ      ( MM3, MM6 )
    POR       ( REGOFF(-8, EBP), MM3 )
    PSLLQ     ( CONST(16), MM6 )
    PSUBW     ( MM6, MM3 )
    MOVQ      ( MM4, MM5 )
    PUNPCKLWD ( MM7, MM4 )
    PUNPCKHWD ( MM7, MM5 )
    PMADDWD   ( MM0, MM1 )
    PMADDWD   ( MM3, MM4 )
    PMADDWD   ( MM0, MM2 )
    PMADDWD   ( MM3, MM5 )
    PSRLD     ( CONST(8), MM1 )
    PSRLD     ( CONST(8), MM2 )
    PSRLD     ( CONST(8), MM4 )
    PACKSSDW  ( MM2, MM1 )
    PSRLD     ( CONST(8), MM5 )
    PACKUSWB  ( MM1, MM1 )
    PACKSSDW  ( MM5, MM4 )
    PAND      ( REGOFF(-24, EBP), MM1 )
    PACKUSWB  ( MM4, MM4 )
    PAND      ( REGOFF(-16, EBP), MM4 )
    POR       ( MM1, MM4 )
    MOVQ      ( MM4, REGIND(EAX) )


LLBL( GMBT_8 ):

LLBL( GMBT_6 ):

    INC_L     ( REGOFF(-28, EBP) )
    JMP       ( LLBL(GMBT_4) )
ALIGNTEXT16
LLBL( GMBT_5 ):


    EMMS

LLBL( GMBT_3 ):

    MOV_L     ( REGOFF(12, EBP), EAX )
    AND_L     ( CONST(1), EAX )
    TEST_L    ( EAX, EAX )
    JE        ( LLBL(GMBT_9) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-1, EAX), EDX )
    XOR_L     ( EAX, EAX )
    MOV_B     ( REGIND(EDX), AL )
    MOV_L     ( EAX, REGOFF(-52, EBP) )
    MOV_L     ( CONST(255), EAX )
    MOV_L     ( EAX, EBX )
    SUB_L     ( REGOFF(-52, EBP), EBX )
    MOV_L     ( EBX, REGOFF(-48, EBP) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-4, EAX), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EAX )
    IMUL_L    ( REGOFF(-52, EBP), EAX )
    MOV_L     ( REGOFF(12, EBP), EDX )
    LEA_L     ( REGDIS(0,EDX,4), ECX )
    MOV_L     ( ECX, EDX )
    ADD_L     ( REGOFF(24, EBP), EDX )
    LEA_L     ( REGOFF(-4, EDX), ECX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(ECX), DL )
    MOV_L     ( EDX, ECX )
    IMUL_L    ( REGOFF(-48, EBP), ECX )
    ADD_L     ( ECX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-44, EBP) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-3, EAX), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EAX )
    IMUL_L    ( REGOFF(-52, EBP), EAX )
    MOV_L     ( REGOFF(12, EBP), EDX )
    LEA_L     ( REGDIS(0,EDX,4), ECX )
    MOV_L     ( ECX, EDX )
    ADD_L     ( REGOFF(24, EBP), EDX )
    LEA_L     ( REGOFF(-3, EDX), ECX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(ECX), DL )
    MOV_L     ( EDX, ECX )
    IMUL_L    ( REGOFF(-48, EBP), ECX )
    ADD_L     ( ECX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-40, EBP) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-2, EAX), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EAX )
    IMUL_L    ( REGOFF(-52, EBP), EAX )
    MOV_L     ( REGOFF(12, EBP), EDX )
    LEA_L     ( REGDIS(0,EDX,4), ECX )
    MOV_L     ( ECX, EDX )
    ADD_L     ( REGOFF(24, EBP), EDX )
    LEA_L     ( REGOFF(-2, EDX), ECX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(ECX), DL )
    MOV_L     ( EDX, ECX )
    IMUL_L    ( REGOFF(-48, EBP), ECX )
    ADD_L     ( ECX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-36, EBP) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-1, EAX), EDX )
    XOR_L     ( ECX, ECX )
    MOV_B     ( REGIND(EDX), CL )
    MOV_L     ( ECX, EAX )
    IMUL_L    ( REGOFF(-52, EBP), EAX )
    MOV_L     ( REGOFF(12, EBP), EDX )
    LEA_L     ( REGDIS(0,EDX,4), ECX )
    MOV_L     ( ECX, EDX )
    ADD_L     ( REGOFF(24, EBP), EDX )
    LEA_L     ( REGOFF(-1, EDX), ECX )
    XOR_L     ( EDX, EDX )
    MOV_B     ( REGIND(ECX), DL )
    MOV_L     ( EDX, ECX )
    IMUL_L    ( REGOFF(-48, EBP), ECX )
    ADD_L     ( ECX, EAX )
    MOV_L     ( EAX, EBX )
    SAR_L     ( CONST(8), EBX )
    MOV_L     ( EBX, REGOFF(-32, EBP) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-4, EAX), EDX )
    MOV_B     ( REGOFF(-44, EBP), AL )
    MOV_B     ( AL, REGIND(EDX) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-3, EAX), EDX )
    MOV_B     ( REGOFF(-40, EBP), AL )
    MOV_B     ( AL, REGIND(EDX) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-2, EAX), EDX )
    MOV_B     ( REGOFF(-36, EBP), AL )
    MOV_B     ( AL, REGIND(EDX) )
    MOV_L     ( REGOFF(12, EBP), EAX )
    LEA_L     ( REGDIS(0,EAX,4), EDX )
    MOV_L     ( EDX, EAX )
    ADD_L     ( REGOFF(20, EBP), EAX )
    LEA_L     ( REGOFF(-1, EAX), EDX )
    MOV_B     ( REGOFF(-32, EBP), AL )
    MOV_B     ( AL, REGIND(EDX) )
LLBL( GMBT_9 ):

LLBL( GMBT_1 ):

    MOV_L     ( REGOFF(-56, EBP), EBX )
    MOV_L     ( EBP, ESP )
    POP_L     ( EBP )
    RET




