|
|
int height, | int height, |
int line_offset) | int line_offset) |
{ | { |
long long rrggbbaa; |
union { |
long long pixel; |
long long rrggbbaa; |
|
struct {short int rr, gg, bb, aa;} words; |
|
} rrggbbaa; |
|
|
|
union { |
|
long long pixel; |
|
struct {short int rr, gg, bb, aa;} words; |
|
} pixel; |
|
|
short *tmp_err; | short *tmp_err; |
short *tmp_nerr; | short *tmp_nerr; |
int x; | int x; |
| |
asm volatile | asm volatile |
( | ( |
"pushal \n\t" |
"pushl %%ebx \n\t" |
| |
// pack dr, dg and db into mm6 | // pack dr, dg and db into mm6 |
"movl %7, %%eax \n\t" | "movl %7, %%eax \n\t" |
|
|
| |
".Enda: \n\t" // THE END | ".Enda: \n\t" // THE END |
"emms \n\t" | "emms \n\t" |
"popal \n\t" |
"popl %%ebx \n\t" |
: | : |
: | : |
"m" (image), // %0 | "m" (image), // %0 |
|
|
"m" (width), // %13 | "m" (width), // %13 |
"m" (height), // %14 | "m" (height), // %14 |
"m" (line_offset), // %15 | "m" (line_offset), // %15 |
"m" (rrggbbaa), // %16 (access to rr) |
"m" (rrggbbaa.rrggbbaa), // %16 (access to rr) |
"m" ((*((short*)(&rrggbbaa)+1))), // %17 (access to gg) |
"m" (rrggbbaa.words.gg), // %17 (access to gg) |
"m" ((*((short*)(&rrggbbaa)+2))), // %18 (access to bb) |
"m" (rrggbbaa.words.bb), // %18 (access to bb) |
"m" ((*((short*)(&rrggbbaa)+3))), // %19 (access to aa) |
"m" (rrggbbaa.words.aa), // %19 (access to aa) |
"m" (pixel), // %20 (access to pixel.r) |
"m" (pixel.pixel), // %20 (access to pixel.r) |
"m" ((*((short*)(&pixel)+1))), // %21 (access to pixel.g) |
"m" (pixel.words.gg), // %21 (access to pixel.g) |
"m" ((*((short*)(&pixel)+2))), // %22 (access to pixel.b) |
"m" (pixel.words.bb), // %22 (access to pixel.b) |
"m" ((*((short*)(&pixel)+3))), // %23 (access to pixel.a) |
"m" (pixel.words.aa), // %23 (access to pixel.a) |
"m" (tmp_err), // %24 | "m" (tmp_err), // %24 |
"m" (tmp_nerr), // %25 | "m" (tmp_nerr), // %25 |
"m" (x) // %26 | "m" (x) // %26 |
|
: "eax", "ecx", "edx", "esi", "edi" |
); | ); |
} | } |
| |
|
|
int height, | int height, |
int line_offset) | int line_offset) |
{ | { |
long long rrggbbaa; |
union { |
long long pixel; |
long long rrggbbaa; |
|
struct {short int rr, gg, bb, aa;} words; |
|
} rrggbbaa; |
|
|
|
union { |
|
long long pixel; |
|
struct {short int rr, gg, bb, aa;} words; |
|
} pixel; |
| |
short *tmp_err; | short *tmp_err; |
short *tmp_nerr; | short *tmp_nerr; |
|
|
| |
asm volatile | asm volatile |
( | ( |
"pushal \n\t" |
"pushl %%ebx \n\t" |
| |
"movl %13, %%eax \n\t" // eax = width | "movl %13, %%eax \n\t" // eax = width |
"movl %%eax, %%ebx \n\t" | "movl %%eax, %%ebx \n\t" |
|
|
| |
".Endc: \n\t" // THE END | ".Endc: \n\t" // THE END |
"emms \n\t" | "emms \n\t" |
"popal \n\t" |
"popl %%ebx \n\t" |
: | : |
: | : |
"m" (image), // %0 | "m" (image), // %0 |
|
|
"m" (width), // %13 | "m" (width), // %13 |
"m" (height), // %14 | "m" (height), // %14 |
"m" (line_offset), // %15 | "m" (line_offset), // %15 |
"m" (rrggbbaa), // %16 (access to rr) |
"m" (rrggbbaa.rrggbbaa), // %16 (access to rr) |
"m" ((*((short*)(&rrggbbaa)+1))), // %17 (access to gg) |
"m" (rrggbbaa.words.gg), // %17 (access to gg) |
"m" ((*((short*)(&rrggbbaa)+2))), // %18 (access to bb) |
"m" (rrggbbaa.words.bb), // %18 (access to bb) |
"m" ((*((short*)(&rrggbbaa)+3))), // %19 (access to aa) |
"m" (rrggbbaa.words.aa), // %19 (access to aa) |
"m" (pixel), // %20 (access to pixel.r) |
"m" (pixel.pixel), // %20 (access to pixel.r) |
"m" ((*((short*)(&pixel)+1))), // %21 (access to pixel.g) |
"m" (pixel.words.gg), // %21 (access to pixel.g) |
"m" ((*((short*)(&pixel)+2))), // %22 (access to pixel.b) |
"m" (pixel.words.bb), // %22 (access to pixel.b) |
"m" ((*((short*)(&pixel)+3))), // %23 (access to pixel.a) |
"m" (pixel.words.aa), // %23 (access to pixel.a) |
"m" (tmp_err), // %24 | "m" (tmp_err), // %24 |
"m" (tmp_nerr), // %25 | "m" (tmp_nerr), // %25 |
"m" (x), // %26 | "m" (x), // %26 |
"m" (w1), // %27 | "m" (w1), // %27 |
"m" (w2) // %28 | "m" (w2) // %28 |
|
: "eax", "ecx", "edx", "esi", "edi" |
); | ); |
} | } |
| |