2010-02-03 45 views

回答

2

好問題!

以下代碼輸出你想使用GCC -O或更高版本什麼,而不訴諸彙編:

 
uint32_t a, b; 
uint64_t c; 
... 
c = (uint64_t)a * (uint64_t)b; 
或者如果你覺得你必須使用特定的機器ASM,你可以去:
 
uint32_t a, b; 
uint64_t c;

asm ("umull %Q0, %R0, %1, %2" : "=r"(c) : "r"(a), "r"(b));

c的註冊名稱是第一的寄存器對中,並且%Q和%R選取該對的低32位和高32位寄存器。以gcc/config/arm/arm.md - > umulsidi3爲例。

但是,如果您可以留在C中,那麼優化程序就有機會做更多的事情,並且對您的程序的讀者更友好。

+0

感謝您的回答!事實上,C版本做我想做的事情,非常酷。 非常感謝%Q和%R語法,這就是我一開始就在尋找的東西。 – user265429 2010-02-15 10:43:25

1

umull指令將其結果生成兩個32位寄存器。我建議明確與類似的東西重新組裝64位的值:

/* assuming the 64-bit result was stored in "hi" (upper 
    half) and "lo" (lower half) */ 
uint64_t v = ((uint64_t)hi << 32) | (uint64_t)lo; 

編譯器優化應該注意到,左移是純粹的數據路由,並將得到的代碼應該罰款。可以肯定的是,只需使用-S來檢查編譯器輸出。

相關問題