Вот код из "уточнённого вопроса", скомпилированный ИАРом (medium optimization). Видно, что ИАР использует UBFX и BFI.
15 void foo()
16 {
17 bbb.a0 = bbb.a1 + bbb.a2;
\ foo: (+1)
\ 0x0 0x.... LDR.N R1,??DataTable4
\ 0x2 0x6808 LDR R0,[R1, #+0]
\ 0x4 0xF3C0 0x0280 UBFX R2,R0,#+2,#+1
\ 0x8 0xF3C0 0x00C0 UBFX R0,R0,#+3,#+1
\ 0xC 0x1882 ADDS R2,R0,R2
\ 0xE 0x6808 LDR R0,[R1, #+0]
\ 0x10 0xF362 0x0001 BFI R0,R2,#+0,#+2
\ 0x14 0x6008 STR R0,[R1, #+0]
18 if ( bbb.a1 != bbb.a2 )
\ 0x16 0x4602 MOV R2,R0
\ 0x18 0xF3C2 0x0080 UBFX R0,R2,#+2,#+1
\ 0x1C 0xF3C2 0x03C0 UBFX R3,R2,#+3,#+1
\ 0x20 0x4298 CMP R0,R3
\ 0x22 0xD00D BEQ.N ??foo_0
19 {
20 bbb.a0 ++;
\ 0x24 0x0890 LSRS R0,R2,#+2
\ 0x26 0x1C52 ADDS R2,R2,#+1
\ 0x28 0xF002 0x0203 AND R2,R2,#0x3
\ 0x2C 0xEA52 0x0280 ORRS R2,R2,R0, LSL #+2
\ 0x30 0x600A STR R2,[R1, #+0]
21 bbb.a0 = ccc.a5 >> 1;
\ 0x32 0x0892 LSRS R2,R2,#+2
\ 0x34 0x6848 LDR R0,[R1, #+4]
\ 0x36 0xF3C0 0x10C0 UBFX R0,R0,#+7,#+1
\ 0x3A 0xEA50 0x0282 ORRS R2,R0,R2, LSL #+2
\ 0x3E 0x600A STR R2,[R1, #+0]
22 }
23 }
-
- Спасибо! - Evgeny_CD(12.02.2019 01:06)