[riscv] Use load and store pseudo-instructions where possible

The pattern of "load address to register" followed by "load value from
address in register" generally results in three instructions: two to
load the address and one to load the value.

This can be reduced to two instructions by allowing the assembler to
incorporate the low bits of the address within the load (or store)
instruction itself.  In the case of a store, this requires specifying
a second register that can be temporarily used to hold the high bits
of the address.  (In the case of a load, the destination register is
reused for this purpose.)

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2025-05-09 15:02:47 +01:00
parent 134d76379e
commit 3027864f13
2 changed files with 5 additions and 10 deletions

View File

@@ -257,8 +257,7 @@ apply_relocs:
la a2, _edata la a2, _edata
/* Calculate relocation addend */ /* Calculate relocation addend */
la t0, prefix_virt LOADN a0, prefix_virt
LOADN a0, (t0)
sub a0, a1, a0 sub a0, a1, a0
/* Skip applying relocations if addend is zero */ /* Skip applying relocations if addend is zero */
@@ -523,8 +522,7 @@ enable_paging_64:
li a1, SATP_MODE_SV57 li a1, SATP_MODE_SV57
/* Calculate virtual address offset */ /* Calculate virtual address offset */
la t0, prefix_virt LOADN t0, prefix_virt
LOADN t0, (t0)
la t1, _prefix la t1, _prefix
sub a0, t1, t0 sub a0, t1, t0
@@ -567,8 +565,7 @@ enable_paging_64_loop:
STOREN t0, -PTE_SIZE(a4) STOREN t0, -PTE_SIZE(a4)
/* Calculate PTE[x] address for iPXE virtual address map */ /* Calculate PTE[x] address for iPXE virtual address map */
la t0, prefix_virt LOADN t0, prefix_virt
LOADN t0, (t0)
srli t0, t0, VPN1_LSB srli t0, t0, VPN1_LSB
andi t0, t0, ( PTE_COUNT - 1 ) andi t0, t0, ( PTE_COUNT - 1 )
slli t0, t0, PTE_SIZE_LOG2 slli t0, t0, PTE_SIZE_LOG2
@@ -711,8 +708,7 @@ enable_paging_32:
mv a2, a0 mv a2, a0
/* Calculate virtual address offset */ /* Calculate virtual address offset */
la t0, prefix_virt LOADN t0, prefix_virt
LOADN t0, (t0)
la t1, _prefix la t1, _prefix
sub a0, t1, t0 sub a0, t1, t0

View File

@@ -79,8 +79,7 @@ _sbi_start:
progress " .stack" progress " .stack"
/* Store boot hart */ /* Store boot hart */
la t0, boot_hart STOREN s0, boot_hart, t0
STOREN s0, (t0)
/* Register device tree */ /* Register device tree */
la a0, sysfdt la a0, sysfdt