Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Недооптимизация
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
jcxz
Проект для 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 - один фиг. Что ему мешает???
scifi
А что, IT блок в этой ситуации даст какие-то преимущества?
jcxz
А почему не даст? IT для того и придумано, чтобы быть быстрее чем ветвление на коротких участках.
scifi
Цитата(jcxz @ Jul 11 2016, 10:24) *
А почему не даст? IT для того и придумано, чтобы быть быстрее чем ветвление на коротких участках.

Ну тогда посчитайте такты и сравните. Мне вовсе не очевидно, что здесь ITTT будет быстрее.
jcxz
Цитата(scifi @ Jul 11 2016, 13:27) *
Ну тогда посчитайте такты и сравните. Мне вовсе не очевидно, что здесь ITTT будет быстрее.

А что их считать? Если есть ещё более длинные команды (ITTTT, ITTTE) какой смысл было их делать в ядре если бы они не давали эффекта по сравнению с B?
IT всегда быстрее B.
За счёт "IT folding" IT всегда быстрее Bcond (в среднем конечно, если считать прохождение веток да/нет равновероятным).
scifi
Цитата(jcxz @ Jul 11 2016, 10:43) *
А что их считать?

Ну, если вам лень, я сам посчитаю.
С инструкцией BEQ: 5 тактов, если сравнение "равно", 2 такта в противном случае.
С инструкцией ITTT: 4 такта, если сравнение "равно", 3 такта в противном случае.
Это если память без задержек.
Что-то я не вижу, что ITTT всех порвал как тузик грелку.
jcxz
Цитата(scifi @ Jul 11 2016, 14:27) *
Ну, если вам лень, я сам посчитаю.
С инструкцией BEQ: 5 тактов, если сравнение "равно", 2 такта в противном случае.
С инструкцией ITTT: 4 такта, если сравнение "равно", 3 такта в противном случае.
Это если память без задержек.
Что-то я не вижу, что ITTT всех порвал как тузик грелку.

Под "равно" Вы наверное имели в виду "не равно"? sm.gif Т.е. - NE.
И Вы забыли про "IT folding".
Мои расчёты:
с BEQ (начиная от неё): если NE = 5 тактов, если EQ = 2...4 такта.
с ITTT (начиная от неё): если NE = 4 такта, если EQ = не знаю, но думаю 3 такта (на пропуск каждой инструкции).
Т.е. - ITTT однозначно лучше. Компилятор не знает ничего о скорости памяти, так что в расчёт должен брать среднее время условного ветвления. К тому же ветвление вроде не только от скорости памяти зависит, но и от выравнивания целевой инструкции.
scifi
Цитата(jcxz @ Jul 11 2016, 13:20) *
с BEQ (начиная от неё): если NE = 5 тактов, если EQ = 2...4 такта.

А, ну да, тут я немного напутал.
Да и фиг с ним, с этим лишним тактом. Я думаю, если всё время в дизассемблер заглядывать и горевать, можно приобрести преждевременную седину biggrin.gif Не может компилятор всегда выдавать оптимальный код.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.