Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / mesa / x86 / mmx_blendtmp.h
1 /*
2  * Written by José Fonseca <j_r_fonseca@yahoo.co.uk>
3  */
4
5
6 /*
7  * void _mesa_mmx_blend( struct gl_context *ctx,
8  *                       GLuint n, 
9  *                       const GLubyte mask[],
10  *                       GLchan rgba[][4], 
11  *                       CONST GLchan dest[][4] )
12  * 
13  */
14 ALIGNTEXT16
15 GLOBL GLNAME( TAG(_mesa_mmx_blend) )
16 HIDDEN( TAG(_mesa_mmx_blend) )
17 GLNAME( TAG(_mesa_mmx_blend) ):
18
19     PUSH_L     ( EBP )
20     MOV_L      ( ESP, EBP )
21     PUSH_L     ( ESI )
22     PUSH_L     ( EDI )
23     PUSH_L     ( EBX )
24
25     MOV_L      ( REGOFF(12, EBP), ECX )         /* n */
26     CMP_L      ( CONST(0), ECX)
27     JE         ( LLTAG(GMB_return) )
28
29     MOV_L      ( REGOFF(16, EBP), EBX )         /* mask */
30     MOV_L      ( REGOFF(20, EBP), EDI )         /* rgba */
31     MOV_L      ( REGOFF(24, EBP), ESI )         /* dest */
32
33     INIT
34     
35     TEST_L     ( CONST(4), EDI )                /* align rgba on an 8-byte boundary */
36     JZ         ( LLTAG(GMB_align_end) )
37
38     CMP_B      ( CONST(0), REGIND(EBX) )        /* *mask == 0 */
39     JE         ( LLTAG(GMB_align_continue) )
40
41     /* runin */
42 #define ONE(x)  x
43 #define TWO(x)  
44     MAIN       ( EDI, ESI )
45 #undef ONE
46 #undef TWO
47
48 LLTAG(GMB_align_continue):
49
50     DEC_L      ( ECX )                          /* n -= 1 */
51     INC_L      ( EBX )                          /* mask += 1 */
52     ADD_L      ( CONST(4), EDI )                /* rgba += 1 */
53     ADD_L      ( CONST(4), ESI )                /* dest += 1 */ 
54
55 LLTAG(GMB_align_end):
56
57     CMP_L      ( CONST(2), ECX)
58     JB         ( LLTAG(GMB_loop_end) )
59
60 ALIGNTEXT16
61 LLTAG(GMB_loop_begin):
62
63     CMP_W      ( CONST(0), REGIND(EBX) )        /* *mask == 0 && *(mask + 1) == 0 */
64     JE         ( LLTAG(GMB_loop_continue) )
65
66     /* main loop */
67 #define ONE(x)
68 #define TWO(x)  x
69     MAIN       ( EDI, ESI )
70 #undef ONE
71 #undef TWO
72
73 LLTAG(GMB_loop_continue):
74
75     DEC_L      ( ECX )
76     DEC_L      ( ECX )                          /* n -= 2 */
77     ADD_L      ( CONST(2), EBX )                /* mask += 2 */
78     ADD_L      ( CONST(8), EDI )                /* rgba += 2 */
79     ADD_L      ( CONST(8), ESI )                /* dest += 2 */ 
80     CMP_L      ( CONST(2), ECX )
81     JAE        ( LLTAG(GMB_loop_begin) )
82
83 LLTAG(GMB_loop_end):
84
85     CMP_L      ( CONST(1), ECX )
86     JB         ( LLTAG(GMB_done) )
87
88     CMP_B      ( CONST(0), REGIND(EBX) )        /* *mask == 0 */
89     JE         ( LLTAG(GMB_done) )
90
91     /* runout */
92 #define ONE(x)  x
93 #define TWO(x)
94     MAIN       ( EDI, ESI )
95 #undef ONE
96 #undef TWO
97
98 LLTAG(GMB_done):
99
100     EMMS
101
102 LLTAG(GMB_return):
103
104     POP_L      ( EBX )
105     POP_L      ( EDI )
106     POP_L      ( ESI )
107     MOV_L      ( EBP, ESP )
108     POP_L      ( EBP )
109     RET
110
111 #undef TAG
112 #undef LLTAG
113 #undef INIT
114 #undef MAIN