Unify taking an identifier address
This commit is contained in:
221
boot/stage1.s
221
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)
|
||||
sb t0, 12(sp)
|
||||
|
||||
# lw a0, 28(sp)
|
||||
lw a1, 32(sp)
|
||||
addi a1, sp, 13
|
||||
call take_address
|
||||
|
||||
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_parameter:
|
||||
lw a0, 36(sp)
|
||||
li t0, 0x20 # _
|
||||
sw t0, 16(sp)
|
||||
li t0, 0x2c307320 # _s0,
|
||||
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
|
||||
|
||||
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)
|
||||
|
Reference in New Issue
Block a user