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]

Gcc bug with mfpmath=sse and movntq ?


Hi,

I'm still doing some experiments using the movntq instruction on a 32 bits OS with gcc 4.5.1

Using the following code I have a NAN and I don't understand what I'm doing wrong :

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

typedef struct
{
  double data1;
} ty_data;

static ty_data s_data;

void *strange_fnc()
{

  double in;
  long long unsigned int *vin = (long long unsigned int *)&in;
  unsigned long long i;

  double *data;
  double coeff = 1.;

data = &(s_data.data1);

for (i = 0; i < 10; ++i)
{
in = (double)i * coeff; /* <-- that instruction generates a x87 instruction !? */
__builtin_ia32_movntq((long long unsigned int*)(data), *vin);
#ifdef FORCE_EMMS
__builtin_ia32_emms();
#endif
}
__builtin_ia32_emms();


  return NULL;
}


int main(int argc, char **argv) { memset(&s_data, 0, sizeof(ty_data));

strange_fnc();

  printf("1- %e\n",
         s_data.data1);

  return 0;
}

<380> gcc -g -O simple.c -mfpmath=sse -msse -msse2 -msse3 -malign-double -DFORCE_EMMS
<381> ./a.out
1- 9.000000e+00


<382> gcc -g -O simple.c -mfpmath=sse -msse -msse2 -msse3 -malign-double
<383> ./a.out
1- nan

<387> gcc -g -O simple.c -mfpmath=sse -msse -msse2 -msse3 -malign-double -mno-80387
1- 4.446591e-323


Since I ask gcc to explicitly use the sse registers I don't understand why it generates a x87 instruction for the type cast !
What am I missing ? Is it a bug ?


Thanks for your help.

Olivier


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