Commit 70800c22 authored by Ben.Lippmeier@anu.edu.au's avatar Ben.Lippmeier@anu.edu.au
Browse files

SPARC NCG: Fix format problem when converting float to int

parent a5013199
...@@ -4988,21 +4988,33 @@ coerceInt2FP width1 width2 x = do ...@@ -4988,21 +4988,33 @@ coerceInt2FP width1 width2 x = do
FxTOy (intSize width1) (floatSize width2) dst dst] FxTOy (intSize width1) (floatSize width2) dst dst]
return (Any (floatSize $ width2) code__2) return (Any (floatSize $ width2) code__2)
------------
coerceFP2Int width1 width2 x = do
let pk = intSize width1
fprep = floatSize width2
(src, code) <- getSomeReg x -- | Coerce a floating point value to integer
reg <- getNewRegNat fprep --
tmp <- getNewRegNat pk -- NOTE: On sparc v9 there are no instructions to move a value from an
let -- FP register directly to an int register, so we have to use a load/store.
code__2 dst = ASSERT(fprep == FF64 || fprep == FF32) --
code `appOL` toOL [ coerceFP2Int width1 width2 x
FxTOy fprep pk src tmp, = do let fsize1 = floatSize width1
ST pk tmp (spRel (-2)), fsize2 = floatSize width2
LD pk (spRel (-2)) dst]
return (Any pk code__2) isize2 = intSize width2
(fsrc, code) <- getSomeReg x
fdst <- getNewRegNat fsize2
let code2 dst
= code
`appOL` toOL
-- convert float to int format, leaving it in a float reg.
[ FxTOy fsize1 isize2 fsrc fdst
-- store the int into mem, then load it back to move
-- it into an actual int reg.
, ST fsize2 fdst (spRel (-2))
, LD isize2 (spRel (-2)) dst]
return (Any isize2 code2)
------------ ------------
coerceDbl2Flt x = do coerceDbl2Flt x = do
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment