Замена встроенного кода сборки - PullRequest
2 голосов
/ 28 января 2011

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

    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"                                                   
    );

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

Ответы [ 3 ]

5 голосов
/ 28 января 2011
...
#define cust(arg) \
asm volatile (
" " #arg " %1, %2, %0          \n\t" \
: "=r" (c) \           
: "r" (a), "r" (b) \      
: "%g0" \                                                   
)

...
cust(cust_add);
0 голосов
/ 29 января 2011

Разве вы не можете просто использовать конкатенацию строк?Или есть какая-то причина, по которой ты не можешь так поступить?

#define cust_add "instr_generic"

...

asm volatile (
cust_add " %1, %2, %0          \n\t"
: "=r" (c)            
: "r" (a), "r" (b)       
: "%g0"                                                   
);
0 голосов
/ 28 января 2011

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

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

...