Я пытаюсь использовать флаги CPSR, когда мой код выполняет арифметические операции, а не использовать серию операторов if для проверки на переполнение, перенос и т. Д., Чтобы получить меньший и более быстрый код. Простой пример - операция сложения:
int16_t a = 0x5000;
int16_t b = 0x4000;
int16_t result = a+b;
uint32_t flags = getFlags();
Код должен будет выполняться на различных платформах, поэтому getFlags () - единственная часть кода, которая может содержать сборку для конкретной архитектуры.
inline uint32_t getFlags() {
uint32_t flags = 0;
asm (“mrs %0, cpsr”
: “=r” (flags)
:
: );
return flags;
}
Проблема в том, что компилятор не может знать, что операция добавления в этом примере должна устанавливать флаги, поэтому он генерирует инструкции, подобные:
ldrsh r3, [r0]
ldrsh r4, [r1]
add r3, r3, r4
strh r3, [r2]
mrs r3, cpsr
Чтобы CPSR содержал что-нибудь полезное, мне нужно, чтобы компилятор использовал add вместо add (s суффикс = update CPSR). Могу ли я что-то изменить в своем коде C или, возможно, в опции компилятора, которая заставит его выбирать инструкции по обновлению флага? Я могу использовать GCC или Clang.