diff options
| author | Eugen Wissner <belka@caraus.de> | 2025-05-12 23:07:02 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2025-05-12 23:07:02 +0200 |
| commit | 1b31f532dfb9987788565c90db0558db6f8bed30 (patch) | |
| tree | c57ceeb963430268429dadf891ce32c4d91512e9 /boot/stage1.s | |
| parent | d85183c7a6842a4db83635c64cf85ddf37491971 (diff) | |
| download | elna-1b31f532dfb9987788565c90db0558db6f8bed30.tar.gz | |
Unify taking an identifier address
Diffstat (limited to 'boot/stage1.s')
| -rw-r--r-- | boot/stage1.s | 217 |
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) |
