2017-03-01 41 views
1
struct vec_struct { 
    alias field this; 
    bool b; 
    int8 field; // ymm 
    } 

SIMD字段,当你在用GDC生成的输出64位的代码似乎是做了很好的工作,因为它已经得到了这个代码的对齐偏移正确的256位YMM'字段'正确。d/DLang/GDC - 在结构

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 blah - 后者是只对齐的吗?道歉,如果我有这个错误,需要阅读。 有人会友善地检查我吗?

+0

像vpaddd大多数操作(我没有检查一个特别)接受未对齐的内存操作数,它大多是具有严格对齐的变体的mov。 –

+0

谢谢马克,我的无知 - 我假设太多了,所以除非我再看一遍,没有证据表明这是代码崩溃,因为我看到的一些行为显然没有对齐。它可能被认为是非常不理想的,尽管在子结构错误对齐的情况下,毕竟它通常会尝试对齐。 –

+0

这也可能是由规范施加的要求有问题。如果与某些C/C++编译器兼容(哪个?)或者某个人的ABI规范是强制性的,那么如果对齐问题得到解决可能会出现问题,但这当然意味着其他“治理”规范首先被破坏,所以也许谁在乎,也许这是不是一个有效的点。 –

回答

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:https://github.com/D-Programming-GDC/GDC/pull/408