跨平台 - 相当于x86的RDTSC的alpha?



我有以下代码在x86/linux中完美运行。我想将此代码转换为使用gcc交叉编译器的ALPHA。它正在生成如下错误:

在'asm'中未知寄存器名'eax'

我自己找不到合适的资料。

 inline uint64_t timestamp(void)
    {
        unsigned long a;
        unsigned long d;
        asm volatile("xorl %%eax,%%eaxn cpuid n" ::: "%eax", "%ebx", "%ecx", "%edx"); // flush pipeline
        asm volatile("rdtscn" : "=a" (a), "=d" (d) );                           // read rdtsc
        asm volatile("xorl %%eax,%%eaxn 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内联,那就足够了:

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

谢谢

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

我通常尽量避免使用内联asm。做对很棘手,做错很容易。如果我需要一些C本身没有提供的东西,我的第一个想法是使用内置程序。在本例中,gcc文档提供了另一个选项:

long x = __builtin_alpha_rpcc();

相关内容

  • 没有找到相关文章

最新更新