| version 1.1 | | version 1.2 |
|---|
| | |
| #elif defined __GNUC__ | | #elif defined __GNUC__ |
| // This code aligns edi so that the destination is aligned to a dword boundry before rep movsd | | // This code aligns edi so that the destination is aligned to a dword boundry before rep movsd |
| inline void gr_linear_movsd(ubyte * src, ubyte * dest, unsigned int num_pixels ) { | | inline void gr_linear_movsd(ubyte * src, ubyte * dest, unsigned int num_pixels ) { |
| | | int dummy[3]; |
| __asm__ __volatile__ ( | | __asm__ __volatile__ ( |
| " cld;" | | " cld;" |
| " movl %%ecx, %%ebx;" | | " movl %%ecx, %%ebx;" |
| | |
| " movl %%ebx, %%ecx;" | | " movl %%ebx, %%ecx;" |
| " andl $3, %%ecx;" | | " andl $3, %%ecx;" |
| " rep; movsb" | | " rep; movsb" |
| : : "S" (src), "D" (dest), "c" (num_pixels) | | : "=S" (dummy[0]), "=D" (dummy[1]), "=c" (dummy[2]) |
| : "%eax", "%ebx", "%ecx", "%esi", "%edi"); | | : "0" (src), "1" (dest), "2" (num_pixels) |
| | | : "%eax", "%ebx"); |
| } | | } |
| | | |
| static inline void gr_linear_rep_movsdm(void * src, void * dest, unsigned int num_pixels ) { | | static inline void gr_linear_rep_movsdm(void * src, void * dest, unsigned int num_pixels ) { |
| | | int dummy[3]; |
| __asm__ __volatile__ ( | | __asm__ __volatile__ ( |
| "0: ;" | | "0: ;" |
| " movb (%%esi), %%al;" | | " movb (%%esi), %%al;" |
| | |
| " incl %%edi;" | | " incl %%edi;" |
| " decl %%ecx;" | | " decl %%ecx;" |
| " jne 0b" | | " jne 0b" |
| : : "S" (src), "D" (dest), "c" (num_pixels) | | : "=S" (dummy[0]), "=D" (dummy[1]), "=c" (dummy[2]) |
| : "%eax", "%ecx", "%esi", "%edi"); | | : "0" (src), "1" (dest), "2" (num_pixels) |
| | | : "%eax"); |
| } | | } |
| | | |
| /* #pragma aux gr_linear_rep_movsdm_faded parm [esi] [edi] [ecx] [ebx] modify exact [ecx esi edi eax ebx] */ | | /* #pragma aux gr_linear_rep_movsdm_faded parm [esi] [edi] [ecx] [ebx] modify exact [ecx esi edi eax ebx] */ |
| static inline void gr_linear_rep_movsdm_faded(void * src, void * dest, unsigned int num_pixels, ubyte fade_value ) { | | static inline void gr_linear_rep_movsdm_faded(void * src, void * dest, unsigned int num_pixels, ubyte fade_value ) { |
| | | int dummy[4]; |
| __asm__ __volatile__ ( | | __asm__ __volatile__ ( |
| " xorl %%eax, %%eax;" | | " xorl %%eax, %%eax;" |
| " movb %%bl, %%ah;" | | " movb %%bl, %%ah;" |
| | |
| " incl %%edi;" | | " incl %%edi;" |
| " decl %%ecx;" | | " decl %%ecx;" |
| " jne 0b" | | " jne 0b" |
| : : "S" (src), "D" (dest), "c" (num_pixels), "b" (fade_value) | | : "=S" (dummy[0]), "=D" (dummy[1]), "=c" (dummy[2]), "=b" (dummy[3]) |
| : "%eax", "%ecx", "%esi", "%edi"); | | : "0" (src), "1" (dest), "2" (num_pixels), "3" (fade_value) |
| | | : "%eax"); |
| } | | } |
| | | |
| inline void gr_linear_rep_movsd_2x(ubyte * src, ubyte * dest, unsigned int num_dest_pixels ) { | | inline void gr_linear_rep_movsd_2x(ubyte * src, ubyte * dest, unsigned int num_dest_pixels ) { |
| /* #pragma aux gr_linear_rep_movsd_2x parm [esi] [edi] [ecx] modify exact [ecx esi edi eax ebx] */ | | /* #pragma aux gr_linear_rep_movsd_2x parm [esi] [edi] [ecx] modify exact [ecx esi edi eax ebx] */ |
| | | int dummy[3]; |
| __asm__ __volatile__ ( | | __asm__ __volatile__ ( |
| "shrl $1, %%ecx;" | | "shrl $1, %%ecx;" |
| "jnc 0f;" | | "jnc 0f;" |
| | |
| "decl %%ecx;" | | "decl %%ecx;" |
| "jne 0b;" | | "jne 0b;" |
| "1:" | | "1:" |
| : : "S" (src), "D" (dest), "c" (num_dest_pixels) | | : "=S" (dummy[0]), "=D" (dummy[1]), "=c" (dummy[2]) |
| : "%eax", "%ecx", "%esi", "%edi"); | | : "0" (src), "1" (dest), "2" (num_dest_pixels) |
| | | : "%eax"); |
| } | | } |
| | | |
| static inline void modex_copy_column(ubyte * src, ubyte * dest, int num_pixels, int src_rowsize, int dest_rowsize ) { | | static inline void modex_copy_column(ubyte * src, ubyte * dest, int num_pixels, int src_rowsize, int dest_rowsize ) { |