This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Problems using Vector Extensions


Brian Dessent wrote:
So, first, it should be easy enough to verify that we are in fact
talking about a fault due to alignment -- check the value of the
operands of the faulting SSE opcode.
At the moment when

movaps (%eax),%xmm1

gets executed (and segfaults), %eax has a value of 0x3f4f98. So as far as my understanding goes (once again, I'm not big at doing such low-level stuff, so bear with me if I'm wrong on this), this really is an aligment-issue.
Then determine where the object gets allocated and how. If it's a
global variable and it has a ctor then it is probably being constructed
before main() when the list of global ctors is run. That could also
explain why removing seemingly unrelated object files causes a change in
behavior, since that would change the order of global ctors even if it's
otherwise dead code.
The code gets called AFTER main (The call stack in the debugger confirms this).

In this case you might play around with adding
__attribute__((aligned(16))) to the declarations.
I'm not sure where to put this, so right now I've put this after the union{} declaration of Vector3D as well as at the end of the Vector3D-declaration. Currently the declaration looks like this:

class Vector3D
{
private:
typedef float v4sf __attribute__ (( vector_size(4 * sizeof(float)) ));
typedef int v4si __attribute__ (( vector_size(4 * sizeof(int)) ));
union
{
v4sf vec;
float v[4];
} __attribute__((aligned(16)));
Vector3D(const v4sf& v);


} __attribute__ ((aligned (16)));


As far as I understood it, this should guarantee correct alignment, but %eax remains missaligned.


On a side note, I stumpled upon this message while searching the web: http://lists.xiph.org/pipermail/speex-dev/2007-August/006031.html

Looks like they're having problems similar to mine, even though none of their proposed solutions (using the align-attribute, switching the relative positions of the variables within the union{} or using the force_align_arg_pointer-attribute) seems to work for me (I'm using a custom-build GCC, whereas I assume they are using the "official" GCC 4.2.1 from mingw, so my config-flags for GCC are problably different, maybe that has something to do with it).

At this point I'm really a bit lost. Could this be a bug in GCC (or at least MinGW)?


Thomas






Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]