diff options
Diffstat (limited to 'lib/Language/Elna/CodeGenerator.hs')
| -rw-r--r-- | lib/Language/Elna/CodeGenerator.hs | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/lib/Language/Elna/CodeGenerator.hs b/lib/Language/Elna/CodeGenerator.hs index 832917f..3cb5c1d 100644 --- a/lib/Language/Elna/CodeGenerator.hs +++ b/lib/Language/Elna/CodeGenerator.hs @@ -4,8 +4,12 @@ module Language.Elna.CodeGenerator ) where import Data.ByteString (ByteString) +import Data.HashMap.Strict (HashMap) +import qualified Data.HashMap.Strict as HashMap import Data.Vector (Vector) import qualified Data.Vector as Vector +import qualified Data.Text.Encoding as Text.Encoding +import Language.Elna.Location (Identifier(..)) import Language.Elna.Intermediate (Quadruple(..)) import qualified Language.Elna.Architecture.RiscV as RiscV import Language.Elna.SymbolTable (SymbolTable) @@ -20,9 +24,27 @@ data Statement | JumpLabel ByteString [Directive] deriving Eq -generateCode :: SymbolTable -> Vector Quadruple -> Vector Statement -generateCode _ _ = Vector.fromList - [ JumpLabel "main" [GlobalDirective, FunctionDirective] - , Instruction (RiscV.CallInstruction "printi") +generateCode :: SymbolTable -> HashMap Identifier (Vector Quadruple) -> Vector Statement +generateCode _ = HashMap.foldlWithKey' go Vector.empty + where + go accumulator (Identifier key) value = + let code = Vector.cons (JumpLabel (Text.Encoding.encodeUtf8 key) [GlobalDirective, FunctionDirective]) + $ Vector.foldMap quadruple value + in accumulator <> code + +quadruple :: Quadruple -> Vector Statement +quadruple StartQuadruple = Vector.fromList + [ Instruction (RiscV.BaseInstruction RiscV.OpImm $ RiscV.I RiscV.SP RiscV.ADDI RiscV.SP (negate 4)) + , Instruction (RiscV.BaseInstruction RiscV.Store $ RiscV.S 0 RiscV.SW RiscV.SP RiscV.S0) + , Instruction (RiscV.BaseInstruction RiscV.Store $ RiscV.S 4 RiscV.SW RiscV.SP RiscV.RA) + , Instruction (RiscV.BaseInstruction RiscV.OpImm $ RiscV.I RiscV.S0 RiscV.ADDI RiscV.SP 4) + ] +quadruple (ParameterQuadruple _) = mempty +quadruple (CallQuadruple callName _) = Vector.singleton + $ Instruction (RiscV.CallInstruction callName) +quadruple StopQuadruple = Vector.fromList + [ Instruction (RiscV.BaseInstruction RiscV.Load $ RiscV.I RiscV.S0 RiscV.LW RiscV.SP 0) + , Instruction (RiscV.BaseInstruction RiscV.Load $ RiscV.I RiscV.RA RiscV.LW RiscV.SP 4) + , Instruction (RiscV.BaseInstruction RiscV.OpImm $ RiscV.I RiscV.SP RiscV.ADDI RiscV.SP 4) , Instruction (RiscV.BaseInstruction RiscV.Jalr $ RiscV.I RiscV.RA RiscV.JALR RiscV.Zero 0) ] |
