[commit: ghc] ghc-8.0: PPC/CodeGen: fix lwa instruction generation (e7201e8)
git at git.haskell.org
git at git.haskell.org
Sun Oct 2 01:04:24 UTC 2016
Repository : ssh://git@git.haskell.org/ghc
On branch : ghc-8.0
Link : http://ghc.haskell.org/trac/ghc/changeset/e7201e86eeb0f294600ff9523f042905351efad2/ghc
>---------------------------------------------------------------
commit e7201e86eeb0f294600ff9523f042905351efad2
Author: Peter Trommler <ptrommler at acm.org>
Date: Sat Oct 1 17:56:31 2016 -0400
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
(cherry picked from commit ce3370e06165690e79a8eb22e5229b515157e00f)
>---------------------------------------------------------------
e7201e86eeb0f294600ff9523f042905351efad2
compiler/nativeGen/PPC/CodeGen.hs | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/compiler/nativeGen/PPC/CodeGen.hs b/compiler/nativeGen/PPC/CodeGen.hs
index 4b9a180..df76211 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
@@ -733,6 +733,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
More information about the ghc-commits
mailing list