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 +++++++++++++++++++++++++++ lib/Language/Elna/Backend/Intermediate.hs | 46 +++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 lib/Language/Elna/Backend/Allocator.hs create mode 100644 lib/Language/Elna/Backend/Intermediate.hs (limited to 'lib/Language/Elna/Backend') 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) -- cgit v1.2.3