module Language.PowerPC.Syntax
( Program
, Instruction (..)
, SR (..)
, GPR (..)
, gpr
, gprIndex
) where
import Data.List
import Data.Maybe
type Program = [Instruction]
data Instruction
= ADDI GPR GPR Int
| B Int
| BA Int
| BL Int
| BLA Int
| MTSPR GPR SR
| Unknown Int Int Int
data SR = CTR | LR | XER | SRInvalid deriving (Show, Eq)
data GPR
= GPR0
| GPR1
| GPR2
| GPR3
| GPR4
| GPR5
| GPR6
| GPR7
| GPR8
| GPR9
| GPR10
| GPR11
| GPR12
| GPR13
| GPR14
| GPR15
| GPR16
| GPR17
| GPR18
| GPR19
| GPR20
| GPR21
| GPR22
| GPR23
| GPR24
| GPR25
| GPR26
| GPR27
| GPR28
| GPR29
| GPR30
| GPR31
deriving (Show, Eq)
gpr :: Int -> GPR
gpr a = if a < 0 || a > 31 then error "invalid GPR index" else
[ GPR0
, GPR1
, GPR2
, GPR3
, GPR4
, GPR5
, GPR6
, GPR7
, GPR8
, GPR9
, GPR10
, GPR11
, GPR12
, GPR13
, GPR14
, GPR15
, GPR16
, GPR17
, GPR18
, GPR19
, GPR20
, GPR21
, GPR22
, GPR23
, GPR24
, GPR25
, GPR26
, GPR27
, GPR28
, GPR29
, GPR30
, GPR31
] !! a
gprIndex :: GPR -> Int
gprIndex a = fromJust $ elemIndex a
[ GPR0
, GPR1
, GPR2
, GPR3
, GPR4
, GPR5
, GPR6
, GPR7
, GPR8
, GPR9
, GPR10
, GPR11
, GPR12
, GPR13
, GPR14
, GPR15
, GPR16
, GPR17
, GPR18
, GPR19
, GPR20
, GPR21
, GPR22
, GPR23
, GPR24
, GPR25
, GPR26
, GPR27
, GPR28
, GPR29
, GPR30
, GPR31
]