首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >让GHC产生“进位加法(ADC)”指令

让GHC产生“进位加法(ADC)”指令
EN

Stack Overflow用户
提问于 2015-11-08 22:57:23
回答 2查看 262关注 0票数 17

下面的代码将表示192位数字的两个未装箱字的三元组添加到一个新的未装箱字的三元组中,并返回任何溢出:

{-# 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指令。我有什么办法可以做到这一点吗?

EN

回答 2

Stack Overflow用户

发布于 2015-11-09 00:36:05

最可靠和有效的方法是直接在你的程序中调用primop。

使用FFI调用是最简单的方法,但正如您也注意到的那样,由于FFI的开销,这不是最有效的方法。

即使编译器支持你想要的指令并在一些程序中使用它,它也是脆弱的。程序中的一些看似无害的更改最终可能会生成不同的程序集,而这些程序集并不使用您想要的指令。

所以我的建议是:

  1. 添加你需要的指令到X86代码生成器后端,如果还没有的话。
  2. 添加一个primop,它直接翻译成你想要运行的指令。首先,确保不存在这样的primop。然后按照以下步骤操作:https://ghc.haskell.org/trac/ghc/wiki/AddingNewPrimitiveOperations
  3. You primop应该在GHC.Prim (http://hackage.haskell.org/package/ghc-prim/docs/GHC-Prim.html)中可见,在您的程序中使用它。
  4. 添加测试,提交您的补丁:)
票数 11
EN

Stack Overflow用户

发布于 2015-11-09 00:30:51

我不熟悉低级编程,但是在Freenode的#ghc频道上一轮提问之后,我找到了与addIntC#llvm.sadd.with.overflow.相关的LLVM的指针。我不确定llvm会把它编译成什么。

GHC的本地代码生成器似乎知道adc指令:X86/CodeGen.hs。但正如评论所说:

我们处理加法,但相当糟糕

编辑:使用单词。似乎LLVM后端确实将MO_Add2 (plusWord2的另一个名称)编译为https://github.com/ghc/ghc/blob/2b7d9c2b96eb9da3cce7826df4a91c3426095528/compiler/llvmGen/LlvmCodeGen/CodeGen.hs#L737中的llvm.uadd.with.overflow,相关票证:https://ghc.haskell.org/trac/ghc/ticket/9430

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33595312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档