[project @ 1999-06-24 13:04:13 by simonmar]
[ghc-hetmet.git] / ghc / compiler / nativeGen / AbsCStixGen.lhs
index 67d4e15..e4c1968 100644 (file)
 %
-% (c) The AQUA Project, Glasgow University, 1993-1995
+% (c) The AQUA Project, Glasgow University, 1993-1998
 %
 
 \begin{code}
-#include "HsVersions.h"
+module AbsCStixGen ( genCodeAbstractC ) where
 
-module AbsCStixGen (
-       genCodeAbstractC,
+#include "HsVersions.h"
 
-       -- and, of course, that's not enough...
-       AbstractC, Target, StixTree, SplitUniqSupply, SUniqSM(..)
-    ) where
+import Ratio   ( Rational )
 
 import AbsCSyn
-import AbsPrel         ( PrimOp(..), primOpNeedsWrapper, isCompareOp
-                         IF_ATTACK_PRAGMAS(COMMA tagOf_PrimOp)
-                         IF_ATTACK_PRAGMAS(COMMA pprPrimOp)
+import Stix
+import MachMisc
+
+import AbsCUtils       ( getAmodeRep, mixedTypeLocn,
+                         nonemptyAbsC, mkAbsCStmts, mkAbsCStmtList
                        )
-import CgCompInfo      ( mIN_UPD_SIZE )
-import ClosureInfo     ( infoTableLabelFromCI, entryLabelFromCI, fastLabelFromCI, 
-                         closureUpdReqd
+import SMRep           ( fixedItblSize, 
+                         rET_SMALL, rET_BIG, 
+                         rET_VEC_SMALL, rET_VEC_BIG 
                        )
-import MachDesc            
-import Maybes          ( Maybe(..), maybeToBool )
-import Outputable     
-import PrimKind                ( isFloatingKind )
-import SMRep           ( SMRep(..), SMSpecRepKind(..), SMUpdateKind(..) )
-import Stix    
-import StixInfo                ( genCodeInfoTable )
-import SplitUniq
-import Unique
-import Util
+import Constants       ( mIN_UPD_SIZE )
+import CLabel           ( CLabel, mkReturnInfoLabel, mkReturnPtLabel )
+import ClosureInfo     ( infoTableLabelFromCI, entryLabelFromCI,
+                         fastLabelFromCI, closureUpdReqd,
+                         staticClosureNeedsLink
+                       )
+import Const           ( Literal(..) )
+import Maybes          ( maybeToBool )
+import PrimOp          ( primOpNeedsWrapper, PrimOp(..) )
+import PrimRep         ( isFloatingRep, PrimRep(..) )
+import StixInfo                ( genCodeInfoTable, genBitmapInfoTable )
+import StixMacro       ( macroCode, checkCode )
+import StixPrim                ( primCode, amodeToStix, amodeToStix' )
+import UniqSupply      ( returnUs, thenUs, mapUs, getUniqueUs, UniqSM )
+import Util            ( naturalMergeSortLe )
+import Panic           ( panic )
+import BitSet          ( intBS )
+
+#ifdef REALLY_HASKELL_1_3
+ord = fromEnum :: Char -> Int
+#endif
 \end{code}
 
-For each independent chunk of AbstractC code, we generate a list of @StixTree@s,
-where each tree corresponds to a single Stix instruction.  We leave the chunks
-separated so that register allocation can be performed locally within the chunk.
+For each independent chunk of AbstractC code, we generate a list of
+@StixTree@s, where each tree corresponds to a single Stix instruction.
+We leave the chunks separated so that register allocation can be
+performed locally within the chunk.
 
 \begin{code}
+genCodeAbstractC :: AbstractC -> UniqSM [[StixTree]]
 
-genCodeAbstractC 
-    :: Target 
-    -> AbstractC
-    -> SUniqSM [[StixTree]]
-
-genCodeAbstractC target absC = 
-    mapSUs (genCodeTopAbsC target) (mkAbsCStmtList absC)       `thenSUs` \ trees ->
-    returnSUs ([StComment SLIT("Native Code")] : trees)
-
+genCodeAbstractC absC
+  = mapUs gentopcode (mkAbsCStmtList absC) `thenUs` \ trees ->
+    returnUs ([StComment SLIT("Native Code")] : trees)
+ where
+ a2stix      = amodeToStix
+ a2stix'     = amodeToStix'
+ volsaves    = volatileSaves
+ volrestores = volatileRestores
+ p2stix      = primCode
+ macro_code  = macroCode
+ -- real code follows... ---------
 \end{code}
 
 Here we handle top-level things, like @CCodeBlock@s and
 @CClosureInfoTable@s.
 
 \begin{code}
+ {-
+ genCodeTopAbsC
+    :: AbstractC
+    -> UniqSM [StixTree]
+ -}
+
+ gentopcode (CCodeBlock label absC)
+  = gencode absC                               `thenUs` \ code ->
+    returnUs (StSegment TextSegment : StFunBegin label : code [StFunEnd label])
+
+ gentopcode stmt@(CStaticClosure label _ _ _)
+  = genCodeStaticClosure stmt                  `thenUs` \ code ->
+    returnUs (StSegment DataSegment : StLabel label : code [])
+
+ gentopcode stmt@(CRetVector label _ _ _)
+  = genCodeVecTbl stmt                         `thenUs` \ code ->
+    returnUs (StSegment TextSegment : code [StLabel label])
+
+ gentopcode stmt@(CRetDirect uniq absC srt liveness)
+  = gencode absC                                      `thenUs` \ code ->
+    genBitmapInfoTable liveness srt closure_type False `thenUs` \ itbl ->
+    returnUs (StSegment TextSegment : 
+              itbl (StLabel lbl_info : StLabel lbl_ret : code []))
+  where 
+       lbl_info = mkReturnInfoLabel uniq
+       lbl_ret  = mkReturnPtLabel uniq
+       closure_type = case liveness of
+                        LvSmall _ -> rET_SMALL
+                        LvLarge _ -> rET_BIG
 
-genCodeTopAbsC 
-    :: Target 
-    -> AbstractC
-    -> SUniqSM [StixTree]
-
-genCodeTopAbsC target (CCodeBlock label absC) =
-    genCodeAbsC target absC                            `thenSUs` \ code ->
-    returnSUs (StSegment TextSegment : StFunBegin label : code [StFunEnd label])
-
-genCodeTopAbsC target stmt@(CStaticClosure label _ _ _) = 
-    genCodeStaticClosure target stmt                   `thenSUs` \ code ->
-    returnSUs (StSegment DataSegment : StLabel label : code [])
-
-genCodeTopAbsC target stmt@(CRetUnVector _ _) = returnSUs []
-
-genCodeTopAbsC target stmt@(CFlatRetVector label _) =
-    genCodeVecTbl target stmt                          `thenSUs` \ code ->
-    returnSUs (StSegment TextSegment : code [StLabel label])
-
-genCodeTopAbsC target stmt@(CClosureInfoAndCode cl_info slow Nothing _ _)
+ gentopcode stmt@(CClosureInfoAndCode cl_info slow Nothing _)
 
   | slow_is_empty
-  = genCodeInfoTable target stmt                       `thenSUs` \ itbl ->
-    returnSUs (StSegment TextSegment : itbl [])
+  = genCodeInfoTable stmt              `thenUs` \ itbl ->
+    returnUs (StSegment TextSegment : itbl [])
 
   | otherwise
-  = genCodeInfoTable target stmt                       `thenSUs` \ itbl ->
-    genCodeAbsC target slow                            `thenSUs` \ slow_code ->
-    returnSUs (StSegment TextSegment : itbl (StFunBegin slow_lbl : 
-              slow_code [StFunEnd slow_lbl]))
+  = genCodeInfoTable stmt              `thenUs` \ itbl ->
+    gencode slow                       `thenUs` \ slow_code ->
+    returnUs (StSegment TextSegment : itbl (StFunBegin slow_lbl :
+             slow_code [StFunEnd slow_lbl]))
   where
     slow_is_empty = not (maybeToBool (nonemptyAbsC slow))
     slow_lbl = entryLabelFromCI cl_info
 
-genCodeTopAbsC target stmt@(CClosureInfoAndCode cl_info slow (Just fast) _ _) =
--- ToDo: what if this is empty? ------------------------^^^^
-    genCodeInfoTable target stmt                       `thenSUs` \ itbl ->
-    genCodeAbsC target slow                            `thenSUs` \ slow_code ->
-    genCodeAbsC target fast                            `thenSUs` \ fast_code ->
-    returnSUs (StSegment TextSegment : itbl (StFunBegin slow_lbl : 
-              slow_code (StFunEnd slow_lbl : StFunBegin fast_lbl :
-              fast_code [StFunEnd fast_lbl])))
+ gentopcode stmt@(CClosureInfoAndCode cl_info slow (Just fast) _) =
+ -- ToDo: what if this is empty? ------------------------^^^^
+    genCodeInfoTable stmt              `thenUs` \ itbl ->
+    gencode slow                       `thenUs` \ slow_code ->
+    gencode fast                       `thenUs` \ fast_code ->
+    returnUs (StSegment TextSegment : itbl (StFunBegin slow_lbl :
+             slow_code (StFunEnd slow_lbl : StFunBegin fast_lbl :
+             fast_code [StFunEnd fast_lbl])))
   where
     slow_lbl = entryLabelFromCI cl_info
     fast_lbl = fastLabelFromCI cl_info
 
-genCodeTopAbsC target absC =
-    genCodeAbsC target absC                            `thenSUs` \ code ->
-    returnSUs (StSegment TextSegment : code [])
+ gentopcode stmt@(CSRT lbl closures)
+  = returnUs [ StSegment TextSegment 
+            , StLabel lbl 
+            , StData DataPtrRep (map StCLbl closures)
+            ]
+
+ gentopcode stmt@(CBitmap lbl mask)
+  = returnUs [ StSegment TextSegment 
+            , StLabel lbl 
+            , StData WordRep (StInt (toInteger (length mask)) : 
+                               map  (StInt . toInteger . intBS) mask)
+            ]
+
+ gentopcode absC
+  = gencode absC                               `thenUs` \ code ->
+    returnUs (StSegment TextSegment : code [])
 
 \end{code}
 
-Now the individual AbstractC statements.
+\begin{code}
+ {-
+ genCodeVecTbl
+    :: AbstractC
+    -> UniqSM StixTreeList
+ -}
+ genCodeVecTbl (CRetVector label amodes srt liveness)
+  = genBitmapInfoTable liveness srt closure_type True `thenUs` \itbl ->
+    returnUs (\xs -> vectbl : itbl xs)
+  where
+    vectbl = StData PtrRep (reverse (map a2stix amodes))
+    closure_type = case liveness of
+                   LvSmall _ -> rET_VEC_SMALL
+                   LvLarge _ -> rET_VEC_BIG
+
+\end{code}
 
 \begin{code}
+ {-
+ genCodeStaticClosure
+    :: AbstractC
+    -> UniqSM StixTreeList
+ -}
+ genCodeStaticClosure (CStaticClosure _ cl_info cost_centre amodes)
+  = returnUs (\xs -> table ++ xs)
+  where
+    table = StData PtrRep [StCLbl (infoTableLabelFromCI cl_info)] : 
+           map (\amode -> StData (getAmodeRep amode) [a2stix amode]) amodes ++
+           [StData PtrRep (padding_wds ++ static_link)]
 
-genCodeAbsC 
-    :: Target 
-    -> AbstractC
-    -> SUniqSM StixTreeList
+    -- always at least one padding word: this is the static link field
+    -- for the garbage collector.
+    padding_wds = if closureUpdReqd cl_info then
+                       take (max 0 (mIN_UPD_SIZE - length amodes)) zeros
+                 else
+                       []
 
-\end{code}
+    static_link | staticClosureNeedsLink cl_info = [StInt 0]
+               | otherwise                      = []
 
-@AbsCNop@s just disappear.
+    zeros = StInt 0 : zeros
 
-\begin{code}
+    {- needed??? --SDM
+       -- Watch out for VoidKinds...cf. PprAbsC
+    amodeZeroVoid item
+      | getAmodeRep item == VoidRep = StInt 0
+      | otherwise = a2stix item
+    -}
 
-genCodeAbsC target AbsCNop = returnSUs id
+\end{code}
 
+Now the individual AbstractC statements.
+
+\begin{code}
+ {-
+ gencode
+    :: AbstractC
+    -> UniqSM StixTreeList
+ -}
 \end{code}
 
-OLD:@CComment@s are passed through as the corresponding @StComment@s.
+@AbsCNop@s just disappear.
 
 \begin{code}
 
---UNUSED:genCodeAbsC target (CComment s) = returnSUs (\xs -> StComment s : xs)
+ gencode AbsCNop = returnUs id
 
 \end{code}
 
@@ -138,7 +217,7 @@ Split markers are a NOP in this land.
 
 \begin{code}
 
-genCodeAbsC target CSplitMarker = returnSUs id
+ gencode CSplitMarker = returnUs id
 
 \end{code}
 
@@ -147,10 +226,10 @@ resulting StixTreeLists are joined together.
 
 \begin{code}
 
-genCodeAbsC target (AbsCStmts c1 c2) =
-    genCodeAbsC target c1                              `thenSUs` \ b1 ->
-    genCodeAbsC target c2                              `thenSUs` \ b2 ->
-    returnSUs (b1 . b2)
+ gencode (AbsCStmts c1 c2)
+  = gencode c1                         `thenUs` \ b1 ->
+    gencode c2                         `thenUs` \ b2 ->
+    returnUs (b1 . b2)
 
 \end{code}
 
@@ -162,12 +241,22 @@ addresses, etc.)
 
 \begin{code}
 
-genCodeAbsC target (CInitHdr cl_info reg_rel _ _) =
-    let
-       lhs = amodeToStix target (CVal reg_rel PtrKind)
+ gencode (CInitHdr cl_info reg_rel _)
+  = let
+       lhs = a2stix reg_rel
        lbl = infoTableLabelFromCI cl_info
     in
-       returnSUs (\xs -> StAssign PtrKind lhs (StCLbl lbl) : xs)
+       returnUs (\xs -> StAssign PtrRep (StInd PtrRep lhs) (StCLbl lbl) : xs)
+
+\end{code}
+
+Heap/Stack Checks.
+
+\begin{code}
+
+ gencode (CCheck macro args assts)
+  = gencode assts `thenUs` \assts_stix ->
+    checkCode macro args assts_stix
 
 \end{code}
 
@@ -175,20 +264,20 @@ Assignment, the curse of von Neumann, is the center of the code we
 produce.  In most cases, the type of the assignment is determined
 by the type of the destination.  However, when the destination can
 have mixed types, the type of the assignment is ``StgWord'' (we use
-PtrKind for lack of anything better).  Think:  do we also want a cast
+PtrRep for lack of anything better).  Think:  do we also want a cast
 of the source?  Be careful about floats/doubles.
 
 \begin{code}
 
-genCodeAbsC target (CAssign lhs rhs)
-  | getAmodeKind lhs == VoidKind = returnSUs id
-  | otherwise =
-    let pk = getAmodeKind lhs
-       pk' = if mixedTypeLocn lhs && not (isFloatingKind pk) then IntKind else pk
-       lhs' = amodeToStix target lhs
-       rhs' = amodeToStix' target rhs
+ gencode (CAssign lhs rhs)
+  | getAmodeRep lhs == VoidRep = returnUs id
+  | otherwise
+  = let pk = getAmodeRep lhs
+       pk' = if mixedTypeLocn lhs && not (isFloatingRep pk) then IntRep else pk
+       lhs' = a2stix lhs
+       rhs' = a2stix' rhs
     in
-        returnSUs (\xs -> StAssign pk' lhs' rhs' : xs)
+       returnUs (\xs -> StAssign pk' lhs' rhs' : xs)
 
 \end{code}
 
@@ -196,28 +285,33 @@ Unconditional jumps, including the special ``enter closure'' operation.
 Note that the new entry convention requires that we load the InfoPtr (R2)
 with the address of the info table before jumping to the entry code for Node.
 
+For a vectored return, we must subtract the size of the info table to
+get at the return vector.  This depends on the size of the info table,
+which varies depending on whether we're profiling etc.
+
 \begin{code}
 
-genCodeAbsC target (CJump dest) =
-    returnSUs (\xs -> StJump (amodeToStix target dest) : xs)
+ gencode (CJump dest)
+  = returnUs (\xs -> StJump (a2stix dest) : xs)
 
-genCodeAbsC target (CFallThrough (CLbl lbl _)) =
-    returnSUs (\xs -> StFallThrough lbl : xs)
+ gencode (CFallThrough (CLbl lbl _))
+  = returnUs (\xs -> StFallThrough lbl : xs)
 
-genCodeAbsC target (CReturn dest DirectReturn) =
-    returnSUs (\xs -> StJump (amodeToStix target dest) : xs)
+ gencode (CReturn dest DirectReturn)
+  = returnUs (\xs -> StJump (a2stix dest) : xs)
 
-genCodeAbsC target (CReturn table (StaticVectoredReturn n)) =
-    returnSUs (\xs -> StJump dest : xs)
-  where 
-    dest = StInd PtrKind (StIndex PtrKind (amodeToStix target table)
-                                         (StInt (toInteger (-n-1))))
+ gencode (CReturn table (StaticVectoredReturn n))
+  = returnUs (\xs -> StJump dest : xs)
+  where
+    dest = StInd PtrRep (StIndex PtrRep (a2stix table)
+                                 (StInt (toInteger (-n-fixedItblSize-1))))
 
-genCodeAbsC target (CReturn table (DynamicVectoredReturn am)) =
-    returnSUs (\xs -> StJump dest : xs)
-  where 
-    dest = StInd PtrKind (StIndex PtrKind (amodeToStix target table) dyn_off)
-    dyn_off = StPrim IntSubOp [StPrim IntNegOp [amodeToStix target am], StInt 1]
+ gencode (CReturn table (DynamicVectoredReturn am))
+  = returnUs (\xs -> StJump dest : xs)
+  where
+    dest = StInd PtrRep (StIndex PtrRep (a2stix table) dyn_off)
+    dyn_off = StPrim IntSubOp [StPrim IntNegOp [a2stix am], 
+                              StInt (toInteger (fixedItblSize+1))]
 
 \end{code}
 
@@ -225,20 +319,20 @@ Now the PrimOps, some of which may need caller-saves register wrappers.
 
 \begin{code}
 
-genCodeAbsC target (COpStmt results op args liveness_mask vols)
+ gencode (COpStmt results op args vols)
   -- ToDo (ADR?): use that liveness mask
-  | primOpNeedsWrapper op =
-    let
-        saves = volatileSaves target vols
-       restores = volatileRestores target vols
+  | primOpNeedsWrapper op
+  = let
+       saves = volsaves vols
+       restores = volrestores vols
     in
-       primToStix target (nonVoid results) op (nonVoid args)
-                                                       `thenSUs` \ code ->
-       returnSUs (\xs -> saves ++ code (restores ++ xs))
+       p2stix (nonVoid results) op (nonVoid args)
+                                                       `thenUs` \ code ->
+       returnUs (\xs -> saves ++ code (restores ++ xs))
 
-  | otherwise = primToStix target (nonVoid results) op (nonVoid args)
+  | otherwise = p2stix (nonVoid results) op (nonVoid args)
     where
-        nonVoid = filter ((/= VoidKind) . getAmodeKind)
+       nonVoid = filter ((/= VoidRep) . getAmodeRep)
 
 \end{code}
 
@@ -247,11 +341,11 @@ Now the dreaded conditional jump.
 Now the if statement.  Almost *all* flow of control are of this form.
 @
        if (am==lit) { absC } else { absCdef }
-@ 
+@
        =>
 @
        IF am = lit GOTO l1:
-       absC 
+       absC
        jump l2:
    l1:
        absCdef
@@ -260,29 +354,29 @@ Now the if statement.  Almost *all* flow of control are of this form.
 
 \begin{code}
 
-genCodeAbsC target (CSwitch discrim alts deflt) 
+ gencode (CSwitch discrim alts deflt)
   = case alts of
-      [] -> genCodeAbsC target deflt
+      [] -> gencode deflt
 
       [(tag,alt_code)] -> case maybe_empty_deflt of
-                               Nothing -> genCodeAbsC target alt_code
-                               Just dc -> mkIfThenElse target discrim tag alt_code dc
+                               Nothing -> gencode alt_code
+                               Just dc -> mkIfThenElse discrim tag alt_code dc
 
       [(tag1@(MachInt i1 _), alt_code1),
-       (tag2@(MachInt i2 _), alt_code2)] 
+       (tag2@(MachInt i2 _), alt_code2)]
        | deflt_is_empty && i1 == 0 && i2 == 1
-       -> mkIfThenElse target discrim tag1 alt_code1 alt_code2
+       -> mkIfThenElse discrim tag1 alt_code1 alt_code2
        | deflt_is_empty && i1 == 1 && i2 == 0
-       -> mkIfThenElse target discrim tag2 alt_code2 alt_code1
+       -> mkIfThenElse discrim tag2 alt_code2 alt_code1
+
        -- If the @discrim@ is simple, then this unfolding is safe.
-      other | simple_discrim -> mkSimpleSwitches target discrim alts deflt
+      other | simple_discrim -> mkSimpleSwitches discrim alts deflt
 
        -- Otherwise, we need to do a bit of work.
-      other ->  getSUnique                       `thenSUs` \ u ->
-               genCodeAbsC target (AbsCStmts
-               (CAssign (CTemp u pk) discrim)
-               (CSwitch (CTemp u pk) alts deflt))
+      other ->  getUniqueUs                      `thenUs` \ u ->
+               gencode (AbsCStmts
+               (CAssign (CTemp u pk) discrim)
+               (CSwitch (CTemp u pk) alts deflt))
 
   where
     maybe_empty_deflt = nonemptyAbsC deflt
@@ -290,7 +384,7 @@ genCodeAbsC target (CSwitch discrim alts deflt)
                        Nothing -> True
                        Just _  -> False
 
-    pk = getAmodeKind discrim
+    pk = getAmodeRep discrim
 
     simple_discrim = case discrim of
                        CReg _    -> True
@@ -304,42 +398,43 @@ Finally, all of the disgusting AbstractC macros.
 
 \begin{code}
 
-genCodeAbsC target (CMacroStmt macro args) = macroCode target macro args
+ gencode (CMacroStmt macro args) = macro_code macro args
 
-genCodeAbsC target (CCallProfCtrMacro macro _) =
-    returnSUs (\xs -> StComment macro : xs)
+ gencode (CCallProfCtrMacro macro _)
+  = returnUs (\xs -> StComment macro : xs)
 
-genCodeAbsC target (CCallProfCCMacro macro _) =
-    returnSUs (\xs -> StComment macro : xs)
+ gencode (CCallProfCCMacro macro _)
+  = returnUs (\xs -> StComment macro : xs)
 
 \end{code}
 
-Here, we generate a jump table if there are more than four (integer) alternatives and
-the jump table occupancy is greater than 50%.  Otherwise, we generate a binary
-comparison tree.  (Perhaps this could be tuned.)
+Here, we generate a jump table if there are more than four (integer)
+alternatives and the jump table occupancy is greater than 50%.
+Otherwise, we generate a binary comparison tree.  (Perhaps this could
+be tuned.)
 
 \begin{code}
 
-intTag :: BasicLit -> Integer
-intTag (MachChar c) = toInteger (ord c)
-intTag (MachInt i _) = i
-intTag _ = panic "intTag"
-
-fltTag :: BasicLit -> Rational
-
-fltTag (MachFloat f) = f
-fltTag (MachDouble d) = d
-fltTag _ = panic "fltTag"
-
-mkSimpleSwitches 
-    :: Target 
-    -> CAddrMode -> [(BasicLit,AbstractC)] -> AbstractC
-    -> SUniqSM StixTreeList
-
-mkSimpleSwitches target am alts absC =
-    getUniqLabelNCG                                    `thenSUs` \ udlbl ->
-    getUniqLabelNCG                                    `thenSUs` \ ujlbl ->
-    let am' = amodeToStix target am
+ intTag :: Literal -> Integer
+ intTag (MachChar c)  = fromInt (ord c)
+ intTag (MachInt i _) = i
+ intTag _ = panic "intTag"
+
+ fltTag :: Literal -> Rational
+
+ fltTag (MachFloat f) = f
+ fltTag (MachDouble d) = d
+ fltTag _ = panic "fltTag"
+
+ {-
+ mkSimpleSwitches
+    :: CAddrMode -> [(Literal,AbstractC)] -> AbstractC
+    -> UniqSM StixTreeList
+ -}
+ mkSimpleSwitches am alts absC
+  = getUniqLabelNCG                                    `thenUs` \ udlbl ->
+    getUniqLabelNCG                                    `thenUs` \ ujlbl ->
+    let am' = a2stix am
        joinedAlts = map (\ (tag,code) -> (tag, mkJoin code ujlbl)) alts
        sortedAlts = naturalMergeSortLe leAlt joinedAlts
                     -- naturalMergeSortLe, because we often get sorted alts to begin with
@@ -350,28 +445,20 @@ mkSimpleSwitches target am alts absC =
        -- lowest and highest possible values the discriminant could take
        lowest = if floating then targetMinDouble else targetMinInt
        highest = if floating then targetMaxDouble else targetMaxInt
-
-       -- These should come from somewhere else, depending on the target arch
-       -- (Note that the floating point values aren't terribly important.)
-       -- ToDo: Fix!(JSM)
-       targetMinDouble = MachDouble (-1.7976931348623157e+308)
-       targetMaxDouble = MachDouble (1.7976931348623157e+308)
-       targetMinInt = mkMachInt (-2147483647)
-       targetMaxInt = mkMachInt 2147483647
     in
        (
        if not floating && choices > 4 && highTag - lowTag < toInteger (2 * choices) then
-           mkJumpTable target am' sortedAlts lowTag highTag udlbl
+           mkJumpTable am' sortedAlts lowTag highTag udlbl
        else
-           mkBinaryTree target am' floating sortedAlts choices lowest highest udlbl
+           mkBinaryTree am' floating sortedAlts choices lowest highest udlbl
        )
-                                                       `thenSUs` \ alt_code ->
-        genCodeAbsC target absC                                `thenSUs` \ dflt_code ->
+                                                       `thenUs` \ alt_code ->
+       gencode absC                            `thenUs` \ dflt_code ->
 
-       returnSUs (\xs -> alt_code (StLabel udlbl : dflt_code (StLabel ujlbl : xs)))
+       returnUs (\xs -> alt_code (StLabel udlbl : dflt_code (StLabel ujlbl : xs)))
 
     where
-       floating = isFloatingKind (getAmodeKind am)
+       floating = isFloatingRep (getAmodeRep am)
        choices = length alts
 
        (x@(MachChar _),_)  `leAlt` (y,_) = intTag x <= intTag y
@@ -380,50 +467,51 @@ mkSimpleSwitches target am alts absC =
 
 \end{code}
 
-We use jump tables when doing an integer switch on a relatively dense list of
-alternatives.  We expect to be given a list of alternatives, sorted by tag,
-and a range of values for which we are to generate a table.  Of course, the tags of 
-the alternatives should lie within the indicated range.  The alternatives need
-not cover the range; a default target is provided for the missing alternatives.
+We use jump tables when doing an integer switch on a relatively dense
+list of alternatives.  We expect to be given a list of alternatives,
+sorted by tag, and a range of values for which we are to generate a
+table.  Of course, the tags of the alternatives should lie within the
+indicated range.  The alternatives need not cover the range; a default
+target is provided for the missing alternatives.
 
-If a join is necessary after the switch, the alternatives should already finish
-with a jump to the join point.
+If a join is necessary after the switch, the alternatives should
+already finish with a jump to the join point.
 
 \begin{code}
-
-mkJumpTable
-    :: Target 
-    -> StixTree                -- discriminant
-    -> [(BasicLit, AbstractC)]         -- alternatives
+ {-
+ mkJumpTable
+    :: StixTree                -- discriminant
+    -> [(Literal, AbstractC)]  -- alternatives
     -> Integer                         -- low tag
     -> Integer                         -- high tag
     -> CLabel                  -- default label
-    -> SUniqSM StixTreeList
+    -> UniqSM StixTreeList
+ -}
 
-mkJumpTable target am alts lowTag highTag dflt =
-    getUniqLabelNCG                                    `thenSUs` \ utlbl ->
-    mapSUs genLabel alts                               `thenSUs` \ branches ->
-    let        cjmpLo = StCondJump dflt (StPrim IntLtOp [am, StInt lowTag])
-       cjmpHi = StCondJump dflt (StPrim IntGtOp [am, StInt highTag])
+ mkJumpTable am alts lowTag highTag dflt
+  = getUniqLabelNCG                                    `thenUs` \ utlbl ->
+    mapUs genLabel alts                                `thenUs` \ branches ->
+    let        cjmpLo = StCondJump dflt (StPrim IntLtOp [am, StInt (toInteger lowTag)])
+       cjmpHi = StCondJump dflt (StPrim IntGtOp [am, StInt (toInteger highTag)])
 
        offset = StPrim IntSubOp [am, StInt lowTag]
-       jump = StJump (StInd PtrKind (StIndex PtrKind (StCLbl utlbl) offset))
 
+       jump = StJump (StInd PtrRep (StIndex PtrRep (StCLbl utlbl) offset))
        tlbl = StLabel utlbl
-       table = StData PtrKind (mkTable branches [lowTag..highTag] [])
-    in    
-       mapSUs mkBranch branches                        `thenSUs` \ alts ->
+       table = StData PtrRep (mkTable branches [lowTag..highTag] [])
+    in
+       mapUs mkBranch branches                         `thenUs` \ alts ->
 
-        returnSUs (\xs -> cjmpLo : cjmpHi : jump : 
-                         StSegment DataSegment : tlbl : table : 
-                         StSegment TextSegment : foldr1 (.) alts xs)
+       returnUs (\xs -> cjmpLo : cjmpHi : jump :
+                        StSegment DataSegment : tlbl : table :
+                        StSegment TextSegment : foldr1 (.) alts xs)
 
     where
-       genLabel x = getUniqLabelNCG `thenSUs` \ lbl -> returnSUs (lbl, x)
+       genLabel x = getUniqLabelNCG `thenUs` \ lbl -> returnUs (lbl, x)
 
        mkBranch (lbl,(_,alt)) =
-            genCodeAbsC target alt                     `thenSUs` \ alt_code ->
-           returnSUs (\xs -> StLabel lbl : alt_code xs)
+           gencode alt                         `thenUs` \ alt_code ->
+           returnUs (\xs -> StLabel lbl : alt_code xs)
 
        mkTable _  []     tbl = reverse tbl
        mkTable [] (x:xs) tbl = mkTable [] xs (StCLbl dflt : tbl)
@@ -442,50 +530,50 @@ is longer.)  We can handle either integer or floating kind alternatives,
 so long as they are not mixed.  (We assume that the type of the discriminant
 determines the type of the alternatives.)
 
-As with the jump table approach, if a join is necessary after the switch, the 
+As with the jump table approach, if a join is necessary after the switch, the
 alternatives should already finish with a jump to the join point.
 
 \begin{code}
-
-mkBinaryTree 
-    :: Target 
-    -> StixTree                -- discriminant
+ {-
+ mkBinaryTree
+    :: StixTree                -- discriminant
     -> Bool                    -- floating point?
-    -> [(BasicLit, AbstractC)]         -- alternatives
+    -> [(Literal, AbstractC)]  -- alternatives
     -> Int                     -- number of choices
-    -> BasicLit                -- low tag
-    -> BasicLit                -- high tag
+    -> Literal                 -- low tag
+    -> Literal                 -- high tag
     -> CLabel                  -- default code label
-    -> SUniqSM StixTreeList
+    -> UniqSM StixTreeList
+ -}
 
-mkBinaryTree target am floating [(tag,alt)] _ lowTag highTag udlbl 
-  | rangeOfOne = genCodeAbsC target alt
-  | otherwise = 
-    let        tag' = amodeToStix target (CLit tag)
+ mkBinaryTree am floating [(tag,alt)] _ lowTag highTag udlbl
+  | rangeOfOne = gencode alt
+  | otherwise
+  = let        tag' = a2stix (CLit tag)
        cmpOp = if floating then DoubleNeOp else IntNeOp
        test = StPrim cmpOp [am, tag']
        cjmp = StCondJump udlbl test
     in
-       genCodeAbsC target alt                          `thenSUs` \ alt_code ->
-        returnSUs (\xs -> cjmp : alt_code xs)
+       gencode alt                             `thenUs` \ alt_code ->
+       returnUs (\xs -> cjmp : alt_code xs)
 
-    where 
+    where
        rangeOfOne = not floating && intTag lowTag + 1 >= intTag highTag
        -- When there is only one possible tag left in range, we skip the comparison
 
-mkBinaryTree target am floating alts choices lowTag highTag udlbl =
-    getUniqLabelNCG                                    `thenSUs` \ uhlbl ->
-    let tag' = amodeToStix target (CLit splitTag)
+ mkBinaryTree am floating alts choices lowTag highTag udlbl
+  = getUniqLabelNCG                                    `thenUs` \ uhlbl ->
+    let tag' = a2stix (CLit splitTag)
        cmpOp = if floating then DoubleGeOp else IntGeOp
        test = StPrim cmpOp [am, tag']
        cjmp = StCondJump uhlbl test
     in
-       mkBinaryTree target am floating alts_lo half lowTag splitTag udlbl
-                                                       `thenSUs` \ lo_code ->
-       mkBinaryTree target am floating alts_hi (choices - half) splitTag highTag udlbl
-                                                       `thenSUs` \ hi_code ->
+       mkBinaryTree am floating alts_lo half lowTag splitTag udlbl
+                                                       `thenUs` \ lo_code ->
+       mkBinaryTree am floating alts_hi (choices - half) splitTag highTag udlbl
+                                                       `thenUs` \ hi_code ->
 
-        returnSUs (\xs -> cjmp : lo_code (StLabel uhlbl : hi_code xs))
+       returnUs (\xs -> cjmp : lo_code (StLabel uhlbl : hi_code xs))
 
     where
        half = choices `div` 2
@@ -495,36 +583,35 @@ mkBinaryTree target am floating alts choices lowTag highTag udlbl =
 \end{code}
 
 \begin{code}
-
-mkIfThenElse 
-    :: Target 
-    -> CAddrMode           -- discriminant
-    -> BasicLit            -- tag
+ {-
+ mkIfThenElse
+    :: CAddrMode           -- discriminant
+    -> Literal             -- tag
     -> AbstractC           -- if-part
     -> AbstractC           -- else-part
-    -> SUniqSM StixTreeList
-
-mkIfThenElse target discrim tag alt deflt =
-    getUniqLabelNCG                                    `thenSUs` \ ujlbl ->
-    getUniqLabelNCG                                    `thenSUs` \ utlbl ->
-    let discrim' = amodeToStix target discrim
-       tag' = amodeToStix target (CLit tag)
-       cmpOp = if (isFloatingKind (getAmodeKind discrim)) then DoubleNeOp else IntNeOp
+    -> UniqSM StixTreeList
+ -}
+
+ mkIfThenElse discrim tag alt deflt
+  = getUniqLabelNCG                                    `thenUs` \ ujlbl ->
+    getUniqLabelNCG                                    `thenUs` \ utlbl ->
+    let discrim' = a2stix discrim
+       tag' = a2stix (CLit tag)
+       cmpOp = if (isFloatingRep (getAmodeRep discrim)) then DoubleNeOp else IntNeOp
        test = StPrim cmpOp [discrim', tag']
        cjmp = StCondJump utlbl test
        dest = StLabel utlbl
        join = StLabel ujlbl
     in
-        genCodeAbsC target (mkJoin alt ujlbl)          `thenSUs` \ alt_code ->
-        genCodeAbsC target deflt                       `thenSUs` \ dflt_code ->
-        returnSUs (\xs -> cjmp : alt_code (dest : dflt_code (join : xs)))
+       gencode (mkJoin alt ujlbl)              `thenUs` \ alt_code ->
+       gencode deflt                           `thenUs` \ dflt_code ->
+       returnUs (\xs -> cjmp : alt_code (dest : dflt_code (join : xs)))
 
 mkJoin :: AbstractC -> CLabel -> AbstractC
 
-mkJoin code lbl 
-  | mightFallThrough code = mkAbsCStmts code (CJump (CLbl lbl PtrKind))
+mkJoin code lbl
+  | mightFallThrough code = mkAbsCStmts code (CJump (CLbl lbl PtrRep))
   | otherwise = code
-
 \end{code}
 
 %---------------------------------------------------------------------------
@@ -543,7 +630,7 @@ mightFallThrough absC = ft absC True
 
   ft (CJump _)       if_empty = False
   ft (CReturn _ _)   if_empty = False
-  ft (CSwitch _ alts deflt) if_empty 
+  ft (CSwitch _ alts deflt) if_empty
        = ft deflt if_empty ||
          or [ft alt if_empty | (_,alt) <- alts]
 
@@ -551,8 +638,8 @@ mightFallThrough absC = ft absC True
   ft _ if_empty = if_empty
 
 {- Old algorithm, which called nonemptyAbsC for every subexpression! =========
-fallThroughAbsC (AbsCStmts c1 c2) =
-    case nonemptyAbsC c2 of
+fallThroughAbsC (AbsCStmts c1 c2)
+  = case nonemptyAbsC c2 of
        Nothing -> fallThroughAbsC c1
        Just x -> fallThroughAbsC x
 fallThroughAbsC (CJump _)       = False
@@ -566,51 +653,3 @@ isEmptyAbsC :: AbstractC -> Bool
 isEmptyAbsC = not . maybeToBool . nonemptyAbsC
 ================= End of old, quadratic, algorithm -}
 \end{code}
-
-Vector tables are trivial!
-
-\begin{code}
-
-genCodeVecTbl 
-    :: Target 
-    -> AbstractC
-    -> SUniqSM StixTreeList
-
-genCodeVecTbl target (CFlatRetVector label amodes) =
-    returnSUs (\xs -> vectbl : xs)
-  where
-    vectbl = StData PtrKind (reverse (map (amodeToStix target) amodes))
-
-\end{code}
-
-Static closures are not so hard either.
-
-\begin{code}
-
-genCodeStaticClosure 
-    :: Target 
-    -> AbstractC
-    -> SUniqSM StixTreeList
-
-genCodeStaticClosure target (CStaticClosure _ cl_info cost_centre amodes) =
-    returnSUs (\xs -> table : xs)
-  where
-    table = StData PtrKind (StCLbl info_lbl : body)
-    info_lbl = infoTableLabelFromCI cl_info
-
-    body = if closureUpdReqd cl_info then 
-               take (max mIN_UPD_SIZE (length amodes')) (amodes' ++ zeros)
-          else
-               amodes'
-
-    zeros = StInt 0 : zeros
-
-    amodes' = map amodeZeroVoid amodes
-
-       -- Watch out for VoidKinds...cf. PprAbsC
-    amodeZeroVoid item 
-      | getAmodeKind item == VoidKind = StInt 0
-      | otherwise = amodeToStix target item
-
-\end{code}
-