Ну, во-первых, набор инструкций thumb-1 менее эффективный, чем thumb-2. Сейчас компилятор уже транслирует в thumb-2, не везде где можно, но там, где это наиболее важно. Благодаря этому, эффективность кода теперь 80-100% от компилятора Ширяева. Размер пустой программы уменьшен до 7400 байт.
Во-вторых - плохая трансляция логических операций OR/&.
SovietPony писал(а):
Я делал под них 16-битный варинт оберона-07 дедовским способом, правда на пол-пути застрял на логических & и OR, забил, а потом похоже пролюбил последнюю версию исходников когда разобрался как делать правильно. А если бы делал деревом, то было бы труднее запутаться.
Я хоть и не запутался, но сделал это через одно место... Кодогенератор сохраняет значение логического выражения в регистре, затем сравнивает значение регистра с нулем и выполняет условный переход, вместо того, чтобы сразу генерить условный переход. И так во всех бэк-эндах. Я пока не придумал, как это исправить без переписывания значительной части. С другой стороны, "хорошая" трансляция логических выражений позволит выиграть лишь 10-20% производительности, и только для некоторых задач.
Есть еще некоторые существенные отличия в кодогенерации от компилятора Ширяева:
- компилятор Ширяева генерит специальные машинные инструкции для вещественной арифметики, мой - эмулирует вещественную арифметику, т. к. в ядрах Cortex-M3 нет FPU, а компилятор сейчас тестируется именно на Cortex-M3. Эмуляция пока очень неэффективная (здесь надо будет переписать в машинных кодах). В дальнейшем, можно также сделать поддержку вещественных инструкций, чтобы получить более эффективный код для микроконтроллеров с FPU (Cortex-M4F).
- компилятор Ширяева генерит только короткие команды переходов. Если расстояние перехода слишком большое - программа не компилируется. Мой - генерит длинные либо короткие переходы в зависимости от расстояния, а также поддерживает инструкцию cbz/cbnz. Это несколько сглаживает недостатки трансляции OR/&.
Ну а вообще... Я сейчас испытываю определенное разочарование и в Обероне и в своем компиляторе. Добавление очередного кодогенератора превратилось в рутину, творческий процесс почти отсутствует. Игрушечные языки и компиляторы мне надоели. Нужен или более серьезный язык, или оптимизирующий компилятор...