Я же добавил про инкремент счётчика, от него можно отказаться используя указатель в качестве счётчика циклов (сравнивая указатель с конечным его значением). В этом случае всё будет бесплатно. Да ещё и регистр счётчика цикла сэкономится.
Пардон, но этот указатель нужно же еще инкрементить.
Еще раз:
Вариант прямой:
1) разыменовываем указатель
2) делаем полезную работу
3) инкрементим указатель
4) сравниваем указатель с ограничителем
5) условный переход
Вариант обратный:
1) разыменовывем указатель+индекс (очень давно это везде одна команда и индексирование является бесплатным)
2) делаем полезную работу
3) декрементим индекс
4) делаем условный переход
Совершенно из общих соображений обратный вариант на одну команду короче.
А если вспомнить, что есть команды вроде loop, которые декрементят счетчик и выполняют условный переход сразу, то вообще так:
1) разыменовывем указатель+индекс (очень давно это везде одна команда и индексирование является бесплатным)
2) делаем полезную работу
3) декрементим индекс+делаем условный переход
И уже две команды на параллельности надо в первом случае отыграть, только чтобы сравнять счет.
(Оффтоп)
loop на практике как правило, не нужен, т.к. с большой вероятностью декремент указателя удастся запараллелить с полезной работой. Особенно, если последней командой блока полезной работы будет не меняющая флаги команда (в т.ч. весь SIMD) - тогда на всякий случай рекомендовано поднять декремент на одну/несколько позиций выше (компиляторы это тоже делают как правило). Так мы делали с времен появления первого Pentium и до недавних времен, пока я еще занимался низкоуровневыми оптимизациями.
Т.е. я пока не вижу, чем перевернутый цикл может быть медленнее на любой архитектуре (кроме экзотики, которую даже сходу не сформулирую). А чем прямой может быть хуже - вижу: если звезды не союдутся и в результате всех спариваний фору отыграть не выйдет - будет именно хуже. А так оно, скорее всего и будет, ибо a) обычно лениво все досканально тестировать профайлером (а нужно - т.к. все равно в голове все конвееры не учтете). b) расчитываем, что работать ваша программа должна не только на вашем конкретном компьютере с конкретной архитектурой.