-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();