Инструкция Apple AS и ARM / Thumb ADDS - PullRequest
2 голосов
/ 20 июня 2011

Я работаю над проектом 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 .

Ответы [ 3 ]

4 голосов
/ 01 июня 2012

Игорь предложил ".syntax_unified". Тем не менее, по крайней мере для binutils 2.22, команда ".sytax унифицирована". Следующий пример прекрасно компилируется здесь:

.align  4
.code   16
.syntax unified

adds r0,r0,r2
adc  r1,r1,r3
4 голосов
/ 20 июня 2011

Я не очень знаком с XCode и инструментарием Apple, но подозреваю, что он может ожидать сборки в старой, до UAL форме.Кодирование Thumb-16 ADD всегда устанавливает флаги (для регистров R0-R7), однако в сборке до UAL символ S не был добавлен к мнемонике.(Большинство арифметических операций всегда обновляют флаги в Thumb-16, поэтому подразумевается S.Однако у вас есть другая проблема в вашем коде.Thumb-16 не поддерживает условные инструкции, только условные ветви.Таким образом, вам придется переделывать свой код, используя ветку, или использовать ADC / SBC.

Обратите внимание, что все вышеперечисленное относится только к исходному Thumb ISA (он же Thumb-16).Thumb-2 (он же Thumb-32) может делать (почти) все, что может ARM, включая использование высоких регистров и условных инструкций, но он недоступен в целях ARMv6 (что, вероятно, по умолчанию в XCode).

0 голосов
/ 23 июня 2011

В соответствии с кратким справочным руководством Thumb-16 должна быть доступна инструкция ADDS.Похоже, это ошибка в ассемблере (что было подтверждено @dwelch).

Я обнаружил, что могу обойти эту проблему, выполняя инструкции, предварительно закодированные с использованием директив ассемблера.Например:

__asm__
(
  "ldr  r0, %[xa]   ;"  // R0 = a
  "ldr  r1, %[xb]   ;"  // R1 = b
  "adds r1, r1, r0  ;"  // R1 = a + b
  ...
);

будет реализовано с использованием:

__asm__
(
  "ldr  r0, %[xa]   ;"  // R0 = a
  "ldr  r1, %[xb]   ;"  // R1 = b
  ".inst.w 0x1809   ;"  // Issue 'adds r1, r1, r0'
  ...
);

Если бы я хотел adds r2, r2, r1, код должен выдавать .inst.w 0x1852 и т. Д.

РЕДАКТИРОВАТЬ: код недавно обновлен из-за синтаксиса arm thumb2 ldr.w? в списке рассылки Binutils.

...