我必须编写内联汇编代码来执行我集成到硬件中的自定义指令 根据在实际芯片上找到的硬件,指令的行为会有所不同。我的装配看起来如下:
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"
);
但是我猜我不能在这个上下文中使用预处理器替换内联组件是对的吗?有没有其他方法可以轻松地做到这一点?
答案 0 :(得分:5)
...
#define cust(arg) \
asm volatile (
" " #arg " %1, %2, %0 \n\t" \
: "=r" (c) \
: "r" (a), "r" (b) \
: "%g0" \
)
...
cust(cust_add);
答案 1 :(得分:0)
我会根据处理器的运行时检测使用不同的解决方案进行if-then-else,或者挤压一点速度,使用函数指针指向包含不同解决方案的函数,如果检测到则为funptr = a_solution ,如果检测到b然后funptr = b_solution等,那么这一次然后在程序的持续时间内使用funptr。
如前所述,自定义指令需要在编译时编译而不是运行时。如果要更改指令运行时,这是第三个选项,可以在运行时插入正确的指令进行自修改代码。
答案 2 :(得分:0)
你不能只使用字符串连接吗?或者有什么理由不能这样做吗?
#define cust_add "instr_generic"
...
asm volatile (
cust_add " %1, %2, %0 \n\t"
: "=r" (c)
: "r" (a), "r" (b)
: "%g0"
);