アライメントをチェックするデバッグビルドの下でアサートが発生しました。アサーションは、を使用してuint8x16_t
にロードされるバイト配列用です。アサルトが発生する間、我々はSIG_BUS
を観察していない。uint8x16_tがバイト配列からロードされるための配置要件?
は、ここでのコードでの使用です:
const byte* input = ...;
...
assert(IsAlignedOn(input, GetAlignmentOf(uint8x16_t));
uint64x2_t message = vreinterpretq_u64_u8(vld1q_u8(input));
私はまた次、およびuint8_t*
の位置合わせのためのアサート火災で試してみました:
assert(IsAlignedOn(input, GetAlignmentOf(uint8_t*));
uint64x2_t message = vreinterpretq_u64_u8(vld1q_u8(input));
バイト配列のためのアライメント要件は何ですかuint8x16_t
にvld1q_u8
と入力してください。
上記のコードでは、input
は関数のパラメータです。 IsAlignedOn
は、2つの引数のアライメントをチェックして、最初のアライメントが少なくとも2番目のアライメントに合っていることを確認します。 GetAlignmentOf
は、型または変数の配置を取得する抽象です。
uint8x16_t
およびuint64x2_t
は、128ビットのARM NEONベクトルデータ型(expected to be placed in a Q register)です。 vld1q_u8
は、VLD1.8
命令にコンパイルされると予想されるNEON疑似命令です。 vreinterpretq_u64_u8
は、データ型の使用を容易にするNEON擬似命令です。
コードはCではありません。 – Olaf
@Olaf - あなたが正しいかどうかはわかりません。それらはintrinsicsです。[C言語の拡張です](http://gcc.gnu.org/onlinedocs/gcc/ARM-C-Language-Extensions-_0028ACLE_0029.html)。引用されたGCCのドキュメントはARMドキュメントを参照しているので、それらについて読むためには両方の参照を持つべきです。 – jww
C標準が 'GetAlignmentOf'のような構文を許す場所への参照を提供してください!あなたの編集を行います:変数 'uint8x16_t'の宣言を[mcve]に与えます。そして、バイト配列のアライメントは、規格によって「1」と定義される。 –
Olaf