summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/Backend
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Language/Elna/Backend')
-rw-r--r--lib/Language/Elna/Backend/Allocator.hs41
-rw-r--r--lib/Language/Elna/Backend/Intermediate.hs46
2 files changed, 87 insertions, 0 deletions
diff --git a/lib/Language/Elna/Backend/Allocator.hs b/lib/Language/Elna/Backend/Allocator.hs
new file mode 100644
index 0000000..9ad849e
--- /dev/null
+++ b/lib/Language/Elna/Backend/Allocator.hs
@@ -0,0 +1,41 @@
+module Language.Elna.Backend.Allocator
+ ( MachineConfiguration(..)
+ , Store(..)
+ , allocate
+ ) where
+
+import Data.HashMap.Strict (HashMap)
+import Data.Vector (Vector)
+import Language.Elna.Backend.Intermediate (Operand(..), Quadruple(..), Variable(..))
+import Language.Elna.Location (Identifier(..))
+
+newtype Store r = Store r
+
+newtype MachineConfiguration r = MachineConfiguration
+ { temporaryRegister :: r
+ }
+
+allocate
+ :: forall r
+ . MachineConfiguration r
+ -> HashMap Identifier (Vector (Quadruple Variable))
+ -> HashMap Identifier (Vector (Quadruple (Store r)))
+allocate MachineConfiguration{..} = fmap function
+ where
+ function :: Vector (Quadruple Variable) -> Vector (Quadruple (Store r))
+ function = fmap quadruple
+ quadruple :: Quadruple Variable -> Quadruple (Store r)
+ quadruple StartQuadruple = StartQuadruple
+ quadruple StopQuadruple = StopQuadruple
+ quadruple (ParameterQuadruple operand1) =
+ ParameterQuadruple (operand operand1)
+ quadruple (CallQuadruple name count) = CallQuadruple name count
+ quadruple (AddQuadruple operand1 operand2 _) =
+ AddQuadruple (operand operand1) (operand operand2) (Store temporaryRegister)
+ quadruple (SubtractionQuadruple operand1 operand2 _) =
+ SubtractionQuadruple (operand operand1) (operand operand2) (Store temporaryRegister)
+ quadruple (NegationQuadruple operand1 _) =
+ NegationQuadruple (operand operand1) (Store temporaryRegister)
+ operand :: Operand Variable -> Operand (Store r)
+ operand (IntOperand x) = IntOperand x
+ operand (VariableOperand _) = VariableOperand (Store temporaryRegister)
diff --git a/lib/Language/Elna/Backend/Intermediate.hs b/lib/Language/Elna/Backend/Intermediate.hs
new file mode 100644
index 0000000..01a026b
--- /dev/null
+++ b/lib/Language/Elna/Backend/Intermediate.hs
@@ -0,0 +1,46 @@
+module Language.Elna.Backend.Intermediate
+ ( Operand(..)
+ , Quadruple(..)
+ {- , Label(..) -}
+ , Variable(..)
+ ) where
+
+import Data.Int (Int32)
+import Data.Word (Word32)
+import Data.Text (Text)
+
+newtype Variable = TempVariable Word32 -- | Variable Text
+ deriving Eq
+
+instance Show Variable
+ where
+ -- show (Variable variable) = '$' : Text.unpack variable
+ show (TempVariable variable) = '$' : show variable
+
+data Operand v
+ = IntOperand Int32
+ | VariableOperand v
+ deriving (Eq, Show)
+
+data Quadruple v
+ = StartQuadruple
+ | StopQuadruple
+ | ParameterQuadruple (Operand v)
+ | CallQuadruple Text Word32
+ | AddQuadruple (Operand v) (Operand v) v
+ | SubtractionQuadruple (Operand v) (Operand v) v
+ | NegationQuadruple (Operand v) v
+ {-| GoToQuadruple Label
+ | AssignQuadruple Operand Variable
+ | ArrayQuadruple Variable Operand Variable
+ | ArrayAssignQuadruple Operand Operand Variable
+ | ProductQuadruple Operand Operand Variable
+ | DivisionQuadruple Operand Operand Variable
+ | EqualQuadruple Operand Operand Label
+ | NonEqualQuadruple Operand Operand Label
+ | LessQuadruple Operand Operand Label
+ | GreaterQuadruple Operand Operand Label
+ | LessOrEqualQuadruple Operand Operand Label
+ | GreaterOrEqualQuadruple Operand Operand Label
+ | LabelQuadruple Label -}
+ deriving (Eq, Show)