summaryrefslogtreecommitdiff
path: root/compiler/codeGen
diff options
context:
space:
mode:
authorNikita Karetnikov <nikita@karetnikov.org>2015-10-31 12:27:54 +0100
committerBen Gamari <ben@smart-cactus.org>2015-10-31 16:40:38 +0100
commit8160f42b8dad33e47b4c73ed3f9bf889462e7bfe (patch)
tree0752990875cffaac175c28b3a761b1509862af4b /compiler/codeGen
parent62f0fbc943307d8522e6c8333caf37c6569ee873 (diff)
downloadhaskell-8160f42b8dad33e47b4c73ed3f9bf889462e7bfe.tar.gz
Add subWordC# on x86ish
This adds a subWordC# primop which implements subtraction with overflow reporting. Reviewers: tibbe, goldfire, rwbarton, bgamari, austin, hvr Reviewed By: bgamari Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D1334 GHC Trac Issues: #10962
Diffstat (limited to 'compiler/codeGen')
-rw-r--r--compiler/codeGen/StgCmmPrim.hs17
1 files changed, 17 insertions, 0 deletions
diff --git a/compiler/codeGen/StgCmmPrim.hs b/compiler/codeGen/StgCmmPrim.hs
index 4400d72639..5d3b94f090 100644
--- a/compiler/codeGen/StgCmmPrim.hs
+++ b/compiler/codeGen/StgCmmPrim.hs
@@ -824,6 +824,10 @@ callishPrimOpSupported dflags op
|| llvm -> Left (MO_Add2 (wordWidth dflags))
| otherwise -> Right genericWordAdd2Op
+ WordSubCOp | (ncg && x86ish)
+ || llvm -> Left (MO_SubWordC (wordWidth dflags))
+ | otherwise -> Right genericWordSubCOp
+
IntAddCOp | (ncg && x86ish)
|| llvm -> Left (MO_AddIntC (wordWidth dflags))
| otherwise -> Right genericIntAddCOp
@@ -940,6 +944,19 @@ genericWordAdd2Op [res_h, res_l] [arg_x, arg_y]
(bottomHalf (CmmReg (CmmLocal r1))))]
genericWordAdd2Op _ _ = panic "genericWordAdd2Op"
+genericWordSubCOp :: GenericOp
+genericWordSubCOp [res_r, res_c] [aa, bb] = do
+ dflags <- getDynFlags
+ emit $ catAGraphs
+ [ -- Put the result into 'res_r'.
+ mkAssign (CmmLocal res_r) $
+ CmmMachOp (mo_wordSub dflags) [aa, bb]
+ -- Set 'res_c' to 1 if 'bb > aa' and to 0 otherwise.
+ , mkAssign (CmmLocal res_c) $
+ CmmMachOp (mo_wordUGt dflags) [bb, aa]
+ ]
+genericWordSubCOp _ _ = panic "genericWordSubCOp"
+
genericIntAddCOp :: GenericOp
genericIntAddCOp [res_r, res_c] [aa, bb]
{-