У нас есть уверенные стрельбы в сборках Debug, которые проверяют выравнивание. Утверждение относится к массиву байтов, который загружается в uint8x16_t
с использованием vld1q_u8
. В то время как утвердительные пожары, мы не наблюдали 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
проверяет выравнивание двух своих аргументов, гарантируя, что первое выровнено по меньшей мере на второе. GetAlignmentOf
- это абстракция, которая извлекает выравнивание для типа или переменной.
uint8x16_t
и uint64x2_t
- 128-битные векторные типы данных ARM NEON, которые являются expected to be placed in a Q register. vld1q_u8
является инструкцией NEON, которая, как ожидается, будет скомпилирована в инструкцию VLD1.8
. vreinterpretq_u64_u8
- это псевдо-инструкция NEON, которая упрощает использование типов данных.
Код не C. – Olaf
@Olaf - Я не уверен, что вы правы. Они являются внутренними, [которые являются расширением языка C] (http://gcc.gnu.org/onlinedocs/gcc/ARM-C-Language-Extensions-_0028ACLE_0029.html). Приведенный документ GCC ссылается на документы ARM, поэтому вы должны иметь обе ссылки, если хотите прочитать о них. – jww
Просьба указать ссылку, где стандарт C позволяет использовать синтаксис типа GetAlignmentOf '! Повторите свое редактирование: укажите [mcve] с объявлением переменной 'uint8x16_t'. И выравнивание байтового массива определяется стандартом «1». –
Olaf