-1

x86/Linux で完全に動作する次のコードがあります。このコードを gcc クロス コンパイラを使用して ALPHA に変換したいと考えています。次のようなエラーが発生しています。

「asm」の不明なレジスタ名「eax」

自分で行う適切なソースを見つけることができませんでした。

 inline uint64_t timestamp(void)
    {
        unsigned long a;
        unsigned long d;
        asm volatile("xorl %%eax,%%eax\n cpuid \n" ::: "%eax", "%ebx", "%ecx", "%edx"); // flush pipeline
        asm volatile("rdtsc\n" : "=a" (a), "=d" (d) );                           // read rdtsc
        asm volatile("xorl %%eax,%%eax\n cpuid \n" ::: "%eax", "%ebx", "%ecx", "%edx"); // flush pipeline again    
        return a | ((uint64_t)d << 32);
    }

rpcc が rdts と同等の命令であることはほとんどわかりませんでした。cpuid と xorl は同じだと思います。ただし、eax、ebx は ALPHA ではなく x86 固有のレジスタです。Alpha ISA レジスタには、ここのように 0 から 31 までの番号が付けられます。

上記のコードを ALPHA に変換してもらえますか、または適切な情報を含むリンクをいくつか提供して、その方法を提案してもらえますか?

少なくとも次の行を ALPHA インラインに変換する方法を知っていれば十分です。

 asm volatile ("rdtsc" : "=a" (a), "=d" (d) : : "ebx", "ecx");

ありがとうございました

4

1 に答える 1

2

私は先に進み、これを答えとして提案します。私はアルファ版ではないので、テストしていませんが、OP の要件に一致しているようで、将来の SO ユーザーにとって価値があるかもしれません。

私は通常、インライン asm を使用しないようにしています。正しく理解するのは難しく、間違えるのは簡単です。C自体が提供していないものが必要な場合、最初に考えたのはビルトインを使用することです。この場合、gcc代替案を示しています。

long x = __builtin_alpha_rpcc();
于 2016-06-30T03:29:35.550 に答える