X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FnativeGen%2FMachCodeGen.hs;h=20aad786b862983ec50606346a49b7f3cff2a942;hb=e171a977fee973066ab0fd871a6b8ac9cfe20a58;hp=6f0b2f448db833a98481461668ec9891ce5887a7;hpb=3463d1d3725bd4ec70acb2656ff20571b9b59294;p=ghc-hetmet.git diff --git a/ghc/compiler/nativeGen/MachCodeGen.hs b/ghc/compiler/nativeGen/MachCodeGen.hs index 6f0b2f44..20aad78 100644 --- a/ghc/compiler/nativeGen/MachCodeGen.hs +++ b/ghc/compiler/nativeGen/MachCodeGen.hs @@ -3388,12 +3388,19 @@ genSwitch expr ids dynRef <- cmmMakeDynamicReference addImportNat False lbl (tableReg,t_code) <- getSomeReg $ dynRef let - jumpTable = map jumpTableEntry ids - + jumpTable = map jumpTableEntryRel ids + + jumpTableEntryRel Nothing + = CmmStaticLit (CmmInt 0 wordRep) + jumpTableEntryRel (Just (BlockId id)) + = CmmStaticLit (CmmLabelDiffOff blockLabel lbl 0) + where blockLabel = mkAsmTempLabel id + code = e_code `appOL` t_code `appOL` toOL [ LDATA ReadOnlyData (CmmDataLabel lbl : jumpTable), SLW tmp reg (RIImm (ImmInt 2)), LD I32 tmp (AddrRegReg tableReg tmp), + ADD tmp tmp (RIReg tableReg), MTCTR tmp, BCTR [ id | Just id <- ids ] ]