x86的RDTSC的Alpha等价物?

时间:2016-06-27 09:34:16

标签: x86 cross-platform inline-assembly rdtsc alpha-cpu-architecture

我有以下代码,它在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,如here

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

如果我知道如何将以下行至少转换为ALPHA inline:

,那就足够了
 asm volatile ("rdtsc" : "=a" (a), "=d" (d) : : "ebx", "ecx");

谢谢

1 个答案:

答案 0 :(得分:2)

我将继续提出这个答案。我不是阿尔法,所以我没有测试它,但它似乎符合OP的要求,可能对未来的SO用户有价值。

我通常会尽量避免使用内联asm。做对和容易出错是很棘手的。如果我需要C本身没有提供的东西,我首先想到的是使用内置的。在这种情况下,gcc docs是另一种选择:

long x = __builtin_alpha_rpcc();