{-# LANGUAGE CPP #-}
module X86.RegInfo (
        mkVirtualReg,
        regDotColor
)

where

#include "nativeGen/NCG.h"
#include "GhclibHsVersions.h"

import GhcPrelude

import Format
import Reg

import Outputable
import Platform
import Unique

import UniqFM
import X86.Regs


mkVirtualReg :: Unique -> Format -> VirtualReg
mkVirtualReg :: Unique -> Format -> VirtualReg
mkVirtualReg Unique
u Format
format
   = case Format
format of
        Format
FF32    -> Unique -> VirtualReg
VirtualRegSSE Unique
u
        Format
FF64    -> Unique -> VirtualReg
VirtualRegSSE Unique
u
        Format
FF80    -> Unique -> VirtualReg
VirtualRegD   Unique
u
        Format
_other  -> Unique -> VirtualReg
VirtualRegI   Unique
u

regDotColor :: Platform -> RealReg -> SDoc
regDotColor :: Platform -> RealReg -> SDoc
regDotColor Platform
platform RealReg
reg
 = let Just [Char]
str = UniqFM [Char] -> RealReg -> Maybe [Char]
forall key elt. Uniquable key => UniqFM elt -> key -> Maybe elt
lookupUFM (Platform -> UniqFM [Char]
regColors Platform
platform) RealReg
reg
   in [Char] -> SDoc
text [Char]
str

regColors :: Platform -> UniqFM [Char]
regColors :: Platform -> UniqFM [Char]
regColors Platform
platform = [(Reg, [Char])] -> UniqFM [Char]
forall key elt. Uniquable key => [(key, elt)] -> UniqFM elt
listToUFM (Platform -> [(Reg, [Char])]
normalRegColors Platform
platform [(Reg, [Char])] -> [(Reg, [Char])] -> [(Reg, [Char])]
forall a. [a] -> [a] -> [a]
++ [(Reg, [Char])]
fpRegColors)

normalRegColors :: Platform -> [(Reg,String)]
normalRegColors :: Platform -> [(Reg, [Char])]
normalRegColors Platform
platform
 | Platform -> Bool
target32Bit Platform
platform = [ (Reg
eax, [Char]
"#00ff00")
                          , (Reg
ebx, [Char]
"#0000ff")
                          , (Reg
ecx, [Char]
"#00ffff")
                          , (Reg
edx, [Char]
"#0080ff") ]
 | Bool
otherwise            = [ (Reg
rax, [Char]
"#00ff00"), (Reg
eax, [Char]
"#00ff00")
                          , (Reg
rbx, [Char]
"#0000ff"), (Reg
ebx, [Char]
"#0000ff")
                          , (Reg
rcx, [Char]
"#00ffff"), (Reg
ecx, [Char]
"#00ffff")
                          , (Reg
rdx, [Char]
"#0080ff"), (Reg
edx, [Char]
"#00ffff")
                          , (Reg
r8,  [Char]
"#00ff80")
                          , (Reg
r9,  [Char]
"#008080")
                          , (Reg
r10, [Char]
"#0040ff")
                          , (Reg
r11, [Char]
"#00ff40")
                          , (Reg
r12, [Char]
"#008040")
                          , (Reg
r13, [Char]
"#004080")
                          , (Reg
r14, [Char]
"#004040")
                          , (Reg
r15, [Char]
"#002080") ]

fpRegColors :: [(Reg,String)]
fpRegColors :: [(Reg, [Char])]
fpRegColors =
        [ (Reg
fake0, [Char]
"#ff00ff")
        , (Reg
fake1, [Char]
"#ff00aa")
        , (Reg
fake2, [Char]
"#aa00ff")
        , (Reg
fake3, [Char]
"#aa00aa")
        , (Reg
fake4, [Char]
"#ff0055")
        , (Reg
fake5, [Char]
"#5500ff") ]

        [(Reg, [Char])] -> [(Reg, [Char])] -> [(Reg, [Char])]
forall a. [a] -> [a] -> [a]
++ [Reg] -> [[Char]] -> [(Reg, [Char])]
forall a b. [a] -> [b] -> [(a, b)]
zip ((RegNo -> Reg) -> [RegNo] -> [Reg]
forall a b. (a -> b) -> [a] -> [b]
map RegNo -> Reg
regSingle [RegNo
24..RegNo
39]) ([Char] -> [[Char]]
forall a. a -> [a]
repeat [Char]
"red")