Мда... Есть такой моментик.... Причем даже с полностью выключенной оптимизацией во второй функции код внутри оператора условия
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???