2
我有一個關於ARM Neon VLD1指令對齊的問題。以下代碼中的對齊方式如何工作?在VLD1中對齊
DATA .req r0
vld1.16 {d16, d17, d18, d19}, [DATA, :128]!
是否這個起始地址讀指令轉移到DATA +的正整數,使得它是16的最小倍數(16個字節= 128位),這是不大於DATA更少,或數據本身改變到16的最小倍數不少於DATA?
我有一個關於ARM Neon VLD1指令對齊的問題。以下代碼中的對齊方式如何工作?在VLD1中對齊
DATA .req r0
vld1.16 {d16, d17, d18, d19}, [DATA, :128]!
是否這個起始地址讀指令轉移到DATA +的正整數,使得它是16的最小倍數(16個字節= 128位),這是不大於DATA更少,或數據本身改變到16的最小倍數不少於DATA?
這是對CPU的暗示。我只看到ARM提供的一個blog post這個提示的有用性,聲稱它使加載速度更快,但它沒有說明如何或爲什麼。可能是因爲CPU可以發出更大的負載。
還可以指定爲Rn中傳遞的指針的對準,使用可選的:參數,這常常加快內存訪問。
如果您提供的提示你必須確保DATA
對齊到16個字節,否則你會得到一個硬件異常。
此硬件行爲在VLD1描述ARM ARM作爲
if ConditionPassed() then
EncodingSpecificOperations(); CheckAdvSIMDEnabled(); NullCheckIfThumbEE(n);
address = R[n]; if (address MOD alignment) != 0 then GenerateAlignmentException();
if wback then R[n] = R[n] + (if register_index then R[m] else ebytes);
Elem[D[d],index,esize] = MemU[address,ebytes];
主要是該行
if (address MOD alignment) != 0 then GenerateAlignmentException();
我其實不明白爲什麼CPU可以檢查對準自己,並應用最佳狀態描述。可能會花費太多的週期。
我明白了。如果使用對齊,則對齊需要地址寄存器爲對齊的倍數。否則會失敗。 – windchime