summaryrefslogtreecommitdiff
path: root/boot/stage1.s
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-05-01 01:32:45 +0200
committerEugen Wissner <belka@caraus.de>2025-05-01 01:32:45 +0200
commitf3a8b2626aa5d541dfaf9c63a911e1893c0f4ba9 (patch)
tree28616236a749887dd91101cdc6d7d541ab92c7de /boot/stage1.s
parent23b7a1ab308442777a32c3bd123e68ad98369c42 (diff)
downloadelna-f3a8b2626aa5d541dfaf9c63a911e1893c0f4ba9.tar.gz
Add semicolons separating the statements
Diffstat (limited to 'boot/stage1.s')
-rw-r--r--boot/stage1.s238
1 files changed, 171 insertions, 67 deletions
diff --git a/boot/stage1.s b/boot/stage1.s
index 7137edc..e591e21 100644
--- a/boot/stage1.s
+++ b/boot/stage1.s
@@ -207,11 +207,66 @@ _build_binary_expression:
addi sp, sp, 32
ret
+# Checks whether the given identifier starts with "loca".
+# Parameters:
+# a0 - Pointer to the identifier.
+# a1 - Identifier length.
+#
+# Sets a0 to 1 if the identifier starts with "loca", otherwise to 0.
+.type _is_local_identifier, @function
+_is_local_identifier:
+ # Prologue.
+ addi sp, sp, -16
+ sw ra, 12(sp)
+ sw s0, 8(sp)
+ addi s0, sp, 16
+
+ li t0, 0x61636f6c # loca
+ sw t0, 4(sp)
+ # a0 is already set.
+ addi a1, sp, 4
+ li a2, 4
+ call _memcmp
+ seqz a0, a0
+
+ # Epilogue.
+ lw ra, 12(sp)
+ lw s0, 8(sp)
+ addi sp, sp, 16
+ ret
+
+# Checks whether the given identifier is a saved register name, like s1 or s2.
+# Parameters:
+# a0 - Pointer to the identifier.
+# a1 - Identifier length.
+#
+# Sets a0 to 1 if the identifier is a preserved register, otherwise to 0.
+.type _is_register_identifier, @function
+_is_register_identifier:
+ # Prologue.
+ addi sp, sp, -8
+ sw ra, 4(sp)
+ sw s0, 0(sp)
+ addi s0, sp, 8
+
+ lbu a0, (a0)
+ addi a1, a1, -2
+ seqz a1, a1
+ addi t0, a0, -'s'
+ seqz t0, t0
+ and a0, a1, t0
+
+ # Epilogue.
+ lw ra, 4(sp)
+ lw s0, 0(sp)
+ addi sp, sp, 8
+ ret
+
# Parameters:
# a0 - Identifier length.
# a1 - Register number as character.
-.type _build_identifier_expression, @function
-_build_identifier_expression:
+.type _compile_identifier_expression, @function
+_compile_identifier_expression:
# Prologue.
addi sp, sp, -32
sw ra, 28(sp)
@@ -221,22 +276,15 @@ _build_identifier_expression:
sw a0, 20(sp) # Identifier length.
sw a1, 16(sp) # Register number as character.
- li t0, 0x61636f6c # loca
- sw t0, 12(sp)
mv a0, s1
- addi a1, sp, 12
- li a2, 4
- call _memcmp
- beqz a0, .Lbuild_identifier_expression_local
+ lw a1, 20(sp)
+ call _is_local_identifier
+ bnez a0, .Lcompile_identifier_expression_local
- lbu a0, (s1)
- lw t0, 20(sp)
- addi t0, t0, -2
- seqz t0, t0
- addi t1, a0, -'s'
- seqz t1, t1
- and t0, t0, t1
- bnez t0, .Lbuild_identifier_expression_saved
+ mv a0, s1
+ lw a1, 20(sp)
+ call _is_register_identifier
+ bnez a0, .Lcompile_identifier_expression_saved
# Global identifier.
lw t1, 16(sp)
@@ -258,7 +306,7 @@ _build_identifier_expression:
lbu a0, (s1)
call _is_upper
- beqz a0, .Lbuild_identifier_expression_end
+ beqz a0, .Lcompile_identifier_expression_end
lw t1, 16(sp)
li t0, 0x0a290061 # a\0)\n
@@ -274,9 +322,9 @@ _build_identifier_expression:
li a1, 12
call _write_out
- j .Lbuild_identifier_expression_end
+ j .Lcompile_identifier_expression_end
-.Lbuild_identifier_expression_saved:
+.Lcompile_identifier_expression_saved:
li t0, 0x00202c00 # \0,_
lw t1, 16(sp)
or t0, t0, t1
@@ -294,9 +342,9 @@ _build_identifier_expression:
li a0, '\n'
call _put_char
- j .Lbuild_identifier_expression_end
+ j .Lcompile_identifier_expression_end
-.Lbuild_identifier_expression_local:
+.Lcompile_identifier_expression_local:
lw t1, 16(sp)
li t0, 0x00202c00 # \0,_
or t0, t0, t1
@@ -321,9 +369,9 @@ _build_identifier_expression:
li a0, '\n'
call _put_char
- j .Lbuild_identifier_expression_end
+ j .Lcompile_identifier_expression_end
-.Lbuild_identifier_expression_end:
+.Lcompile_identifier_expression_end:
# Epilogue.
lw ra, 28(sp)
@@ -368,7 +416,7 @@ _build_expression:
lw a0, 20(sp)
lw a1, 28(sp)
- call _build_identifier_expression
+ call _compile_identifier_expression
j .Lbuild_expression_advance
@@ -455,6 +503,86 @@ _build_expression:
addi sp, sp, 40
ret
+# Compiles an lvalue.
+#
+# Parameters:
+# a0 - Pointer to the identifier.
+# a1 - Identifier length.
+.type _compile_designator_expression, @function
+_compile_designator_expression:
+ # Prologue.
+ addi sp, sp, -32
+ sw ra, 28(sp)
+ sw s0, 24(sp)
+ addi s0, sp, 32
+
+ sw a0, 20(sp) # Identifier pointer.
+ sw a1, 16(sp) # Identifier length.
+
+ lw a0, 20(sp)
+ lw a1, 16(sp)
+ call _is_local_identifier
+ bnez a0, .Lcompile_designator_expression_local
+
+ lw a0, 20(sp)
+ lw a1, 16(sp)
+ call _is_register_identifier
+ bnez a0, .Lcompile_designator_expression_saved
+
+.Lcompile_designator_expression_local:
+ li t0, 0x202c30 # 0,_
+ sw t0, 12(sp)
+ li t0, 0x61207773 # sw a
+ sw t0, 8(sp)
+ addi a0, sp, 8
+ li a1, 7
+ call _write_out
+
+ lw a0, 20(sp)
+ lw a1, 16(sp)
+ addi a0, a0, 4 # Skip the "loca" variable prefix.
+ addi a1, a1, -4 # Skip the "loca" variable prefix.
+ call _write_out
+
+ li t0, '\n'
+ sw t0, 12(sp)
+ li t0, 0x29707328 # (sp)
+ sw t0, 8(sp)
+ addi a0, sp, 8
+ li a1, 5
+ call _write_out
+
+ j .Lcompile_designator_expression_end
+
+.Lcompile_designator_expression_saved:
+ li t0, 0x20766d # mv_
+ sw t0, 12(sp)
+ addi a0, sp, 12
+ li a1, 3
+ call _write_out
+
+ lw a0, 20(sp)
+ lw a1, 16(sp)
+ call _write_out
+
+ li t0, 0x0a # \n
+ sw t0, 12(sp)
+ li t0, 0x3061202c # , a0
+ sw t0, 8(sp)
+ addi a0, sp, 8
+ li a1, 5
+ call _write_out
+
+ j .Lcompile_designator_expression_end
+
+.Lcompile_designator_expression_end:
+
+ # Epilogue.
+ lw ra, 28(sp)
+ lw s0, 24(sp)
+ addi sp, sp, 32
+ ret
+
# Compiles a statement beginning with an identifier.
#
# Left values should be variables named "loca n", where n is the offset
@@ -508,28 +636,9 @@ _compile_identifier:
.Lcompile_identifier_assign:
call _build_binary_expression
-
- li t0, 0x202c30 # 0,_
- sw t0, 12(sp)
- li t0, 0x61207773 # sw a
- sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 7
- call _write_out
-
lw a0, 20(sp)
lw a1, 16(sp)
- addi a0, a0, 4 # Skip the "loca" variable prefix.
- addi a1, a1, -4 # Skip the "loca" variable prefix.
- call _write_out
-
- li t0, '\n'
- sw t0, 12(sp)
- li t0, 0x29707328 # (sp)
- sw t0, 8(sp)
- addi a0, sp, 8
- li a1, 5
- call _write_out
+ call _compile_designator_expression
j .Lcompile_identifier_end
@@ -1310,11 +1419,7 @@ _compile_label:
addi s0, sp, 16
sw a0, 0(sp) # Save the line length.
-
- # Write the whole line as is.
- mv a0, s1
- lw a1, 0(sp)
- call _write_out
+ mv a1, a0 # Argument for _write_out later.
lw t0, 0(sp) # Line length.
mv t1, s1 # Line start.
@@ -1323,8 +1428,15 @@ _compile_label:
addi t1, t1, -1 # Last character on the line.
lbu t1, (t1)
- li t2, ':'
- beq t1, t2, .Lcompile_label_colon
+ li t2, ';'
+ bne t1, t2, .Lcompile_label_colon
+
+ addi a1, a1, -1
+
+.Lcompile_label_colon:
+ # Write the whole line as is.
+ mv a0, s1
+ call _write_out
li t0, 0x3a # :
sw t0, 4(sp)
@@ -1332,7 +1444,6 @@ _compile_label:
li a1, 1
call _write_out
-.Lcompile_label_colon:
li t0, '\n'
sw t0, 4(sp)
addi a0, sp, 4
@@ -1411,12 +1522,6 @@ _compile_if:
call _put_char
.Lcompile_if_loop:
- /* DEBUG
- mv a0, s1
- li a1, 6
- call _write_error
- call _divide_by_zero_error */
-
call _skip_spaces
call _read_token
@@ -1532,13 +1637,15 @@ _compile_line:
call _memcmp
beqz a0, .Lcompile_line_exit
- li t0, 0x61636f6c # loca
- sw t0, 12(sp)
mv a0, s1
- addi a1, sp, 12
- li a2, 4
- call _memcmp
- beqz a0, .Lcompile_line_identifier
+ lw a1, 20(sp)
+ call _is_local_identifier
+ bnez a0, .Lcompile_line_identifier
+
+ mv a0, s1
+ li a1, 2
+ call _is_register_identifier
+ bnez a0, .Lcompile_line_identifier
li t0, 0x6f706d69 # impo
sw t0, 12(sp)
@@ -1806,9 +1913,6 @@ _main:
.type _start, @function
_start:
call _tokenizer_initialize
- li a1, 50
- call _write_error
-
call _main
call _compile