x86'的Alpha等效值;什么是RDTSC?

x86'的Alpha等效值;什么是RDTSC?,x86,cross-platform,inline-assembly,rdtsc,alpha-cpu-architecture,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",

下面的代码在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);
    }
谢谢你

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

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

long x = __builtin_alpha_rpcc();

这并不像更改寄存器的名称那么简单
cpuid
rdtsc
是x86特定的指令。您必须确定这些指令的合适Alpha等效值,甚至可能没有。更好的办法是使用一个可移植的系统API来获取这些信息。你真的需要实时时钟的精度吗?如果你这样做了,你的目标操作系统真的没有提供一种可移植的方式来查询它吗?虽然我不说alpha,但我在gcc中看到了一个
\uuuuuu内置\uAlpha\uRPCC
。内置通常比内联asm更好。@CodyGray:是的,我需要精度。@DavidWohlferd我想要转换整个指定的代码。是否可以使用uu buildit u alpha rpcc!!?登记?或者只是转换成一个c变量?
long x=\uuuuu builtin\ualpha\urpcc()有什么问题?
?让编译器处理“寄存器”的内容。
long x = __builtin_alpha_rpcc();