Jump to content

    

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

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

Это -O2.

А это -Os.

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

if (n >= 3u) continue;

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

Share this post


Link to post
Share on other sites
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
        

 

Share this post


Link to post
Share on other sites
7 hours ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites
21 минуту назад, Rst7 сказал:

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

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

Share this post


Link to post
Share on other sites
9 hours ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites
2 часа назад, VladislavS сказал:

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now