GNU as has "la %r4,8(%r3)" as an alias for "addi %r4,%r3,8", meaning to load the address of the thing at 8(%r3). Our 'la', now 'li32', makes an addis/ori pair to load an immediate 32-bit value. For example, "li32 r4,23456789" loads a big number.
		
			
				
	
	
		
			38 lines
		
	
	
	
		
			735 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
	
		
			735 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
#
 | 
						|
! $Source$
 | 
						|
! $State$
 | 
						|
! $Revision$
 | 
						|
 | 
						|
#include "powerpc.h"
 | 
						|
 | 
						|
.sect .text
 | 
						|
	
 | 
						|
! Index into a bounds-checked array.
 | 
						|
!
 | 
						|
! On entry:
 | 
						|
!    r3 = ptr to descriptor
 | 
						|
!    r4 = index
 | 
						|
!    r5 = address of array
 | 
						|
! Yields:
 | 
						|
!    r3 = address of element
 | 
						|
!    r0 = size of element (used by .lar4, .sar4)
 | 
						|
! Preserves r10 for .lar4, .sar4
 | 
						|
 | 
						|
.define .aar4
 | 
						|
.aar4:
 | 
						|
	li32 r0, .trap_earray
 | 
						|
	mtspr ctr, r0            ! load CTR with trap address
 | 
						|
 | 
						|
	lwz r0, 0(r3)
 | 
						|
	subf. r4, r0, r4         ! adjust range
 | 
						|
	bcctr IFTRUE, LT, 0      ! check lower bound
 | 
						|
	
 | 
						|
	lwz r0, 4(r3)
 | 
						|
	cmpl cr0, 0, r4, r3
 | 
						|
	bcctr IFFALSE, LT, 0     ! check upper bound
 | 
						|
	
 | 
						|
	lwz r0, 8(r3)
 | 
						|
	mullw r4, r4, r0         ! scale index
 | 
						|
	add r3, r4, r5           ! calculate element address
 | 
						|
	
 | 
						|
	bclr ALWAYS, 0, 0
 |