105 lines
1.6 KiB
ArmAsm
105 lines
1.6 KiB
ArmAsm
.global aar
|
|
.global lar
|
|
.global sar
|
|
|
|
aar: ! %o0 = descr %o1 = index %o2 = array_ptr
|
|
|
|
save %sp, -64, %sp
|
|
ld [%i0], %o0 ! lower bound
|
|
subcc %i1, %o0, %o1 ! 0..N-1
|
|
bl 1f ! <0
|
|
nop
|
|
ld [%i0+4], %o0 ! n
|
|
cmp %o1, %o0
|
|
bgt 1f ! > N
|
|
nop
|
|
call mli4 ! descr *= n.size
|
|
ld [%i0+8], %o0 ! el.size
|
|
add %i2, %o0, %i0 ! &base_addr[n]
|
|
ret
|
|
restore ! delay slot
|
|
1: restore
|
|
set EARRAY, %o0
|
|
call trp
|
|
nop
|
|
retl
|
|
nop
|
|
|
|
lar: ! %o0 = descr %o1 = index %o2 = array_ptr
|
|
|
|
mov %o7, %o4
|
|
call aar
|
|
mov %o0, %o3
|
|
mov %o4, %o7
|
|
|
|
! %o0 = address of el, %o1 = sizeof(el), %o2 = word, %o3 = descr
|
|
ld [%o3+8], %o1 ! el.size
|
|
cmp %o1, 1
|
|
bne 2f
|
|
nop
|
|
ldub [%o0], %o2 ! el.size == 1
|
|
dec 4, %l0
|
|
retl
|
|
st %o2, [%l0] ! delay slot
|
|
2: cmp %o1,2
|
|
bne 3f
|
|
nop
|
|
lduh [%o0], %o2 ! el.size == 2
|
|
dec 4, %l0
|
|
retl
|
|
st %o2, [%l0] ! delay slot
|
|
3: cmp %o1, 4
|
|
bne 4f
|
|
nop
|
|
ld [%o0], %o2
|
|
dec 4, %l0
|
|
retl
|
|
st %o2, [%l0] ! delay slot
|
|
4: sub %l0, %o1, %l0
|
|
5: deccc 4, %o1
|
|
ld [%o0+%o1], %o2
|
|
bnz 5b
|
|
st %o2, [%l0+%o1]
|
|
retl
|
|
nop
|
|
|
|
sar: ! %o0 = descr %o1 = index %o2 = array_ptr
|
|
|
|
mov %o7, %o4
|
|
call aar
|
|
mov %o0, %o3
|
|
mov %o4, %o7
|
|
|
|
! %o0 = address of el, %o1 = sizeof(el), %o2 = word, %o3 = descr
|
|
|
|
ld [%o3+8], %o1 ! el.size
|
|
cmp %o1, 1
|
|
bne 2f
|
|
nop
|
|
ld [%l0], %o2
|
|
stb %o2, [%o0]
|
|
retl
|
|
inc 4, %l0 ! delay slot
|
|
2: cmp %o1,2
|
|
bne 3f
|
|
nop
|
|
ld [%l0], %o2
|
|
sth %o2, [%o0]
|
|
retl
|
|
inc 4, %l0 ! delay slot
|
|
3: cmp %o1, 4
|
|
bne 4f
|
|
nop
|
|
ld [%l0], %o2
|
|
st %o2, [%o0]
|
|
retl
|
|
inc 4, %l0 ! delay slot
|
|
|
|
4: mov %o1, %o4
|
|
5: deccc 4, %o1
|
|
ld [%l0+%o1], %o2
|
|
bnz 5b
|
|
st %o2, [%o0+%o1] ! delay slot
|
|
retl
|
|
add %l0, %o4, %l0 ! delay slot
|