Я работаю над проектом iPhone / iPad и хочу обновить регистр состояния во время некоторых (не всех) арифметических операций.По умолчанию Xcode использует 'Compile for Thumb', и я не хочу его менять.
Следующий встроенный код сборки GCC работает нормально в ARM, но приводит к ошибке компиляции в Thumb: 'инструкция не поддерживаетсяв режиме Thumb16 - добавляет r6, r4, r5 '.Проблема заключается в обновлении регистра статуса.(Я также знаю, что movcs
и strcs
нужно будет изменить).
Есть ли у Thumb инструкция ADD, которая устанавливает Overflow (V) или Carry (C) в CPSR?Если нет, существуют ли обходные пути для уровня сборки, специфичные для Thumb, для проверки на переполнение и переносы?
uint32_t result, a, b;
int no_carry = 1;
...
__asm__
(
"ldr r4, %[xa] ;" // R4 = a
"ldr r5, %[xb] ;" // R5 = b
"adds r6, r4, r5 ;" // R6 = R4 + R5, set status
"movcs r4, #0 ;" // set overflow (if carry set)
"strcs r4, %[xc] ;" // store it (if carry set)
"str r6, %[xr] ;" // result = R6
: [xr] "=m" (result), [xc] "=m" (no_carry)
: [xa] "m" (a), [xb] "m" (b)
: "r4", "r5", "r6"
);
...
РЕДАКТИРОВАТЬ: регистры также необходимо перемещать, чтобы использовать преимущества ARM ABI в двоичном интерфейсе приложения(ABI) для архитектуры ARM .