Skip to content

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.

Edited by Andreas Klebinger
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information