104 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			104 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
 |