[Bug c/46716] New: bad code generated with -mno-sse2 -m64
mathog at caltech dot edu
gcc-bugzilla@gcc.gnu.org
Tue Nov 30 00:59:00 GMT 2010
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46716
Summary: bad code generated with -mno-sse2 -m64
Product: gcc
Version: 4.4.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: mathog@caltech.edu
The following small program generates incorrect output when compiled with
the flags -mno-sse2 -m64 on a 64 bit system. Output is correct for -m32
or -msse2 -m64. The problem manifests as the lower double of the second
parameter passed into test() being replaced by the value of the second double
from the first parameter.
% cat /etc/release
Mandriva Linux release 2010.0 (Official) for x86_64
% cat /proc/cpuinfo | head -10
processor : 0
vendor_id : AuthenticAMD
cpu family : 15
model : 33
model name : Dual Core AMD Opteron(tm) Processor 280
stepping : 2
cpu MHz : 1000.000
cache size : 1024 KB
physical id : 0
siblings : 2
% gcc --version
gcc (GCC) 4.4.1
example:
% gcc -msse -mno-sse2 -I. -m64 -o foo gccprob2.c
% ./foo
s1 1.000000 2.000000
test s1 1.000000 2.000000
test s2 2.000000 2.000000
% gcc -msse -mno-sse2 -I. -m32 -o foo gccprob2.c
OR
% gcc -msse -msse2 -I. -m64 -o foo gccprob2.c
s1 1.000000 2.000000
test s1 1.000000 2.000000
test s2 1.000000 2.000000
*************************************************
#include <stdio.h> /* for printf */
typedef double __m128d __attribute__ ((__vector_size__ (16),
__may_alias__));
typedef union
{
__m128d x;
double a[2];
} union128d;
#define EMM_FLT8(a) ((double *)&(a))
void test ( __m128d s1, __m128d s2)
{
printf("test s1 %lf %lf\n",EMM_FLT8(s1)[0],EMM_FLT8(s1)[1]);
printf("test s2 %lf %lf\n",EMM_FLT8(s2)[0],EMM_FLT8(s2)[1]);
}
int main (void)
{
__attribute__ ((aligned (16))) union128d s1;
s1.a[0] = 1.0;
s1.a[1] = 2.0;
printf("s1 %lf %lf\n",s1.a[0],s1.a[1]);
test (s1.x, s1.x);
}
**************************************************
More information about the Gcc-bugs
mailing list