1 --------------------------------------------------------------------------------
2 -- | Deal with Cmm registers
5 module LlvmCodeGen.Regs (
6 lmGlobalRegArg, lmGlobalRegVar
9 #include "HsVersions.h"
14 import Outputable ( panic )
17 -- | Get the LlvmVar function variable storing the real register
18 lmGlobalRegVar :: GlobalReg -> LlvmVar
20 = let reg' = lmGlobalReg "_Var" reg
21 in if (isPointer . getVarType) reg'
25 -- | Get the LlvmVar function argument storing the real register
26 lmGlobalRegArg :: GlobalReg -> LlvmVar
27 lmGlobalRegArg = lmGlobalReg "_Arg"
29 {- Need to make sure the names here can't conflict with the unique generated
30 names. Uniques generated names containing only base62 chars. So using say
31 the '_' char guarantees this.
33 lmGlobalReg :: String -> GlobalReg -> LlvmVar
36 BaseReg -> ptrGlobal $ "Base" ++ suf
37 Sp -> ptrGlobal $ "Sp" ++ suf
38 Hp -> ptrGlobal $ "Hp" ++ suf
39 VanillaReg 1 _ -> wordGlobal $ "R1" ++ suf
40 VanillaReg 2 _ -> wordGlobal $ "R2" ++ suf
41 VanillaReg 3 _ -> wordGlobal $ "R3" ++ suf
42 VanillaReg 4 _ -> wordGlobal $ "R4" ++ suf
43 VanillaReg 5 _ -> wordGlobal $ "R5" ++ suf
44 VanillaReg 6 _ -> wordGlobal $ "R6" ++ suf
45 SpLim -> wordGlobal $ "SpLim" ++ suf
46 FloatReg 1 -> floatGlobal $"F1" ++ suf
47 FloatReg 2 -> floatGlobal $"F2" ++ suf
48 FloatReg 3 -> floatGlobal $"F3" ++ suf
49 FloatReg 4 -> floatGlobal $"F4" ++ suf
50 DoubleReg 1 -> doubleGlobal $ "D1" ++ suf
51 DoubleReg 2 -> doubleGlobal $ "D2" ++ suf
52 _other -> panic $ "LlvmCodeGen.Reg: GlobalReg (" ++ (show reg)
55 wordGlobal name = LMNLocalVar (fsLit name) llvmWord
56 ptrGlobal name = LMNLocalVar (fsLit name) llvmWordPtr
57 floatGlobal name = LMNLocalVar (fsLit name) LMFloat
58 doubleGlobal name = LMNLocalVar (fsLit name) LMDouble