module RegAlloc.Linear.SPARC.FreeRegs
where
-import MachRegs
+import Regs
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.
+ -- 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 == 43 = regs
| r == 45 = regs
| r == 47 = regs