Marc Glisse <marc.glisse@xxxxxxxx> writes: > On Sun, 24 Jun 2012, Dag Lem wrote: > > > Marc Glisse <marc.glisse@xxxxxxxx> writes: > > > >> On Sun, 24 Jun 2012, Dag Lem wrote: > >> [...] > > I guess you're right. Casting as in my naïve approach would also have > > limited usefulness in that it would only be able to extract the lower > > (and not the higher) bits of a vector register. However I can't help > > thinking that some kind of intrinsic/operator/whatever to extract > > vector register parts would be useful. > > But they do exist. You even criticized one for generating a > superfluous mov and reported a bug against one that mysteriously > started generating vshufps ;-) I should have been more specific; what I meant was a *portable* intrinsic/operator/whatever, not AVX intrinsics. [...] > or *z=*(v2sf*)&d; if you really want pointers. I agree it isn't that > pretty, but it could be worse... Well, I guess you're right - it's not that bad, and certainly portable. If only gcc could translate the casts to no-ops or single instructions, instead of insisting on storing and reloading the registers from memory. [...] > Although since I was the one who tried to fix it and I gave up, you > may have to wait a bit for someone else to be motivated... Don't give up! ;-) > > I have to say, I am impressed by the code generated for this at -O3: > > #include <x86intrin.h> > __v2sf f(__v4sf x){ > __v2sf d=*(__v2sf*)&x; > return d; > } > > movaps %xmm0, -72(%rsp) > movq -72(%rsp), %rax > movq %rax, -80(%rsp) > movlps -80(%rsp), %xmm0 Yes, it is impressive. But could have been a no-op? Again, thanks for your help and feedback. I'll just stick to pointer casts, and hope that even better code will be generated some time in the future. -- Best regards, Dag Lem