#ifdef DEBUG
import Outputable ( assertPanic )
-import TRACE ( trace )
+import Debug.Trace ( trace )
#endif
import Control.Monad ( mapAndUnzipM )
-import Maybe ( fromJust )
-import DATA_BITS
-import DATA_WORD
+import Data.Maybe ( fromJust )
+import Data.Bits
+import Data.Word
-- -----------------------------------------------------------------------------
-- Top-level of the instruction selector
getRegister tree@(CmmRegOff _ _)
= getRegister (mangleIndexTree tree)
+
+#if WORD_SIZE_IN_BITS==32
+ -- for 32-bit architectuers, support some 64 -> 32 bit conversions:
+ -- TO_W_(x), TO_W_(x >> 32)
+
+getRegister (CmmMachOp (MO_U_Conv I64 I32)
+ [CmmMachOp (MO_U_Shr I64) [x,CmmLit (CmmInt 32 _)]]) = do
+ ChildCode64 code rlo <- iselExpr64 x
+ return $ Fixed I32 (getHiVRegFromLo rlo) code
+
+getRegister (CmmMachOp (MO_S_Conv I64 I32)
+ [CmmMachOp (MO_U_Shr I64) [x,CmmLit (CmmInt 32 _)]]) = do
+ ChildCode64 code rlo <- iselExpr64 x
+ return $ Fixed I32 (getHiVRegFromLo rlo) code
+
+getRegister (CmmMachOp (MO_U_Conv I64 I32) [x]) = do
+ ChildCode64 code rlo <- iselExpr64 x
+ return $ Fixed I32 rlo code
+
+getRegister (CmmMachOp (MO_S_Conv I64 I32) [x]) = do
+ ChildCode64 code rlo <- iselExpr64 x
+ return $ Fixed I32 rlo code
+
+#endif
+
-- end of machine-"independent" bit; here we go on the rest...
#if alpha_TARGET_ARCH
MO_U_Lt rep -> condIntCode LU x y
MO_U_Le rep -> condIntCode LEU x y
- other -> pprPanic "getCondCode(x86,sparc)" (pprMachOp mop)
+ other -> pprPanic "getCondCode(x86,x86_64,sparc)" (ppr (CmmMachOp mop [x,y]))
getCondCode other = pprPanic "getCondCode(2)(x86,sparc)" (ppr other)
#if i386_TARGET_ARCH
+genCCall (CmmPrim MO_WriteBarrier) _ _ _ = return nilOL
+ -- write barrier compiles to no code on x86/x86-64;
+ -- we keep it this long in order to prevent earlier optimisations.
+
-- we only cope with a single result for foreign calls
genCCall (CmmPrim op) [(r,_)] args vols = do
case op of
code2 <- stmtToInstrs (CmmAssign res (CmmReg tmp))
return (code1 `appOL` code2)
where
- lbl = mkForeignLabel fn Nothing True
+ lbl = mkForeignLabel fn Nothing False
fn = case mop of
MO_F32_Sqrt -> FSLIT("sqrtf")
#if x86_64_TARGET_ARCH
+genCCall (CmmPrim MO_WriteBarrier) _ _ _ = return nilOL
+ -- write barrier compiles to no code on x86/x86-64;
+ -- we keep it this long in order to prevent earlier optimisations.
+
genCCall (CmmPrim op) [(r,_)] args vols =
outOfLineFloatOp op r args vols