From fdf56ce9d0de459dc5bd65537847ded7b02ad5c2 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Wed, 2 Oct 2024 22:56:15 +0200 Subject: Negate integral expressions --- lib/Language/Elna/Backend/Allocator.hs | 41 ++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 lib/Language/Elna/Backend/Allocator.hs (limited to 'lib/Language/Elna/Backend/Allocator.hs') 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) -- cgit v1.2.3