D / DLang / GDC - 结构

时间:2017-03-01 17:22:40

标签: gcc struct d simd memory-alignment

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

在这段代码中,当您查看GDC生成的x64代码输出时,它似乎做得很好,因为它已经为256位YMM'字段'的偏移正确。

Q :D会自动将字段上的对齐限制传播到堆栈上的静态结构或结构的分配吗?

在这种情况下 -

struct vec_struct {
    bool b2;
    struct {
        alias field this;
        bool b;
        int8 field; // umm
        }
    }

似乎“字段”的偏移量不再正确对齐 - GDC中的偏移量为40个字节。我不认为编译器将仅使用未对齐的指令?在任何情况下,我都可以获取字段的地址,然后将其传递给期望获得保证正确对齐的内容的人,如果我已经理解了D文档。 :这是正确的 - 一个严重的问题,还是我愚蠢?

请不要咬人。我是D的新手,我希望我已经理解了x86 SIMD指令的文档。 (非常有经验的专业asm和C程序员,但是v已经过时了。)

Noob q:我注意到GDC操作码看起来有点奇怪,例如编译器生成256位无符号提取,然后是对齐的二进制操作(我认为),例如一个movdqu后跟一个vpaddd r,ymm ptr等等 - 后者只是对齐吗?如果我有这个错误,请道歉,需要阅读。 有人会善意地检查我吗?

1 个答案:

答案 0 :(得分:1)

  

D会自动将字段上的对齐限制传播到堆栈上的静态结构或结构的分配吗?

我认为它应该和GDC / LDC已经支持正确的堆栈对齐。 DMD可能在这方面有一些缺陷: https://issues.dlang.org/show_bug.cgi?id=16098

  

似乎是'字段的偏移量。不再正确对齐 - GDC中的偏移量为40个字节。

正如Iain已经在D.learn主题中回答的那样,这是共享DMD / GDC代码库中的一个错误。

错误报告:https://issues.dlang.org/show_bug.cgi?id=17237

DMD错误修正:https://github.com/dlang/dmd/pull/6582

GDC的Backport:https://github.com/D-Programming-GDC/GDC/pull/408