From bbb15a02181bf8354f29c4add9add38fafa5da65 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Tue, 1 Oct 2024 00:02:19 +0200 Subject: Add allocator convertion functions --- lib/Language/Elna/Allocator.hs | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'lib/Language/Elna/Allocator.hs') diff --git a/lib/Language/Elna/Allocator.hs b/lib/Language/Elna/Allocator.hs index a5ca574..3b32de4 100644 --- a/lib/Language/Elna/Allocator.hs +++ b/lib/Language/Elna/Allocator.hs @@ -1,3 +1,39 @@ module Language.Elna.Allocator - ( + ( MachineConfiguration(..) + , Store(..) + , allocate ) where + +import Data.HashMap.Strict (HashMap) +import Data.Vector (Vector) +import Language.Elna.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) + operand :: Operand Variable -> Operand (Store r) + operand (IntOperand x) = IntOperand x + operand (VariableOperand _) = VariableOperand (Store temporaryRegister) -- cgit v1.2.3