summaryrefslogtreecommitdiff
path: root/compiler/nativeGen/PPC
diff options
context:
space:
mode:
authorPeter Trommler <ptrommler@acm.org>2016-10-01 17:56:31 -0400
committerBen Gamari <ben@smart-cactus.org>2016-10-01 20:01:29 -0400
commitce3370e06165690e79a8eb22e5229b515157e00f (patch)
treea9687d8dd7331816f3478ffef604ebf88d6b3101 /compiler/nativeGen/PPC
parent1851349acd9e73f1c18d68f70d5cf7b46a843cb5 (diff)
downloadhaskell-ce3370e06165690e79a8eb22e5229b515157e00f.tar.gz
PPC/CodeGen: fix lwa instruction generation
Opcode lwa is a 64-bit opcode and allows a DS-form only. This patch generates lwa opcodes only when the offset is a multiple of 4. Fixes #12621 Test Plan: validate Reviewers: erikd, hvr, simonmar, austin, bgamari Reviewed By: bgamari Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D2547 GHC Trac Issues: #12621
Diffstat (limited to 'compiler/nativeGen/PPC')
-rw-r--r--compiler/nativeGen/PPC/CodeGen.hs16
1 files changed, 12 insertions, 4 deletions
diff --git a/compiler/nativeGen/PPC/CodeGen.hs b/compiler/nativeGen/PPC/CodeGen.hs
index d03a6e5c23..ead122b959 100644
--- a/compiler/nativeGen/PPC/CodeGen.hs
+++ b/compiler/nativeGen/PPC/CodeGen.hs
@@ -9,9 +9,8 @@
-----------------------------------------------------------------------------
-- This is a big module, but, if you pay attention to
--- (a) the sectioning, (b) the type signatures, and
--- (c) the #if blah_TARGET_ARCH} things, the
--- structure should not be too overwhelming.
+-- (a) the sectioning, and (b) the type signatures,
+-- the structure should not be too overwhelming.
module PPC.CodeGen (
cmmTopCodeGen,
@@ -471,7 +470,8 @@ getRegister' _ (CmmMachOp (MO_UU_Conv W32 W64) [CmmLoad mem _]) = do
return (Any II64 (\dst -> addr_code `snocOL` LD II32 dst addr))
getRegister' _ (CmmMachOp (MO_SS_Conv W32 W64) [CmmLoad mem _]) = do
- Amode addr addr_code <- getAmode D mem
+ -- lwa is DS-form. See Note [Power instruction format]
+ Amode addr addr_code <- getAmode DS mem
return (Any II64 (\dst -> addr_code `snocOL` LA II32 dst addr))
getRegister' dflags (CmmMachOp mop [x]) -- unary MachOps
@@ -742,6 +742,14 @@ temporary, then do the other computation, and then use the temporary:
... (tmp) ...
-}
+{- Note [Power instruction format]
+In some instructions the 16 bit offset must be a multiple of 4, i.e.
+the two least significant bits mus be zero. The "Power ISA" specification
+calls these instruction formats "DS-FORM" and the instructions with
+arbitrary 16 bit offsets are "D-FORM".
+
+The Power ISA specification document can be obtained from www.power.org.
+-}
data InstrForm = D | DS
getAmode :: InstrForm -> CmmExpr -> NatM Amode