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 - 后者是只对齐的吗?道歉,如果我有这个错误,需要阅读。 有人会友善地检查我吗?
像vpaddd大多数操作(我没有检查一个特别)接受未对齐的内存操作数,它大多是具有严格对齐的变体的mov。 –
谢谢马克,我的无知 - 我假设太多了,所以除非我再看一遍,没有证据表明这是代码崩溃,因为我看到的一些行为显然没有对齐。它可能被认为是非常不理想的,尽管在子结构错误对齐的情况下,毕竟它通常会尝试对齐。 –
这也可能是由规范施加的要求有问题。如果与某些C/C++编译器兼容(哪个?)或者某个人的ABI规范是强制性的,那么如果对齐问题得到解决可能会出现问题,但这当然意味着其他“治理”规范首先被破坏,所以也许谁在乎,也许这是不是一个有效的点。 –