diff options
| author | Ben Gamari <ben@smart-cactus.org> | 2022-01-27 13:15:49 -0500 |
|---|---|---|
| committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-02-04 16:14:47 -0500 |
| commit | 58d7faacafc975d522cbc9f56a7db1e46b37d4a1 (patch) | |
| tree | 2ed5935efe8bc01decb21b848447cdcfb13652a9 /compiler/GHC/Cmm | |
| parent | b79206f1add1c9e9a88f1cc9e2d2c47be9bfea3e (diff) | |
| download | haskell-58d7faacafc975d522cbc9f56a7db1e46b37d4a1.tar.gz | |
cmm: Introduce cmmLoadBWord and cmmLoadGCWord
Diffstat (limited to 'compiler/GHC/Cmm')
| -rw-r--r-- | compiler/GHC/Cmm/Info.hs | 4 | ||||
| -rw-r--r-- | compiler/GHC/Cmm/LayoutStack.hs | 2 | ||||
| -rw-r--r-- | compiler/GHC/Cmm/Parser.y | 3 | ||||
| -rw-r--r-- | compiler/GHC/Cmm/Utils.hs | 9 |
4 files changed, 13 insertions, 5 deletions
diff --git a/compiler/GHC/Cmm/Info.hs b/compiler/GHC/Cmm/Info.hs index 53e1b67fcc..db6d92ced6 100644 --- a/compiler/GHC/Cmm/Info.hs +++ b/compiler/GHC/Cmm/Info.hs @@ -450,7 +450,7 @@ wordAligned platform align_check e -- | Takes a closure pointer and returns the info table pointer closureInfoPtr :: Platform -> DoAlignSanitisation -> CmmExpr -> CmmExpr closureInfoPtr platform align_check e = - CmmLoad (wordAligned platform align_check e) (bWord platform) + cmmLoadBWord platform (wordAligned platform align_check e) -- | Takes an info pointer (the first word of a closure) and returns its entry -- code @@ -458,7 +458,7 @@ entryCode :: Platform -> CmmExpr -> CmmExpr entryCode platform e = if platformTablesNextToCode platform then e - else CmmLoad e (bWord platform) + else cmmLoadBWord platform e -- | Takes a closure pointer, and return the *zero-indexed* -- constructor tag obtained from the info table diff --git a/compiler/GHC/Cmm/LayoutStack.hs b/compiler/GHC/Cmm/LayoutStack.hs index 1bd00ed65a..f23af80d7e 100644 --- a/compiler/GHC/Cmm/LayoutStack.hs +++ b/compiler/GHC/Cmm/LayoutStack.hs @@ -1164,7 +1164,7 @@ lowerSafeForeignCall profile block -- different. Hence we continue by jumping to the top stack frame, -- not by jumping to succ. jump = CmmCall { cml_target = entryCode platform $ - CmmLoad spExpr (bWord platform) + cmmLoadBWord platform spExpr , cml_cont = Just succ , cml_args_regs = regs , cml_args = widthInBytes (wordWidth platform) diff --git a/compiler/GHC/Cmm/Parser.y b/compiler/GHC/Cmm/Parser.y index 68d5821309..065737922f 100644 --- a/compiler/GHC/Cmm/Parser.y +++ b/compiler/GHC/Cmm/Parser.y @@ -1289,8 +1289,7 @@ doReturn exprs_code = do mkReturnSimple :: Profile -> [CmmActual] -> UpdFrameOffset -> CmmAGraph mkReturnSimple profile actuals updfr_off = mkReturn profile e actuals updfr_off - where e = entryCode platform (CmmLoad (CmmStackSlot Old updfr_off) - (gcWord platform)) + where e = entryCode platform (cmmLoadGCWord platform (CmmStackSlot Old updfr_off)) platform = profilePlatform profile doRawJump :: CmmParse CmmExpr -> [GlobalReg] -> CmmParse () diff --git a/compiler/GHC/Cmm/Utils.hs b/compiler/GHC/Cmm/Utils.hs index 596b8d050f..b541d7a95c 100644 --- a/compiler/GHC/Cmm/Utils.hs +++ b/compiler/GHC/Cmm/Utils.hs @@ -31,6 +31,7 @@ module GHC.Cmm.Utils( cmmRegOffB, cmmOffsetB, cmmLabelOffB, cmmOffsetLitB, cmmOffsetExprB, cmmRegOffW, cmmOffsetW, cmmLabelOffW, cmmOffsetLitW, cmmOffsetExprW, cmmIndex, cmmIndexExpr, cmmLoadIndex, cmmLoadIndexW, + cmmLoadBWord, cmmLoadGCWord, cmmNegate, cmmULtWord, cmmUGeWord, cmmUGtWord, cmmUShrWord, cmmSLtWord, @@ -306,6 +307,14 @@ cmmIndexExpr platform width base idx = cmmLoadIndex :: Platform -> CmmType -> CmmExpr -> Int -> CmmExpr cmmLoadIndex platform ty expr ix = CmmLoad (cmmIndex platform (typeWidth ty) expr ix) ty +-- | Load a non-pointer word. +cmmLoadBWord :: Platform -> CmmExpr -> CmmExpr +cmmLoadBWord platform ptr = CmmLoad ptr (bWord platform) + +-- | Load a GC pointer. +cmmLoadGCWord :: Platform -> CmmExpr -> CmmExpr +cmmLoadGCWord platform ptr = CmmLoad ptr (gcWord platform) + -- The "B" variants take byte offsets cmmRegOffB :: CmmReg -> ByteOff -> CmmExpr cmmRegOffB = cmmRegOff |
