-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 是特定于 x86 的寄存器,而不是 ALPHA 中的寄存器。Alpha ISA 寄存器从 0 到 31 编号,就像这里

有人可以通过提供一些包含合理信息的链接将上述代码转换为 ALPHA 或建议我如何做到这一点吗?

如果我知道如何将以下行至少转换为 ALPHA inline,那就足够了:

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

谢谢

4

1 回答 1

2

我将继续提出这个作为答案。我不在 alpha 版本,所以我没有测试它,但它似乎符合 OP 的要求,并且可能对未来的 SO 用户有价值。

我通常尽量避免使用内联汇编。做对很难,做错也很容易。如果我需要 C 本身不提供的东西,我的第一个想法是使用内置函数。在这种情况下,gcc提供了一个替代方案:

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