Кто тут шарит в АРМах? Скажите, нафига компилер вставляет вот этот ноп:
103: __inline void AY_Tick_tone(int n) {
0x00000B60 F04F0C00 MOV r12,#0x00
0x00000B64 2E00 CMP r6,#0x00
0x00000B66 F34080FC BLE.W 0x00000D62
104: if (AY[n].ctr_tn0 < AY[n].TF0.h)
0x00000B6A BF00 NOP
0x00000B6C EB08108C ADD r0,r8,r12,LSL #6
0x00000B70 8983 LDRH r3,[r0,#0x0C]
0x00000B72 8884 LDRH r4,[r0,#0x04]
0x00000B74 42A3 CMP r3,r4
В дальнейшем переход в цикле происходит на адрес после НОПа:
0x00000D5C 45B4 CMP r12,r6
0x00000D5E F6FFAF05 BLT.W 0x00000B6C
Компилятор армовский 4.1.
Выставлена оптимизация О3, по скорости, межмодульная.
Проц STM32F407VGT6 (Cortex-M4F).
Мои предположения:
1. Херово оптимизирует. Глупый вариант, для статистики.
2. Что то связанное с выравниванием по адресам на 4. Но джампы работают и на адреса кратные 2.
3. Какая-то фича для внутреннего фетчера/бранч предиктора.