Перейти к содержанию
    

Почему такая высокая цена за инструкцию перехода?

33 минуты назад, amaora сказал:

Это -O2.

А это -Os.

Это возможно потому, что GCC увидел, что n в данном случае не может быть больше 4 и поставил BEQ вместо BCS. А попробуйте заменить условие на:

if (n >= 3u) continue;

чтобы он делал переход именно по ">=".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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
        

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, jcxz said:

Да и если просто взять: 144МГц(макс.тактовая ядра)/30МГц(частота флешь?) = ~4.8 инструкций - как раз примерно соответствует возможностям команды IT. Т.е. - при кеш-промахе (переходе) потребуется ~5 тактов на чтение новой порции кода, а не 7.

Не совсем. Три такта - сам бранч (ну если это CM3) плюс чтение новой страницы. Итого, скажем, порядка 8ми тактов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, Rst7 сказал:

Не совсем. Три такта - сам бранч (ну если это CM3) плюс чтение новой страницы. Итого, скажем, порядка 8ми тактов.

Вообще-то в TRM Cortex-M сказано: 1+P; где P = 1..3 - как раз и есть время выборки следующих команд. Конечно если команды выбираются из flash, то это время P может растянуться. Но общее время имхо будет: 1 + MAX(P, выборка_из_флешь)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, jcxz said:

Вообще-то в TRM Cortex-M сказано: 1+P; где P = 1..3 - как раз и есть время выборки следующих команд.

Да, пардон, в большинстве случаев - P=1. Входит ли это P во время доступа к флешу или нет - вот это уже неизвестно. В общем, бенчмарк бы ответил на все вопросы, но объективно при исполнении из RAM явно должен быть переход. Так что в оптимизаторе IAR'а похоже есть недоделка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раз с gcc без меня разобрались, решил с armcc v6.12 (тот что в Keil) поэкспериментировать. Он на высоких оптимизациях вообще цикл раскручивает.

Без раскручивания делает условный переход.

// if (n >= 3u) continue;
  cmp	r7, #2 
  bhi	.LBB0_3 

Под itt прячет две инструкции. Компилил под M4F.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, VladislavS сказал:

Без раскручивания делает условный переход.

Под itt прячет две инструкции. Компилил под M4F.

Значит это чисто IAR-овский баг. Надо в поддержку писать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...