Пример:
Код
unsigned int test_lsl(unsigned int a, unsigned int b)
{
if(a > b)
{
a -= b;
a <<= 1;
a |= 1;
}
else a <<= 1;
return a;
}
{
if(a > b)
{
a -= b;
a <<= 1;
a |= 1;
}
else a <<= 1;
return a;
}
На уровнях оптимизации 2 и 3 компилируется так:
Код
test_lsl PROC
;;;88
;;;89 unsigned int test_lsl(unsigned int a, unsigned int b)
0000c6 4288 CMP r0,r1
;;;90 {
;;;91 if(a > b)
;;;92 {
;;;93 a -= b;
0000c8 bf88 IT HI
0000ca 1a40 SUBHI r0,r0,r1
;;;94 a <<= 1;
;;;95 a |= 1;
;;;96 }
;;;97 else a <<= 1;
0000cc 0040 LSLS r0,r0,#1
0000ce bf88 IT HI ;95
0000d0 f0400001 ORRHI r0,r0,#1 ;95
;;;98 return a;
;;;99 }
0000d4 4770 BX lr
;;;100
ENDP
;;;88
;;;89 unsigned int test_lsl(unsigned int a, unsigned int b)
0000c6 4288 CMP r0,r1
;;;90 {
;;;91 if(a > b)
;;;92 {
;;;93 a -= b;
0000c8 bf88 IT HI
0000ca 1a40 SUBHI r0,r0,r1
;;;94 a <<= 1;
;;;95 a |= 1;
;;;96 }
;;;97 else a <<= 1;
0000cc 0040 LSLS r0,r0,#1
0000ce bf88 IT HI ;95
0000d0 f0400001 ORRHI r0,r0,#1 ;95
;;;98 return a;
;;;99 }
0000d4 4770 BX lr
;;;100
ENDP
LSLS перетирает флаг С, в результате чего OR выполняется совсем не по условию a > b.