155d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca/*
255d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca * Written by Jos� Fonseca <j_r_fonseca@yahoo.co.uk>
355d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca */
455d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
555d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
655d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca/*
7f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * void _mesa_mmx_blend( struct gl_context *ctx,
855d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca *                       GLuint n,
955d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca *                       const GLubyte mask[],
1055d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca *                       GLchan rgba[][4],
1155d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca *                       CONST GLchan dest[][4] )
1255d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca *
1355d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca */
1455d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose FonsecaALIGNTEXT16
1555d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose FonsecaGLOBL GLNAME( TAG(_mesa_mmx_blend) )
16932dee87e3002be87dc3bcc49efd8ac9ac3e1fa4Brian PaulHIDDEN( TAG(_mesa_mmx_blend) )
1755d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose FonsecaGLNAME( TAG(_mesa_mmx_blend) ):
1855d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
1955d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    PUSH_L     ( EBP )
2055d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    MOV_L      ( ESP, EBP )
2155d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    PUSH_L     ( ESI )
2255d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    PUSH_L     ( EDI )
2355d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    PUSH_L     ( EBX )
2455d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
2555d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    MOV_L      ( REGOFF(12, EBP), ECX )		/* n */
2655d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    CMP_L      ( CONST(0), ECX)
27b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul    JE         ( LLTAG(GMB_return) )
2855d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
2955d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    MOV_L      ( REGOFF(16, EBP), EBX )		/* mask */
3055d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    MOV_L      ( REGOFF(20, EBP), EDI )         /* rgba */
3155d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    MOV_L      ( REGOFF(24, EBP), ESI )         /* dest */
3255d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
3355d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    INIT
3455d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
3555d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    TEST_L     ( CONST(4), EDI )		/* align rgba on an 8-byte boundary */
36b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul    JZ         ( LLTAG(GMB_align_end) )
3755d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
3855d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    CMP_B      ( CONST(0), REGIND(EBX) )	/* *mask == 0 */
39b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul    JE         ( LLTAG(GMB_align_continue) )
4055d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
4155d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    /* runin */
4255d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#define ONE(x)	x
4355d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#define TWO(x)
44533e88824af9f60a926e7b70ddd40ad1386be686Jose Fonseca    MAIN       ( EDI, ESI )
4555d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#undef ONE
4655d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#undef TWO
4755d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
48b305028464f02947c0cce0476af0e35f4ed1fafaBrian PaulLLTAG(GMB_align_continue):
4955d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
5055d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    DEC_L      ( ECX )				/* n -= 1 */
5155d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    INC_L      ( EBX )		                /* mask += 1 */
5255d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    ADD_L      ( CONST(4), EDI )		/* rgba += 1 */
5355d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    ADD_L      ( CONST(4), ESI )		/* dest += 1 */
5455d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
55b305028464f02947c0cce0476af0e35f4ed1fafaBrian PaulLLTAG(GMB_align_end):
5655d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
5755d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    CMP_L      ( CONST(2), ECX)
58b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul    JB         ( LLTAG(GMB_loop_end) )
5955d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
6055d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose FonsecaALIGNTEXT16
61b305028464f02947c0cce0476af0e35f4ed1fafaBrian PaulLLTAG(GMB_loop_begin):
6255d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
6355d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    CMP_W      ( CONST(0), REGIND(EBX) )	/* *mask == 0 && *(mask + 1) == 0 */
64b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul    JE         ( LLTAG(GMB_loop_continue) )
6555d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
6655d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    /* main loop */
6755d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#define ONE(x)
6855d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#define TWO(x)	x
69533e88824af9f60a926e7b70ddd40ad1386be686Jose Fonseca    MAIN       ( EDI, ESI )
7055d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#undef ONE
7155d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#undef TWO
7255d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
73b305028464f02947c0cce0476af0e35f4ed1fafaBrian PaulLLTAG(GMB_loop_continue):
7455d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
7555d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    DEC_L      ( ECX )
7655d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    DEC_L      ( ECX )				/* n -= 2 */
7755d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    ADD_L      ( CONST(2), EBX )		/* mask += 2 */
7855d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    ADD_L      ( CONST(8), EDI )		/* rgba += 2 */
7955d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    ADD_L      ( CONST(8), ESI )		/* dest += 2 */
8055d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    CMP_L      ( CONST(2), ECX )
81b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul    JAE        ( LLTAG(GMB_loop_begin) )
8255d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
83b305028464f02947c0cce0476af0e35f4ed1fafaBrian PaulLLTAG(GMB_loop_end):
8455d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
8555d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    CMP_L      ( CONST(1), ECX )
86b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul    JB         ( LLTAG(GMB_done) )
8755d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
8855d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    CMP_B      ( CONST(0), REGIND(EBX) )	/* *mask == 0 */
89b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul    JE         ( LLTAG(GMB_done) )
9055d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
9155d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    /* runout */
9255d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#define ONE(x)	x
9355d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#define TWO(x)
94533e88824af9f60a926e7b70ddd40ad1386be686Jose Fonseca    MAIN       ( EDI, ESI )
9555d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#undef ONE
9655d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#undef TWO
9755d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
98b305028464f02947c0cce0476af0e35f4ed1fafaBrian PaulLLTAG(GMB_done):
9955d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
10055d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    EMMS
10155d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
102b305028464f02947c0cce0476af0e35f4ed1fafaBrian PaulLLTAG(GMB_return):
10355d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
10455d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    POP_L      ( EBX )
10555d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    POP_L      ( EDI )
10655d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    POP_L      ( ESI )
10755d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    MOV_L      ( EBP, ESP )
10855d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    POP_L      ( EBP )
10955d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca    RET
11055d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca
11155d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#undef TAG
112b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#undef LLTAG
11355d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#undef INIT
11455d9ee83b4c29e8f7c373ee6326bbb4f77402beeJose Fonseca#undef MAIN
115