jcxz 187 11 июля, 2016 Опубликовано 11 июля, 2016 · Жалоба Проект для 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 1 11 июля, 2016 Опубликовано 11 июля, 2016 · Жалоба А что, IT блок в этой ситуации даст какие-то преимущества? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 11 июля, 2016 Опубликовано 11 июля, 2016 · Жалоба А почему не даст? IT для того и придумано, чтобы быть быстрее чем ветвление на коротких участках. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 11 июля, 2016 Опубликовано 11 июля, 2016 · Жалоба А почему не даст? IT для того и придумано, чтобы быть быстрее чем ветвление на коротких участках. Ну тогда посчитайте такты и сравните. Мне вовсе не очевидно, что здесь ITTT будет быстрее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 11 июля, 2016 Опубликовано 11 июля, 2016 · Жалоба Ну тогда посчитайте такты и сравните. Мне вовсе не очевидно, что здесь ITTT будет быстрее. А что их считать? Если есть ещё более длинные команды (ITTTT, ITTTE) какой смысл было их делать в ядре если бы они не давали эффекта по сравнению с B? IT всегда быстрее B. За счёт "IT folding" IT всегда быстрее Bcond (в среднем конечно, если считать прохождение веток да/нет равновероятным). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 11 июля, 2016 Опубликовано 11 июля, 2016 · Жалоба А что их считать? Ну, если вам лень, я сам посчитаю. С инструкцией BEQ: 5 тактов, если сравнение "равно", 2 такта в противном случае. С инструкцией ITTT: 4 такта, если сравнение "равно", 3 такта в противном случае. Это если память без задержек. Что-то я не вижу, что ITTT всех порвал как тузик грелку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 11 июля, 2016 Опубликовано 11 июля, 2016 · Жалоба Ну, если вам лень, я сам посчитаю. С инструкцией BEQ: 5 тактов, если сравнение "равно", 2 такта в противном случае. С инструкцией ITTT: 4 такта, если сравнение "равно", 3 такта в противном случае. Это если память без задержек. Что-то я не вижу, что ITTT всех порвал как тузик грелку. Под "равно" Вы наверное имели в виду "не равно"? :) Т.е. - NE. И Вы забыли про "IT folding". Мои расчёты: с BEQ (начиная от неё): если NE = 5 тактов, если EQ = 2...4 такта. с ITTT (начиная от неё): если NE = 4 такта, если EQ = не знаю, но думаю 3 такта (на пропуск каждой инструкции). Т.е. - ITTT однозначно лучше. Компилятор не знает ничего о скорости памяти, так что в расчёт должен брать среднее время условного ветвления. К тому же ветвление вроде не только от скорости памяти зависит, но и от выравнивания целевой инструкции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 11 июля, 2016 Опубликовано 11 июля, 2016 · Жалоба с BEQ (начиная от неё): если NE = 5 тактов, если EQ = 2...4 такта. А, ну да, тут я немного напутал. Да и фиг с ним, с этим лишним тактом. Я думаю, если всё время в дизассемблер заглядывать и горевать, можно приобрести преждевременную седину Не может компилятор всегда выдавать оптимальный код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться