diff options
| author | Eugen Wissner <belka@caraus.de> | 2025-04-27 23:18:06 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2025-04-27 23:18:06 +0200 |
| commit | 963d32e8d1ab322d77768b5464e7360fd6feb3cd (patch) | |
| tree | e4f935eecda3ba057db1e7c0ac568c3bba9cab48 /boot/stage1.s | |
| parent | a60e623af5eff3b0252cf6100cf0c366a9d3058b (diff) | |
| download | elna-963d32e8d1ab322d77768b5464e7360fd6feb3cd.tar.gz | |
Add return statements
Diffstat (limited to 'boot/stage1.s')
| -rw-r--r-- | boot/stage1.s | 181 |
1 files changed, 114 insertions, 67 deletions
diff --git a/boot/stage1.s b/boot/stage1.s index 32c4e79..5989ac9 100644 --- a/boot/stage1.s +++ b/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 |
