diff options
Diffstat (limited to 'boot/stage1.s')
| -rw-r--r-- | boot/stage1.s | 173 |
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 |
