From: wolfgang Date: Sun, 18 Sep 2005 16:27:21 +0000 (+0000) Subject: [project @ 2005-09-18 16:27:21 by wolfgang] X-Git-Tag: Initial_conversion_from_CVS_complete~204 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=6e48af3c5a7ee6c1bbf3bc33bd6dbd5ca77c5ea8;p=ghc-hetmet.git [project @ 2005-09-18 16:27:21 by wolfgang] Make outOfLineFloatOp PIC/dynamic-linking-aware on i386 --- diff --git a/ghc/compiler/nativeGen/MachCodeGen.hs b/ghc/compiler/nativeGen/MachCodeGen.hs index 43123ba..8560d4a 100644 --- a/ghc/compiler/nativeGen/MachCodeGen.hs +++ b/ghc/compiler/nativeGen/MachCodeGen.hs @@ -3057,23 +3057,27 @@ genCCall target dest_regs args vols = do outOfLineFloatOp :: CallishMachOp -> CmmReg -> [(CmmExpr,MachHint)] -> Maybe [GlobalReg] -> NatM InstrBlock outOfLineFloatOp mop res args vols - | cmmRegRep res == F64 - = stmtToInstrs (CmmCall target [(res,FloatHint)] args vols) - - | otherwise - = do uq <- getUniqueNat - let - tmp = CmmLocal (LocalReg uq F64) - -- in - code1 <- stmtToInstrs (CmmCall target [(tmp,FloatHint)] (map promote args) vols) - code2 <- stmtToInstrs (CmmAssign res (demote (CmmReg tmp))) - return (code1 `appOL` code2) + = do + targetExpr <- cmmMakeDynamicReference addImportNat True lbl + let target = CmmForeignCall targetExpr CCallConv + + if cmmRegRep res == F64 + then + stmtToInstrs (CmmCall target [(res,FloatHint)] args vols) + else do + uq <- getUniqueNat + let + tmp = CmmLocal (LocalReg uq F64) + -- in + code1 <- stmtToInstrs (CmmCall target [(tmp,FloatHint)] + (map promote args) vols) + code2 <- stmtToInstrs (CmmAssign res (demote (CmmReg tmp))) + return (code1 `appOL` code2) where promote (x,hint) = (CmmMachOp (MO_S_Conv F32 F64) [x], hint) demote x = CmmMachOp (MO_S_Conv F64 F32) [x] - target = CmmForeignCall (CmmLit lbl) CCallConv - lbl = CmmLabel (mkForeignLabel fn Nothing False) + lbl = mkForeignLabel fn Nothing True fn = case mop of MO_F32_Sqrt -> FSLIT("sqrt")