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