C++: список уничтожения asm

В g++ можно указать списки уничтожения для asm, например:

asm ("somecode" : : "r1", "r2", "r3");

что означает, что ассемблерный код меняет регистры r1, r2, r3.

Теперь мои измененные регистры зависят от параметра шаблона n (блок asm находится внутри шаблонной функции), а регистры r1, ..., rn будут изменены. Как я могу это выразить?


person Thomas    schedule 04.11.2010    source источник
comment
Зачем вам это нужно? С архитектурой с таким количеством регистров, разве вы не можете просто выбрать несколько для использования и всегда использовать именно эти регистры?   -  person bdonlan    schedule 17.01.2011


Ответы (2)


Со сколькими различными сочетаниями регистров вы сталкиваетесь? Если не слишком много, вы можете предоставить конкретную реализацию для каждого. (Специализация шаблона)

Потому что я опасаюсь, что нет возможности создавать "шаблонные операторы".

person Flinsch    schedule 04.11.2010
comment
Боюсь, это будет решение, к которому мне придется прибегнуть, хотя n может принимать значения от 0 до 120... - person Thomas; 04.11.2010
comment
Можно ли заменить "r1" и т. д. переменными const char*? Если да, то это может быть решением. - person Flinsch; 04.11.2010
comment
Эта идея тоже пришла мне в голову (не знаю, правильна ли она синтаксически), но я даже не мог придумать, как сгенерировать этот разделенный запятыми набор const char* с шаблонным количеством элементов. - person Thomas; 04.11.2010

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

person Simone-Cu    schedule 17.01.2011