From: wolfgang Date: Sun, 18 Sep 2005 07:12:44 +0000 (+0000) Subject: [project @ 2005-09-18 07:12:44 by wolfgang] X-Git-Tag: Initial_conversion_from_CVS_complete~207 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=ed3035ea8ca65a7e70fa90288494ffdc2c004505;p=ghc-hetmet.git [project @ 2005-09-18 07:12:44 by wolfgang] PIC version for genSwitch on i386 --- diff --git a/ghc/compiler/nativeGen/MachCodeGen.hs b/ghc/compiler/nativeGen/MachCodeGen.hs index e552660..43123ba 100644 --- a/ghc/compiler/nativeGen/MachCodeGen.hs +++ b/ghc/compiler/nativeGen/MachCodeGen.hs @@ -3716,18 +3716,44 @@ genCCall target dest_regs argsAndHints vols genSwitch :: CmmExpr -> [Maybe BlockId] -> NatM InstrBlock #if i386_TARGET_ARCH || x86_64_TARGET_ARCH -genSwitch expr ids = do - (reg,e_code) <- getSomeReg expr - lbl <- getNewLabelNat - let - jumpTable = map jumpTableEntry ids - op = OpAddr (AddrBaseIndex EABaseNone (EAIndex reg wORD_SIZE) (ImmCLbl lbl)) - code = e_code `appOL` toOL [ - LDATA ReadOnlyData (CmmDataLabel lbl : jumpTable), - JMP_TBL op [ id | Just id <- ids ] - ] - -- in - return code +genSwitch expr ids + | opt_PIC + = do + (reg,e_code) <- getSomeReg expr + lbl <- getNewLabelNat + dynRef <- cmmMakeDynamicReference addImportNat False lbl + (tableReg,t_code) <- getSomeReg $ dynRef + let + jumpTable = map jumpTableEntryRel ids + + jumpTableEntryRel Nothing + = CmmStaticLit (CmmInt 0 wordRep) + jumpTableEntryRel (Just (BlockId id)) + = CmmStaticLit (CmmLabelDiffOff blockLabel lbl 0) + where blockLabel = mkAsmTempLabel id + + op = OpAddr (AddrBaseIndex (EABaseReg tableReg) + (EAIndex reg wORD_SIZE) (ImmInt 0)) + + code = e_code `appOL` t_code `appOL` toOL [ + LDATA ReadOnlyData (CmmDataLabel lbl : jumpTable), + ADD wordRep op (OpReg tableReg), + JMP_TBL (OpReg tableReg) [ id | Just id <- ids ] + ] + return code + | otherwise + = do + (reg,e_code) <- getSomeReg expr + lbl <- getNewLabelNat + let + jumpTable = map jumpTableEntry ids + op = OpAddr (AddrBaseIndex EABaseNone (EAIndex reg wORD_SIZE) (ImmCLbl lbl)) + code = e_code `appOL` toOL [ + LDATA ReadOnlyData (CmmDataLabel lbl : jumpTable), + JMP_TBL op [ id | Just id <- ids ] + ] + -- in + return code #elif powerpc_TARGET_ARCH genSwitch expr ids | opt_PIC