module RegAlloc.Linear.SPARC.FreeRegs
where
-import MachRegs
+import SPARC.Regs
+import SPARC.RegPlate
+import RegClass
+import Reg
import Outputable
+import FastBool
import Data.Word
import Data.Bits
import Data.List
+
--------------------------------------------------------------------------------
-- SPARC is like PPC, except for twinning of floating point regs.
-- When we allocate a double reg we must take an even numbered
--
releaseReg :: RegNo -> FreeRegs -> FreeRegs
releaseReg r regs@(FreeRegs g f d)
-
- -- used by STG machine, or otherwise unavailable
- | r >= 0 && r <= 15 = regs
--- | r >= 3 && r <= 15 = regs
-
- | r >= 17 && r <= 21 = regs
- | r >= 24 && r <= 31 = regs
- | r >= 32 && r <= 41 = regs
- | r >= 54 && r <= 59 = regs
-
- -- never release the high part of double regs.
- | r == 43 = regs
- | r == 45 = regs
- | r == 47 = regs
- | r == 49 = regs
- | r == 51 = regs
- | r == 53 = regs
+ -- don't release pinned reg
+ | not $ isFastTrue (freeReg r)
+ = regs
+
+ -- don't release the high part of double regs
+ -- this prevents them from being allocated as single precison regs.
+ | r == 39 = regs
+ | r == 41 = regs
+ | r == 43 = regs
+ | r == 45 = regs
+ | r == 47 = regs
+ | r == 49 = regs
+ | r == 51 = regs
+ | r == 53 = regs
-- a general purpose reg
| r <= 31