Cmm: 64-bit Literals in hand written Cmm code are broken:
Summary
Assigning/returning 64bit literals in hand written Cmm seems to be broken at least on x86-32.
Steps to reproduce
#include "Cmm.h"
return_literal(I64 x) {
I64 z;
z = 0x7FFFFFFFFFFFFFFF;
return (z);
}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE UnliftedFFITypes #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE GHCForeignImportPrim #-}
module Main where
import GHC.Exts
import GHC.Int
import GHC.Word
import Numeric
-- foreign import prim "test_mul_ov" mul_may :: Int64# -> Int64# -> Int64#
foreign import prim "return_literal" return_literal :: Int64# -> Int64#
-- foreign import prim "test2" test2 :: Int64# -> Int64# -> (# Int64#, Int64# #)
main = do
let I64# x = 0x100000000
-- let I64# y = 0x100000000
-- let I64# z = 0x7FFFFFFFFFFFFFFF
let r_lit = I64# (return_literal x)
putStrLn $ showHex r_lit ""
Expected behavior
We would expect this to return 0x7FFFFFFFFFFFFFFF
but it returns 0xffffffff
.
It's worth pointing out that taking a 64-bit argument and returning it again does work.
Environment
It's broken on ghc-head on 32bit.