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