我想將一些彙編代碼引入c99代碼庫。我想使用ARM CPU的UMULL指令來乘以2 uint32_t,並立即得到結果到uint64_t。如何獲得ARM MULL指令以在gcc中的uint64_t中生成其輸出?
現在uint64_t需要2個寄存器,那麼如何指定輸出和asm塊的約束呢?
我想將一些彙編代碼引入c99代碼庫。我想使用ARM CPU的UMULL指令來乘以2 uint32_t,並立即得到結果到uint64_t。如何獲得ARM MULL指令以在gcc中的uint64_t中生成其輸出?
現在uint64_t需要2個寄存器,那麼如何指定輸出和asm塊的約束呢?
好問題!
以下代碼輸出你想使用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中,那麼優化程序就有機會做更多的事情,並且對您的程序的讀者更友好。
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
來檢查編譯器輸出。
感謝您的回答!事實上,C版本做我想做的事情,非常酷。 非常感謝%Q和%R語法,這就是我一開始就在尋找的東西。 – user265429 2010-02-15 10:43:25