-fasm codeGen doesn't truncate CMMInt's at the right place
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.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.10.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | Unknown/Multiple |
| Architecture |
Edited by ToRA