インライン アセンブリをラップするインライン関数定義があります。引数がビルド時にわかっているかどうかに基づいて、別のインライン アセンブリ実装を選択したいと考えています。
私の質問は、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() は、機能しないことを除いて、まさに必要な魔法のように思えます。
機能しない理由は、リンカーが配列をメモリに配置し、そのアドレスを選択した後に配列のアドレスが認識される (したがって、インライン アセンブリの直接の制約に適合する) ためです。リンク前のコンパイル時に認識されます。
だから、私が探しているのは、「この変数は即値に適していますか?」と尋ねる方法です。「これは定数式ですか?」ではなく。