這裏是代碼,增加了代表192位的數字拆箱詞兩個三倍到一個新的三重未裝箱的話,還返回任何溢出:獲取GHC產生「帶進位加法(ADC)」的說明
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnboxedTuples #-}
import GHC.Prim(plusWord2#, Word#, or#)
longAdd ::
(# Word#, Word#, Word# #) ->
(# Word#, Word#, Word# #) ->
(# Word#, (# Word#, Word#, Word# #) #)
longAdd (# xl, xm, xh #) (# yl, ym, yh #) =
let
plusWord3 x y c =
let
(# c1, r1 #) = plusWord2# x y
(# c2, r2 #) = plusWord2# r1 c
in
(# plusWord# c1 c2, r2 #)
(# cl, rl #) = plusWord2# xl yl
(# cm, rm #) = plusWord3 xm ym cl
(# ch, rh #) = plusWord3 xh yh cm
in
(# ch, (# rl, rm, rh #) #)
問題是「plusWord3」的定義。理想情況下,這就像一個「ADC」功能,這需要兩個詞和進位並返回結果和新的隨身攜帶,因此所得到的組件是這樣的:
add x1 y1
adc x2 y2
adc x3 y3
不幸的是GHC,無論是本地人或通過LLVM,產生包括保存進位的寄存器,然後通過一個單獨的額外附加閱讀它醜陋的彙編代碼,而不是僅僅使用adc
的。我不想調用外部C函數來實現這一點,因爲一旦你添加了調用的開銷它可能是不值得的,我想留在Haskell這樣的代碼可以被內聯在可能的情況。但我也希望能夠哄騙編譯器適當地生成adc
指令。無論如何,我可以實現這一目標嗎?
192位字(和許多其他人)在['可用數據。DoubleWord'](https://hackage.haskell.org/package/data-dword-0.3/docs/Data-DoubleWord.html)。我想知道它是否經過優化以生成高效的代碼,因此一旦找到答案,它可能是知道如何去做的地方,也可能是提供貢獻的地方。 –