[GHC] #13442: Add a coercion/cast operator to CMM

GHC ghc-devs at haskell.org
Sat Mar 18 07:01:52 UTC 2017


#13442: Add a coercion/cast operator to CMM
-------------------------------------+-------------------------------------
           Reporter:  erikd          |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:  8.4.1
          Component:  Compiler       |           Version:  8.0.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 While trying to implement casts between floating-point and integral types
 #4092) @rwbarton suggested the following CMM:
 {{{
 stg_wordToFloatzh(W_ w)
 {
     D_ d;
     STK_CHK_P_LL(WDS(1), stg_wordToFloatzh, w);
     Sp(-1) = w;
     d = Sp(-1);
     return (d);
 }
 }}}
 This code works outside of GHC, but when I try to add it as
 `rts/CastFloatWord.cmm` the CMM linter complains with:
 {{{
 Cmm lint error:
   in basic block c5
     in assignment:
       _c2::F64 = I64[Sp + -1 * 8];
       Reg ty: F64
       Rhs ty: I64
 Program was:
   {offset
     c6: // global
         _c1::I64 = R1;
         //tick src<rts/CastFloatWord.cmm:(7,1)-(13,1)>
         if (Sp - 1 * 8 < SpLim) goto c3; else goto c5;
     c3: // global
         //tick src<rts/CastFloatWord.cmm:9:35-100>
         R1 = _c1::I64;
         R2 = stg_wordToFloatzh;
         call stg_gc_prim_p_ll(R1, R2) args: 8, res: 0, upd: 8;
     c5: // global
         I64[Sp + -1 * 8] = _c1::I64;
         _c2::F64 = I64[Sp + -1 * 8];
         D1 = _c2::F64;
         call (P64[(old + 8)])(D1) args: 8, res: 0, upd: 8;
   }
 }}}
 For hand written CMM code like this, it would be nice to have a
 cast/coercion to allow this code to pass the linter.

 Looking for suggestions as to the syntax. I suspect that it would be best
 if the destination type was made explicit in the cast operation.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13442>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list