Замена встроенного ассемблерного кода

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

    asm volatile (
    " instr_generic %1, %2, %0          \n\t"
    : "=r" (c)            
    : "r" (a), "r" (b)       
    : "%g0"                                                   
    );

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

Теперь вместо instr_generic я хочу написать cust_add или cust_sub, и тогда это нужно заменить на instr_generic. Другими словами, это должно выглядеть вот так

    #define cust_add instr_generic

    ...

    asm volatile (
    " cust_add %1, %2, %0          \n\t"
    : "=r" (c)            
    : "r" (a), "r" (b)       
    : "%g0"                                                   
    );

Но я думаю, что я не могу использовать препроцессор в этом контексте для замены встроенной сборки, верно? Есть ли другой способ сделать это легко?


person reinhard    schedule 28.01.2011    source источник
comment
Язык ассемблера будет скомпилирован во время компиляции, задолго до того, как вы когда-нибудь доберетесь до определения аппаратных возможностей во время выполнения.   -  person Lazarus    schedule 28.01.2011


Ответы (2)


Я бы либо сделал if-then-else с различными решениями, основанными на обнаружении процессора во время выполнения, либо, чтобы немного сократить скорость, использовал указатель функции на функции, содержащие другое решение, если обнаружен, то funptr = a_solution, иначе, если обнаружен b, затем funptr = b_solution и т. д. Сделайте это один раз, а затем используйте funptr на протяжении всей программы.

Как уже упоминалось, пользовательскую инструкцию необходимо компилировать во время компиляции, а не во время выполнения. если вы хотите изменить время выполнения инструкции, это третий вариант выполнения самомодифицирующегося кода для вставки правильной инструкции во время выполнения.

person old_timer    schedule 28.01.2011
comment
Хорошим способом сделать SMC было бы создать таблицу исправлений инструкций (аналогично тому, что Linux/x86 делает для extables) и написать правильную инструкцию при запуске программы. - person ninjalj; 28.01.2011

Разве вы не можете просто использовать конкатенацию строк? Или по какой-то причине вы не можете сделать это таким образом?

#define cust_add "instr_generic"

...

asm volatile (
cust_add " %1, %2, %0          \n\t"
: "=r" (c)            
: "r" (a), "r" (b)       
: "%g0"                                                   
);
person tomlogic    schedule 28.01.2011
comment
#define cust_add "instr_generic" - нет, не работает. (По этой причине я здесь. Это именно то, что я пытаюсь сделать, но это вызывает сбой компиляции в недрах ассемблера. Я пытаюсь понять, как это решить). - person jww; 22.07.2015