| alar ( @ 2009-05-22 07:44:00 |
| Current mood: | |
| Current music: | Venetian Snares - Hospitality |
GCC vs AVR = 1:0
GCC - хороший компилятор. Но иногда его зарубает: в коде
uint16_t x;
int16_t ref;
uint32_t result;
result += (x-ref)*(x-ref);
он делает всё правильно, за исключением:
1. результат умножения должен быть 32битным
2. надо пользоваться командой перемножения знаковых чисел.
Причём, получить от него 32битный результат, немного пошаманив, можно. Но при этом пациент пытается перемножать 32битные числа! Добиться от него использования команды знакового умножения так и не удалось.
А вот оптимизатор у него - очень качественный: выделение подвыражений (в этом примере x-ref он считает 1 раз), размещение данных в регистрах, толковый пролог у функций и прерываний (я иногда на асме пишу хуже :)).