Alignment of struct containing SIMD field - GDC

Cecil Ward via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Feb 28 22:04:32 PST 2017


struct vec_struct {
     alias field this;
     bool b;
     int8 field;
     }

In this code when you look at the generated x64 code output by 
GDC it seems to be doing a nice job, because it has got the 
offset right for the 256-bit YMM 'field' correct.

Does D automatically propagate the alignment restrictions on the 
field to the allocation of static structs or structs on the stack?

In this case:

struct vec_struct {
     bool b2;
     struct {
         alias field this;
         bool b;
         int8 field;
         }
     }
it appears that the offset to 'field' is no longer aligned 
correctly - offset is 40 bytes in GDC. I don't suppose the 
compiler will use solely unaligned instructions? In any event, I 
could take the address of field and then pass that to someone 
expecting to pick up something with guaranteed correct alignment, 
if I have understood the D docs.

Please don't bite. I'm both new to D and I hope I have understood 
the x86 SIMD instructions' docs. (Very experienced professional 
asm and C programmer, but v out-of-date.)

Noob q: I notice that the GDC opcodes look a bit odd, for example 
the compiler generates a 256-bit unaligned fetch followed by an 
aligned binary operation (I think), eg a movdqu followed by a 
vpaddd r, ymm ptr blah - is the latter aligned-only? Apologies if 
I have got this wrong, need to read up. Would someone 
sanity-check me?


More information about the Digitalmars-d-learn mailing list