[uquote="VladislavS",url="/forum/viewtopic.php?p=3742456#p3742456"]Немного поэкспериментировал с твоим примером. Процессор STM32F303 (CM4F), выполнение кода из SRAM. Скорее всего, из FLASH будут другие цифры по тактам.
Сделал тестовый код (надеюсь я правильно понял твои макросы).[/uquote]Да, именно в такое мои макросы и должны были развернуться. Единственный момент - IAR ругается warning-ом на выражения, в которых встречаются сразу несколько чтений volatile переменных. Поэтому эта строка у меня разбита на 2: сперва "
3 - ((GPIOA->IDR>>10)&1)", а потом - остальное.
Ну собственно IAR-овский результат такой же как у меня - 5 команд.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3742456#p3742456"]И получил как раз[/uquote]Да, собственно этого я и ожидал от IAR-а. Как минимально-оптимальный результат.

4 шт. 4-байтовых арифметических команды.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3742456#p3742456"]Только разницы по тактам, как я и предполагал, никакой. Результаты под IAR и GCC[/uquote]IAR-овский результат - 5 команд. Должен быть на 1 такт длиннее. Ну а то что "нет разницы" - так там в результаты попали множество LDR, которые в сумме длиннее. И IAR их поставил меньше. Таким способом с точностью до такта не измерить. Вобщем - GCC здесь оказался лучше. Но даже он не додумался до самого оптимального варианта, который я приводил 3-м по счёту.

Вобщем - компиляторы ещё пока что тупее человека.
Добавлено after 5 minutes 43 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=3742299#p3742299"]Так приведите весь код, который нужно компилировать...
Что из себя представляет Pval, PIN_PRND_B и PIN_PRND_F?[/uquote]Посмотрите соседний пост
VladislavS - он правильно угадал содержимое макросов. У него как раз и получилось от GCC то, что я ожидал. Правда не самый лучший вариант.
[uquote="Мурик",url="/forum/viewtopic.php?p=3742299#p3742299"]
jcxz писал(а):Компилятор у Вас зачем то перегружал повторно указатель, потратив на это лишние команды LDR.
Потому что данные в __IO регистре, т. е. valatile.[/uquote]
Данные, но не
указатель на них (адрес этого регистра). А у Вас GCC дважды зачем-то перегрузил этот адрес. Посмотрите на результат IAR (что я приводил) - там указатель на IO-регистры грузится один раз, и потом по нему дважды читаются оба порта (со смещением, так как они находятся по близким адресам).
Добавлено after 4 minutes 50 seconds:
[uquote="protoder",url="/forum/viewtopic.php?p=3742899#p3742899"]Кстати, вот и еще один пример, зачем может быть нужен ассемблер: в сложных случаях понять, а что же такое намудрил компилятор.[/uquote]Совершенно правы! Или "намудрил автор исходника". Я бывает когда ищу баг, гляну на результат компиляции и по нему сразу вижу баг (особенно - если что-то не так с приведением типов, расширением типов, знаками и т.п.).