Я в шоке. Какой код можно сгенерировать на такую строку:
Код
if(v & F0BIT)
Вот результат:
Код
if(v & F0BIT)
+0000003B: 2F24 MOV R18,R20 Copy register
+0000003C: 2733 CLR R19 Clear Register
+0000003D: 2F93 MOV R25,R19 Copy register
+0000003E: 2F82 MOV R24,R18 Copy register
+0000003F: E063 LDI R22,0x03 Load immediate
+00000040: 9596 LSR R25 Logical shift right
+00000041: 9587 ROR R24 Rotate right through carry
+00000042: 956A DEC R22 Decrement
+00000043: F7E1 BRNE PC-0x03 Branch if not equal
+00000044: 7081 ANDI R24,0x01 Logical AND with immediate
+00000045: 7090 ANDI R25,0x00 Logical AND with immediate
+00000046: 2388 TST R24 Test for Zero or Minus
+00000047: F011 BREQ PC+0x03 Branch if equal
А все потому, что константа F0BIT описана следующим образом:
Код
const int F0BIT = (1<<F0);
const int F1BIT = (1<<F1);
И вот вместо того, чтобы на этапе компиляции вычислить это выражение и сделать логическое И с переменной, компилятор решает сдвинуть переменную на F0 битов! Особенно порадовала строка ANDI R25,0x00. Впрочем, CLR R19 с последующей MOV R25,R19 тоже ничего...
А я уж было обрадовался что компилятор заработал...