diff options
| author | Eugen Wissner <belka@caraus.de> | 2024-10-01 00:02:19 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2024-10-01 00:02:19 +0200 |
| commit | bbb15a02181bf8354f29c4add9add38fafa5da65 (patch) | |
| tree | e5603b46b380736cc74af3e3647cd56488890169 /lib/Language/Elna/Allocator.hs | |
| parent | c2c923276f7ecde1f71e53309dc5d1cc53cd3ff2 (diff) | |
| download | elna-bbb15a02181bf8354f29c4add9add38fafa5da65.tar.gz | |
Add allocator convertion functions
Diffstat (limited to 'lib/Language/Elna/Allocator.hs')
| -rw-r--r-- | lib/Language/Elna/Allocator.hs | 38 |
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) |
