我有以下代码在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();