1848b8605Smrg/*
2848b8605Smrg * Written by Jos� Fonseca <j_r_fonseca@yahoo.co.uk>
3848b8605Smrg */
4848b8605Smrg
5848b8605Smrg
6848b8605Smrg/*
7848b8605Smrg * void _mesa_mmx_blend( struct gl_context *ctx,
8848b8605Smrg *                       GLuint n,
9848b8605Smrg *                       const GLubyte mask[],
10848b8605Smrg *                       GLchan rgba[][4],
11848b8605Smrg *                       CONST GLchan dest[][4] )
12848b8605Smrg *
13848b8605Smrg */
14848b8605SmrgALIGNTEXT16
15848b8605SmrgGLOBL GLNAME( TAG(_mesa_mmx_blend) )
16848b8605SmrgHIDDEN( TAG(_mesa_mmx_blend) )
17848b8605SmrgGLNAME( TAG(_mesa_mmx_blend) ):
18848b8605Smrg
19848b8605Smrg    PUSH_L     ( EBP )
20848b8605Smrg    MOV_L      ( ESP, EBP )
21848b8605Smrg    PUSH_L     ( ESI )
22848b8605Smrg    PUSH_L     ( EDI )
23848b8605Smrg    PUSH_L     ( EBX )
24848b8605Smrg
25848b8605Smrg    MOV_L      ( REGOFF(12, EBP), ECX )		/* n */
26848b8605Smrg    CMP_L      ( CONST(0), ECX)
27848b8605Smrg    JE         ( LLTAG(GMB_return) )
28848b8605Smrg
29848b8605Smrg    MOV_L      ( REGOFF(16, EBP), EBX )		/* mask */
30848b8605Smrg    MOV_L      ( REGOFF(20, EBP), EDI )         /* rgba */
31848b8605Smrg    MOV_L      ( REGOFF(24, EBP), ESI )         /* dest */
32848b8605Smrg
33848b8605Smrg    INIT
34848b8605Smrg
35848b8605Smrg    TEST_L     ( CONST(4), EDI )		/* align rgba on an 8-byte boundary */
36848b8605Smrg    JZ         ( LLTAG(GMB_align_end) )
37848b8605Smrg
38848b8605Smrg    CMP_B      ( CONST(0), REGIND(EBX) )	/* *mask == 0 */
39848b8605Smrg    JE         ( LLTAG(GMB_align_continue) )
40848b8605Smrg
41848b8605Smrg    /* runin */
42848b8605Smrg#define ONE(x)	x
43848b8605Smrg#define TWO(x)
44848b8605Smrg    MAIN       ( EDI, ESI )
45848b8605Smrg#undef ONE
46848b8605Smrg#undef TWO
47848b8605Smrg
48848b8605SmrgLLTAG(GMB_align_continue):
49848b8605Smrg
50848b8605Smrg    DEC_L      ( ECX )				/* n -= 1 */
51848b8605Smrg    INC_L      ( EBX )		                /* mask += 1 */
52848b8605Smrg    ADD_L      ( CONST(4), EDI )		/* rgba += 1 */
53848b8605Smrg    ADD_L      ( CONST(4), ESI )		/* dest += 1 */
54848b8605Smrg
55848b8605SmrgLLTAG(GMB_align_end):
56848b8605Smrg
57848b8605Smrg    CMP_L      ( CONST(2), ECX)
58848b8605Smrg    JB         ( LLTAG(GMB_loop_end) )
59848b8605Smrg
60848b8605SmrgALIGNTEXT16
61848b8605SmrgLLTAG(GMB_loop_begin):
62848b8605Smrg
63848b8605Smrg    CMP_W      ( CONST(0), REGIND(EBX) )	/* *mask == 0 && *(mask + 1) == 0 */
64848b8605Smrg    JE         ( LLTAG(GMB_loop_continue) )
65848b8605Smrg
66848b8605Smrg    /* main loop */
67848b8605Smrg#define ONE(x)
68848b8605Smrg#define TWO(x)	x
69848b8605Smrg    MAIN       ( EDI, ESI )
70848b8605Smrg#undef ONE
71848b8605Smrg#undef TWO
72848b8605Smrg
73848b8605SmrgLLTAG(GMB_loop_continue):
74848b8605Smrg
75848b8605Smrg    DEC_L      ( ECX )
76848b8605Smrg    DEC_L      ( ECX )				/* n -= 2 */
77848b8605Smrg    ADD_L      ( CONST(2), EBX )		/* mask += 2 */
78848b8605Smrg    ADD_L      ( CONST(8), EDI )		/* rgba += 2 */
79848b8605Smrg    ADD_L      ( CONST(8), ESI )		/* dest += 2 */
80848b8605Smrg    CMP_L      ( CONST(2), ECX )
81848b8605Smrg    JAE        ( LLTAG(GMB_loop_begin) )
82848b8605Smrg
83848b8605SmrgLLTAG(GMB_loop_end):
84848b8605Smrg
85848b8605Smrg    CMP_L      ( CONST(1), ECX )
86848b8605Smrg    JB         ( LLTAG(GMB_done) )
87848b8605Smrg
88848b8605Smrg    CMP_B      ( CONST(0), REGIND(EBX) )	/* *mask == 0 */
89848b8605Smrg    JE         ( LLTAG(GMB_done) )
90848b8605Smrg
91848b8605Smrg    /* runout */
92848b8605Smrg#define ONE(x)	x
93848b8605Smrg#define TWO(x)
94848b8605Smrg    MAIN       ( EDI, ESI )
95848b8605Smrg#undef ONE
96848b8605Smrg#undef TWO
97848b8605Smrg
98848b8605SmrgLLTAG(GMB_done):
99848b8605Smrg
100848b8605Smrg    EMMS
101848b8605Smrg
102848b8605SmrgLLTAG(GMB_return):
103848b8605Smrg
104848b8605Smrg    POP_L      ( EBX )
105848b8605Smrg    POP_L      ( EDI )
106848b8605Smrg    POP_L      ( ESI )
107848b8605Smrg    MOV_L      ( EBP, ESP )
108848b8605Smrg    POP_L      ( EBP )
109848b8605Smrg    RET
110848b8605Smrg
111848b8605Smrg#undef TAG
112848b8605Smrg#undef LLTAG
113848b8605Smrg#undef INIT
114848b8605Smrg#undef MAIN
115