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
 |