[project @ 2000-07-11 19:17:20 by panne]
[ghc-hetmet.git] / ghc / compiler / nativeGen / MachRegs.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1996-1998
3 %
4 \section[MachRegs]{Machine-specific info about registers}
5
6 Also includes stuff about immediate operands, which are
7 often/usually quite entangled with registers.
8
9 (Immediates could be untangled from registers at some cost in tangled
10 modules --- the pleasure has been foregone.)
11
12 \begin{code}
13 #include "nativeGen/NCG.h"
14
15 module MachRegs (
16
17         RegClass(..), regClass,
18         Reg(..), isRealReg, isVirtualReg,
19         allocatableRegs, argRegs, allArgRegs, callClobberedRegs,
20
21         Imm(..),
22         MachRegsAddr(..),
23         RegLoc(..),
24
25         addrOffset,
26         baseRegOffset,
27         callerSaves,
28         freeReg,
29         getNewRegNCG,
30         mkVReg,
31         magicIdRegMaybe,
32         saveLoc,
33         spRel,
34         stgReg,
35         strImmLit
36
37 #if alpha_TARGET_ARCH
38         , allArgRegs
39         , fits8Bits
40         , fReg
41         , gp, pv, ra, sp, t9, t10, t11, t12, v0, f0, zeroh
42 #endif
43 #if i386_TARGET_ARCH
44         , eax, ebx, ecx, edx, esi, esp
45         , fake0, fake1, fake2, fake3, fake4, fake5
46 #endif
47 #if sparc_TARGET_ARCH
48         , fits13Bits
49         , fpRel, gReg, iReg, lReg, oReg, largeOffsetError
50         , fp, sp, g0, g1, g2, o0, f0, f6, f8, f26, f27
51         
52 #endif
53     ) where
54
55 #include "HsVersions.h"
56
57 import AbsCSyn          ( MagicId(..) )
58 import AbsCUtils        ( magicIdPrimRep )
59 import CLabel           ( CLabel, mkMainRegTableLabel )
60 import PrimOp           ( PrimOp(..) )
61 import PrimRep          ( PrimRep(..), isFloatingRep )
62 import Stix             ( StixTree(..), StixReg(..),
63                           getUniqueNat, returnNat, thenNat, NatM )
64 import Unique           ( mkPseudoUnique2, Uniquable(..), Unique )
65 import Outputable
66 \end{code}
67
68 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
69
70 \begin{code}
71 data Imm
72   = ImmInt      Int
73   | ImmInteger  Integer     -- Sigh.
74   | ImmCLbl     CLabel      -- AbstractC Label (with baggage)
75   | ImmLab      Bool SDoc    -- Simple string label (underscore-able)
76                              -- Bool==True ==> in a different DLL
77   | ImmLit      SDoc    -- Simple string
78   | ImmIndex    CLabel Int
79   | ImmFloat    Rational
80   | ImmDouble   Rational
81   IF_ARCH_sparc(
82   | LO Imm                  -- Possible restrictions...
83   | HI Imm
84   ,)
85 strImmLit s = ImmLit (text s)
86 \end{code}
87
88 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
89
90 \begin{code}
91 data MachRegsAddr
92 #if alpha_TARGET_ARCH
93   = AddrImm     Imm
94   | AddrReg     Reg
95   | AddrRegImm  Reg Imm
96 #endif
97
98 #if i386_TARGET_ARCH
99   = AddrBaseIndex       Base Index Displacement
100   | ImmAddr             Imm Int
101
102 type Base         = Maybe Reg
103 type Index        = Maybe (Reg, Int)    -- Int is 2, 4 or 8
104 type Displacement = Imm
105 #endif
106
107 #if sparc_TARGET_ARCH
108   = AddrRegReg  Reg Reg
109   | AddrRegImm  Reg Imm
110 #endif
111
112 addrOffset :: MachRegsAddr -> Int -> Maybe MachRegsAddr
113
114 addrOffset addr off
115   = case addr of
116 #if alpha_TARGET_ARCH
117       _ -> panic "MachMisc.addrOffset not defined for Alpha"
118 #endif
119 #if i386_TARGET_ARCH
120       ImmAddr i off0      -> Just (ImmAddr i (off0 + off))
121       AddrBaseIndex r i (ImmInt n) -> Just (AddrBaseIndex r i (ImmInt (n + off)))
122       AddrBaseIndex r i (ImmInteger n)
123         -> Just (AddrBaseIndex r i (ImmInt (fromInteger (n + toInteger off))))
124       _ -> Nothing
125 #endif
126 #if sparc_TARGET_ARCH
127       AddrRegImm r (ImmInt n)
128        | fits13Bits n2 -> Just (AddrRegImm r (ImmInt n2))
129        | otherwise     -> Nothing
130        where n2 = n + off
131
132       AddrRegImm r (ImmInteger n)
133        | fits13Bits n2 -> Just (AddrRegImm r (ImmInt (fromInteger n2)))
134        | otherwise     -> Nothing
135        where n2 = n + toInteger off
136
137       AddrRegReg r (RealReg 0)
138        | fits13Bits off -> Just (AddrRegImm r (ImmInt off))
139        | otherwise     -> Nothing
140        
141       _ -> Nothing
142
143 #endif {-sparc-}
144
145 -----------------
146 #if alpha_TARGET_ARCH
147
148 fits8Bits :: Integer -> Bool
149 fits8Bits i = i >= -256 && i < 256
150
151 #endif
152
153 #if sparc_TARGET_ARCH
154
155 {-# SPECIALIZE fits13Bits :: Int -> Bool, Integer -> Bool #-}
156 fits13Bits :: Integral a => a -> Bool
157 fits13Bits x = x >= -4096 && x < 4096
158
159 -----------------
160 largeOffsetError i
161   = error ("ERROR: SPARC native-code generator cannot handle large offset ("
162            ++show i++");\nprobably because of large constant data structures;" ++ 
163            "\nworkaround: use -fvia-C on this module.\n")
164
165 #endif {-sparc-}
166 \end{code}
167
168 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
169
170 @stgReg@: we map STG registers onto appropriate Stix Trees.  First, we
171 handle the two constants, @STK_STUB_closure@ and @vtbl_StdUpdFrame@.
172 The rest are either in real machine registers or stored as offsets
173 from BaseReg.
174
175 \begin{code}
176 data RegLoc = Save StixTree | Always StixTree
177 \end{code}
178
179 Trees for register save locations:
180 \begin{code}
181 saveLoc :: MagicId -> StixTree
182
183 saveLoc reg = case (stgReg reg) of {Always loc -> loc; Save loc -> loc}
184 \end{code}
185
186 \begin{code}
187 stgReg :: MagicId -> RegLoc
188
189 stgReg x
190   = case (magicIdRegMaybe x) of
191         Just _  -> Save   nonReg
192         Nothing -> Always nonReg
193   where
194     offset = baseRegOffset x
195
196     baseLoc = case (magicIdRegMaybe BaseReg) of
197       Just _  -> StReg (StixMagicId BaseReg)
198       Nothing -> StCLbl mkMainRegTableLabel
199
200     nonReg = case x of
201       BaseReg -> StCLbl mkMainRegTableLabel
202
203       _ -> StInd (magicIdPrimRep x)
204                  (StPrim IntAddOp [baseLoc,
205                         StInt (toInteger (offset*BYTES_PER_WORD))])
206 \end{code}
207
208 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
209
210 @spRel@ gives us a stack relative addressing mode for volatile
211 temporaries and for excess call arguments.  @fpRel@, where
212 applicable, is the same but for the frame pointer.
213
214 \begin{code}
215 spRel :: Int    -- desired stack offset in words, positive or negative
216       -> MachRegsAddr
217
218 spRel n
219 #if i386_TARGET_ARCH
220   = AddrBaseIndex (Just esp) Nothing (ImmInt (n * BYTES_PER_WORD))
221 #else
222   = AddrRegImm sp (ImmInt (n * BYTES_PER_WORD))
223 #endif
224
225 #if sparc_TARGET_ARCH
226 fpRel :: Int -> MachRegsAddr
227     -- Duznae work for offsets greater than 13 bits; we just hope for
228     -- the best
229 fpRel n
230   = AddrRegImm fp (ImmInt (n * BYTES_PER_WORD))
231 #endif
232 \end{code}
233
234 %************************************************************************
235 %*                                                                      *
236 \subsection[Reg]{Real registers}
237 %*                                                                      *
238 %************************************************************************
239
240 RealRegs are machine regs which are available for allocation, in the
241 usual way.  We know what class they are, because that's part of the
242 processor's architecture.
243
244 VirtualRegs are virtual registers.  The register allocator will
245 eventually have to map them into RealRegs, or into spill slots.
246 VirtualRegs are allocated on the fly, usually to represent a single
247 value in the abstract assembly code (i.e. dynamic registers are
248 usually single assignment).  With the new register allocator, the
249 single assignment restriction isn't necessary to get correct code,
250 although a better register allocation will result if single assignment
251 is used -- because the allocator maps a VirtualReg into a single
252 RealReg, even if the VirtualReg has multiple live ranges.
253
254 Virtual regs can be of either class, so that info is attached.
255
256 \begin{code}
257
258 data RegClass 
259    = RcInteger 
260    | RcFloat
261    | RcDouble
262      deriving Eq
263
264 data Reg
265    = RealReg     Int
266    | VirtualRegI Unique
267    | VirtualRegF Unique
268    | VirtualRegD Unique
269
270 unRealReg (RealReg i) = i
271 unRealReg vreg        = pprPanic "unRealReg on VirtualReg" (ppr vreg)
272
273 mkVReg :: Unique -> PrimRep -> Reg
274 mkVReg u pk
275 #if sparc_TARGET_ARCH
276    = case pk of
277         FloatRep  -> VirtualRegF u
278         DoubleRep -> VirtualRegD u
279         other     -> VirtualRegI u
280 #else
281    = if isFloatingRep pk then VirtualRegD u else VirtualRegI u
282 #endif
283
284 isVirtualReg (RealReg _)     = False
285 isVirtualReg (VirtualRegI _) = True
286 isVirtualReg (VirtualRegF _) = True
287 isVirtualReg (VirtualRegD _) = True
288 isRealReg = not . isVirtualReg
289
290 getNewRegNCG :: PrimRep -> NatM Reg
291 getNewRegNCG pk
292    = getUniqueNat `thenNat` \ u -> returnNat (mkVReg u pk)
293
294 instance Eq Reg where
295    (==) (RealReg i1)     (RealReg i2)     = i1 == i2
296    (==) (VirtualRegI u1) (VirtualRegI u2) = u1 == u2
297    (==) (VirtualRegF u1) (VirtualRegF u2) = u1 == u2
298    (==) (VirtualRegD u1) (VirtualRegD u2) = u1 == u2
299    (==) reg1             reg2             = False
300
301 instance Ord Reg where
302    compare (RealReg i1)     (RealReg i2)     = compare i1 i2
303    compare (RealReg _)      (VirtualRegI _)  = LT
304    compare (RealReg _)      (VirtualRegF _)  = LT
305    compare (RealReg _)      (VirtualRegD _)  = LT
306
307    compare (VirtualRegI _)  (RealReg _)      = GT
308    compare (VirtualRegI u1) (VirtualRegI u2) = compare u1 u2
309    compare (VirtualRegI _)  (VirtualRegF _)  = LT
310    compare (VirtualRegI _)  (VirtualRegD _)  = LT
311
312    compare (VirtualRegF _)  (RealReg _)      = GT
313    compare (VirtualRegF _)  (VirtualRegI _)  = GT
314    compare (VirtualRegF u1) (VirtualRegF u2) = compare u1 u2
315    compare (VirtualRegF _)  (VirtualRegD _)  = LT
316
317    compare (VirtualRegD _)  (RealReg _)      = GT
318    compare (VirtualRegD _)  (VirtualRegI _)  = GT
319    compare (VirtualRegD _)  (VirtualRegF _)  = GT
320    compare (VirtualRegD u1) (VirtualRegD u2) = compare u1 u2
321
322
323 instance Show Reg where
324     showsPrec _ (RealReg i)     = showString (showReg i)
325     showsPrec _ (VirtualRegI u) = showString "%vI_"  . shows u
326     showsPrec _ (VirtualRegF u) = showString "%vF_"  . shows u
327     showsPrec _ (VirtualRegD u) = showString "%vD_"  . shows u
328
329 instance Outputable Reg where
330     ppr r = text (show r)
331
332 instance Uniquable Reg where
333     getUnique (RealReg i)     = mkPseudoUnique2 i
334     getUnique (VirtualRegI u) = u
335     getUnique (VirtualRegF u) = u
336     getUnique (VirtualRegD u) = u
337 \end{code}
338
339 ** Machine-specific Reg stuff: **
340
341 The Alpha has 64 registers of interest; 32 integer registers and 32 floating
342 point registers.  The mapping of STG registers to alpha machine registers
343 is defined in StgRegs.h.  We are, of course, prepared for any eventuality.
344 \begin{code}
345 #if alpha_TARGET_ARCH
346 fReg :: Int -> Int
347 fReg x = (32 + x)
348
349 v0, f0, ra, pv, gp, sp, zeroh :: Reg
350 v0    = realReg 0
351 f0    = realReg (fReg 0)
352 ra    = FixedReg ILIT(26)
353 pv    = t12
354 gp    = FixedReg ILIT(29)
355 sp    = FixedReg ILIT(30)
356 zeroh = FixedReg ILIT(31) -- "zero" is used in 1.3 (MonadZero method)
357
358 t9, t10, t11, t12 :: Reg
359 t9  = realReg 23
360 t10 = realReg 24
361 t11 = realReg 25
362 t12 = realReg 27
363 #endif
364 \end{code}
365
366 Intel x86 architecture:
367 - All registers except 7 (esp) are available for use.
368 - Only ebx, esi, edi and esp are available across a C call (they are callee-saves).
369 - Registers 0-7 have 16-bit counterparts (ax, bx etc.)
370 - Registers 0-3 have 8 bit counterparts (ah, bh etc.)
371 - Registers 8-13 are fakes; we pretend x86 has 6 conventionally-addressable
372   fp registers, and 3-operand insns for them, and we translate this into
373   real stack-based x86 fp code after register allocation.
374
375 \begin{code}
376 #if i386_TARGET_ARCH
377
378 fake0, fake1, fake2, fake3, fake4, fake5, 
379        eax, ebx, ecx, edx, esp, ebp, esi, edi :: Reg
380 eax   = RealReg 0
381 ebx   = RealReg 1
382 ecx   = RealReg 2
383 edx   = RealReg 3
384 esi   = RealReg 4
385 edi   = RealReg 5
386 ebp   = RealReg 6
387 esp   = RealReg 7
388 fake0 = RealReg 8
389 fake1 = RealReg 9
390 fake2 = RealReg 10
391 fake3 = RealReg 11
392 fake4 = RealReg 12
393 fake5 = RealReg 13
394
395 regClass (RealReg i)     = if i < 8 then RcInteger else RcDouble
396 regClass (VirtualRegI u) = RcInteger
397 regClass (VirtualRegF u) = RcFloat
398 regClass (VirtualRegD u) = RcDouble
399
400 regNames 
401    = ["%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp", "%esp", 
402       "%fake0", "%fake1", "%fake2", "%fake3", "%fake4", "%fake5", "%fake6"]
403
404 showReg :: Int -> String
405 showReg n
406    = if   n >= 0 && n < 14
407      then regNames !! n
408      else "%unknown_x86_real_reg_" ++ show n
409
410 #endif
411 \end{code}
412
413 The SPARC has 64 registers of interest; 32 integer registers and 32
414 floating point registers.  The mapping of STG registers to SPARC
415 machine registers is defined in StgRegs.h.  We are, of course,
416 prepared for any eventuality.
417
418 The whole fp-register pairing thing on sparcs is a huge nuisance.  See
419 fptools/ghc/includes/MachRegs.h for a description of what's going on
420 here.
421
422 \begin{code}
423 #if sparc_TARGET_ARCH
424
425 gReg,lReg,iReg,oReg,fReg :: Int -> Int
426 gReg x = x
427 oReg x = (8 + x)
428 lReg x = (16 + x)
429 iReg x = (24 + x)
430 fReg x = (32 + x)
431
432 nCG_FirstFloatReg :: Int
433 nCG_FirstFloatReg = unRealReg NCG_FirstFloatReg
434
435 regClass (VirtualRegI u) = RcInteger
436 regClass (VirtualRegF u) = RcFloat
437 regClass (VirtualRegD u) = RcDouble
438 regClass (RealReg i) | i < 32                = RcInteger 
439                      | i < nCG_FirstFloatReg = RcDouble
440                      | otherwise             = RcFloat
441
442 showReg :: Int -> String
443 showReg n
444    | n >= 0  && n < 8   = "%g" ++ show n
445    | n >= 8  && n < 16  = "%o" ++ show (n-8)
446    | n >= 16 && n < 24  = "%l" ++ show (n-16)
447    | n >= 24 && n < 32  = "%i" ++ show (n-24)
448    | n >= 32 && n < 64  = "%f" ++ show (n-32)
449    | otherwise          = "%unknown_sparc_real_reg_" ++ show n
450
451 g0, g1, g2, fp, sp, o0, f0, f1, f6, f8, f22, f26, f27 :: Reg
452
453 f6  = RealReg (fReg 6)
454 f8  = RealReg (fReg 8)
455 f22 = RealReg (fReg 22)
456 f26 = RealReg (fReg 26)
457 f27 = RealReg (fReg 27)
458
459
460 -- g0 is useful for codegen; is always zero, and writes to it vanish.
461 g0  = RealReg (gReg 0)
462 g1  = RealReg (gReg 1)
463 g2  = RealReg (gReg 2)
464
465 -- FP, SP, int and float return (from C) regs.
466 fp  = RealReg (iReg 6)
467 sp  = RealReg (oReg 6)
468 o0  = RealReg (oReg 0)
469 f0  = RealReg (fReg 0)
470 f1  = RealReg (fReg 1)
471
472 #endif
473
474 -------------------------------
475 callClobberedRegs :: [Reg]
476 callClobberedRegs
477   =
478 #if alpha_TARGET_ARCH
479     [0, 1, 2, 3, 4, 5, 6, 7, 8,
480      16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
481      fReg 0, fReg 1, fReg 10, fReg 11, fReg 12, fReg 13, fReg 14, fReg 15,
482      fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21, fReg 22, fReg 23,
483      fReg 24, fReg 25, fReg 26, fReg 27, fReg 28, fReg 29, fReg 30]
484 #endif {- alpha_TARGET_ARCH -}
485 #if i386_TARGET_ARCH
486     -- caller-saves registers
487     [eax,ecx,edx,fake0,fake1,fake2,fake3,fake4,fake5]
488 #endif {- i386_TARGET_ARCH -}
489 #if sparc_TARGET_ARCH
490     map RealReg 
491         ( oReg 7 :
492           [oReg i | i <- [0..5]] ++
493           [gReg i | i <- [1..7]] ++
494           [fReg i | i <- [0..31]] )
495 #endif {- sparc_TARGET_ARCH -}
496 \end{code}
497
498 Redefine the literals used for machine-registers with non-numeric
499 names in the header files.  Gag me with a spoon, eh?
500 \begin{code}
501 #if alpha_TARGET_ARCH
502 #define f0 32
503 #define f1 33
504 #define f2 34
505 #define f3 35
506 #define f4 36
507 #define f5 37
508 #define f6 38
509 #define f7 39
510 #define f8 40
511 #define f9 41
512 #define f10 42
513 #define f11 43
514 #define f12 44
515 #define f13 45
516 #define f14 46
517 #define f15 47
518 #define f16 48
519 #define f17 49
520 #define f18 50
521 #define f19 51
522 #define f20 52
523 #define f21 53
524 #define f22 54
525 #define f23 55
526 #define f24 56
527 #define f25 57
528 #define f26 58
529 #define f27 59
530 #define f28 60
531 #define f29 61
532 #define f30 62
533 #define f31 63
534 #endif
535 #if i386_TARGET_ARCH
536 #define eax 0
537 #define ebx 1
538 #define ecx 2
539 #define edx 3
540 #define esi 4
541 #define edi 5
542 #define ebp 6
543 #define esp 7
544 #define fake0 8
545 #define fake1 9
546 #define fake2 10
547 #define fake3 11
548 #define fake4 12
549 #define fake5 13
550 #endif
551 #if sparc_TARGET_ARCH
552 #define g0 0
553 #define g1 1
554 #define g2 2
555 #define g3 3
556 #define g4 4
557 #define g5 5
558 #define g6 6
559 #define g7 7
560 #define o0 8
561 #define o1 9
562 #define o2 10
563 #define o3 11
564 #define o4 12
565 #define o5 13
566 #define o6 14
567 #define o7 15
568 #define l0 16
569 #define l1 17
570 #define l2 18
571 #define l3 19
572 #define l4 20
573 #define l5 21
574 #define l6 22
575 #define l7 23
576 #define i0 24
577 #define i1 25
578 #define i2 26
579 #define i3 27
580 #define i4 28
581 #define i5 29
582 #define i6 30
583 #define i7 31
584
585 #define f0  32
586 #define f1  33
587 #define f2  34
588 #define f3  35
589 #define f4  36
590 #define f5  37
591 #define f6  38
592 #define f7  39
593 #define f8  40
594 #define f9  41
595 #define f10 42
596 #define f11 43
597 #define f12 44
598 #define f13 45
599 #define f14 46
600 #define f15 47
601 #define f16 48
602 #define f17 49
603 #define f18 50
604 #define f19 51
605 #define f20 52
606 #define f21 53
607 #define f22 54
608 #define f23 55
609 #define f24 56
610 #define f25 57
611 #define f26 58
612 #define f27 59
613 #define f28 60
614 #define f29 61
615 #define f30 62
616 #define f31 63
617
618 #endif
619 \end{code}
620
621 \begin{code}
622 baseRegOffset :: MagicId -> Int
623
624 baseRegOffset (VanillaReg _ ILIT(1)) = OFFSET_R1
625 baseRegOffset (VanillaReg _ ILIT(2)) = OFFSET_R2
626 baseRegOffset (VanillaReg _ ILIT(3)) = OFFSET_R3
627 baseRegOffset (VanillaReg _ ILIT(4)) = OFFSET_R4
628 baseRegOffset (VanillaReg _ ILIT(5)) = OFFSET_R5
629 baseRegOffset (VanillaReg _ ILIT(6)) = OFFSET_R6
630 baseRegOffset (VanillaReg _ ILIT(7)) = OFFSET_R7
631 baseRegOffset (VanillaReg _ ILIT(8)) = OFFSET_R8
632 baseRegOffset (VanillaReg _ ILIT(9)) = OFFSET_R9
633 baseRegOffset (VanillaReg _ ILIT(10)) = OFFSET_R10
634 baseRegOffset (FloatReg  ILIT(1))    = OFFSET_F1
635 baseRegOffset (FloatReg  ILIT(2))    = OFFSET_F2
636 baseRegOffset (FloatReg  ILIT(3))    = OFFSET_F3
637 baseRegOffset (FloatReg  ILIT(4))    = OFFSET_F4
638 baseRegOffset (DoubleReg ILIT(1))    = OFFSET_D1
639 baseRegOffset (DoubleReg ILIT(2))    = OFFSET_D2
640 baseRegOffset Sp                     = OFFSET_Sp
641 baseRegOffset Su                     = OFFSET_Su
642 baseRegOffset SpLim                  = OFFSET_SpLim
643 #ifdef OFFSET_Lng1
644 baseRegOffset (LongReg _ ILIT(1))    = OFFSET_Lng1
645 #endif
646 #ifdef OFFSET_Lng2
647 baseRegOffset (LongReg _ ILIT(2))    = OFFSET_Lng2
648 #endif
649 baseRegOffset Hp                     = OFFSET_Hp
650 baseRegOffset HpLim                  = OFFSET_HpLim
651 baseRegOffset CurrentTSO             = OFFSET_CurrentTSO
652 baseRegOffset CurrentNursery         = OFFSET_CurrentNursery
653 #ifdef DEBUG
654 baseRegOffset BaseReg                = panic "baseRegOffset:BaseReg"
655 baseRegOffset CurCostCentre          = panic "baseRegOffset:CurCostCentre"
656 baseRegOffset VoidReg                = panic "baseRegOffset:VoidReg"
657 #endif
658 \end{code}
659
660 \begin{code}
661 callerSaves :: MagicId -> Bool
662
663 #ifdef CALLER_SAVES_Base
664 callerSaves BaseReg                     = True
665 #endif
666 #ifdef CALLER_SAVES_R1
667 callerSaves (VanillaReg _ ILIT(1))      = True
668 #endif
669 #ifdef CALLER_SAVES_R2
670 callerSaves (VanillaReg _ ILIT(2))      = True
671 #endif
672 #ifdef CALLER_SAVES_R3
673 callerSaves (VanillaReg _ ILIT(3))      = True
674 #endif
675 #ifdef CALLER_SAVES_R4
676 callerSaves (VanillaReg _ ILIT(4))      = True
677 #endif
678 #ifdef CALLER_SAVES_R5
679 callerSaves (VanillaReg _ ILIT(5))      = True
680 #endif
681 #ifdef CALLER_SAVES_R6
682 callerSaves (VanillaReg _ ILIT(6))      = True
683 #endif
684 #ifdef CALLER_SAVES_R7
685 callerSaves (VanillaReg _ ILIT(7))      = True
686 #endif
687 #ifdef CALLER_SAVES_R8
688 callerSaves (VanillaReg _ ILIT(8))      = True
689 #endif
690 #ifdef CALLER_SAVES_F1
691 callerSaves (FloatReg ILIT(1))          = True
692 #endif
693 #ifdef CALLER_SAVES_F2
694 callerSaves (FloatReg ILIT(2))          = True
695 #endif
696 #ifdef CALLER_SAVES_F3
697 callerSaves (FloatReg ILIT(3))          = True
698 #endif
699 #ifdef CALLER_SAVES_F4
700 callerSaves (FloatReg ILIT(4))          = True
701 #endif
702 #ifdef CALLER_SAVES_D1
703 callerSaves (DoubleReg ILIT(1))         = True
704 #endif
705 #ifdef CALLER_SAVES_D2
706 callerSaves (DoubleReg ILIT(2))         = True
707 #endif
708 #ifdef CALLER_SAVES_L1
709 callerSaves (LongReg _ ILIT(1))         = True
710 #endif
711 #ifdef CALLER_SAVES_Sp
712 callerSaves Sp                          = True
713 #endif
714 #ifdef CALLER_SAVES_Su
715 callerSaves Su                          = True
716 #endif
717 #ifdef CALLER_SAVES_SpLim
718 callerSaves SpLim                       = True
719 #endif
720 #ifdef CALLER_SAVES_Hp
721 callerSaves Hp                          = True
722 #endif
723 #ifdef CALLER_SAVES_HpLim
724 callerSaves HpLim                       = True
725 #endif
726 #ifdef CALLER_SAVES_CurrentTSO
727 callerSaves CurrentTSO                  = True
728 #endif
729 #ifdef CALLER_SAVES_CurrentNursery
730 callerSaves CurrentNursery              = True
731 #endif
732 callerSaves _                           = False
733 \end{code}
734
735 \begin{code}
736 magicIdRegMaybe :: MagicId -> Maybe Reg
737
738 #ifdef REG_Base
739 magicIdRegMaybe BaseReg                 = Just (RealReg REG_Base)
740 #endif
741 #ifdef REG_R1
742 magicIdRegMaybe (VanillaReg _ ILIT(1))  = Just (RealReg REG_R1)
743 #endif 
744 #ifdef REG_R2 
745 magicIdRegMaybe (VanillaReg _ ILIT(2))  = Just (RealReg REG_R2)
746 #endif 
747 #ifdef REG_R3 
748 magicIdRegMaybe (VanillaReg _ ILIT(3))  = Just (RealReg REG_R3)
749 #endif 
750 #ifdef REG_R4 
751 magicIdRegMaybe (VanillaReg _ ILIT(4))  = Just (RealReg REG_R4)
752 #endif 
753 #ifdef REG_R5 
754 magicIdRegMaybe (VanillaReg _ ILIT(5))  = Just (RealReg REG_R5)
755 #endif 
756 #ifdef REG_R6 
757 magicIdRegMaybe (VanillaReg _ ILIT(6))  = Just (RealReg REG_R6)
758 #endif 
759 #ifdef REG_R7 
760 magicIdRegMaybe (VanillaReg _ ILIT(7))  = Just (RealReg REG_R7)
761 #endif 
762 #ifdef REG_R8 
763 magicIdRegMaybe (VanillaReg _ ILIT(8))  = Just (RealReg REG_R8)
764 #endif
765 #ifdef REG_R9 
766 magicIdRegMaybe (VanillaReg _ ILIT(9))  = Just (RealReg REG_R9)
767 #endif
768 #ifdef REG_R10 
769 magicIdRegMaybe (VanillaReg _ ILIT(10)) = Just (RealReg REG_R10)
770 #endif
771 #ifdef REG_F1
772 magicIdRegMaybe (FloatReg ILIT(1))      = Just (RealReg REG_F1)
773 #endif                                  
774 #ifdef REG_F2                           
775 magicIdRegMaybe (FloatReg ILIT(2))      = Just (RealReg REG_F2)
776 #endif                                  
777 #ifdef REG_F3                           
778 magicIdRegMaybe (FloatReg ILIT(3))      = Just (RealReg REG_F3)
779 #endif                                  
780 #ifdef REG_F4                           
781 magicIdRegMaybe (FloatReg ILIT(4))      = Just (RealReg REG_F4)
782 #endif                                  
783 #ifdef REG_D1                           
784 magicIdRegMaybe (DoubleReg ILIT(1))     = Just (RealReg REG_D1)
785 #endif                                  
786 #ifdef REG_D2                           
787 magicIdRegMaybe (DoubleReg ILIT(2))     = Just (RealReg REG_D2)
788 #endif
789 #ifdef REG_Sp       
790 magicIdRegMaybe Sp                      = Just (RealReg REG_Sp)
791 #endif
792 #ifdef REG_Lng1                         
793 magicIdRegMaybe (LongReg _ ILIT(1))     = Just (RealReg REG_Lng1)
794 #endif                                  
795 #ifdef REG_Lng2                         
796 magicIdRegMaybe (LongReg _ ILIT(2))     = Just (RealReg REG_Lng2)
797 #endif
798 #ifdef REG_Su                           
799 magicIdRegMaybe Su                      = Just (RealReg REG_Su)
800 #endif                                  
801 #ifdef REG_SpLim                                
802 magicIdRegMaybe SpLim                   = Just (RealReg REG_SpLim)
803 #endif                                  
804 #ifdef REG_Hp                           
805 magicIdRegMaybe Hp                      = Just (RealReg REG_Hp)
806 #endif                                  
807 #ifdef REG_HpLim                        
808 magicIdRegMaybe HpLim                   = Just (RealReg REG_HpLim)
809 #endif                                  
810 #ifdef REG_CurrentTSO                           
811 magicIdRegMaybe CurrentTSO              = Just (RealReg REG_CurrentTSO)
812 #endif                                  
813 #ifdef REG_CurrentNursery                       
814 magicIdRegMaybe CurrentNursery          = Just (RealReg REG_CurrentNursery)
815 #endif                                  
816 magicIdRegMaybe _                       = Nothing
817 \end{code}
818
819 \begin{code}
820 -------------------------------
821 -- allMachRegs is the complete set of machine regs.
822 allMachRegNos :: [Int]
823 allMachRegNos
824    = IF_ARCH_alpha( [0..63],
825      IF_ARCH_i386(  [0..13],
826      IF_ARCH_sparc( ([0..31]
827                      ++ [f0,f2 .. nCG_FirstFloatReg-1]
828                      ++ [nCG_FirstFloatReg .. f31]),
829                    )))
830 -- allocatableRegs is allMachRegNos with the fixed-use regs removed.
831 allocatableRegs :: [Reg]
832 allocatableRegs
833    = let isFree (RealReg (I# i)) = _IS_TRUE_(freeReg i)
834      in  filter isFree (map RealReg allMachRegNos)
835
836 -------------------------------
837 -- argRegs is the set of regs which are read for an n-argument call to C.
838 -- For archs which pass all args on the stack (x86), is empty.
839 -- Sparc passes up to the first 6 args in regs.
840 -- Dunno about Alpha.
841 argRegs :: Int -> [Reg]
842
843 #if i386_TARGET_ARCH
844 argRegs _ = panic "MachRegs.argRegs(x86): should not be used!"
845 #endif
846
847 #if alpha_TARGET_ARCH
848 argRegs 0 = []
849 argRegs 1 = freeMappedRegs [16, fReg 16]
850 argRegs 2 = freeMappedRegs [16, 17, fReg 16, fReg 17]
851 argRegs 3 = freeMappedRegs [16, 17, 18, fReg 16, fReg 17, fReg 18]
852 argRegs 4 = freeMappedRegs [16, 17, 18, 19, fReg 16, fReg 17, fReg 18, fReg 19]
853 argRegs 5 = freeMappedRegs [16, 17, 18, 19, 20, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20]
854 argRegs 6 = freeMappedRegs [16, 17, 18, 19, 20, 21, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21]
855 argRegs _ = panic "MachRegs.argRegs(alpha): don't know about >6 arguments!"
856 #endif {- alpha_TARGET_ARCH -}
857
858 #if sparc_TARGET_ARCH
859 argRegs 0 = []
860 argRegs 1 = map (RealReg . oReg) [0]
861 argRegs 2 = map (RealReg . oReg) [0,1]
862 argRegs 3 = map (RealReg . oReg) [0,1,2]
863 argRegs 4 = map (RealReg . oReg) [0,1,2,3]
864 argRegs 5 = map (RealReg . oReg) [0,1,2,3,4]
865 argRegs 6 = map (RealReg . oReg) [0,1,2,3,4,5]
866 argRegs _ = panic "MachRegs.argRegs(sparc): don't know about >6 arguments!"
867 #endif {- sparc_TARGET_ARCH -}
868
869
870
871 -------------------------------
872 -- all of the arg regs ??
873 #if alpha_TARGET_ARCH
874 allArgRegs :: [(Reg, Reg)]
875 allArgRegs = [(realReg i, realReg (fReg i)) | i <- [16..21]]
876 #endif {- alpha_TARGET_ARCH -}
877
878 #if sparc_TARGET_ARCH
879 allArgRegs :: [Reg]
880 allArgRegs = map RealReg [oReg i | i <- [0..5]]
881 #endif {- sparc_TARGET_ARCH -}
882
883 #if i386_TARGET_ARCH
884 allArgRegs :: [Reg]
885 allArgRegs = panic "MachRegs.allArgRegs(x86): should not be used!"
886 #endif
887 \end{code}
888
889 \begin{code}
890 freeReg :: FAST_INT -> FAST_BOOL
891
892 #if alpha_TARGET_ARCH
893 freeReg ILIT(26) = _FALSE_  -- return address (ra)
894 freeReg ILIT(28) = _FALSE_  -- reserved for the assembler (at)
895 freeReg ILIT(29) = _FALSE_  -- global pointer (gp)
896 freeReg ILIT(30) = _FALSE_  -- stack pointer (sp)
897 freeReg ILIT(31) = _FALSE_  -- always zero (zeroh)
898 freeReg ILIT(63) = _FALSE_  -- always zero (f31)
899 #endif
900
901 #if i386_TARGET_ARCH
902 freeReg ILIT(esp) = _FALSE_  -- %esp is the C stack pointer
903 #endif
904
905 #if sparc_TARGET_ARCH
906 freeReg ILIT(g0) = _FALSE_  --  %g0 is always 0.
907 freeReg ILIT(g5) = _FALSE_  --  %g5 is reserved (ABI).
908 freeReg ILIT(g6) = _FALSE_  --  %g6 is reserved (ABI).
909 freeReg ILIT(g7) = _FALSE_  --  %g7 is reserved (ABI).
910 freeReg ILIT(i6) = _FALSE_  --  %i6 is our frame pointer.
911 freeReg ILIT(o6) = _FALSE_  --  %o6 is our stack pointer.
912 freeReg ILIT(f0) = _FALSE_  --  %f0/%f1 are the C fp return registers.
913 freeReg ILIT(f1) = _FALSE_
914 #endif
915
916 #ifdef REG_Base
917 freeReg ILIT(REG_Base) = _FALSE_
918 #endif
919 #ifdef REG_R1
920 freeReg ILIT(REG_R1)   = _FALSE_
921 #endif  
922 #ifdef REG_R2  
923 freeReg ILIT(REG_R2)   = _FALSE_
924 #endif  
925 #ifdef REG_R3  
926 freeReg ILIT(REG_R3)   = _FALSE_
927 #endif  
928 #ifdef REG_R4  
929 freeReg ILIT(REG_R4)   = _FALSE_
930 #endif  
931 #ifdef REG_R5  
932 freeReg ILIT(REG_R5)   = _FALSE_
933 #endif  
934 #ifdef REG_R6  
935 freeReg ILIT(REG_R6)   = _FALSE_
936 #endif  
937 #ifdef REG_R7  
938 freeReg ILIT(REG_R7)   = _FALSE_
939 #endif  
940 #ifdef REG_R8  
941 freeReg ILIT(REG_R8)   = _FALSE_
942 #endif
943 #ifdef REG_F1
944 freeReg ILIT(REG_F1) = _FALSE_
945 #endif
946 #ifdef REG_F2
947 freeReg ILIT(REG_F2) = _FALSE_
948 #endif
949 #ifdef REG_F3
950 freeReg ILIT(REG_F3) = _FALSE_
951 #endif
952 #ifdef REG_F4
953 freeReg ILIT(REG_F4) = _FALSE_
954 #endif
955 #ifdef REG_D1
956 freeReg ILIT(REG_D1) = _FALSE_
957 #endif
958 #ifdef REG_D2
959 freeReg ILIT(REG_D2) = _FALSE_
960 #endif
961 #ifdef REG_Sp 
962 freeReg ILIT(REG_Sp)   = _FALSE_
963 #endif 
964 #ifdef REG_Su
965 freeReg ILIT(REG_Su)   = _FALSE_
966 #endif 
967 #ifdef REG_SpLim 
968 freeReg ILIT(REG_SpLim) = _FALSE_
969 #endif 
970 #ifdef REG_Hp 
971 freeReg ILIT(REG_Hp)   = _FALSE_
972 #endif
973 #ifdef REG_HpLim
974 freeReg ILIT(REG_HpLim) = _FALSE_
975 #endif
976 freeReg n               = _TRUE_
977 \end{code}