summaryrefslogtreecommitdiff
path: root/boot/stage1.s
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-05-12 23:07:02 +0200
committerEugen Wissner <belka@caraus.de>2025-05-12 23:07:02 +0200
commit1b31f532dfb9987788565c90db0558db6f8bed30 (patch)
treec57ceeb963430268429dadf891ce32c4d91512e9 /boot/stage1.s
parentd85183c7a6842a4db83635c64cf85ddf37491971 (diff)
downloadelna-1b31f532dfb9987788565c90db0558db6f8bed30.tar.gz
Unify taking an identifier address
Diffstat (limited to 'boot/stage1.s')
-rw-r--r--boot/stage1.s217
1 files changed, 57 insertions, 160 deletions
diff --git a/boot/stage1.s b/boot/stage1.s
index 8258075..15e3d20 100644
--- a/boot/stage1.s
+++ b/boot/stage1.s
@@ -249,31 +249,47 @@ is_local_identifier:
addi sp, sp, 16
ret
-# Checks whether the given identifier is a saved register name, like s1 or s2.
+# Looks for a register that can be used to calculate a symbol address. Writes it
+# as string, like sp or s0 into the provided buffer.
+#
# Parameters:
-# a0 - Pointer to the identifier.
-# a1 - Identifier length.
+# a0 - Symbol info pointer.
+# a1 - Output buffer.
#
-# 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
+# Sets a0 to the length of register name written or 0.
+.type take_address, @function
+take_address:
+ beqz a0, .Ltake_address_undefined
+ lw t0, 0(a0)
- lbu a0, (a0)
- addi a1, a1, -2
- seqz a1, a1
- addi t0, a0, -'s'
- seqz t0, t0
- and a0, a1, t0
+ li t1, INFO_PARAMETER
+ beq t0, t1, .Ltake_address_parameter
- # Epilogue.
- lw ra, 4(sp)
- lw s0, 0(sp)
- addi sp, sp, 8
+ li t1, INFO_LOCAL
+ beq t0, t1, .Ltake_address_local
+
+ j .Ltake_address_undefined
+
+.Ltake_address_parameter:
+ li t0, 0x3073 # s0
+ sh t0, (a1)
+
+ li a0, 2
+
+ j .Ltake_address_end
+
+.Ltake_address_local:
+ li t0, 0x7073 # (sp)
+ sh t0, (a1)
+
+ li a0, 2
+
+ j .Ltake_address_end
+
+.Ltake_address_undefined:
+ li a0, 0
+
+.Ltake_address_end:
ret
# Parameters:
@@ -298,18 +314,9 @@ compile_identifier_expression:
beqz a0, .Lcompile_identifier_expression_by_name
lw t0, 0(a0)
- li t1, INFO_PARAMETER
- beq t0, t1, .Lcompile_identifier_expression_parameter
-
- li t1, INFO_LOCAL
- beq t0, t1, .Lcompile_identifier_expression_local
+ j .Lcompile_identifier_expression_by_address
.Lcompile_identifier_expression_by_name:
- mv a0, s1
- lw a1, 20(sp)
- call is_register_identifier
- bnez a0, .Lcompile_identifier_expression_saved
-
# Global identifier.
lw t1, 16(sp)
li t0, 0x00202c00 # \0,_
@@ -348,7 +355,7 @@ compile_identifier_expression:
j .Lcompile_identifier_expression_end
-.Lcompile_identifier_expression_parameter:
+.Lcompile_identifier_expression_by_address:
lw t1, 16(sp)
li t0, 0x00202c00 # \0,_
or t0, t0, t1
@@ -363,56 +370,17 @@ compile_identifier_expression:
lw a0, 8(a0)
call _write_i
- li t0, 0x29307328 # (s0)
- sw t0, 8(sp)
- li a0, 4
- addi a1, sp, 8
- call _write_s
- li a0, '\n'
+ li a0, '('
call _write_c
- j .Lcompile_identifier_expression_end
-
-.Lcompile_identifier_expression_local:
- lw t1, 16(sp)
- li t0, 0x00202c00 # \0,_
- or t0, t0, t1
- sw t0, 8(sp)
- li t0, 0x6120776c # lw a
- sw t0, 4(sp)
- li a0, 7
- addi a1, sp, 4
- call _write_s
-
lw a0, 12(sp)
- lw a0, 8(a0)
- call _write_i
-
- li t0, 0x29707328 # (sp)
- sw t0, 8(sp)
- li a0, 4
- addi a1, sp, 8
- call _write_s
- li a0, '\n'
- call _write_c
-
- j .Lcompile_identifier_expression_end
-
-.Lcompile_identifier_expression_saved:
- li t0, 0x00202c00 # \0,_
- lw t1, 16(sp)
- or t0, t0, t1
- sw t0, 8(sp)
- li t0, 0x6120766d # mv a
- sw t0, 4(sp)
- li a0, 7
+ addi a1, sp, 4
+ call take_address
addi a1, sp, 4
call _write_s
- lw a0, 20(sp)
- mv a1, s1
- call _write_s
-
+ li a0, ')'
+ call _write_c
li a0, '\n'
call _write_c
@@ -552,81 +520,36 @@ compile_at_expression:
lw a1, 32(sp)
call symbol_table_find
sw a0, 20(sp)
- lw t0, 0(a0)
- li t1, INFO_PARAMETER
- beq t0, t1, .Lcompile_at_expression_parameter
-
- li t1, INFO_LOCAL
- beq t0, t1, .Lcompile_at_expression_local
-
- unimp
-
-.Lcompile_at_expression_local:
- lw a0, 36(sp)
li t0, 0x20 # _
- sw t0, 16(sp)
- li t0, 0x2c707320 # _sp,
- sw t0, 12(sp)
- li t0, 0x2c006120 # _a\0,
- sw t0, 8(sp)
- sb a0, 10(sp)
- li t0, 0x69646461 # addi
- sw t0, 4(sp)
- li a0, 13
- addi a1, sp, 4
- call _write_s
-
- lw a0, 20(sp)
- lw a0, 8(a0)
- call _write_i
+ sb t0, 12(sp)
- j .Lcompile_at_expression_end
+ # lw a0, 28(sp)
+ lw a1, 32(sp)
+ addi a1, sp, 13
+ call take_address
-.Lcompile_at_expression_parameter:
- lw a0, 36(sp)
- li t0, 0x20 # _
- sw t0, 16(sp)
- li t0, 0x2c307320 # _s0,
- sw t0, 12(sp)
+ lw t1, 36(sp)
li t0, 0x2c006120 # _a\0,
sw t0, 8(sp)
- sb a0, 10(sp)
+ sb t1, 10(sp)
li t0, 0x69646461 # addi
sw t0, 4(sp)
- li a0, 13
+ addi a0, a0, 9 # The length returned by take_address + the instruction.
addi a1, sp, 4
call _write_s
+ li a0, ','
+ call _write_c
+ li a0, ' '
+ call _write_c
+
lw a0, 20(sp)
lw a0, 8(a0)
call _write_i
j .Lcompile_at_expression_end
-.Lcompile_at_expression_undefined:
- lw a0, 36(sp)
- li t0, 0x20 # _
- sw t0, 16(sp)
- li t0, 0x2c707320 # _sp,
- sw t0, 12(sp)
- li t0, 0x2c006120 # _a\0,
- sw t0, 8(sp)
- sb a0, 10(sp)
- li t0, 0x69646461 # addi
- sw t0, 4(sp)
- li a0, 13
- addi a1, sp, 4
- call _write_s
-
- lw a0, 32(sp)
- lw a1, 28(sp)
- addi a0, a1, -4 # Skip the "loca" variable prefix.
- addi a1, a0, 4 # Skip the "loca" variable prefix.
- call _write_s
-
- j .Lcompile_at_expression_end
-
.Lcompile_at_expression_end:
li a0, '\n'
call _write_c
@@ -658,11 +581,6 @@ compile_designator_expression:
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)
@@ -688,27 +606,6 @@ compile_designator_expression:
j .Lcompile_designator_expression_end
-.Lcompile_designator_expression_saved:
- li t0, 0x20766d # mv_
- sw t0, 12(sp)
- li a0, 3
- addi a1, sp, 12
- call _write_s
-
- lw a0, 16(sp)
- lw a1, 20(sp)
- call _write_s
-
- li t0, 0x0a # \n
- sw t0, 12(sp)
- li t0, 0x3061202c # , a0
- sw t0, 8(sp)
- li a0, 5
- addi a1, sp, 8
- call _write_s
-
- j .Lcompile_designator_expression_end
-
.Lcompile_designator_expression_end:
# Epilogue.
lw ra, 28(sp)