Skip to content

-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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information