36 lines
666 B
ArmAsm
36 lines
666 B
ArmAsm
|
.sect .text
|
||
|
|
||
|
! Stores a variable-sized block from the stack.
|
||
|
!
|
||
|
! On entry: r3 = size
|
||
|
! Stack: ( block address -- )
|
||
|
! Preserves r10 for .sar4
|
||
|
|
||
|
.define .sts4
|
||
|
.sts4:
|
||
|
lwz r4, 0(sp) ! r4 = address
|
||
|
|
||
|
! Sizes 1 and 2 are handled specially.
|
||
|
cmplwi r3, 1
|
||
|
ble 1f
|
||
|
cmplwi r3, 2
|
||
|
ble 2f
|
||
|
|
||
|
! Else the size must be a multiple of 4.
|
||
|
srwi r5, r3, 2
|
||
|
mtspr ctr, r5 ! ctr = number of words
|
||
|
addi r4, r4, -4 ! adjust address to before block
|
||
|
4: lwzu r5, 4(sp)
|
||
|
stwu r5, 4(r4)
|
||
|
bdnz 4b ! decrement ctr, jump if non-zero
|
||
|
addi sp, sp, 4
|
||
|
blr
|
||
|
|
||
|
1: lwz r5, 4(sp)
|
||
|
stb r5, 0(r4)
|
||
|
b 3f
|
||
|
2: lwz r5, 4(sp)
|
||
|
sth r5, 0(r4)
|
||
|
3: addi sp, sp, 8
|
||
|
blr
|