summaryrefslogtreecommitdiff
path: root/boot/stage1.s
diff options
context:
space:
mode:
Diffstat (limited to 'boot/stage1.s')
-rw-r--r--boot/stage1.s659
1 files changed, 368 insertions, 291 deletions
diff --git a/boot/stage1.s b/boot/stage1.s
index d957af2..8258075 100644
--- a/boot/stage1.s
+++ b/boot/stage1.s
@@ -123,7 +123,7 @@ compile_binary_expression:
addi s0, sp, 32
li a0, 0
- call _build_expression
+ call compile_expression
mv a0, s1
addi a1, sp, 12
@@ -153,64 +153,64 @@ compile_binary_expression:
.Lcompile_binary_expression_equal:
mv s1, a0 # Skip =.
li a0, 1
- call _build_expression
- la a0, asm_sub_a0_a1
- li a1, ASM_SUB_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_SUB_A0_A1_SIZE
+ la a1, asm_sub_a0_a1
+ call _write_s
- la a0, asm_seqz_a0
- li a1, ASM_SEQZ_A0_SIZE
- call _write_out
+ li a0, ASM_SEQZ_A0_SIZE
+ la a1, asm_seqz_a0
+ call _write_s
j .Lcompile_binary_expression_end
.Lcompile_binary_expression_and:
mv s1, a0 # Skip &.
li a0, 1
- call _build_expression
- la a0, asm_and_a0_a1
- li a1, ASM_AND_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_AND_A0_A1_SIZE
+ la a1, asm_and_a0_a1
+ call _write_s
j .Lcompile_binary_expression_end
.Lcompile_binary_expression_or:
mv s1, a0 # Skip or.
li a0, 1
- call _build_expression
- la a0, asm_or_a0_a1
- li a1, ASM_OR_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_OR_A0_A1_SIZE
+ la a1, asm_or_a0_a1
+ call _write_s
j .Lcompile_binary_expression_end
.Lcompile_binary_expression_plus:
mv s1, a0 # Skip +.
li a0, 1
- call _build_expression
- la a0, asm_add_a0_a1
- li a1, ASM_ADD_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_ADD_A0_A1_SIZE
+ la a1, asm_add_a0_a1
+ call _write_s
j .Lcompile_binary_expression_end
.Lcompile_binary_expression_minus:
mv s1, a0 # Skip -.
li a0, 1
- call _build_expression
- la a0, asm_sub_a0_a1
- li a1, ASM_SUB_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_SUB_A0_A1_SIZE
+ la a1, asm_sub_a0_a1
+ call _write_s
j .Lcompile_binary_expression_end
.Lcompile_binary_expression_product:
mv s1, a0 # Skip *.
li a0, 1
- call _build_expression
- la a0, asm_mul_a0_a1
- li a1, ASM_MUL_A0_A1_SIZE
- call _write_out
+ call compile_expression
+ li a0, ASM_MUL_A0_A1_SIZE
+ la a1, asm_mul_a0_a1
+ call _write_s
j .Lcompile_binary_expression_end
@@ -295,19 +295,21 @@ compile_identifier_expression:
call symbol_table_find
sw a0, 12(sp)
- mv a0, s1
- lw a1, 20(sp)
- call is_local_identifier
- bnez a0, .Lcompile_identifier_expression_local
+ beqz a0, .Lcompile_identifier_expression_by_name
+ lw t0, 0(a0)
+
+ li t1, INFO_PARAMETER
+ beq t0, t1, .Lcompile_identifier_expression_parameter
+ li t1, INFO_LOCAL
+ beq t0, t1, .Lcompile_identifier_expression_local
+
+.Lcompile_identifier_expression_by_name:
mv a0, s1
lw a1, 20(sp)
call is_register_identifier
bnez a0, .Lcompile_identifier_expression_saved
- lw t0, 12(sp)
- bnez t0, .Lcompile_identifier_expression_defined
-
# Global identifier.
lw t1, 16(sp)
li t0, 0x00202c00 # \0,_
@@ -315,16 +317,16 @@ compile_identifier_expression:
sw t0, 8(sp)
li t0, 0x6120616c # la a
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 4
+ call _write_s
- mv a0, s1
- lw a1, 20(sp)
- call _write_out
+ lw a0, 20(sp)
+ mv a1, s1
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
lbu a0, (s1)
call _is_upper
@@ -340,86 +342,83 @@ compile_identifier_expression:
sw t0, 4(sp)
li t0, 0x6120776c # lw a
sw t0, 0(sp)
- addi a0, sp, 0
- li a1, 12
- call _write_out
+ li a0, 12
+ addi a1, sp, 0
+ call _write_s
j .Lcompile_identifier_expression_end
-.Lcompile_identifier_expression_defined:
+.Lcompile_identifier_expression_parameter:
lw t1, 16(sp)
li t0, 0x00202c00 # \0,_
or t0, t0, t1
sw t0, 8(sp)
li t0, 0x6120776c # lw a
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 4
+ call _write_s
lw a0, 12(sp)
lw a0, 8(a0)
- call _printi
+ call _write_i
- li t0, 0x29707328 # (sp)
+ li t0, 0x29307328 # (s0)
sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 4
- call _write_out
+ li a0, 4
+ addi a1, sp, 8
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
j .Lcompile_identifier_expression_end
-.Lcompile_identifier_expression_saved:
- li t0, 0x00202c00 # \0,_
+.Lcompile_identifier_expression_local:
lw t1, 16(sp)
+ li t0, 0x00202c00 # \0,_
or t0, t0, t1
sw t0, 8(sp)
- li t0, 0x6120766d # mv a
+ li t0, 0x6120776c # lw a
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 4
+ call _write_s
- mv a0, s1
- lw a1, 20(sp)
- call _write_out
+ lw a0, 12(sp)
+ lw a0, 8(a0)
+ call _write_i
+ li t0, 0x29707328 # (sp)
+ sw t0, 8(sp)
+ li a0, 4
+ addi a1, sp, 8
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
j .Lcompile_identifier_expression_end
-.Lcompile_identifier_expression_local:
- lw t1, 16(sp)
+.Lcompile_identifier_expression_saved:
li t0, 0x00202c00 # \0,_
+ lw t1, 16(sp)
or t0, t0, t1
sw t0, 8(sp)
- li t0, 0x6120776c # lw a
+ li t0, 0x6120766d # mv a
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 4
+ call _write_s
- mv a0, s1
- lw a1, 20(sp)
- addi a0, a0, 4 # Skip the "loca" variable prefix.
- addi a1, a1, -4 # Skip the "loca" variable prefix.
- call _write_out
+ lw a0, 20(sp)
+ mv a1, s1
+ call _write_s
- li t0, 0x29707328 # (sp)
- sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 4
- call _write_out
li a0, '\n'
- call _put_char
+ call _write_c
j .Lcompile_identifier_expression_end
.Lcompile_identifier_expression_end:
-
# Epilogue.
lw ra, 28(sp)
lw s0, 24(sp)
@@ -429,8 +428,8 @@ compile_identifier_expression:
# Evalutes an expression and saves the result in a0.
#
# a0 - X in aX, the register number to save the result.
-.type _build_expression, @function
-_build_expression:
+.type compile_expression, @function
+compile_expression:
# Prologue.
addi sp, sp, -48
sw ra, 44(sp)
@@ -448,69 +447,47 @@ _build_expression:
lw a0, 24(sp)
li t0, TOKEN_MINUS
- beq a0, t0, .Lbuild_expression_negate
+ beq a0, t0, .Lcompile_expression_negate
li t0, TOKEN_AT
- beq a0, t0, .Lbuild_expression_address
+ beq a0, t0, .Lcompile_expression_address
li t0, TOKEN_INTEGER
- beq a0, t0, .Lbuild_expression_literal
+ beq a0, t0, .Lcompile_expression_literal
lw a0, 32(sp)
lbu a0, (a0)
li t0, '_'
- beq a0, t0, .Lbuild_expression_call
+ beq a0, t0, .Lcompile_expression_call
lw s1, 32(sp)
lw a0, 28(sp)
lw a1, 36(sp)
call compile_identifier_expression
- j .Lbuild_expression_advance
+ j .Lcompile_expression_advance
-.Lbuild_expression_negate:
+.Lcompile_expression_negate:
lw s1, 20(sp) # Skip the -.
mv a0, zero
- call _build_expression
+ call compile_expression
- la a0, asm_neg_a0
- li a1, ASM_NEG_A0_SIZE
- call _write_out
+ li a0, ASM_NEG_A0_SIZE
+ la a1, asm_neg_a0
+ call _write_s
- j .Lbuild_expression_end
+ j .Lcompile_expression_end
-.Lbuild_expression_address:
- lw t1, 36(sp)
- li t0, 0x20 # _
- sw t0, 16(sp)
- li t0, 0x2c707320 # _sp,
- sw t0, 12(sp)
- li t0, 0x2c006120 # _a\0,
- sw t0, 8(sp)
- sb t1, 10(sp)
- li t0, 0x69646461 # addi
- sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 13
- call _write_out
-
- lw a0, 20(sp) # Skip @.
- addi a1, sp, 24
- call lex_next
- mv s1, a0
-
- lw a0, 32(sp)
- lw a1, 28(sp)
- addi a0, a0, 4 # Skip the "loca" variable prefix.
- addi a1, a1, -4 # Skip the "loca" variable prefix.
- call _write_out
+.Lcompile_expression_address:
+ lw a0, 20(sp)
+ mv s1, a0 # Skip @.
- li a0, '\n'
- call _put_char
+ lw a0, 36(sp)
+ call compile_at_expression
- j .Lbuild_expression_end
+ j .Lcompile_expression_end
-.Lbuild_expression_call:
+.Lcompile_expression_call:
lw a0, 20(sp)
addi a1, sp, 8
call lex_next
@@ -520,32 +497,140 @@ _build_expression:
lw a1, 28(sp)
call compile_call
- j .Lbuild_expression_end
+ j .Lcompile_expression_end
-.Lbuild_expression_literal:
+.Lcompile_expression_literal:
lw t1, 36(sp)
li t0, 0x00202c00 # \0,_
or t0, t0, t1
sw t0, 16(sp)
li t0, 0x6120696c # li a
sw t0, 12(sp)
- addi a0, sp, 12
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 12
+ call _write_s
- lw a0, 32(sp)
- lw a1, 28(sp)
- call _write_out
+ lw a0, 28(sp)
+ lw a1, 32(sp)
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
- j .Lbuild_expression_advance
+ j .Lcompile_expression_advance
-.Lbuild_expression_advance:
+.Lcompile_expression_advance:
lw s1, 20(sp)
-.Lbuild_expression_end:
+.Lcompile_expression_end:
+ # Epilogue.
+ lw ra, 44(sp)
+ lw s0, 40(sp)
+ addi sp, sp, 48
+ ret
+
+# Expression taking an identifier address.
+#
+# Parameters:
+# a0 - Register number as character
+.type compile_at_expression, @function
+compile_at_expression:
+ # Prologue.
+ addi sp, sp, -48
+ sw ra, 44(sp)
+ sw s0, 40(sp)
+ addi s0, sp, 48
+
+ sw a0, 36(sp)
+
+ mv a0, s1
+ addi a1, sp, 24
+ call lex_next
+ mv s1, a0
+
+ lw a0, 28(sp)
+ lw a1, 32(sp)
+ call symbol_table_find
+ sw a0, 20(sp)
+ lw t0, 0(a0)
+
+ li t1, INFO_PARAMETER
+ beq t0, t1, .Lcompile_at_expression_parameter
+
+ li t1, INFO_LOCAL
+ beq t0, t1, .Lcompile_at_expression_local
+
+ unimp
+
+.Lcompile_at_expression_local:
+ lw a0, 36(sp)
+ li t0, 0x20 # _
+ sw t0, 16(sp)
+ li t0, 0x2c707320 # _sp,
+ sw t0, 12(sp)
+ li t0, 0x2c006120 # _a\0,
+ sw t0, 8(sp)
+ sb a0, 10(sp)
+ li t0, 0x69646461 # addi
+ sw t0, 4(sp)
+ li a0, 13
+ addi a1, sp, 4
+ call _write_s
+
+ lw a0, 20(sp)
+ lw a0, 8(a0)
+ call _write_i
+
+ j .Lcompile_at_expression_end
+
+.Lcompile_at_expression_parameter:
+ lw a0, 36(sp)
+ li t0, 0x20 # _
+ sw t0, 16(sp)
+ li t0, 0x2c307320 # _s0,
+ sw t0, 12(sp)
+ li t0, 0x2c006120 # _a\0,
+ sw t0, 8(sp)
+ sb a0, 10(sp)
+ li t0, 0x69646461 # addi
+ sw t0, 4(sp)
+ li a0, 13
+ addi a1, sp, 4
+ call _write_s
+
+ lw a0, 20(sp)
+ lw a0, 8(a0)
+ call _write_i
+
+ j .Lcompile_at_expression_end
+
+.Lcompile_at_expression_undefined:
+ lw a0, 36(sp)
+ li t0, 0x20 # _
+ sw t0, 16(sp)
+ li t0, 0x2c707320 # _sp,
+ sw t0, 12(sp)
+ li t0, 0x2c006120 # _a\0,
+ sw t0, 8(sp)
+ sb a0, 10(sp)
+ li t0, 0x69646461 # addi
+ sw t0, 4(sp)
+ li a0, 13
+ addi a1, sp, 4
+ call _write_s
+
+ lw a0, 32(sp)
+ lw a1, 28(sp)
+ addi a0, a1, -4 # Skip the "loca" variable prefix.
+ addi a1, a0, 4 # Skip the "loca" variable prefix.
+ call _write_s
+
+ j .Lcompile_at_expression_end
+
+.Lcompile_at_expression_end:
+ li a0, '\n'
+ call _write_c
+
# Epilogue.
lw ra, 44(sp)
lw s0, 40(sp)
@@ -583,49 +668,48 @@ compile_designator_expression:
sw t0, 12(sp)
li t0, 0x61207773 # sw a
sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 8
+ call _write_s
- lw a0, 20(sp)
- lw a1, 16(sp)
- addi a0, a0, 4 # Skip the "loca" variable prefix.
- addi a1, a1, -4 # Skip the "loca" variable prefix.
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ addi a0, a0, -4 # Skip the "loca" variable prefix.
+ addi a1, a1, 4 # Skip the "loca" variable prefix.
+ call _write_s
li t0, '\n'
sw t0, 12(sp)
li t0, 0x29707328 # (sp)
sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 5
- call _write_out
+ li a0, 5
+ addi a1, sp, 8
+ call _write_s
j .Lcompile_designator_expression_end
.Lcompile_designator_expression_saved:
li t0, 0x20766d # mv_
sw t0, 12(sp)
- addi a0, sp, 12
- li a1, 3
- call _write_out
+ li a0, 3
+ addi a1, sp, 12
+ call _write_s
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ call _write_s
li t0, 0x0a # \n
sw t0, 12(sp)
li t0, 0x3061202c # , a0
sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 5
- call _write_out
+ li a0, 5
+ addi a1, sp, 8
+ call _write_s
j .Lcompile_designator_expression_end
.Lcompile_designator_expression_end:
-
# Epilogue.
lw ra, 28(sp)
lw s0, 24(sp)
@@ -708,15 +792,15 @@ compile_call:
.Lcompile_call_argument:
li a0, 0
- call _build_expression
+ call compile_expression
li t0, 0x202c30 # 0,_
sw t0, 8(sp)
li t0, 0x61207773 # sw a
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 7
- call _write_out
+ li a0, 7
+ addi a1, sp, 4
+ call _write_s
lw t0, 12(sp) # Argument count for a procedure call.
@@ -725,15 +809,15 @@ compile_call:
li a0, -4
mul a0, t0, a0
addi a0, a0, 60
- call _printi
+ call _write_i
li t0, '\n'
sw t0, 8(sp)
li t0, 0x29707328 # (sp)
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 5
- call _write_out
+ li a0, 5
+ addi a1, sp, 4
+ call _write_s
lbu t0, (s1)
li t1, ','
@@ -752,25 +836,25 @@ compile_call:
.Lcompile_call_restore:
# Just go through all a0-a5 registers and read them from stack.
# If this stack value contains garbage, the procedure just shouldn't use it.
- la a0, asm_restore_parameters
- li a1, ASM_RESTORE_PARAMETERS_SIZE
- call _write_out
+ li a0, ASM_RESTORE_PARAMETERS_SIZE
+ la a1, asm_restore_parameters
+ call _write_s
.Lcompile_call_perform:
li t0, 0x20
sw t0, 8(sp)
li t0, 0x6c6c6163 # call
sw t0, 4(sp)
- addi a0, sp, 4
- li a1, 5
- call _write_out
+ li a0, 5
+ addi a1, sp, 4
+ call _write_s
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
addi s1, s1, 1 # Skip the close paren.
@@ -816,9 +900,9 @@ compile_module_declaration:
sw s0, 16(sp)
addi s0, sp, 24
- la a0, global_start
- li a1, GLOBAL_START_SIZE
- call _write_out
+ li a0, GLOBAL_START_SIZE
+ la a1, global_start
+ call _write_s
# Skip "program".
mv a0, s1
@@ -848,9 +932,9 @@ compile_constant_section:
bne t0, t1, .Lcompile_constant_section_end
mv s1, a0
- la a0, section_rodata
- li a1, SECTION_RODATA_SIZE
- call _write_out
+ li a0, SECTION_RODATA_SIZE
+ la a1, section_rodata
+ call _write_s
.Lcompile_constant_section_item:
mv a0, s1
@@ -888,30 +972,30 @@ compile_constant:
call lex_next # Skip the assignment sign.
mv s1, a0
# Write identifier the identifier.
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ call _write_s
# : .long
li t0, 0x20676e6f # ong_
sw t0, 4(sp)
li t0, 0x6c2e203a # : .l
sw t0, 0(sp)
- mv a0, sp
- li a1, 8
- call _write_out
+ li a0, 8
+ mv a1, sp
+ call _write_s
mv a0, s1
addi a1, sp, 12
call lex_next
mv s1, a0
- lw a0, 20(sp) # Save the literal pointer before advancing it.
- lw a1, 16(sp) # The literal length.
- call _write_out
+ lw a0, 16(sp) # The literal length.
+ lw a1, 20(sp) # Save the literal pointer before advancing it.
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
# Epilogue.
lw ra, 28(sp)
@@ -936,9 +1020,9 @@ compile_global_section:
bne t0, t1, .Lcompile_global_section_end
mv s1, a0
- la a0, section_bss
- li a1, SECTION_BSS_SIZE
- call _write_out
+ li a0, SECTION_BSS_SIZE
+ la a1, section_bss
+ call _write_s
.Lcompile_global_section_item:
mv a0, s1
@@ -987,37 +1071,37 @@ compile_global:
mv s1, a0
# .type identifier, @object
- la a0, asm_type
- li a1, ASM_TYPE_SIZE
- call _write_out
+ li a0, ASM_TYPE_SIZE
+ la a1, asm_type
+ call _write_s
- lw a0, 36(sp)
- lw a1, 32(sp)
- call _write_out
+ lw a0, 32(sp)
+ lw a1, 36(sp)
+ call _write_s
- la a0, asm_type_object
- li a1, ASM_TYPE_OBJECT_SIZE
- call _write_out
+ li a0, ASM_TYPE_OBJECT_SIZE
+ la a1, asm_type_object
+ call _write_s
# identifier: .zero size
- lw a0, 36(sp)
- lw a1, 32(sp)
- call _write_out
+ lw a0, 32(sp)
+ lw a1, 36(sp)
+ call _write_s
li t0, 0x206f7265 # ero_
sw t0, 12(sp)
li t0, 0x7a2e203a # : .z
sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 8
- call _write_out
+ li a0, 8
+ addi a1, sp, 8
+ call _write_s
- lw a0, 24(sp)
- lw a1, 20(sp)
- call _write_out
+ lw a0, 20(sp)
+ lw a1, 24(sp)
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
# Epilogue.
lw ra, 44(sp)
@@ -1136,7 +1220,8 @@ compile_parameters:
sw s0, 40(sp)
addi s0, sp, 48
- sw zero, 12(sp) # Parameter offset counter.
+ li t0, -12
+ sw t0, 12(sp) # Parameter offset counter.
mv a0, s1
addi a1, sp, 28
@@ -1173,7 +1258,7 @@ compile_parameters:
call symbol_table_insert
lw t0, 12(sp)
- addi t0, t0, 4
+ addi t0, t0, -4
sw t0, 12(sp)
# Read the comma between the parameters or a closing paren.
@@ -1185,7 +1270,7 @@ compile_parameters:
li t1, TOKEN_COMMA
bne t0, t1, .Lcompile_parameters_end
# If it is a comma, read the name of the next parameter.
- addi a1, sp, 16
+ addi a1, sp, 28
call lex_next
mv s1, a0
@@ -1217,7 +1302,12 @@ compile_procedure:
lw a0, 16(sp)
lw a1, 20(sp)
- call _write_procedure_head
+ call write_procedure_head
+
+ /* DEBUG */
+ lw a0, 20(sp)
+ lw a1, 16(sp)
+ call _write_error
# Save the state of the symbol table before we enter the procedure scope.
la t0, symbol_table
@@ -1234,36 +1324,23 @@ compile_procedure:
mv s1, a0
# Generate the procedure prologue with a predefined stack size.
- la a0, prologue
- li a1, PROLOGUE_SIZE
- call _write_out
+ li a0, PROLOGUE_SIZE
+ la a1, prologue
+ call _write_s
# Save passed arguments on the stack.
- la a0, asm_preserve_parameters
- li a1, ASM_PRESERVE_PARAMETERS_SIZE
- call _write_out
+ li a0, ASM_PRESERVE_PARAMETERS_SIZE
+ la a1, asm_preserve_parameters
+ call _write_s
# Generate the body of the procedure.
call compile_statements
mv s1, a0 # Skip end.
# Generate the procedure epilogue with a predefined stack size.
- la a0, epilogue
- li a1, EPILOGUE_SIZE
- call _write_out
-
- /* DEBUG
- lw a0, 16(sp)
- lw a1, 20(sp)
- call symbol_table_find
- beqz a0, .x
-*/
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_error
-
- call symbol_table_dump
- /* DEBUG */
+ li a0, EPILOGUE_SIZE
+ la a1, epilogue
+ call _write_s
# Restore the symbol table, removing symbols local to this procedure.
la t0, symbol_table
@@ -1296,16 +1373,16 @@ compile_goto:
li t0, 0x2e206a # j .
sw t0, 12(sp)
- addi a0, sp, 12
- li a1, 3
- call _write_out
+ li a0, 3
+ addi a1, sp, 12
+ call _write_s
- lw a0, 8(sp) # Saved dot position.
- lw a1, 4(sp)
- call _write_out
+ lw a0, 4(sp)
+ lw a1, 8(sp) # Saved dot position.
+ call _write_s
li a0, '\n'
- call _put_char
+ call _write_c
# Epilogue.
lw ra, 28(sp)
@@ -1330,14 +1407,14 @@ compile_label:
mv s1, a0
li a0, '.'
- call _put_char
- lw a0, 16(sp)
- lw a1, 12(sp)
- call _write_out
+ call _write_c
+ lw a0, 12(sp)
+ lw a1, 16(sp)
+ call _write_s
li a0, ':'
- call _put_char
+ call _write_c
li a0, '\n'
- call _put_char
+ call _write_c
# Epilogue.
lw ra, 28(sp)
@@ -1398,35 +1475,35 @@ compile_if:
li t0, 0x62626262 # bbbb
sb t0, 11(sp)
- addi a0, sp, 11
- li a1, 13
- call _write_out
+ li a0, 13
+ addi a1, sp, 11
+ call _write_s
# Write the label counter.
mv a0, s2
- call _printi
+ call _write_i
li a0, '\n'
- call _put_char
+ call _write_c
call compile_statements
mv s1, a0 # Skip end.
# Write the label prefix.
- addi a0, sp, 20
- li a1, 4
- call _write_out
+ li a0, 4
+ addi a1, sp, 20
+ call _write_s
# Write the label counter.
mv a0, s2
- call _printi
+ call _write_i
# Finalize the label.
li t0, 0x0a3a # :\n
sh t0, 16(sp)
- addi a0, sp, 16
- li a1, 2
- call _write_out
+ li a0, 2
+ addi a1, sp, 16
+ call _write_s
addi s2, s2, 1 # Increment the label counter.
@@ -1443,8 +1520,8 @@ compile_if:
# Parameters:
# a0 - Identifier length.
# a0 - Identifier pointer.
-.type _write_procedure_head, @function
-_write_procedure_head:
+.type write_procedure_head, @function
+write_procedure_head:
# Prologue.
addi sp, sp, -32
sw ra, 28(sp)
@@ -1455,27 +1532,27 @@ _write_procedure_head:
sw a1, 20(sp)
# .type identifier, @function
- la a0, asm_type
- li a1, ASM_TYPE_SIZE
- call _write_out
+ li a0, ASM_TYPE_SIZE
+ la a1, asm_type
+ call _write_s
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ call _write_s
- la a0, asm_type_function
- li a1, ASM_TYPE_FUNCTION_SIZE
- call _write_out
+ li a0, ASM_TYPE_FUNCTION_SIZE
+ la a1, asm_type_function
+ call _write_s
- lw a0, 20(sp)
- lw a1, 16(sp)
- call _write_out
+ lw a0, 16(sp)
+ lw a1, 20(sp)
+ call _write_s
li t0, 0x0a3a # :\n
sw t0, 12(sp)
- addi a0, sp, 12
- li a1, 2
- call _write_out
+ li a0, 2
+ addi a1, sp, 12
+ call _write_s
# Epilogue.
lw ra, 28(sp)
@@ -1592,9 +1669,9 @@ compile_text_section:
sw s0, 8(sp)
addi s0, sp, 16
- la a0, section_text
- li a1, SECTION_TEXT_SIZE
- call _write_out
+ li a0, SECTION_TEXT_SIZE
+ la a1, section_text
+ call _write_s
# Epilogue.
lw ra, 12(sp)
@@ -1611,9 +1688,9 @@ compile_entry_point:
addi s0, sp, 32
# .type _start, @function
- la a0, asm_start
- li a1, ASM_START_SIZE
- call _write_out
+ li a0, ASM_START_SIZE
+ la a1, asm_start
+ call _write_s
mv a0, s1
addi a1, sp, 4
@@ -1624,9 +1701,9 @@ compile_entry_point:
call compile_statements
mv s1, a0 # Skip end.
- la a0, asm_exit
- li a1, ASM_EXIT_SIZE
- call _write_out
+ li a0, ASM_EXIT_SIZE
+ la a1, asm_exit
+ call _write_s
# Epilogue.
lw ra, 28(sp)