Commit fb0d5120 authored by Peter Trommler's avatar Peter Trommler 🥁 Committed by Ben Gamari

nativeGen.PPC: Fix shift arith. right > 31 bits

Arithmetic right shifts of more than 31 bits set all bits to
the sign bit on PowerPC. iThe assembler does not allow shift
amounts larger than 32 so do an arithemetic right shift of 31
bit instead.

Fixes #10870

Test Plan: validate (especially on powerpc)

Reviewers: austin, erikd, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D1459

GHC Trac Issues: #10870
parent badf5d54
......@@ -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
......
......@@ -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 ]
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment