ack/mach/sparc/libem/lar.s
1991-09-20 16:05:17 +00:00

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