Ticket #2838 (closed merge: fixed)
-fasm codeGen doesn't truncate CMMInt's at the right place
| Reported by: | TristanAllwood | Owned by: | igloo |
|---|---|---|---|
| Priority: | normal | Milestone: | 6.10.2 |
| Component: | Compiler | Version: | 6.10.1 |
| Keywords: | Cc: | ||
| Operating System: | Unknown/Multiple | Architecture: | Unknown/Multiple |
| Type of failure: | Difficulty: | Unknown | |
| Test Case: | Blocked By: | ||
| Blocking: | Related Tickets: |
Description
With this sample program:
{-# LANGUAGE MagicHash, UnboxedTuples #-}
module Simpl(complement) where
import GHC.Base
import GHC.Num
complement (I# x#) = I# (word2Int# (int2Word# (4294967295#) `xor#` int2Word# (-1#)))
And compiling with
-O0 -fasm
on 6.10 or a recent head blows up in the assembler due to the constant.
Assembler messages: Error: missing or invalid immediate expression `-4294967296' taken as 0 Error: suffix or operands invalid for `mov'
After some debugging with SPJ, we believe that what is happening is:
CMMIntis storing 4294967295 as an Integer. This magic number is (2^32) - 1.
4294967295 ^ -1 is 00..011..1 ^ 11..111..1 = 11..100..0 which is (-4294967296)
We think internally using Integer arithmatic is fine (in e.g. CmmOpt?), however truncation isn't happening correctly when turning the Integer into a real Int; makeImmediate in nativeGen\machineRegs looks like a possible culprit.
Change History
Note: See
TracTickets for help on using
tickets.
