|
From: Erik W. <om...@te...> - 2006-02-27 21:36:21
|
-------- Original Message --------
Subject: Bug in libdv MMX inline asm
From: Zan Lynx <zl...@ac...>
To: ome...@us...
Date: Mon, 27 Feb 2006 13:58:04 -0700
Testing a new GCC 4.1 beta I discovered that it put one of the global
statics into a register. AMD-64 has a lot of them to use. :)
This caused a build error because the asm code was using memory to
register functions to try to do reg to reg operations.
To fix this, use the memory constraint in the m2r and r2m macros instead
of the X (anything goes) constraint.
Here's a patch (double-check it though, I only saw it build not run):
--- libdv-0.104/libdv/mmx.h 2001-10-27 21:23:57.000000000 -0600
+++ libdv-0.104.patched/libdv/mmx.h 2006-02-27 13:47:20.000000000 -0700
@@ -272,15 +272,15 @@
fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \
mmx_trace.d[1], mmx_trace.d[0]); \
__asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (mmx_trace) \
+ : "=m" (mmx_trace) \
: /* nothing */ ); \
fprintf(stderr, #reg "=0x%08x%08x) => ", \
mmx_trace.d[1], mmx_trace.d[0]); \
__asm__ __volatile__ (#op " %0, %%" #reg \
: /* nothing */ \
- : "X" (mem)); \
+ : "m" (mmx_trace)); \
__asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (mmx_trace) \
+ : "=m" (mmx_trace) \
: /* nothing */ ); \
fprintf(stderr, #reg "=0x%08x%08x\n", \
mmx_trace.d[1], mmx_trace.d[0]); \
@@ -290,7 +290,7 @@
{ \
mmx_t mmx_trace; \
__asm__ __volatile__ ("movq %%" #reg ", %0" \
- : "=X" (mmx_trace) \
+ : "=m" (mmx_trace) \
: /* nothing */ ); \
fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \
mmx_trace.d[1], mmx_trace.d[0]); \
@@ -298,7 +298,7 @@
fprintf(stderr, #mem "=0x%08x%08x) => ", \
mmx_trace.d[1], mmx_trace.d[0]); \
__asm__ __volatile__ (#op " %%" #reg ", %0" \
- : "=X" (mem) \
+ : "=m" (mem) \
: /* nothing */ ); \
mmx_trace = (mem); \
fprintf(stderr, #mem "=0x%08x%08x\n", \
@@ -338,8 +338,8 @@
__asm__ __volatile__ ("movq %0, %%mm0\n\t" \
#op " %1, %%mm0\n\t" \
"movq %%mm0, %0" \
- : "=X" (memd) \
- : "X" (mems)); \
+ : "=m" (memd) \
+ : "m" (mems)); \
mmx_trace = (memd); \
fprintf(stderr, #memd "=0x%08x%08x\n", \
mmx_trace.d[1], mmx_trace.d[0]); \
@@ -358,11 +358,11 @@
#define mmx_m2r(op, mem, reg) \
__asm__ __volatile__ (#op " %0, %%" #reg \
: /* nothing */ \
- : "X" (mem))
+ : "m" (mem))
#define mmx_r2m(op, reg, mem) \
__asm__ __volatile__ (#op " %%" #reg ", %0" \
- : "=X" (mem) \
+ : "=m" (mem) \
: /* nothing */ )
#define mmx_r2r(op, regs, regd) \
@@ -372,8 +372,8 @@
__asm__ __volatile__ ("movq %0, %%mm0\n\t" \
#op " %1, %%mm0\n\t" \
"movq %%mm0, %0" \
- : "=X" (memd) \
- : "X" (mems))
+ : "=m" (memd) \
+ : "m" (mems))
#endif
--
Zan Lynx <zl...@ac...>
|