Что происходит с инструкциями с отложенным результатом на ветке в сборке ARM? - PullRequest
3 голосов
/ 23 марта 2012

Я оптимизирую алгоритм в сборке ARM и мне нужно выяснить, в каком порядке размещать инструкции, чтобы минимизировать задержки конвейера.Счетчик циклов на http://pulsar.webshaker.net/ccc/index.php?lng=us очень полезен в этом, но ему не хватает знаний о том, что происходит при вызовах функций / ветвях.Что я хочу сделать, так это в основном (это всего лишь пример):

mul       r4, r0, r1
mov       r0, #0
mov       r1, #12
mov       r4, r4, ASR #14
str       r4, [r5]
bl        foo

Поток конвейера между инструкциями mul и mov довольно ужасен, и ничто не мешает мне выполнитьвызов функции между ними.Но что именно происходит с конвейером, когда я делаю ветку?Я знаю, что foo сделает push {r4-r12, lr} в качестве первой инструкции.Я вижу два возможных результата:

  1. Команда перехода занимает несколько циклов, что позволяет команде mul доставить свой результат до выполнения push, тем самым уменьшая задержку конвейера.
  2. Задержка конвейера увеличивается, так как push требуется r4 за несколько циклов до его выполнения (это было в случае до ARMv7 IIRC, счетчик циклов в ссылке, кажется, не считает это необходимым).*

Короче говоря:
Что происходит с инструкциями с задержанными результатами (mul является основным примером), когда вы выполняете вызов функции (который должен помещать регистр в стек) или даженормальная ветка?

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Если я понимаю, вам не нужно выполнять

mov       r4, r4, ASR #14
str       r4, [r5]

перед вызовом.Выполнение вызова до выполнения mov

bl        foo
mov       r4, r4, ASR #14
str       r4, [r5]

- хорошая идея.

У мул будет больше времени для завершения во время разговора.STM будет проблемой, которая понятна.Конечно, вы можете нажать R4 до его вычисления.

Если foo является функцией asm, вы можете сохранить R4 позже в функции foo (возможно, вы можете попытаться не использовать r4, а затем не сохранять его).

, если функция foo является функцией C (или если вы можете изменить инструкцию push).используйте r12 вместо r4 в качестве регистра назначения MUL.

R12 позже потребуется для инструкции STM.Тогда вполне возможно, что муль имеет достаточно времени для завершения, прежде чем STM понадобится регистру назначения (R12)!

0 голосов
/ 23 марта 2012

Я не уверен, что ответ, но я почти уверен, что если ответ общеизвестен, он будет в Техническом справочнике Cortex-A8 .

...