module GHC.CmmToAsm.X86.RegInfo (
        mkVirtualReg,
        regDotColor
)

where

import GHC.Prelude

import GHC.CmmToAsm.Format
import GHC.Platform.Reg

import GHC.Utils.Outputable
import GHC.Utils.Panic
import GHC.Platform
import GHC.Types.Unique

import GHC.Types.Unique.FM
import GHC.CmmToAsm.X86.Regs


mkVirtualReg :: Unique -> Format -> VirtualReg
mkVirtualReg :: Unique -> Format -> VirtualReg
mkVirtualReg Unique
u Format
format
   = case Format
format of
        Format
FF32    -> Unique -> VirtualReg
VirtualRegD Unique
u
        -- On X86, we pass 32-bit floats in the same registers as 64-bit floats.
        Format
FF64    -> Unique -> VirtualReg
VirtualRegD Unique
u
        -- SIMD NCG TODO: add support for 256 and 512-wide vectors.
        VecFormat {} -> Unique -> VirtualReg
VirtualRegV128 Unique
u
        Format
_other  -> Unique -> VirtualReg
VirtualRegI Unique
u

regDotColor :: Platform -> RealReg -> SDoc
regDotColor :: Platform -> RealReg -> SDoc
regDotColor Platform
platform RealReg
reg
 = case (UniqFM RealReg [Char] -> RealReg -> Maybe [Char]
forall key elt. Uniquable key => UniqFM key elt -> key -> Maybe elt
lookupUFM (Platform -> UniqFM RealReg [Char]
regColors Platform
platform) RealReg
reg) of
        Just [Char]
str -> [Char] -> SDoc
forall doc. IsLine doc => [Char] -> doc
text [Char]
str
        Maybe [Char]
_        -> [Char] -> SDoc
forall a. HasCallStack => [Char] -> a
panic [Char]
"Register not assigned a color"

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

normalRegColors :: Platform -> [(RealReg,String)]
normalRegColors :: Platform -> [(RealReg, [Char])]
normalRegColors Platform
platform =
    [RealReg] -> [[Char]] -> [(RealReg, [Char])]
forall a b. [a] -> [b] -> [(a, b)]
zip ((RegNo -> RealReg) -> [RegNo] -> [RealReg]
forall a b. (a -> b) -> [a] -> [b]
map RegNo -> RealReg
realRegSingle [RegNo
0..Platform -> RegNo
lastint Platform
platform]) [[Char]]
colors
        [(RealReg, [Char])] -> [(RealReg, [Char])] -> [(RealReg, [Char])]
forall a. [a] -> [a] -> [a]
++ [RealReg] -> [[Char]] -> [(RealReg, [Char])]
forall a b. [a] -> [b] -> [(a, b)]
zip ((RegNo -> RealReg) -> [RegNo] -> [RealReg]
forall a b. (a -> b) -> [a] -> [b]
map RegNo -> RealReg
realRegSingle [RegNo
firstxmm..Platform -> RegNo
lastxmm Platform
platform]) [[Char]]
greys
  where
    -- 16 colors - enough for amd64 gp regs
    colors :: [[Char]]
colors = [[Char]
"#800000",[Char]
"#ff0000",[Char]
"#808000",[Char]
"#ffff00",[Char]
"#008000"
             ,[Char]
"#00ff00",[Char]
"#008080",[Char]
"#00ffff",[Char]
"#000080",[Char]
"#0000ff"
             ,[Char]
"#800080",[Char]
"#ff00ff",[Char]
"#87005f",[Char]
"#875f00",[Char]
"#87af00"
             ,[Char]
"#ff00af"]

    -- 16 shades of grey, enough for the currently supported
    -- SSE extensions.
    greys :: [[Char]]
greys = [[Char]
"#0e0e0e",[Char]
"#1c1c1c",[Char]
"#2a2a2a",[Char]
"#383838",[Char]
"#464646"
            ,[Char]
"#545454",[Char]
"#626262",[Char]
"#707070",[Char]
"#7e7e7e",[Char]
"#8c8c8c"
            ,[Char]
"#9a9a9a",[Char]
"#a8a8a8",[Char]
"#b6b6b6",[Char]
"#c4c4c4",[Char]
"#d2d2d2"
            ,[Char]
"#e0e0e0"]



--     32 shades of grey - use for avx 512 if we ever need it
--     greys = ["#070707","#0e0e0e","#151515","#1c1c1c"
--             ,"#232323","#2a2a2a","#313131","#383838","#3f3f3f"
--             ,"#464646","#4d4d4d","#545454","#5b5b5b","#626262"
--             ,"#696969","#707070","#777777","#7e7e7e","#858585"
--             ,"#8c8c8c","#939393","#9a9a9a","#a1a1a1","#a8a8a8"
--             ,"#afafaf","#b6b6b6","#bdbdbd","#c4c4c4","#cbcbcb"
--             ,"#d2d2d2","#d9d9d9","#e0e0e0"]