------- Comment #5 from howarth at nitro dot med dot uc dot edu 2009-03-14 06:25 ------- Well, these two offending inlined routines do have the comments...
/* Only works with aligned 4-byte quantities, will cause a bus error */ /* on some platforms if used on unaligned data. */ static void swap4_aligned(void *v, long ndata) { int *data = (int *) v; long i; int *N; for (i=0; i<ndata; i++) { N = data + i; *N=(((*N>>24)&0xff) | ((*N&0xff)<<24) | ((*N>>8)&0xff00) | ((*N&0xff00)<<8)); } } /* Only works with aligned 8-byte quantities, will cause a bus error */ /* on some platforms if used on unaligned data. */ static void swap8_aligned(void *v, long ndata) { /* Use int* internally to prevent bugs caused by some compilers */ /* and hardware that would potentially load data into an FP reg */ /* and hose everything, such as the old "jmemcpy()" bug in NAMD */ int *data = (int *) v; long i; int *N; int t0, t1; for (i=0; i<ndata; i++) { N = data + (i<<1); t0 = N[0]; t0=(((t0>>24)&0xff) | ((t0&0xff)<<24) | ((t0>>8)&0xff00) | ((t0&0xff00)<<8)); t1 = N[1]; t1=(((t1>>24)&0xff) | ((t1&0xff)<<24) | ((t1>>8)&0xff00) | ((t1&0xff00)<<8)); N[0] = t1; N[1] = t0; } } Any idea how hard this one is to work around? It unclear if this could be fixed with a union in any easy manner. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39460