[project @ 2000-07-11 15:26:33 by sewardj]
[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 \end{code}
474
475 Redefine the literals used for machine-registers with non-numeric
476 names in the header files.  Gag me with a spoon, eh?
477 \begin{code}
478 #if alpha_TARGET_ARCH
479 #define f0 32
480 #define f1 33
481 #define f2 34
482 #define f3 35
483 #define f4 36
484 #define f5 37
485 #define f6 38
486 #define f7 39
487 #define f8 40
488 #define f9 41
489 #define f10 42
490 #define f11 43
491 #define f12 44
492 #define f13 45
493 #define f14 46
494 #define f15 47
495 #define f16 48
496 #define f17 49
497 #define f18 50
498 #define f19 51
499 #define f20 52
500 #define f21 53
501 #define f22 54
502 #define f23 55
503 #define f24 56
504 #define f25 57
505 #define f26 58
506 #define f27 59
507 #define f28 60
508 #define f29 61
509 #define f30 62
510 #define f31 63
511 #endif
512 #if i386_TARGET_ARCH
513 #define eax 0
514 #define ebx 1
515 #define ecx 2
516 #define edx 3
517 #define esi 4
518 #define edi 5
519 #define ebp 6
520 #define esp 7
521 #define fake0 8
522 #define fake1 9
523 #define fake2 10
524 #define fake3 11
525 #define fake4 12
526 #define fake5 13
527 #endif
528 #if sparc_TARGET_ARCH
529 #define g0 0
530 #define g1 1
531 #define g2 2
532 #define g3 3
533 #define g4 4
534 #define g5 5
535 #define g6 6
536 #define g7 7
537 #define o0 8
538 #define o1 9
539 #define o2 10
540 #define o3 11
541 #define o4 12
542 #define o5 13
543 #define o6 14
544 #define o7 15
545 #define l0 16
546 #define l1 17
547 #define l2 18
548 #define l3 19
549 #define l4 20
550 #define l5 21
551 #define l6 22
552 #define l7 23
553 #define i0 24
554 #define i1 25
555 #define i2 26
556 #define i3 27
557 #define i4 28
558 #define i5 29
559 #define i6 30
560 #define i7 31
561
562 #define f0  32
563 #define f1  33
564 #define f2  34
565 #define f3  35
566 #define f4  36
567 #define f5  37
568 #define f6  38
569 #define f7  39
570 #define f8  40
571 #define f9  41
572 #define f10 42
573 #define f11 43
574 #define f12 44
575 #define f13 45
576 #define f14 46
577 #define f15 47
578 #define f16 48
579 #define f17 49
580 #define f18 50
581 #define f19 51
582 #define f20 52
583 #define f21 53
584 #define f22 54
585 #define f23 55
586 #define f24 56
587 #define f25 57
588 #define f26 58
589 #define f27 59
590 #define f28 60
591 #define f29 61
592 #define f30 62
593 #define f31 63
594
595 #endif
596 \end{code}
597
598 \begin{code}
599 baseRegOffset :: MagicId -> Int
600
601 baseRegOffset (VanillaReg _ ILIT(1)) = OFFSET_R1
602 baseRegOffset (VanillaReg _ ILIT(2)) = OFFSET_R2
603 baseRegOffset (VanillaReg _ ILIT(3)) = OFFSET_R3
604 baseRegOffset (VanillaReg _ ILIT(4)) = OFFSET_R4
605 baseRegOffset (VanillaReg _ ILIT(5)) = OFFSET_R5
606 baseRegOffset (VanillaReg _ ILIT(6)) = OFFSET_R6
607 baseRegOffset (VanillaReg _ ILIT(7)) = OFFSET_R7
608 baseRegOffset (VanillaReg _ ILIT(8)) = OFFSET_R8
609 baseRegOffset (VanillaReg _ ILIT(9)) = OFFSET_R9
610 baseRegOffset (VanillaReg _ ILIT(10)) = OFFSET_R10
611 baseRegOffset (FloatReg  ILIT(1))    = OFFSET_F1
612 baseRegOffset (FloatReg  ILIT(2))    = OFFSET_F2
613 baseRegOffset (FloatReg  ILIT(3))    = OFFSET_F3
614 baseRegOffset (FloatReg  ILIT(4))    = OFFSET_F4
615 baseRegOffset (DoubleReg ILIT(1))    = OFFSET_D1
616 baseRegOffset (DoubleReg ILIT(2))    = OFFSET_D2
617 baseRegOffset Sp                     = OFFSET_Sp
618 baseRegOffset Su                     = OFFSET_Su
619 baseRegOffset SpLim                  = OFFSET_SpLim
620 #ifdef OFFSET_Lng1
621 baseRegOffset (LongReg _ ILIT(1))    = OFFSET_Lng1
622 #endif
623 #ifdef OFFSET_Lng2
624 baseRegOffset (LongReg _ ILIT(2))    = OFFSET_Lng2
625 #endif
626 baseRegOffset Hp                     = OFFSET_Hp
627 baseRegOffset HpLim                  = OFFSET_HpLim
628 baseRegOffset CurrentTSO             = OFFSET_CurrentTSO
629 baseRegOffset CurrentNursery         = OFFSET_CurrentNursery
630 #ifdef DEBUG
631 baseRegOffset BaseReg                = panic "baseRegOffset:BaseReg"
632 baseRegOffset CurCostCentre          = panic "baseRegOffset:CurCostCentre"
633 baseRegOffset VoidReg                = panic "baseRegOffset:VoidReg"
634 #endif
635 \end{code}
636
637 \begin{code}
638 callerSaves :: MagicId -> Bool
639
640 #ifdef CALLER_SAVES_Base
641 callerSaves BaseReg                     = True
642 #endif
643 #ifdef CALLER_SAVES_R1
644 callerSaves (VanillaReg _ ILIT(1))      = True
645 #endif
646 #ifdef CALLER_SAVES_R2
647 callerSaves (VanillaReg _ ILIT(2))      = True
648 #endif
649 #ifdef CALLER_SAVES_R3
650 callerSaves (VanillaReg _ ILIT(3))      = True
651 #endif
652 #ifdef CALLER_SAVES_R4
653 callerSaves (VanillaReg _ ILIT(4))      = True
654 #endif
655 #ifdef CALLER_SAVES_R5
656 callerSaves (VanillaReg _ ILIT(5))      = True
657 #endif
658 #ifdef CALLER_SAVES_R6
659 callerSaves (VanillaReg _ ILIT(6))      = True
660 #endif
661 #ifdef CALLER_SAVES_R7
662 callerSaves (VanillaReg _ ILIT(7))      = True
663 #endif
664 #ifdef CALLER_SAVES_R8
665 callerSaves (VanillaReg _ ILIT(8))      = True
666 #endif
667 #ifdef CALLER_SAVES_F1
668 callerSaves (FloatReg ILIT(1))          = True
669 #endif
670 #ifdef CALLER_SAVES_F2
671 callerSaves (FloatReg ILIT(2))          = True
672 #endif
673 #ifdef CALLER_SAVES_F3
674 callerSaves (FloatReg ILIT(3))          = True
675 #endif
676 #ifdef CALLER_SAVES_F4
677 callerSaves (FloatReg ILIT(4))          = True
678 #endif
679 #ifdef CALLER_SAVES_D1
680 callerSaves (DoubleReg ILIT(1))         = True
681 #endif
682 #ifdef CALLER_SAVES_D2
683 callerSaves (DoubleReg ILIT(2))         = True
684 #endif
685 #ifdef CALLER_SAVES_L1
686 callerSaves (LongReg _ ILIT(1))         = True
687 #endif
688 #ifdef CALLER_SAVES_Sp
689 callerSaves Sp                          = True
690 #endif
691 #ifdef CALLER_SAVES_Su
692 callerSaves Su                          = True
693 #endif
694 #ifdef CALLER_SAVES_SpLim
695 callerSaves SpLim                       = True
696 #endif
697 #ifdef CALLER_SAVES_Hp
698 callerSaves Hp                          = True
699 #endif
700 #ifdef CALLER_SAVES_HpLim
701 callerSaves HpLim                       = True
702 #endif
703 #ifdef CALLER_SAVES_CurrentTSO
704 callerSaves CurrentTSO                  = True
705 #endif
706 #ifdef CALLER_SAVES_CurrentNursery
707 callerSaves CurrentNursery              = True
708 #endif
709 callerSaves _                           = False
710 \end{code}
711
712 \begin{code}
713 magicIdRegMaybe :: MagicId -> Maybe Reg
714
715 #ifdef REG_Base
716 magicIdRegMaybe BaseReg                 = Just (RealReg REG_Base)
717 #endif
718 #ifdef REG_R1
719 magicIdRegMaybe (VanillaReg _ ILIT(1))  = Just (RealReg REG_R1)
720 #endif 
721 #ifdef REG_R2 
722 magicIdRegMaybe (VanillaReg _ ILIT(2))  = Just (RealReg REG_R2)
723 #endif 
724 #ifdef REG_R3 
725 magicIdRegMaybe (VanillaReg _ ILIT(3))  = Just (RealReg REG_R3)
726 #endif 
727 #ifdef REG_R4 
728 magicIdRegMaybe (VanillaReg _ ILIT(4))  = Just (RealReg REG_R4)
729 #endif 
730 #ifdef REG_R5 
731 magicIdRegMaybe (VanillaReg _ ILIT(5))  = Just (RealReg REG_R5)
732 #endif 
733 #ifdef REG_R6 
734 magicIdRegMaybe (VanillaReg _ ILIT(6))  = Just (RealReg REG_R6)
735 #endif 
736 #ifdef REG_R7 
737 magicIdRegMaybe (VanillaReg _ ILIT(7))  = Just (RealReg REG_R7)
738 #endif 
739 #ifdef REG_R8 
740 magicIdRegMaybe (VanillaReg _ ILIT(8))  = Just (RealReg REG_R8)
741 #endif
742 #ifdef REG_R9 
743 magicIdRegMaybe (VanillaReg _ ILIT(9))  = Just (RealReg REG_R9)
744 #endif
745 #ifdef REG_R10 
746 magicIdRegMaybe (VanillaReg _ ILIT(10)) = Just (RealReg REG_R10)
747 #endif
748 #ifdef REG_F1
749 magicIdRegMaybe (FloatReg ILIT(1))      = Just (RealReg REG_F1)
750 #endif                                  
751 #ifdef REG_F2                           
752 magicIdRegMaybe (FloatReg ILIT(2))      = Just (RealReg REG_F2)
753 #endif                                  
754 #ifdef REG_F3                           
755 magicIdRegMaybe (FloatReg ILIT(3))      = Just (RealReg REG_F3)
756 #endif                                  
757 #ifdef REG_F4                           
758 magicIdRegMaybe (FloatReg ILIT(4))      = Just (RealReg REG_F4)
759 #endif                                  
760 #ifdef REG_D1                           
761 magicIdRegMaybe (DoubleReg ILIT(1))     = Just (RealReg REG_D1)
762 #endif                                  
763 #ifdef REG_D2                           
764 magicIdRegMaybe (DoubleReg ILIT(2))     = Just (RealReg REG_D2)
765 #endif
766 #ifdef REG_Sp       
767 magicIdRegMaybe Sp                      = Just (RealReg REG_Sp)
768 #endif
769 #ifdef REG_Lng1                         
770 magicIdRegMaybe (LongReg _ ILIT(1))     = Just (RealReg REG_Lng1)
771 #endif                                  
772 #ifdef REG_Lng2                         
773 magicIdRegMaybe (LongReg _ ILIT(2))     = Just (RealReg REG_Lng2)
774 #endif
775 #ifdef REG_Su                           
776 magicIdRegMaybe Su                      = Just (RealReg REG_Su)
777 #endif                                  
778 #ifdef REG_SpLim                                
779 magicIdRegMaybe SpLim                   = Just (RealReg REG_SpLim)
780 #endif                                  
781 #ifdef REG_Hp                           
782 magicIdRegMaybe Hp                      = Just (RealReg REG_Hp)
783 #endif                                  
784 #ifdef REG_HpLim                        
785 magicIdRegMaybe HpLim                   = Just (RealReg REG_HpLim)
786 #endif                                  
787 #ifdef REG_CurrentTSO                           
788 magicIdRegMaybe CurrentTSO              = Just (RealReg REG_CurrentTSO)
789 #endif                                  
790 #ifdef REG_CurrentNursery                       
791 magicIdRegMaybe CurrentNursery          = Just (RealReg REG_CurrentNursery)
792 #endif                                  
793 magicIdRegMaybe _                       = Nothing
794 \end{code}
795
796 \begin{code}
797 -------------------------------
798 -- allMachRegs is the complete set of machine regs.
799 allMachRegNos :: [Int]
800 allMachRegNos
801    = IF_ARCH_alpha( [0..63],
802      IF_ARCH_i386(  [0..13],
803      IF_ARCH_sparc( ([0..31]
804                      ++ [f0,f2 .. nCG_FirstFloatReg-1]
805                      ++ [nCG_FirstFloatReg .. f31]),
806                    )))
807 -- allocatableRegs is allMachRegNos with the fixed-use regs removed.
808 allocatableRegs :: [Reg]
809 allocatableRegs
810    = let isFree (RealReg (I# i)) = _IS_TRUE_(freeReg i)
811      in  filter isFree (map RealReg allMachRegNos)
812
813
814 -------------------------------
815 callClobberedRegs :: [Reg]
816 callClobberedRegs
817   =
818 #if alpha_TARGET_ARCH
819     [0, 1, 2, 3, 4, 5, 6, 7, 8,
820      16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
821      fReg 0, fReg 1, fReg 10, fReg 11, fReg 12, fReg 13, fReg 14, fReg 15,
822      fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21, fReg 22, fReg 23,
823      fReg 24, fReg 25, fReg 26, fReg 27, fReg 28, fReg 29, fReg 30]
824 #endif {- alpha_TARGET_ARCH -}
825 #if i386_TARGET_ARCH
826     -- caller-saves registers
827     [eax,ecx,edx,fake0,fake1,fake2,fake3,fake4,fake5]
828 #endif {- i386_TARGET_ARCH -}
829 #if sparc_TARGET_ARCH
830     map RealReg 
831         ( oReg 7 :
832           [oReg i | i <- [0..5]] ++
833           [gReg i | i <- [1..7]] ++
834           [fReg i | i <- [0..31]] )
835 #endif {- sparc_TARGET_ARCH -}
836
837 -------------------------------
838 -- argRegs is the set of regs which are read for an n-argument call to C.
839 -- For archs which pass all args on the stack (x86), is empty.
840 -- Sparc passes up to the first 6 args in regs.
841 -- Dunno about Alpha.
842 argRegs :: Int -> [Reg]
843
844 #if i386_TARGET_ARCH
845 argRegs _ = panic "MachRegs.argRegs(x86): should not be used!"
846 #endif
847
848 #if alpha_TARGET_ARCH
849 argRegs 0 = []
850 argRegs 1 = freeMappedRegs [16, fReg 16]
851 argRegs 2 = freeMappedRegs [16, 17, fReg 16, fReg 17]
852 argRegs 3 = freeMappedRegs [16, 17, 18, fReg 16, fReg 17, fReg 18]
853 argRegs 4 = freeMappedRegs [16, 17, 18, 19, fReg 16, fReg 17, fReg 18, fReg 19]
854 argRegs 5 = freeMappedRegs [16, 17, 18, 19, 20, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20]
855 argRegs 6 = freeMappedRegs [16, 17, 18, 19, 20, 21, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21]
856 argRegs _ = panic "MachRegs.argRegs(alpha): don't know about >6 arguments!"
857 #endif {- alpha_TARGET_ARCH -}
858
859 #if sparc_TARGET_ARCH
860 argRegs 0 = []
861 argRegs 1 = map (RealReg . oReg) [0]
862 argRegs 2 = map (RealReg . oReg) [0,1]
863 argRegs 3 = map (RealReg . oReg) [0,1,2]
864 argRegs 4 = map (RealReg . oReg) [0,1,2,3]
865 argRegs 5 = map (RealReg . oReg) [0,1,2,3,4]
866 argRegs 6 = map (RealReg . oReg) [0,1,2,3,4,5]
867 argRegs _ = panic "MachRegs.argRegs(sparc): don't know about >6 arguments!"
868 #endif {- sparc_TARGET_ARCH -}
869
870
871
872 -------------------------------
873 -- all of the arg regs ??
874 #if alpha_TARGET_ARCH
875 allArgRegs :: [(Reg, Reg)]
876 allArgRegs = [(realReg i, realReg (fReg i)) | i <- [16..21]]
877 #endif {- alpha_TARGET_ARCH -}
878
879 #if sparc_TARGET_ARCH
880 allArgRegs :: [Reg]
881 allArgRegs = map RealReg [oReg i | i <- [0..5]]
882 #endif {- sparc_TARGET_ARCH -}
883
884 #if linux_TARGET_ARCH
885 allArgRegs :: [Reg]
886 allArgRegs = panic "MachRegs.allArgRegs(x86): should not be used!"
887 #endif
888 \end{code}
889
890 \begin{code}
891 freeReg :: FAST_INT -> FAST_BOOL
892
893 #if alpha_TARGET_ARCH
894 freeReg ILIT(26) = _FALSE_  -- return address (ra)
895 freeReg ILIT(28) = _FALSE_  -- reserved for the assembler (at)
896 freeReg ILIT(29) = _FALSE_  -- global pointer (gp)
897 freeReg ILIT(30) = _FALSE_  -- stack pointer (sp)
898 freeReg ILIT(31) = _FALSE_  -- always zero (zeroh)
899 freeReg ILIT(63) = _FALSE_  -- always zero (f31)
900 #endif
901
902 #if i386_TARGET_ARCH
903 freeReg ILIT(esp) = _FALSE_  -- %esp is the C stack pointer
904 #endif
905
906 #if sparc_TARGET_ARCH
907 freeReg ILIT(g0) = _FALSE_  --  %g0 is always 0.
908 freeReg ILIT(g5) = _FALSE_  --  %g5 is reserved (ABI).
909 freeReg ILIT(g6) = _FALSE_  --  %g6 is reserved (ABI).
910 freeReg ILIT(g7) = _FALSE_  --  %g7 is reserved (ABI).
911 freeReg ILIT(i6) = _FALSE_  --  %i6 is our frame pointer.
912 freeReg ILIT(o6) = _FALSE_  --  %o6 is our stack pointer.
913 freeReg ILIT(f0) = _FALSE_  --  %f0/%f1 are the C fp return registers.
914 freeReg ILIT(f1) = _FALSE_
915 #endif
916
917 #ifdef REG_Base
918 freeReg ILIT(REG_Base) = _FALSE_
919 #endif
920 #ifdef REG_R1
921 freeReg ILIT(REG_R1)   = _FALSE_
922 #endif  
923 #ifdef REG_R2  
924 freeReg ILIT(REG_R2)   = _FALSE_
925 #endif  
926 #ifdef REG_R3  
927 freeReg ILIT(REG_R3)   = _FALSE_
928 #endif  
929 #ifdef REG_R4  
930 freeReg ILIT(REG_R4)   = _FALSE_
931 #endif  
932 #ifdef REG_R5  
933 freeReg ILIT(REG_R5)   = _FALSE_
934 #endif  
935 #ifdef REG_R6  
936 freeReg ILIT(REG_R6)   = _FALSE_
937 #endif  
938 #ifdef REG_R7  
939 freeReg ILIT(REG_R7)   = _FALSE_
940 #endif  
941 #ifdef REG_R8  
942 freeReg ILIT(REG_R8)   = _FALSE_
943 #endif
944 #ifdef REG_F1
945 freeReg ILIT(REG_F1) = _FALSE_
946 #endif
947 #ifdef REG_F2
948 freeReg ILIT(REG_F2) = _FALSE_
949 #endif
950 #ifdef REG_F3
951 freeReg ILIT(REG_F3) = _FALSE_
952 #endif
953 #ifdef REG_F4
954 freeReg ILIT(REG_F4) = _FALSE_
955 #endif
956 #ifdef REG_D1
957 freeReg ILIT(REG_D1) = _FALSE_
958 #endif
959 #ifdef REG_D2
960 freeReg ILIT(REG_D2) = _FALSE_
961 #endif
962 #ifdef REG_Sp 
963 freeReg ILIT(REG_Sp)   = _FALSE_
964 #endif 
965 #ifdef REG_Su
966 freeReg ILIT(REG_Su)   = _FALSE_
967 #endif 
968 #ifdef REG_SpLim 
969 freeReg ILIT(REG_SpLim) = _FALSE_
970 #endif 
971 #ifdef REG_Hp 
972 freeReg ILIT(REG_Hp)   = _FALSE_
973 #endif
974 #ifdef REG_HpLim
975 freeReg ILIT(REG_HpLim) = _FALSE_
976 #endif
977 freeReg n               = _TRUE_
978 \end{code}