Перейти к содержанию
    

Недооптимизация

Проект для Cortex-M4. Включена полная оптимизация (хоть size, хоть speed, хоть balanced).

На один из условных операторов, компилятор выдаёт код:

0x4588             CMP      R8,R1
0xD005             BEQ.N    ??TaskUsbView_6
0xEA48 0x2717      ORR      R7,R8,R7, LSR #+8
0xF8CD 0x8000      STR      R8,[SP, #+0]
0xF1A9 0x0908      SUB      R9,R9,#+8
??TaskUsbView_6:

Никак не могу понять - почему он не создаёт блок ITTT ?

В других местах кода полно IT, но в этом месте - никак. Ставил разные типы оптимизации: size, speed, balanced - один фиг. Что ему мешает???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему не даст? IT для того и придумано, чтобы быть быстрее чем ветвление на коротких участках.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему не даст? IT для того и придумано, чтобы быть быстрее чем ветвление на коротких участках.

Ну тогда посчитайте такты и сравните. Мне вовсе не очевидно, что здесь ITTT будет быстрее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну тогда посчитайте такты и сравните. Мне вовсе не очевидно, что здесь ITTT будет быстрее.

А что их считать? Если есть ещё более длинные команды (ITTTT, ITTTE) какой смысл было их делать в ядре если бы они не давали эффекта по сравнению с B?

IT всегда быстрее B.

За счёт "IT folding" IT всегда быстрее Bcond (в среднем конечно, если считать прохождение веток да/нет равновероятным).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что их считать?

Ну, если вам лень, я сам посчитаю.

С инструкцией BEQ: 5 тактов, если сравнение "равно", 2 такта в противном случае.

С инструкцией ITTT: 4 такта, если сравнение "равно", 3 такта в противном случае.

Это если память без задержек.

Что-то я не вижу, что ITTT всех порвал как тузик грелку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, если вам лень, я сам посчитаю.

С инструкцией BEQ: 5 тактов, если сравнение "равно", 2 такта в противном случае.

С инструкцией ITTT: 4 такта, если сравнение "равно", 3 такта в противном случае.

Это если память без задержек.

Что-то я не вижу, что ITTT всех порвал как тузик грелку.

Под "равно" Вы наверное имели в виду "не равно"? :) Т.е. - NE.

И Вы забыли про "IT folding".

Мои расчёты:

с BEQ (начиная от неё): если NE = 5 тактов, если EQ = 2...4 такта.

с ITTT (начиная от неё): если NE = 4 такта, если EQ = не знаю, но думаю 3 такта (на пропуск каждой инструкции).

Т.е. - ITTT однозначно лучше. Компилятор не знает ничего о скорости памяти, так что в расчёт должен брать среднее время условного ветвления. К тому же ветвление вроде не только от скорости памяти зависит, но и от выравнивания целевой инструкции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

с BEQ (начиная от неё): если NE = 5 тактов, если EQ = 2...4 такта.

А, ну да, тут я немного напутал.

Да и фиг с ним, с этим лишним тактом. Я думаю, если всё время в дизассемблер заглядывать и горевать, можно приобрести преждевременную седину :biggrin: Не может компилятор всегда выдавать оптимальный код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...