На примере простого кода, работы с битовыми полями, я его уже давно как то выкладывал, для версий 4.42, 5.11 и RVCT (уже не помню какого)
Код
struct bf_s {
unsigned f1:6;
unsigned f2:2;
unsigned f3:20;
unsigned f4:4;
} bf;
void short_clear(void)
{
bf.f2 = 0;
}
void short_set(void)
{
bf.f2 = 3;
}
void short_const(void)
{
bf.f2 = 1;
}
void short_var(unsigned val)
{
bf.f2 = val;
}
void long_clear(void)
{
bf.f3 = 0;
}
void long_set(void)
{
bf.f3 = (1<<20)-1;
}
void long_const(void)
{
bf.f3 = 1;
}
void long_var(unsigned val)
{
bf.f3 = val;
}
void long_var_if(unsigned val,unsigned cond)
{
if (cond) bf.f3 = val;
else bf.f4=val;
}
unsigned a;
unsigned b;
unsigned c;
void var_if(unsigned val)
{
if (val) a = c;
else b = c;
c = val;
}
Сейчас скомпилил последним иаром V5.40.2.51604/W32
Улучшений серьезных нет

BFI и условное выполнение до сих пор IAR делать не умеет!
Для примера листинг одной функции
Код
RVCT -O3 -Otime --cpu Cortex-M3
long_var_if PROC
LDR r3,|L1.176|
CMP r1,#0
LDR r2,[r3,#0]
ITE EQ
BFIEQ r2,r0,#28,#4
BFINE r2,r0,#8,#20
STR r2,[r3,#0] ; bf
BX lr
ENDP
IAR --cpu Cortex-M3 -Ohs
long_var_if:
LDR.N R2,??DataTable13 ;; bf
LDR R3,[R2, #+0]
CBZ R1,??long_var_if_0
LDR.N R1,??DataTable14 ;; 0xf00000ff
ANDS R1,R1,R3
LDR.N R3,??DataTable15 ;; 0xfffff00
AND R0,R3,R0, LSL #+8
ORRS R0,R0,R1
B.N ??long_var_if_1
??long_var_if_0:
LSLS R1,R3,#+4
LSRS R1,R1,#+4
ORR R0,R1,R0, LSL #+28
??long_var_if_1:
STR R0,[R2, #+0]
BX LR