Выравнивание в VLD1

У меня вопрос по выравниванию инструкции ARM Neon VLD1. Как работает выравнивание в следующем коде?

DATA            .req r0  
vld1.16         {d16, d17, d18, d19}, [DATA, :128]!  

Смещается ли начальный адрес этой инструкции чтения на ДАННЫЕ + положительное целое число, так что он является наименьшим кратным 16 (16 байт = 128 бит), что не меньше, чем ДАННЫЕ, или сами ДАННЫЕ изменяются на наименьшее кратное 16 нет меньше ДАННЫХ?


person windchime    schedule 05.02.2013    source источник


Ответы (1)


Это подсказка процессору. Единственное, что я прочитал о полезности такой подсказки, было из сообщение в блоге на сайте ARM, в котором утверждается, что это ускоряет загрузку, однако не говорится, как и почему. Возможно потому, что 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();

Я на самом деле не могу понять, почему процессор может сам проверять выравнивание и применять наилучшее условие. Может быть, это будет стоить слишком много циклов.

person auselen    schedule 05.02.2013
comment
Понимаю. Выравнивание требует, чтобы адресный регистр был кратен выравниванию, если используется выравнивание. В противном случае это не удастся. - person windchime; 06.02.2013