diff options
Diffstat (limited to 'lib/Language/Elna/CodeGenerator.hs')
| -rw-r--r-- | lib/Language/Elna/CodeGenerator.hs | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/lib/Language/Elna/CodeGenerator.hs b/lib/Language/Elna/CodeGenerator.hs index 704f625..1ddfb21 100644 --- a/lib/Language/Elna/CodeGenerator.hs +++ b/lib/Language/Elna/CodeGenerator.hs @@ -1,17 +1,28 @@ module Language.Elna.CodeGenerator - ( generateCode + ( Asm(..) + , generateCode ) where +import Data.Text (Text) import Data.Vector (Vector) import qualified Data.Vector as Vector import Language.Elna.Intermediate (Quadruple(..)) import qualified Language.Elna.Architecture.RiscV as RiscV import Language.Elna.SymbolTable (SymbolTable) -generateCode :: SymbolTable -> Vector Quadruple -> Vector RiscV.Instruction +data Directive + = GlobalDirective + | FunctionDirective + deriving (Eq, Show) + +data Asm + = Instruction RiscV.Instruction + | JumpLabel Text [Directive] + deriving Eq + +generateCode :: SymbolTable -> Vector Quadruple -> Vector Asm generateCode _ _ = Vector.fromList - [ RiscV.CallInstruction "printi" - , RiscV.Instruction RiscV.OpImm $ RiscV.I RiscV.A0 RiscV.ADDI RiscV.Zero 0 - , RiscV.Instruction RiscV.OpImm $ RiscV.I RiscV.A7 RiscV.ADDI RiscV.Zero 93 - , RiscV.Instruction RiscV.System $ RiscV.Type RiscV.Zero RiscV.PRIV RiscV.Zero RiscV.ECALL + [ JumpLabel "main" [GlobalDirective, FunctionDirective] + , Instruction (RiscV.CallInstruction "printi") + , Instruction (RiscV.BaseInstruction RiscV.Jalr $ RiscV.I RiscV.RA RiscV.JALR RiscV.Zero 0) ] |
