我对 ARM Neon VLD1 指令的对齐有疑问。以下代码中的对齐如何工作?
DATA .req r0
vld1.16 {d16, d17, d18, d19}, [DATA, :128]!
这条读指令的起始地址是否移动到DATA+一个正整数,使得它是不小于DATA的16的最小倍数(16字节=128位),还是DATA本身变为16的最小倍数?小于数据?
这是对 CPU 的提示。我从 ARM 网站上的一篇博文中读到了有关这种提示有用性的唯一内容,声称它使加载速度更快,但没有说明如何或为什么。可能是因为 CPU 可以发出更广泛的负载。
您还可以使用可选的 : 参数为 Rn 中传递的指针指定对齐方式,这通常会加快内存访问速度。
如果您提供提示,则必须确保它DATA
与 16 字节对齐,否则您将获得硬件异常。
此硬件行为在ARM ARM的 VLD1 描述中描述为
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 可以自行检查对齐并应用最佳条件。可能会花费太多的周期。