我有一个包含内联程序集的内联函数定义。我希望根据参数在构建时是否已知这一事实来选择不同的内联汇编实现。
我的问题是如何在 C 代码或内联汇编中询问地址值是否在构建时是已知的,因此是否适合立即值。如果您正在考虑 __builtin_constant_p - 请提前阅读。
这是一些说明我的意图的代码:我正在尝试找到一种实现“is_immediate”的方法。
static char arr[5];
void __attribute__((always_inline)) do_something(char * buf)
{
if(is_immediate(buf) {
// Argument is constant, can use immediate form
asm volatile ("insn1 %0" : : "i"(buf));
} else {
// Argument is computed at runtime, use a register
unsigned long tmp = (unsigned long)buf + 1;
asm volatile("insn2 %0" : : "r"(tmp));
}
int main(void)
{
do_something(&arr);
}
第一印象 __builtin_constant_p() 似乎正是需要的魔法,但它不起作用。
原因是不起作用的是,虽然在链接器将数组放入内存并为其选择地址之后,数组的地址将是已知的(因此它确实符合内联汇编的直接约束),但它不是在链接之前的编译时已知。
所以,我正在寻找的是一种询问方式——“这个变量是否适合作为直接值?” 而不是“这是一个常量表达式吗?”。