summaryrefslogtreecommitdiff
path: root/boot/stage1.s
diff options
context:
space:
mode:
Diffstat (limited to 'boot/stage1.s')
-rw-r--r--boot/stage1.s173
1 files changed, 86 insertions, 87 deletions
diff --git a/boot/stage1.s b/boot/stage1.s
index 9b118d5..9ab072d 100644
--- a/boot/stage1.s
+++ b/boot/stage1.s
@@ -4,6 +4,8 @@
# s1 - Contains the current position in the source text.
# s2 - Label counter.
+.include "boot/definitions.inc"
+
.equ SOURCE_BUFFER_SIZE, 81920
.section .rodata
@@ -55,20 +57,41 @@ source_code: .zero SOURCE_BUFFER_SIZE
.type _compile_import, @function
_compile_import:
# Prologue.
- addi sp, sp, -8
- sw ra, 4(sp)
- sw s0, 0(sp)
- addi s0, sp, 8
+ addi sp, sp, -16
+ sw ra, 12(sp)
+ sw s0, 8(sp)
+ addi s0, sp, 16
- addi s1, s1, 6
+.Lcompile_import_loop:
+ call _skip_comment
call _skip_spaces
- call _read_token
- add s1, s1, a0 # Skip the imported module name.
+ mv a0, s1
+ addi a1, sp, 0
+ call _tokenize_next
+ li t0, TOKEN_IMPORT
+ lw t1, 0(sp)
+ bne t0, t1, .Lcompile_import_end
+ # a0 is set from the previous _tokenize_next call. Skip the module name.
+ addi a1, sp, 0
+ call _tokenize_next
+ mv s1, a0
+
+ /* DEBUG
+ lw t0, 0(sp)
+ addi t0, t0, '0'
+ sw t0, 4(sp)
+ addi a0, sp, 4
+ li a1, 1
+ call _write_error*/
+
+ j .Lcompile_import_loop
+
+.Lcompile_import_end:
# Epilogue.
- lw ra, 4(sp)
- lw s0, 0(sp)
- addi sp, sp, 8
+ lw ra, 12(sp)
+ lw s0, 8(sp)
+ addi sp, sp, 16
ret
.type _build_binary_expression, @function
@@ -943,40 +966,54 @@ _compile_assembly:
addi sp, sp, 16
ret
-.type _compile_program, @function
-_compile_program:
+.type _compile_module_declaration, @function
+_compile_module_declaration:
# Prologue.
- addi sp, sp, -8
- sw ra, 4(sp)
- sw s0, 0(sp)
- addi s0, sp, 8
+ addi sp, sp, -16
+ sw ra, 12(sp)
+ sw s0, 8(sp)
+ addi s0, sp, 16
la a0, global_start
li a1, GLOBAL_START_SIZE
call _write_out
- addi s1, s1, 8 # program\n.
+ # Skip "program".
+ call _skip_comment
+ mv a0, s1
+ addi a1, sp, 0
+ call _tokenize_next
+ mv s1, a0
# Epilogue.
- lw ra, 4(sp)
- lw s0, 0(sp)
- addi sp, sp, 8
+ lw ra, 12(sp)
+ lw s0, 8(sp)
+ addi sp, sp, 16
ret
.type _compile_constant_section, @function
_compile_constant_section:
# Prologue.
- addi sp, sp, -8
- sw ra, 4(sp)
- sw s0, 0(sp)
- addi s0, sp, 8
+ addi sp, sp, -16
+ sw ra, 12(sp)
+ sw s0, 8(sp)
+ addi s0, sp, 16
+
+ call _skip_comment
+ call _skip_spaces
+
+ mv a0, s1
+ addi a1, sp, 0
+ call _tokenize_next
+ li t0, TOKEN_CONST
+ lw t1, 0(sp)
+ bne t0, t1, .Lcompile_constant_section_end
+ mv s1, a0
la a0, section_rodata
li a1, SECTION_RODATA_SIZE
call _write_out
- addi s1, s1, 6 # const\n.
-
.Lcompile_constant_section_item:
call _skip_spaces
lbu a0, (s1)
@@ -988,9 +1025,9 @@ _compile_constant_section:
.Lcompile_constant_section_end:
# Epilogue.
- lw ra, 4(sp)
- lw s0, 0(sp)
- addi sp, sp, 8
+ lw ra, 12(sp)
+ lw s0, 8(sp)
+ addi sp, sp, 16
ret
.type _compile_constant, @function
@@ -1040,17 +1077,23 @@ _compile_constant:
.type _compile_variable_section, @function
_compile_variable_section:
# Prologue.
- addi sp, sp, -8
- sw ra, 4(sp)
- sw s0, 0(sp)
- addi s0, sp, 8
+ addi sp, sp, -16
+ sw ra, 12(sp)
+ sw s0, 8(sp)
+ addi s0, sp, 16
+
+ mv a0, s1
+ addi a1, sp, 0
+ call _tokenize_next
+ li t0, TOKEN_VAR
+ lw t1, 0(sp)
+ bne t0, t1, .Lcompile_variable_section_end
+ mv s1, a0
la a0, section_bss
li a1, SECTION_BSS_SIZE
call _write_out
- addi s1, s1, 4 # var\n.
-
.Lcompile_variable_section_item:
call _skip_spaces
lbu a0, (s1)
@@ -1062,9 +1105,9 @@ _compile_variable_section:
.Lcompile_variable_section_end:
# Epilogue.
- lw ra, 4(sp)
- lw s0, 0(sp)
- addi sp, sp, 8
+ lw ra, 12(sp)
+ lw s0, 8(sp)
+ addi sp, sp, 16
ret
.type _compile_variable, @function
@@ -1589,30 +1632,6 @@ _compile_line:
li t1, '('
beq t0, t1, .Lcompile_line_comment
- li t0, 0x676f7270 # prog
- sw t0, 12(sp)
- mv a0, s1
- addi a1, sp, 12
- li a2, 4
- call _memcmp
- beqz a0, .Lcompile_line_program
-
- li t0, 0x736e6f63 # cons
- sw t0, 12(sp)
- mv a0, s1
- addi a1, sp, 12
- li a2, 4
- call _memcmp
- beqz a0, .Lcompile_line_const
-
- li t0, 0x0a726176 # var\n
- sw t0, 12(sp)
- mv a0, s1
- addi a1, sp, 12
- li a2, 4
- call _memcmp
- beqz a0, .Lcompile_line_var
-
li t0, 0x636f7270 # proc
sw t0, 12(sp)
mv a0, s1
@@ -1647,14 +1666,6 @@ _compile_line:
call _is_register_identifier
bnez a0, .Lcompile_line_identifier
- li t0, 0x6f706d69 # impo
- sw t0, 12(sp)
- mv a0, s1
- addi a1, sp, 12
- li a2, 4
- call _memcmp
- beqz a0, .Lcompile_line_import
-
li t0, 0x6f746f67 # goto
sw t0, 12(sp)
mv a0, s1
@@ -1704,10 +1715,6 @@ _compile_line:
call _compile_goto
j .Lcompile_line_section
-.Lcompile_line_import:
- call _compile_import
- j .Lcompile_line_section
-
.Lcompile_line_identifier:
call _compile_identifier
j .Lcompile_line_section
@@ -1725,10 +1732,6 @@ _compile_line:
li a0, 1
j .Lcompile_line_end
-.Lcompile_line_const:
- call _compile_constant_section
- j .Lcompile_line_section
-
.Lcompile_line_procedure:
lw a1, 16(sp)
bnez a1, .Lcompile_line_compile_procedure
@@ -1738,14 +1741,6 @@ _compile_line:
li a0, 1
j .Lcompile_line_end
-.Lcompile_line_var:
- call _compile_variable_section
- j .Lcompile_line_section
-
-.Lcompile_line_program:
- call _compile_program
- j .Lcompile_line_section
-
.Lcompile_line_comment:
lw a0, 20(sp)
call _skip_comment
@@ -1864,6 +1859,11 @@ _compile:
sw zero, 4(sp) # Whether the text section header was already emitted.
+ call _compile_module_declaration
+ call _compile_import
+ call _compile_constant_section
+ call _compile_variable_section
+
.Lcompile_do:
lbu t0, (s1) # t0 = Current character.
beqz t0, .Lcompile_end # Exit the loop on the NUL character.
@@ -1913,7 +1913,6 @@ _start:
call _read_file
mv a0, s1
- call _tokenize
call _main
call _compile