ARMNeonVLD1命令の配置について質問があります。次のコードの配置はどのように機能しますか?
DATA .req r0
vld1.16 {d16, d17, d18, d19}, [DATA, :128]!
この読み取り命令の開始アドレスは、DATA +正の整数にシフトし、DATA以上の16の最小公倍数(16バイト= 128ビット)になるか、またはDATA自体が16の最小公倍数に変更されますか?データ未満?
CPUへのヒントです。そのようなヒントの有用性について私が読んだのは、 ARMのサイトのブログ投稿からであり、読み込みが速くなると主張していましたが、その方法や理由については述べていません。おそらくCPUがより広い負荷を発行できるためです。
オプションの:パラメータを使用して、Rnで渡されるポインタの配置を指定することもできます。これにより、多くの場合、メモリアクセスが高速化されます。
ヒントを提供する場合は、DATA
それが16バイトにアラインされていることを確認する必要があります。そうしないと、ハードウェア例外が発生します。
このハードウェアの動作は、ARMARMの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がアライメント自体をチェックして最良の条件を適用できる理由を実際には理解できません。それはあまりにも多くのサイクルを要するかもしれません。