我有以下代码,它在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");
谢谢
答案 0 :(得分:2)
我将继续提出这个答案。我不是阿尔法,所以我没有测试它,但它似乎符合OP的要求,可能对未来的SO用户有价值。
我通常会尽量避免使用内联asm。做对和容易出错是很棘手的。如果我需要C本身没有提供的东西,我首先想到的是使用内置的。在这种情况下,gcc docs是另一种选择:
long x = __builtin_alpha_rpcc();