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規範是強制性的,那麼如果對齊問題得到解決可能會出現問題,但這當然意味着其他「治理」規範首先被破壞,所以也許誰在乎,也許這是不是一個有效的點。 –