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 115