Распределение регистров g ++ - PullRequest
1 голос
/ 11 ноября 2010

Есть ли в g ++ безопасный способ заставить переменную находиться в определенном регистре при вызове функции? Эта функция содержит встроенный asm-код, который принимает входные данные в определенных регистрах.

Я пытался объявить локальные переменные в фиксированных регистрах (register int x asm ("$10")) и передать их функции, но -O3 испортил это.

Я не хочу резервировать регистры для всей программы, объявляя глобальные переменные в регистрах.

Ответы [ 4 ]

1 голос
/ 17 января 2011

Если вы хотите, чтобы параметры функции передавались в регистрах, вы можете сделать что-то вроде этого:

int __attribute__((fastcall)) foo(register int a, register int b)
{
    return a + b;
}
  • __attribute__((fastcall)) означает, что переданы первые два параметра функциив ECX и EDX соответственно.
  • Ключевое слово register используется для предотвращения копирования параметров в стек GCC после ввода функции.

Я обнаружил, что это работает надежнона разных -O уровнях.

0 голосов
/ 28 января 2012

Передайте переменные, объявленные с явными регистрами, непосредственно в оператор asm; регистр должен быть указан в функции, содержащей оператор asm.

0 голосов
/ 17 января 2011

Вы можете использовать расширенную сборку. Это для gcc, должно работать: http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html Вы можете использовать входной регистр, который будет заполнен той переменной, которую вы хотите. Или вы можете ссылаться на переменную C ++ напрямую по ее имени в встроенном коде asm.

0 голосов
/ 11 ноября 2010

Используйте asm volatile встроенные сборочные блоки, как описано в на этой странице .

...