jcxz 235 27 мая, 2019 Опубликовано 27 мая, 2019 · Жалоба 33 минуты назад, amaora сказал: Это -O2. А это -Os. Это возможно потому, что GCC увидел, что n в данном случае не может быть больше 4 и поставил BEQ вместо BCS. А попробуйте заменить условие на: if (n >= 3u) continue; чтобы он делал переход именно по ">=". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amaora 24 27 мая, 2019 Опубликовано 27 мая, 2019 · Жалоба 1 minute ago, jcxz said: Это возможно потому, что GCC увидел, что n в данном случае не может быть больше 4 и поставил BEQ вместо BCS. А попробуйте заменить условие на: if (n >= 3u) continue; чтобы он делал переход именно по ">=". Ну да, вот теперь -O2. cmp r6, #2 bhi .L2 ldrh r10, [r5, #2] ldrh r2, [r5, #4] sub r3, r3, r10 cmp r3, r2 itt hi lslhi r3, r9, r6 orrhi r0, r0, r3 .L2: cmp r1, ip add r6, r6, #-1 beq .L1 ldrb r3, [r7], #-1 @ zero_extendqisi2 ldrh r10, [r5, #-6] b .L5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 27 мая, 2019 Опубликовано 27 мая, 2019 · Жалоба 7 hours ago, jcxz said: Да и если просто взять: 144МГц(макс.тактовая ядра)/30МГц(частота флешь?) = ~4.8 инструкций - как раз примерно соответствует возможностям команды IT. Т.е. - при кеш-промахе (переходе) потребуется ~5 тактов на чтение новой порции кода, а не 7. Не совсем. Три такта - сам бранч (ну если это CM3) плюс чтение новой страницы. Итого, скажем, порядка 8ми тактов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 27 мая, 2019 Опубликовано 27 мая, 2019 · Жалоба 21 минуту назад, Rst7 сказал: Не совсем. Три такта - сам бранч (ну если это CM3) плюс чтение новой страницы. Итого, скажем, порядка 8ми тактов. Вообще-то в TRM Cortex-M сказано: 1+P; где P = 1..3 - как раз и есть время выборки следующих команд. Конечно если команды выбираются из flash, то это время P может растянуться. Но общее время имхо будет: 1 + MAX(P, выборка_из_флешь) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 28 мая, 2019 Опубликовано 28 мая, 2019 · Жалоба 9 hours ago, jcxz said: Вообще-то в TRM Cortex-M сказано: 1+P; где P = 1..3 - как раз и есть время выборки следующих команд. Да, пардон, в большинстве случаев - P=1. Входит ли это P во время доступа к флешу или нет - вот это уже неизвестно. В общем, бенчмарк бы ответил на все вопросы, но объективно при исполнении из RAM явно должен быть переход. Так что в оптимизаторе IAR'а похоже есть недоделка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 28 мая, 2019 Опубликовано 28 мая, 2019 · Жалоба Раз с gcc без меня разобрались, решил с armcc v6.12 (тот что в Keil) поэкспериментировать. Он на высоких оптимизациях вообще цикл раскручивает. Без раскручивания делает условный переход. // if (n >= 3u) continue; cmp r7, #2 bhi .LBB0_3 Под itt прячет две инструкции. Компилил под M4F. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 28 мая, 2019 Опубликовано 28 мая, 2019 · Жалоба 2 часа назад, VladislavS сказал: Без раскручивания делает условный переход. Под itt прячет две инструкции. Компилил под M4F. Значит это чисто IAR-овский баг. Надо в поддержку писать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться