Мда... Есть такой моментик.... Причем даже с полностью выключенной оптимизацией во второй функции код внутри оператора условия
in_data = Y - 1;
else if (in_data < -Y)
in_data = -Y;
даже не компилируется и в листиге вместо этого оператора вообще какая-то лажа...
Причем если изменить константу 0x10000000 на единицу в любую сторону, либо делать какое-то действие с in_data в условии (например корректное if(in_data+1 > Y)), либо изменить константу на 1 и использовать условие "строго больше", то все ок. Мда.. Глючокс...
Приводимый листинг
22 signed int scale2 (signed long in_data)
23 {
24 in_data += (1L << 12);
\ scale2:
\ 00000000 8021 MOV R1,#+0x80
\ 00000002 4901 LSL R1,R1,#+0x5 ;; #+0x1000
\ 00000004 4018 ADD R0,R0,R1
25
26 if (in_data >= Y)
\ 00000006 0101 LSL R1,R0,#+0x4 ;; SignExt R1,R0,#+0x4,#+0x4
\ 00000008 0911 ASR R1,R1,#+0x4
\ 0000000A 8842 CMP R0,R1
\ 0000000C 04D0 BEQ ??scale2_0
\ 0000000E C017 ASR R0,R0,#+0x1F
\ 00000010 C143 MVN R1,R0
\ 00000012 0007 LSL R0,R0,#+0x1C
\ 00000014 0909 LSR R1,R1,#+0x4
\ 00000016 0843 ORR R0,R1
27 in_data = Y - 1;
28 else if (in_data < Z)
29 in_data = Z;
30
31 return (in_data >> 13);
\ ??scale2_0:
\ 00000018 4013 ASR R0,R0,#+0xD
\ 0000001A 7047 BX LR ;; return
32 }
О каком знаковом расширении полученной константы он хочет сказать в сторчке с адресом 00000006 и что он делает в строчках 0000000E-00000016???
)