summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/Allocator.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-10-01 00:02:19 +0200
committerEugen Wissner <belka@caraus.de>2024-10-01 00:02:19 +0200
commitbbb15a02181bf8354f29c4add9add38fafa5da65 (patch)
treee5603b46b380736cc74af3e3647cd56488890169 /lib/Language/Elna/Allocator.hs
parentc2c923276f7ecde1f71e53309dc5d1cc53cd3ff2 (diff)
downloadelna-bbb15a02181bf8354f29c4add9add38fafa5da65.tar.gz
Add allocator convertion functions
Diffstat (limited to 'lib/Language/Elna/Allocator.hs')
-rw-r--r--lib/Language/Elna/Allocator.hs38
1 files changed, 37 insertions, 1 deletions
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)