Add builtin symbols
This commit is contained in:
265
boot/stage1.s
265
boot/stage1.s
@@ -411,14 +411,6 @@ _build_expression:
|
||||
call _tokenize_next
|
||||
sw a0, 20(sp)
|
||||
|
||||
/* DEBUG
|
||||
lw a0, 32(sp)
|
||||
lw a1, 28(sp)
|
||||
call _write_error
|
||||
lw a0, 28(sp)
|
||||
li a1, 8
|
||||
call _write_error */
|
||||
|
||||
lw a0, 24(sp)
|
||||
|
||||
li t0, TOKEN_MINUS
|
||||
@@ -754,74 +746,6 @@ _compile_call:
|
||||
addi sp, sp, 32
|
||||
ret
|
||||
|
||||
# Skips the spaces till the next non space character.
|
||||
.type _skip_spaces, @function
|
||||
_skip_spaces:
|
||||
.Lspace_loop_do:
|
||||
lbu t0, (s1) # t0 = Current character.
|
||||
|
||||
li t1, ' '
|
||||
beq t0, t1, .Lspace_loop_repeat
|
||||
li t1, '\t'
|
||||
beq t0, t1, .Lspace_loop_repeat
|
||||
li t1, '\n'
|
||||
beq t0, t1, .Lspace_loop_repeat
|
||||
li t1, '\r'
|
||||
beq t0, t1, .Lspace_loop_repeat
|
||||
|
||||
j .Lspace_loop_end
|
||||
.Lspace_loop_repeat:
|
||||
addi s1, s1, 1
|
||||
j .Lspace_loop_do
|
||||
|
||||
.Lspace_loop_end:
|
||||
ret
|
||||
|
||||
# Parameters:
|
||||
# a0 - Line length.
|
||||
.type _skip_comment, @function
|
||||
_skip_comment:
|
||||
# Prologue.
|
||||
addi sp, sp, -16
|
||||
sw ra, 12(sp)
|
||||
sw s0, 8(sp)
|
||||
addi s0, sp, 16
|
||||
|
||||
# Check whether this is a comment.
|
||||
li t0, 0x2a28 # (*
|
||||
sw t0, 4(sp)
|
||||
addi a0, sp, 4
|
||||
mv a1, s1
|
||||
li a2, 2
|
||||
call _memcmp
|
||||
bnez a0, .Lskip_comment_end
|
||||
|
||||
addi s1, s1, 2 # Skip (*.
|
||||
|
||||
li t0, 0x292a # *)
|
||||
sw t0, 4(sp)
|
||||
|
||||
.Lskip_comment_loop:
|
||||
addi a0, sp, 4
|
||||
mv a1, s1
|
||||
li a2, 2
|
||||
call _memcmp
|
||||
beqz a0, .Lskip_comment_close
|
||||
|
||||
addi s1, s1, 1
|
||||
|
||||
j .Lskip_comment_loop
|
||||
|
||||
.Lskip_comment_close:
|
||||
addi s1, s1, 2 # Skip *).
|
||||
|
||||
.Lskip_comment_end:
|
||||
# Epilogue.
|
||||
lw ra, 12(sp)
|
||||
lw s0, 8(sp)
|
||||
addi sp, sp, 16
|
||||
ret
|
||||
|
||||
# Walks through the procedure definitions.
|
||||
.type _compile_procedure_section, @function
|
||||
_compile_procedure_section:
|
||||
@@ -832,9 +756,6 @@ _compile_procedure_section:
|
||||
addi s0, sp, 32
|
||||
|
||||
.Lcompile_procedure_section_loop:
|
||||
call _skip_spaces
|
||||
call _skip_comment
|
||||
|
||||
mv a0, s1
|
||||
addi a1, sp, 4
|
||||
call _tokenize_next
|
||||
@@ -1083,28 +1004,9 @@ _compile_procedure:
|
||||
call _tokenize_next
|
||||
mv s1, a0
|
||||
|
||||
# .type identifier, @function
|
||||
la a0, asm_type
|
||||
li a1, ASM_TYPE_SIZE
|
||||
call _write_out
|
||||
|
||||
lw a0, 20(sp)
|
||||
lw a1, 16(sp)
|
||||
call _write_out
|
||||
|
||||
la a0, asm_type_function
|
||||
li a1, ASM_TYPE_FUNCTION_SIZE
|
||||
call _write_out
|
||||
|
||||
lw a0, 20(sp)
|
||||
lw a1, 16(sp)
|
||||
call _write_out
|
||||
|
||||
li t0, 0x0a3a # :\n
|
||||
sw t0, 12(sp)
|
||||
addi a0, sp, 12
|
||||
li a1, 2
|
||||
call _write_out
|
||||
lw a0, 16(sp)
|
||||
lw a1, 20(sp)
|
||||
call _write_procedure_head
|
||||
|
||||
# Skip all declarations until we find the "begin" keyword, denoting the
|
||||
# beginning of the procedure body.
|
||||
@@ -1128,21 +1030,24 @@ _compile_procedure:
|
||||
call _write_out
|
||||
|
||||
# Generate the body of the procedure.
|
||||
.Lcompile_procedure_body:
|
||||
li t0, 0x0a646e65 # end\n
|
||||
sw t0, 8(sp)
|
||||
mv a0, s1
|
||||
addi a1, sp, 8
|
||||
li a2, 4
|
||||
call _memcmp
|
||||
call _compile_statements
|
||||
mv s1, a0 # Skip end.
|
||||
|
||||
beqz a0, .Lcompile_procedure_end
|
||||
|
||||
call _compile_statement
|
||||
j .Lcompile_procedure_body
|
||||
|
||||
.Lcompile_procedure_end:
|
||||
add s1, s1, 4 # Skip end\n.
|
||||
/* DEBUG
|
||||
sw a0, 8(sp)
|
||||
lw a1, 12(sp)
|
||||
li a2, TOKEN_END
|
||||
sub a1, a1, a2
|
||||
seqz a1, a1
|
||||
seqz a0, a0
|
||||
addi a0, a0, '0'
|
||||
addi a1, a1, '0'
|
||||
sb a0, 4(sp)
|
||||
sb a1, 5(sp)
|
||||
addi a0, sp, 4
|
||||
li a1, 2
|
||||
call _write_error
|
||||
lw a0, 8(sp) */
|
||||
|
||||
# Generate the procedure epilogue with a predefined stack size.
|
||||
la a0, epilogue
|
||||
@@ -1288,21 +1193,8 @@ _compile_if:
|
||||
li a0, '\n'
|
||||
call _put_char
|
||||
|
||||
.Lcompile_if_loop:
|
||||
mv a0, s1
|
||||
addi a1, sp, 0
|
||||
call _tokenize_next
|
||||
|
||||
lw t0, 0(sp)
|
||||
li t1, TOKEN_END
|
||||
beq t0, t1, .Lcompile_if_end
|
||||
|
||||
call _compile_statement
|
||||
|
||||
j .Lcompile_if_loop
|
||||
|
||||
.Lcompile_if_end:
|
||||
mv s1, a0 # Skip the end with newline. a0 is set by the last call to _tokenize_next.
|
||||
call _compile_statements
|
||||
mv s1, a0 # Skip end.
|
||||
|
||||
# Write the label prefix.
|
||||
addi a0, sp, 20
|
||||
@@ -1328,6 +1220,95 @@ _compile_if:
|
||||
addi sp, sp, 32
|
||||
ret
|
||||
|
||||
# Writes:
|
||||
# .type identifier, @function
|
||||
# identifier:
|
||||
#
|
||||
# Parameters:
|
||||
# a0 - Identifier length.
|
||||
# a0 - Identifier pointer.
|
||||
.type _write_procedure_head, @function
|
||||
_write_procedure_head:
|
||||
# Prologue.
|
||||
addi sp, sp, -32
|
||||
sw ra, 28(sp)
|
||||
sw s0, 24(sp)
|
||||
addi s0, sp, 32
|
||||
|
||||
sw a0, 16(sp)
|
||||
sw a1, 20(sp)
|
||||
|
||||
# .type identifier, @function
|
||||
la a0, asm_type
|
||||
li a1, ASM_TYPE_SIZE
|
||||
call _write_out
|
||||
|
||||
lw a0, 20(sp)
|
||||
lw a1, 16(sp)
|
||||
call _write_out
|
||||
|
||||
la a0, asm_type_function
|
||||
li a1, ASM_TYPE_FUNCTION_SIZE
|
||||
call _write_out
|
||||
|
||||
lw a0, 20(sp)
|
||||
lw a1, 16(sp)
|
||||
call _write_out
|
||||
|
||||
li t0, 0x0a3a # :\n
|
||||
sw t0, 12(sp)
|
||||
addi a0, sp, 12
|
||||
li a1, 2
|
||||
call _write_out
|
||||
|
||||
# Epilogue.
|
||||
lw ra, 28(sp)
|
||||
lw s0, 24(sp)
|
||||
addi sp, sp, 32
|
||||
ret
|
||||
|
||||
# Compiles a list of statements delimited by semicolons.
|
||||
#
|
||||
# Sets a0 to the end of the token finishing the list
|
||||
# (should be the "end" token in a valid program).
|
||||
.type _compile_statements, @function
|
||||
_compile_statements:
|
||||
# Prologue.
|
||||
addi sp, sp, -32
|
||||
sw ra, 28(sp)
|
||||
sw s0, 24(sp)
|
||||
addi s0, sp, 32
|
||||
|
||||
# Generate the body of the procedure.
|
||||
mv a0, s1
|
||||
addi a1, sp, 0
|
||||
call _tokenize_next
|
||||
lw t0, 0(sp)
|
||||
li t1, TOKEN_END
|
||||
|
||||
beq t0, t1, .Lcompile_statements_end
|
||||
|
||||
.Lcompile_statements_body:
|
||||
call _compile_statement
|
||||
|
||||
mv a0, s1
|
||||
addi a1, sp, 0
|
||||
call _tokenize_next
|
||||
lw t0, 0(sp)
|
||||
li t1, TOKEN_SEMICOLON
|
||||
|
||||
bne t0, t1, .Lcompile_statements_end
|
||||
mv s1, a0
|
||||
|
||||
j .Lcompile_statements_body
|
||||
|
||||
.Lcompile_statements_end:
|
||||
# Epilogue.
|
||||
lw ra, 28(sp)
|
||||
lw s0, 24(sp)
|
||||
addi sp, sp, 32
|
||||
ret
|
||||
|
||||
# Checks for the type of the current statement and compiles it.
|
||||
.type _compile_statement, @function
|
||||
_compile_statement:
|
||||
@@ -1357,7 +1338,7 @@ _compile_statement:
|
||||
li t1, TOKEN_DOT
|
||||
beq t0, t1, .Lcompile_statement_label
|
||||
|
||||
j .Lcompile_statement_empty # Else.
|
||||
unimp # Else.
|
||||
|
||||
.Lcompile_statement_if:
|
||||
call _compile_if
|
||||
@@ -1379,10 +1360,6 @@ _compile_statement:
|
||||
call _compile_identifier
|
||||
j .Lcompile_statement_end
|
||||
|
||||
.Lcompile_statement_empty:
|
||||
addi s1, s1, 1
|
||||
j .Lcompile_statement_end
|
||||
|
||||
.Lcompile_statement_end:
|
||||
# Epilogue.
|
||||
lw ra, 28(sp)
|
||||
@@ -1422,23 +1399,14 @@ _compile_entry_point:
|
||||
li a1, ASM_START_SIZE
|
||||
call _write_out
|
||||
|
||||
addi s1, s1, 6 # Skip begin\n.
|
||||
|
||||
# Generate the body of the procedure.
|
||||
.Lcompile_entry_point_body:
|
||||
mv a0, s1
|
||||
addi a1, sp, 4
|
||||
call _tokenize_next
|
||||
mv s1, a0 # Skip begin.
|
||||
|
||||
lw t0, 4(sp)
|
||||
li t1, TOKEN_END
|
||||
beq t0, t1, .Lcompile_entry_point_end
|
||||
|
||||
call _compile_statement
|
||||
j .Lcompile_entry_point_body
|
||||
|
||||
.Lcompile_entry_point_end:
|
||||
mv s1, a0 # Skip end. a0 is set by the last _tokenize_next call.
|
||||
# Generate the body of the procedure.
|
||||
call _compile_statements
|
||||
mv s1, a0 # Skip end.
|
||||
|
||||
la a0, asm_exit
|
||||
li a1, ASM_EXIT_SIZE
|
||||
@@ -1481,6 +1449,7 @@ _start:
|
||||
call _read_file
|
||||
|
||||
li s2, 1
|
||||
call symbol_table_build
|
||||
call _compile
|
||||
|
||||
# Call exit.
|
||||
|
Reference in New Issue
Block a user