Если вы действительно хотите возиться с распределением регистров, вы можете заставить GCC распределять локальные и глобальные переменные в определенных регистрах.
Вы делаете это с помощью специального объявления переменной, подобного этому:
register int test_integer asm ("EBX");
Работает и для других архитектур, просто замените EBX на целевое имя регистра.
Для получения более подробной информации, я предлагаю вам взглянуть на документацию gcc:
http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Local-Reg-Vars.html
Однако я предлагаю не связываться с распределением регистров, если у вас нет очень веских причин для этого. Если вы выделяете некоторые регистры самостоятельно, у распределителя будет меньше регистров для работы, и вы можете получить код, который хуже, чем код, с которого вы начали.
Если ваша функция настолько критична по производительности, что вы получаете 20% -ную разницу в производительности между компиляциями, было бы неплохо написать эту вещь в inline-ассемблере.
РЕДАКТИРОВАТЬ: Как указал strager, компилятор не обязан использовать регистр для переменной. Использовать регистр только принудительно, если переменная используется вообще. Например. если переменная не переживает проход оптимизации, она не будет использоваться. Также регистр можно использовать и для других переменных.