Print numbers with multiple digits

This commit is contained in:
Eugen Wissner 2024-09-27 00:22:44 +02:00
parent 8eaeb5afa3
commit f9c1f8d892
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
6 changed files with 46 additions and 23 deletions

View File

@ -35,6 +35,7 @@ common warnings
library elna-internal
import: warnings
exposed-modules:
Language.Elna.Allocator
Language.Elna.Architecture.RiscV
Language.Elna.AST
Language.Elna.CodeGenerator

View File

@ -0,0 +1,3 @@
module Language.Elna.Allocator
(
) where

View File

@ -10,7 +10,7 @@ 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 Language.Elna.Intermediate (Operand(..), Quadruple(..))
import qualified Language.Elna.Architecture.RiscV as RiscV
import Language.Elna.SymbolTable (SymbolTable)
@ -34,17 +34,20 @@ generateCode _ = HashMap.foldlWithKey' go Vector.empty
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)
[ Instruction (RiscV.BaseInstruction RiscV.OpImm $ RiscV.I RiscV.SP RiscV.ADDI RiscV.SP (negate 8))
, Instruction (RiscV.BaseInstruction RiscV.Store $ RiscV.S 4 RiscV.SW RiscV.SP RiscV.S0)
, Instruction (RiscV.BaseInstruction RiscV.Store $ RiscV.S 8 RiscV.SW RiscV.SP RiscV.RA)
, Instruction (RiscV.BaseInstruction RiscV.OpImm $ RiscV.I RiscV.S0 RiscV.ADDI RiscV.SP 8)
]
quadruple (ParameterQuadruple (IntOperand intValue)) = Vector.fromList
[ Instruction (RiscV.BaseInstruction RiscV.OpImm $ RiscV.I RiscV.A0 RiscV.ADDI RiscV.Zero $ fromIntegral intValue)
, Instruction (RiscV.BaseInstruction RiscV.Store $ RiscV.S 0 RiscV.SW RiscV.SP RiscV.A0)
]
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.Load $ RiscV.I RiscV.S0 RiscV.LW RiscV.SP 4)
, Instruction (RiscV.BaseInstruction RiscV.Load $ RiscV.I RiscV.RA RiscV.LW RiscV.SP 8)
, Instruction (RiscV.BaseInstruction RiscV.OpImm $ RiscV.I RiscV.SP RiscV.ADDI RiscV.SP 8)
, Instruction (RiscV.BaseInstruction RiscV.Jalr $ RiscV.I RiscV.RA RiscV.JALR RiscV.Zero 0)
]

View File

@ -0,0 +1 @@
13

View File

@ -0,0 +1,3 @@
proc main() {
printi(13);
}

View File

@ -6,29 +6,41 @@
.text
printi:
addi sp, sp, -4
addi sp, sp, -16
sw s0, 0(sp)
sw ra, 4(sp)
addi s0, sp, 4
addi s0, sp, 16
addi t1, zero, '\n'
sb t1, -1(s0)
# t0 - Whole number.
# t1 - Constant 10.
# a1 - Local buffer.
# t2 - Current character.
lw t0, 0(s0)
addi t1, zero, 10
addi a1, s0, -2
.digit10:
rem t2, t0, t1
addi t2, t2, '0'
sb t2, 0(a1)
div t0, t0, t1
addi a1, a1, -1
bne zero, t0, .digit10
addi t0, a0, 0
addi a0, a0, '0'
sw a0, 0(s0)
addi a0, x0, 1
addi a1, s0, 0
addi a2, x0, 1
addi a7, x0, 64
ecall
addi t1, x0, '\n'
sw t1, 0(s0)
addi a0, zero, 1
addi a1, a1, 1
sub a2, s0, a1
addi a7, zero, 64
ecall
addi a0, t0, 0
lw s0, 0(sp)
lw ra, 4(sp)
addi sp, sp, 4
addi sp, sp, 16
ret
_start: