Files
riscv-linux-heap/src/test/heap.s
2022-10-20 22:57:47 -04:00

235 lines
3.8 KiB
ArmAsm

.section .rodata
.word 0f - hinfo_msg
hinfo_msg:
.string "Current heap info:"
0:
.word 0f - block_msg
block_msg:
.string "Current heap blocks:"
0:
.word 0f - dots
dots:
.string "..."
0:
.word 0f - hexstr
hexstr:
.string "0x"
0:
.align 2
.section .text
.global heap_test
heap_test:
addi sp, sp, -(7*8)
sd ra, 0(sp)
sd s0, 8(sp)
sd s1, 16(sp)
sd s2, 24(sp)
sd s3, 32(sp)
sd s4, 40(sp)
sd s5, 48(sp)
# empty heap
jal print_heap
jal printnl
# put stuff on heap
li a0, 8*9
jal heap_alloc
move s2, a0
jal print_heap
jal printnl
li a0, 8*4
jal heap_alloc
li t0, 0x1111111111111111
sd t0, (a0)
sd t0, 8(a0)
sd t0, 24(a0)
move s3, a0
# put array of stuff on heap
li s0, 0x0a
0:
bltz s0, 0f
li a0, 8*3
jal heap_alloc
sd s0, (a0)
li t0, 0xf000000000000000
add t0, s0, t0
sd t0, 16(a0)
addi s0, s0, -1
j 0b
0:
li a0, 8*7
jal heap_alloc
li t0, 0xffff
sd t0, 6*8(a0)
move s5, a0
li a0, 8*3
jal heap_alloc
move s4, a0
jal print_heap
jal printnl
# free stuff
move a0, s2
jal heap_free
move a0, s3
jal heap_free
move a0, s4
jal heap_free
move a0, s5
jal heap_free
jal print_heap
ld ra, 0(sp)
ld s0, 8(sp)
ld s1, 16(sp)
sd s2, 24(sp)
sd s3, 32(sp)
sd s4, 40(sp)
sd s5, 48(sp)
addi sp, sp, +(7*8)
ret
print_heap:
addi sp, sp, -8
sd ra, 0(sp)
jal print_heap_info
jal print_heap_blocks
ld ra, 0(sp)
addi sp, sp, +8
ret
print_heap_blocks:
addi sp, sp, -(3*8)
sd ra, 0(sp)
sd s0, 8(sp)
sd s1, 16(sp)
# blocks
la a0, block_msg
lw a1, -4(a0)
jal println
la t0, heap_info
ld s0, 24(t0)
ld s1, 32(t0)
0:
jal print_space
jal print_space
la a0, hexstr
lw a1, -4(a0)
jal print
move a0, s0
jal print_hex
jal print_space
ld a0, 0(s0)
jal print_hex
jal print_space
jal printnl
jal print_space
jal print_space
jal print_space
jal print_space
ld a0, 8(s0)
jal print_hex
jal print_space
ld a0, 16(s0)
jal print_hex
jal print_space
la a0, dots
lw a1, -4(a0)
jal print
jal print_space
ld t0, 0(s0)
andi t0, t0, ~0b11
add t0, s0, t0
ld a0, -8(t0)
move s0, t0
jal print_hex
jal printnl
beq s0, s1, 0f
j 0b
0:
ld ra, 0(sp)
ld s0, 8(sp)
ld s1, 16(sp)
addi sp, sp, +(3*8)
ret
print_heap_info:
addi sp, sp, -(4*8)
sd ra, 0(sp)
sd s0, 8(sp)
sd s1, 16(sp)
sd s2, 24(sp)
la a0, hinfo_msg
lw a1, -4(a0)
jal print
jal print_space
la a0, hexstr
lw a1, -4(a0)
jal print
la s0, heap_info
move a0, s0
jal print_hex
jal printnl
li s1, 0
li s2, 5
0:
beq s1, s2, 0f
jal print_space
jal print_space
li t1, 8
mul t0, s1, t1
add t0, s0, t0
ld a0, 0(t0)
jal print_hex
jal printnl
addi s1, s1, 1
j 0b
0:
ld ra, 0(sp)
ld s0, 8(sp)
ld s1, 16(sp)
ld s2, 24(sp)
addi sp, sp, +(4*8)
ret