-1

我有以下代码在x86/linux中完美运行。我想使用gcc交叉编译器将此代码转换为ALPHA。 它产生的错误类似如下:用于x86的RDTSC的Alpha等价物?

未知的寄存器名“EAX”在“ASM”

我无法找到合适的来源做我自己。

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中。阿尔法ISA寄存器编号从0到31就像here

有人可以将上面的代码转换成ALPHA或可以建议我怎么做,通过提供一些合理的信息链接?

这将是足够好,如果我知道如何以下线将至少为ALPHA在线:

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

谢谢

+3

它不是像更改注册名称一样简单。 'cpuid'和'rdtsc'是x86特定的指令。你将不得不确定什么是适合这些指令的Alpha等价物,甚至可能没有。一个更好的主意是使用便携式系统API来获取这些信息。你真的*需要实时时钟的精度吗?如果你这样做,你的目标操作系统是否真的不提供一种便携的方式来查询它? –

+0

尽管我不会说alpha,但我在gcc [docs](https://gcc.gnu.org/onlinedocs/gcc/Alpha-Built-in-Functions.html)中看到了一个'__builtin_alpha_rpcc'。建立内部结构通常是比内联结构更好的选择。 –

+0

@CodyGray:是的。 ,我需要精确。 – ANTHONY

回答

1

我要继续前进,并提出以此为答案。我不是alpha,所以我没有测试它,但它似乎符合OP的要求,并且可能对未来的SO用户有价值。

我通常会尽量避免使用内联asm。正确和容易出错是非常棘手的。如果我需要C本身没有提供的东西,我的第一个想法是使用内置的。在这种情况下,海湾合作委员会docs替代方案:

long x = __builtin_alpha_rpcc();