Как я могу заставить компилятор выбирать инструкции по обновлению флага ARM? - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь использовать флаги 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.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вы не можете диктовать, какие инструкции будет использовать компилятор. Такой подход бесполезен и несовместим с важными функциями оптимизации, которые выполняют компиляторы.

Вы можете получить портативную проверку переполнения, используя встроенные компиляторы, поддерживаемые как GCC , так и Clang . Например, __builtin_add_overflow(a, b, &c) сохраняет a+b в c и возвращает true, если произошло переполнение. (И это тип-универсальный; a, b и c могут быть любыми целочисленными типами. Происходит ли переполнение, зависит только от значений a и b и типа c. )

Вы можете ожидать, что такие встроенные программы будут участвовать в оптимизации, в том числе используя инструкции по обновлению флага, если они подходят. (Документация GCC прямо заявляет об этом.)

0 голосов
/ 08 ноября 2018

Этот вид кода не может работать полезным способом, потому что компилятор может свободно перестраивать код по своему усмотрению. Нет даже гарантии, что это дополнение является последней инструкцией по обновлению флага перед выполнением вашей инструкции mrs. Если вы хотите получить это право, поместите дополнение для установки флага и инструкцию mrs в один оператор asm.

...