summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Ericson <git@JohnEricson.me>2020-01-20 16:54:17 -0500
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-07-07 13:56:00 -0400
commit46397e530e1b107c6b8932f7ca79ebab53a3249a (patch)
tree66480aea3cd2e454ad8b126467e3ab3c9c0f3f56
parent37743f91a3f5018a8894ca6d35e8b423e4e08b50 (diff)
downloadhaskell-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.hs8
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]