question about coercions between primitive types in STG level

Simon Marlow marlowsd at gmail.com
Mon Dec 7 18:57:22 UTC 2015


Simon's right, you need an explicit conversion, and unfortunately those 
conversions don't currently exist.  You would have to add them to the 
MachOp type, and implement them in each of the native code generators.

The good news is that if you did this, we could implement cheap 
conversions between the IEEE floating point types and their 
representations as unboxed integers, which is currently done by poking 
the values to memory and then peeking them back at the desired type. 
There's a ticket for this around somewhere....

Cheers
Simon

On 07/12/2015 12:23, Simon Peyton Jones wrote:
> If memory serves, there are primops for converting between unboxed values of different widths.
>
> Certainly converting between a float and a non-float will require an instruction on some architectures, since they use different register sets.
>
> Re (2) I have no idea.  You'll need to get more information... pprTrace or something.
>
> Simon
>
> |  -----Original Message-----
> |  From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of Ömer
> |  Sinan Agacan
> |  Sent: 06 December 2015 18:25
> |  To: ghc-devs <ghc-devs at haskell.org>
> |  Subject: question about coercions between primitive types in STG level
> |
> |  Hi all,
> |
> |  In my compiler pass(D1559, see ElimUbxSums.hs) I'm doing some unsafe
> |  coercions at the STG level. It works fine for lifted types, but for
> |  unlifted ones I'm having some problems. What I'm trying to do is given
> |  a number of primitive types I'm finding the one with biggest size, and
> |  then generating a constructor that takes this biggest primitive type
> |  as argument.
> |
> |  The problem is that this is not working very well - GHC is generating
> |  illegal instructions that try to load a F32 value to a register
> |  allocated for I64, using movss instruction.
> |
> |  CoreLint is catching this error and printing this:
> |
> |      Cmm lint error:
> |        in basic block c1hF
> |          in assignment:
> |            _g16W::I64 = 4.5 :: W32;   // CmmAssign
> |            Reg ty: I64
> |            Rhs ty: F32
> |
> |  So I have two questions about this:
> |
> |  1. Is there a way to safely do this? What are my options here? What
> |  I'm trying
> |     to do is to use a single data constructor field for different
> |  primitive
> |     types.  The field is guaranteed to be as big as necessary.
> |
> |  2. In the Cmm code shown above, the type annotation is showing `W32`
> |  but in the
> |     error message it says `F32`. I'm confused about this, is this error
> |  message
> |     given because the sizes don't match? (64bits vs 32bits) Why the
> |  type
> |     annotation says W32 while the value has type F32?
> |
> |  Thanks..
> |  _______________________________________________
> |  ghc-devs mailing list
> |  ghc-devs at haskell.org
> |  https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail.h
> |  askell.org%2fcgi-bin%2fmailman%2flistinfo%2fghc-
> |  devs&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7ced6a1fbfa6254e5
> |  2a7d808d2fe6a9a63%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=7j3fQs4
> |  ox67SZbA4jv4uPVVdvp5X5yUUuMaqp4sh%2fpg%3d
> _______________________________________________
> ghc-devs mailing list
> ghc-devs at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>


More information about the ghc-devs mailing list