diff options
author | John Ericson <git@JohnEricson.me> | 2020-01-20 16:54:17 -0500 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-07-07 13:56:00 -0400 |
commit | 46397e530e1b107c6b8932f7ca79ebab53a3249a (patch) | |
tree | 66480aea3cd2e454ad8b126467e3ab3c9c0f3f56 | |
parent | 37743f91a3f5018a8894ca6d35e8b423e4e08b50 (diff) | |
download | haskell-46397e530e1b107c6b8932f7ca79ebab53a3249a.tar.gz |
`genericIntMul2Op`: Call `genericWordMul2Op` directly
This unblocks a refactor, and removes partiality. It might be a PowerPC
regression but that should be fixable.
-rw-r--r-- | compiler/GHC/StgToCmm/Prim.hs | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/compiler/GHC/StgToCmm/Prim.hs b/compiler/GHC/StgToCmm/Prim.hs index 3c6ba38011..908ca9a792 100644 --- a/compiler/GHC/StgToCmm/Prim.hs +++ b/compiler/GHC/StgToCmm/Prim.hs @@ -1868,18 +1868,14 @@ genericWordMul2Op [res_h, res_l] [arg_x, arg_y] genericWordMul2Op _ _ = panic "genericWordMul2Op" genericIntMul2Op :: GenericOp -genericIntMul2Op [res_c, res_h, res_l] [arg_x, arg_y] +genericIntMul2Op [res_c, res_h, res_l] both_args@[arg_x, arg_y] = do dflags <- getDynFlags platform <- getPlatform -- Implement algorithm from Hacker's Delight, 2nd edition, p.174 let t = cmmExprType platform arg_x p <- newTemp t -- 1) compute the multiplication as if numbers were unsigned - let wordMul2 = case emitPrimOp dflags WordMul2Op [arg_x,arg_y] of - PrimopCmmEmit_External -> panic "Unsupported out-of-line WordMul2Op" - PrimopCmmEmit_IntoRegs f -> f - PrimopCmmEmit_Raw _ -> panic "Unsupported inline WordMul2Op" - wordMul2 [p,res_l] + genericWordMul2Op [p, res_l] both_args -- 2) correct the high bits of the unsigned result let carryFill x = CmmMachOp (MO_S_Shr ww) [x, wwm1] sub x y = CmmMachOp (MO_Sub ww) [x, y] |