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 ) { |