summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/nativeGen/PPC/Ppr.hs11
-rw-r--r--testsuite/tests/codeGen/should_run/T10870.hs1
-rw-r--r--testsuite/tests/codeGen/should_run/T10870.stdout1
3 files changed, 10 insertions, 3 deletions
diff --git a/compiler/nativeGen/PPC/Ppr.hs b/compiler/nativeGen/PPC/Ppr.hs
index e5147794ce..99f9ab77ea 100644
--- a/compiler/nativeGen/PPC/Ppr.hs
+++ b/compiler/nativeGen/PPC/Ppr.hs
@@ -718,12 +718,17 @@ pprInstr (SR II32 reg1 reg2 (RIImm (ImmInt i))) | i < 0 || i > 31 =
pprInstr (XOR reg1 reg2 (RIReg reg2))
pprInstr (SL II32 reg1 reg2 (RIImm (ImmInt i))) | i < 0 || i > 31 =
- -- As aboce for SR, but for left shifts.
+ -- As above for SR, but for left shifts.
-- Fixes ticket http://ghc.haskell.org/trac/ghc/ticket/10870
pprInstr (XOR reg1 reg2 (RIReg reg2))
-pprInstr (SRA II32 reg1 reg2 (RIImm (ImmInt i))) | i < 0 || i > 31 =
- pprInstr (XOR reg1 reg2 (RIReg reg2))
+pprInstr (SRA II32 reg1 reg2 (RIImm (ImmInt i))) | i > 31 =
+ -- PT: I don't know what to do for negative shift amounts:
+ -- For now just panic.
+ --
+ -- For shift amounts greater than 31 set all bit to the
+ -- value of the sign bit, this also what sraw does.
+ pprInstr (SRA II32 reg1 reg2 (RIImm (ImmInt 31)))
pprInstr (SL fmt reg1 reg2 ri) =
let op = case fmt of
diff --git a/testsuite/tests/codeGen/should_run/T10870.hs b/testsuite/tests/codeGen/should_run/T10870.hs
index 642ef2c1ff..255f5780dd 100644
--- a/testsuite/tests/codeGen/should_run/T10870.hs
+++ b/testsuite/tests/codeGen/should_run/T10870.hs
@@ -8,4 +8,5 @@ unsafeShift32R x = unsafeShiftR x 32
main :: IO ()
main = do
print $ map unsafeShift32R [ 123456, 0x7fffffff :: Int ]
+ print $ map unsafeShift32R [ -123456, -0x80000000 :: Int ]
print $ map unsafeShift32R [ 123456, 0xffffffff :: Word ]
diff --git a/testsuite/tests/codeGen/should_run/T10870.stdout b/testsuite/tests/codeGen/should_run/T10870.stdout
index 945f244e36..54b015cbda 100644
--- a/testsuite/tests/codeGen/should_run/T10870.stdout
+++ b/testsuite/tests/codeGen/should_run/T10870.stdout
@@ -1,2 +1,3 @@
[0,0]
+[-1,-1]
[0,0]