Add return statements
This commit is contained in:
181
boot/stage1.s
181
boot/stage1.s
@@ -1,7 +1,7 @@
|
||||
.global _start # Program entry point.
|
||||
# s1 - Contains the current position in the source text.
|
||||
|
||||
.equ SOURCE_BUFFER_SIZE, 40960
|
||||
.equ SOURCE_BUFFER_SIZE, 81920
|
||||
|
||||
.section .rodata
|
||||
section_rodata: .ascii ".section .rodata\n"
|
||||
@@ -16,6 +16,7 @@ prologue: .ascii "addi sp, sp, -96\nsw ra, 92(sp)\nsw s0, 88(sp)\naddi s0, sp, 9
|
||||
.equ PROLOGUE_SIZE, . - prologue
|
||||
epilogue: .ascii "lw ra, 92(sp)\nlw s0, 88(sp)\naddi sp, sp, 96\nret\n"
|
||||
.equ EPILOGUE_SIZE, . - epilogue
|
||||
|
||||
asm_exit: .ascii "li a0, 0\nli a7, 93\necall\n"
|
||||
.equ ASM_EXIT_SIZE, . - asm_exit
|
||||
asm_start: .ascii ".type _start, @function\n_start:\n"
|
||||
@@ -24,6 +25,14 @@ asm_and_a0_a1: .ascii "and a0, a0, a1\n"
|
||||
.equ ASM_AND_A0_A1_SIZE, . - asm_and_a0_a1
|
||||
asm_or_a0_a1: .ascii "or a0, a0, a1\n"
|
||||
.equ ASM_OR_A0_A1_SIZE, . - asm_or_a0_a1
|
||||
asm_add_a0_a1: .ascii "add a0, a0, a1\n"
|
||||
.equ ASM_ADD_A0_A1_SIZE, . - asm_add_a0_a1
|
||||
asm_sub_a0_a1: .ascii "sub a0, a0, a1\n"
|
||||
.equ ASM_SUB_A0_A1_SIZE, . - asm_sub_a0_a1
|
||||
asm_seqz_a0: .ascii "seqz a0, a0\n"
|
||||
.equ ASM_SEQZ_A0_SIZE, . - asm_seqz_a0
|
||||
asm_type: .ascii ".type "
|
||||
.equ ASM_TYPE_SIZE, . - asm_type
|
||||
|
||||
.section .bss
|
||||
.type source_code, @object
|
||||
@@ -67,7 +76,7 @@ _build_binary_expression:
|
||||
call _read_token
|
||||
sw a0, 20(sp)
|
||||
|
||||
li t0, 0x26 # &
|
||||
li t0, '&'
|
||||
sw t0, 16(sp)
|
||||
mv a0, s1
|
||||
lw a1, 20(sp)
|
||||
@@ -83,7 +92,7 @@ _build_binary_expression:
|
||||
call _token_compare
|
||||
beqz a0, .L_build_binary_expression_or
|
||||
|
||||
li t0, 0x3d # =
|
||||
li t0, '='
|
||||
sw t0, 16(sp)
|
||||
mv a0, s1
|
||||
lw a1, 20(sp)
|
||||
@@ -91,32 +100,34 @@ _build_binary_expression:
|
||||
call _token_compare
|
||||
beqz a0, .L_build_binary_expression_equal
|
||||
|
||||
li t0, '+'
|
||||
sw t0, 16(sp)
|
||||
mv a0, s1
|
||||
lw a1, 20(sp)
|
||||
addi a2, sp, 16
|
||||
call _token_compare
|
||||
beqz a0, .L_build_binary_expression_plus
|
||||
|
||||
li t0, '-'
|
||||
sw t0, 16(sp)
|
||||
mv a0, s1
|
||||
lw a1, 20(sp)
|
||||
addi a2, sp, 16
|
||||
call _token_compare
|
||||
beqz a0, .L_build_binary_expression_minus
|
||||
|
||||
j .Lbuild_binary_expression_end
|
||||
|
||||
.L_build_binary_expression_equal:
|
||||
addi s1, s1, 1 # Skip =.
|
||||
li a0, 1
|
||||
call _build_expression
|
||||
li t0, 0x0a3161 # a1\n
|
||||
sw t0, 16(sp)
|
||||
li t0, 0x202c3061 # a0,_
|
||||
sw t0, 12(sp)
|
||||
li t0, 0x202c3061 # a0,_
|
||||
sw t0, 8(sp)
|
||||
li t0, 0x20627573 # sub_
|
||||
sw t0, 4(sp)
|
||||
addi a0, sp, 4
|
||||
li a1, 15
|
||||
la a0, asm_sub_a0_a1
|
||||
li a1, ASM_SUB_A0_A1_SIZE
|
||||
call _write_out
|
||||
|
||||
li t0, 0x0a306120 # _a0\n
|
||||
sw t0, 16(sp)
|
||||
li t0, 0x2c306120 # _a0,
|
||||
sw t0, 12(sp)
|
||||
li t0, 0x7a716573 # seqz
|
||||
sw t0, 8(sp)
|
||||
addi a0, sp, 8
|
||||
li a1, 12
|
||||
la a0, asm_seqz_a0
|
||||
li a1, ASM_SEQZ_A0_SIZE
|
||||
call _write_out
|
||||
|
||||
j .Lbuild_binary_expression_end
|
||||
@@ -141,6 +152,26 @@ _build_binary_expression:
|
||||
|
||||
j .Lbuild_binary_expression_end
|
||||
|
||||
.L_build_binary_expression_plus:
|
||||
addi s1, s1, 1 # Skip +.
|
||||
li a0, 1
|
||||
call _build_expression
|
||||
la a0, asm_add_a0_a1
|
||||
li a1, ASM_ADD_A0_A1_SIZE
|
||||
call _write_out
|
||||
|
||||
j .Lbuild_binary_expression_end
|
||||
|
||||
.L_build_binary_expression_minus:
|
||||
addi s1, s1, 1 # Skip -.
|
||||
li a0, 1
|
||||
call _build_expression
|
||||
la a0, asm_sub_a0_a1
|
||||
li a1, ASM_SUB_A0_A1_SIZE
|
||||
call _write_out
|
||||
|
||||
j .Lbuild_binary_expression_end
|
||||
|
||||
.Lbuild_binary_expression_end:
|
||||
# Epilogue.
|
||||
lw ra, 28(sp)
|
||||
@@ -237,11 +268,8 @@ _build_expression:
|
||||
addi a1, a1, -4 # Skip the "loca" variable prefix.
|
||||
call _write_out
|
||||
|
||||
li t0, 0x0a # \n
|
||||
sw t0, 16(sp)
|
||||
addi a0, sp, 16
|
||||
li a1, 1
|
||||
call _write_out
|
||||
li a0, '\n'
|
||||
call _put_char
|
||||
|
||||
j .Lbuild_expression_advance
|
||||
|
||||
@@ -262,7 +290,7 @@ _build_expression:
|
||||
addi a1, a1, -4 # Skip the "loca" variable prefix.
|
||||
call _write_out
|
||||
|
||||
li t0, 0x0a # \n
|
||||
li t0, '\n'
|
||||
sw t0, 16(sp)
|
||||
li t0, 0x29707328 # (sp)
|
||||
sw t0, 12(sp)
|
||||
@@ -380,7 +408,7 @@ _compile_identifier:
|
||||
addi a1, a1, -4 # Skip the "loca" variable prefix.
|
||||
call _write_out
|
||||
|
||||
li t0, 0x0a # \n
|
||||
li t0, '\n'
|
||||
sw t0, 12(sp)
|
||||
li t0, 0x29707328 # (sp)
|
||||
sw t0, 8(sp)
|
||||
@@ -416,7 +444,6 @@ _compile_call:
|
||||
|
||||
.Lcompile_call_paren:
|
||||
call _skip_spaces
|
||||
call _read_token
|
||||
lbu t0, (s1)
|
||||
li t1, 0x29 # )
|
||||
beq t0, t1, .Lcompile_call_complete
|
||||
@@ -458,7 +485,7 @@ _compile_call:
|
||||
li a1, 1
|
||||
call _write_out
|
||||
|
||||
li t0, 0x0a # \n
|
||||
li t0, '\n'
|
||||
sw t0, 8(sp)
|
||||
li t0, 0x29707328 # (sp)
|
||||
sw t0, 4(sp)
|
||||
@@ -467,7 +494,6 @@ _compile_call:
|
||||
call _write_out
|
||||
|
||||
call _skip_spaces
|
||||
call _read_token
|
||||
lbu t0, (s1)
|
||||
li t1, ','
|
||||
bne t0, t1, .Lcompile_call_paren
|
||||
@@ -507,7 +533,7 @@ _compile_call:
|
||||
addi t4, t4, '0'
|
||||
addi t0, t0, '0'
|
||||
|
||||
li t5, 0x0a # \n
|
||||
li t5, '\n'
|
||||
sb t5, 11(sp)
|
||||
li t5, 0x29707328 # (sp)
|
||||
sw t5, 7(sp)
|
||||
@@ -540,7 +566,7 @@ _compile_call:
|
||||
lw a1, 16(sp)
|
||||
call _write_out
|
||||
|
||||
li t0, 0x0a # \n
|
||||
li t0, '\n'
|
||||
sw t0, 8(sp)
|
||||
addi a0, sp, 8
|
||||
li a1, 1
|
||||
@@ -601,6 +627,12 @@ _read_token:
|
||||
li t1, '='
|
||||
beq t0, t1, .Ltoken_character_single
|
||||
|
||||
li t1, '+'
|
||||
beq t0, t1, .Ltoken_character_single
|
||||
|
||||
li t1, '-'
|
||||
beq t0, t1, .Ltoken_character_single
|
||||
|
||||
li t1, '@'
|
||||
beq t0, t1, .Ltoken_character_single
|
||||
# Expect an identifier or a number.
|
||||
@@ -693,11 +725,6 @@ _skip_comment:
|
||||
sw s0, 8(sp)
|
||||
addi s0, sp, 16
|
||||
|
||||
/* DEBUG
|
||||
mv a0, s1
|
||||
li a1, 8
|
||||
call _write_error */
|
||||
|
||||
# Check whether this is a comment.
|
||||
li t0, 0x2a28 # (*
|
||||
sw t0, 4(sp)
|
||||
@@ -924,12 +951,8 @@ _compile_variable:
|
||||
add s1, s1, a0 # Skip the type.
|
||||
|
||||
# .type identifier, @object
|
||||
li t0, 0x2065 # e_
|
||||
sw t0, 12(sp)
|
||||
li t0, 0x7079742e # .typ
|
||||
sw t0, 8(sp)
|
||||
addi a0, sp, 8
|
||||
li a1, 6
|
||||
la a0, asm_type
|
||||
li a1, ASM_TYPE_SIZE
|
||||
call _write_out
|
||||
|
||||
lw a0, 28(sp)
|
||||
@@ -959,7 +982,7 @@ _compile_variable:
|
||||
lw a1, 24(sp)
|
||||
call _write_out
|
||||
|
||||
li t0, 0x202c # ,
|
||||
li t0, 0x202c # ,_
|
||||
sw t0, 12(sp)
|
||||
addi a0, sp, 12
|
||||
li a1, 2
|
||||
@@ -969,11 +992,8 @@ _compile_variable:
|
||||
lw a1, 16(sp)
|
||||
call _write_out
|
||||
|
||||
li t0, 0x0a # \n
|
||||
sw t0, 12(sp)
|
||||
addi a0, sp, 12
|
||||
li a1, 1
|
||||
call _write_out
|
||||
li a0, '\n'
|
||||
call _put_char
|
||||
|
||||
# identifier: .zero size
|
||||
lw a0, 28(sp)
|
||||
@@ -992,11 +1012,8 @@ _compile_variable:
|
||||
lw a1, 16(sp)
|
||||
call _write_out
|
||||
|
||||
li t0, 0x0a # \n
|
||||
sw t0, 12(sp)
|
||||
addi a0, sp, 12
|
||||
li a1, 1
|
||||
call _write_out
|
||||
li a0, '\n'
|
||||
call _put_char
|
||||
|
||||
# Epilogue.
|
||||
lw ra, 36(sp)
|
||||
@@ -1019,12 +1036,8 @@ _compile_procedure:
|
||||
add s1, s1, a0
|
||||
|
||||
# .type identifier, @function
|
||||
li t0, 0x2065 # e_
|
||||
sw t0, 12(sp)
|
||||
li t0, 0x7079742e # .typ
|
||||
sw t0, 8(sp)
|
||||
addi a0, sp, 8
|
||||
li a1, 6
|
||||
la a0, asm_type
|
||||
li a1, ASM_TYPE_SIZE
|
||||
call _write_out
|
||||
|
||||
lw a0, 20(sp)
|
||||
@@ -1235,11 +1248,8 @@ _compile_goto:
|
||||
|
||||
addi s1, s1, 1 # Skip the new line.
|
||||
|
||||
li t0, 0x0a # \n
|
||||
sw t0, 8(sp)
|
||||
addi a0, sp, 8
|
||||
li a1, 1
|
||||
call _write_out
|
||||
li a0, '\n'
|
||||
call _put_char
|
||||
|
||||
# Epilogue.
|
||||
lw ra, 12(sp)
|
||||
@@ -1280,7 +1290,7 @@ _compile_label:
|
||||
call _write_out
|
||||
|
||||
.Lcompile_label_colon:
|
||||
li t0, 0x0a # \n
|
||||
li t0, '\n'
|
||||
sw t0, 4(sp)
|
||||
addi a0, sp, 4
|
||||
li a1, 1
|
||||
@@ -1296,6 +1306,25 @@ _compile_label:
|
||||
addi sp, sp, 16
|
||||
ret
|
||||
|
||||
.type _compile_return, @function
|
||||
_compile_return:
|
||||
# Prologue.
|
||||
addi sp, sp, -16
|
||||
sw ra, 12(sp)
|
||||
sw s0, 8(sp)
|
||||
addi s0, sp, 16
|
||||
|
||||
addi s1, s1, 6 # Skip return.
|
||||
call _skip_spaces
|
||||
|
||||
call _build_binary_expression
|
||||
|
||||
# Epilogue.
|
||||
lw ra, 12(sp)
|
||||
lw s0, 8(sp)
|
||||
addi sp, sp, 16
|
||||
ret
|
||||
|
||||
# Parameters:
|
||||
# a0 - Line length.
|
||||
# a1 - Whether the section header was already emitted. If not it should be
|
||||
@@ -1403,6 +1432,16 @@ _compile_line:
|
||||
call _memcmp
|
||||
beqz a0, .Lcompile_line_goto
|
||||
|
||||
li t0, 0x6e72 # rn
|
||||
sw t0, 12(sp)
|
||||
li t0, 0x75746572 # retu
|
||||
sw t0, 8(sp)
|
||||
mv a0, s1
|
||||
addi a1, sp, 8
|
||||
li a2, 6
|
||||
call _memcmp
|
||||
beqz a0, .Lcompile_line_return
|
||||
|
||||
lbu t0, (s1)
|
||||
li t1, '.'
|
||||
beq t0, t1, .Lcompile_line_label
|
||||
@@ -1416,6 +1455,14 @@ _compile_line:
|
||||
call _compile_label
|
||||
j .Lcompile_line_section
|
||||
|
||||
.Lcompile_line_return:
|
||||
/* DEBUG
|
||||
mv a0, s1
|
||||
li a1, 6
|
||||
call _write_error */
|
||||
call _compile_return
|
||||
j .Lcompile_line_section
|
||||
|
||||
.Lcompile_line_goto:
|
||||
call _compile_goto
|
||||
j .Lcompile_line_section
|
||||
|
Reference in New Issue
Block a user