[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