|
Недооптимизация, (Cortex-M, IAR for ARM v7.50.3) |
|
|
|
Jul 11 2016, 06:49
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Проект для 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 - один фиг. Что ему мешает???
|
|
|
|
|
 |
Ответов
|
Jul 11 2016, 07:43
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ Jul 11 2016, 13:27)  Ну тогда посчитайте такты и сравните. Мне вовсе не очевидно, что здесь ITTT будет быстрее. А что их считать? Если есть ещё более длинные команды (ITTTT, ITTTE) какой смысл было их делать в ядре если бы они не давали эффекта по сравнению с B? IT всегда быстрее B. За счёт "IT folding" IT всегда быстрее Bcond (в среднем конечно, если считать прохождение веток да/нет равновероятным).
|
|
|
|
|
Jul 11 2016, 08:27
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(jcxz @ Jul 11 2016, 10:43)  А что их считать? Ну, если вам лень, я сам посчитаю. С инструкцией BEQ: 5 тактов, если сравнение "равно", 2 такта в противном случае. С инструкцией ITTT: 4 такта, если сравнение "равно", 3 такта в противном случае. Это если память без задержек. Что-то я не вижу, что ITTT всех порвал как тузик грелку.
|
|
|
|
|
Jul 11 2016, 10:20
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ Jul 11 2016, 14:27)  Ну, если вам лень, я сам посчитаю. С инструкцией BEQ: 5 тактов, если сравнение "равно", 2 такта в противном случае. С инструкцией ITTT: 4 такта, если сравнение "равно", 3 такта в противном случае. Это если память без задержек. Что-то я не вижу, что ITTT всех порвал как тузик грелку. Под "равно" Вы наверное имели в виду "не равно"?  Т.е. - NE. И Вы забыли про "IT folding". Мои расчёты: с BEQ (начиная от неё): если NE = 5 тактов, если EQ = 2...4 такта. с ITTT (начиная от неё): если NE = 4 такта, если EQ = не знаю, но думаю 3 такта (на пропуск каждой инструкции). Т.е. - ITTT однозначно лучше. Компилятор не знает ничего о скорости памяти, так что в расчёт должен брать среднее время условного ветвления. К тому же ветвление вроде не только от скорости памяти зависит, но и от выравнивания целевой инструкции.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|