Help with gcc SSE intrinsics

Ok, I've been looking at this for hours and can't figure it out. I know I'm
missing something obvious.

I've been spending the past few days beefing up the vector support in the C
Backend. This should help us debug vector code that's miscompiled. But
gcc doesn't like this fragment:

  ((double *)(&llvm_cbe_r1147))[0u] =
(((llvm_cbe_r1146__BITCAST_TEMPORARY.Int64 = 4ull,
llvm_cbe_r1146__BITCAST_TEMPORARY .Double)));
  llvm_cbe_r1148 = __builtin_ia32_movddup(llvm_cbe_r1147);

prog.linked.c:10393: error: incompatible types when assigning to type 'double
__vector__'
from type 'int'

  double __attribute__((vector_size(16 ))) llvm_cbe_r1147;
  double __attribute__((vector_size(16 ))) llvm_cbe_r1148;

Any ideas what gcc is complaining about? I'm running gcc with -msse3.

                            -Dave

As far as I can tell, GCC 4.x no longer predeclares __builtin_ia32_movddup. g++ gives a clearer error, but in C the function is implicitly declared as a returning int (because of the call), and so you get the type mismatch again.

At least, that's my guess (I'm not familiar with GCC internals).

  Daveed

Ok, I've been looking at this for hours and can't figure it out. I know I'm
missing something obvious.

I've been spending the past few days beefing up the vector support in the C
Backend. This should help us debug vector code that's miscompiled. But
gcc doesn't like this fragment:

((double *)(&llvm_cbe_r1147))[0u] =
(((llvm_cbe_r1146__BITCAST_TEMPORARY.Int64 = 4ull,
llvm_cbe_r1146__BITCAST_TEMPORARY .Double)));
llvm_cbe_r1148 = __builtin_ia32_movddup(llvm_cbe_r1147);

I don't see __builtin_ia32_movddup defined anywhere in the llvm-gcc sources. That's probably it.

Not llvm-gcc. GNU gcc. It's documented here:

http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/X86-Built_002din-Functions.html#X86-Built_002din-Functions

                                 -Dave

I see, I'm not in a position to duplicate this then. Good luck.

Aha! They removed this intrinsic and expect everyone to know to use the
Intel one: _mm_movedup_pd.

Grr...

On the plus side, the CBE is now rockin' with vector code. I'm seeing some
truly weird...err...stuff. :slight_smile:

                           -Dave