47 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #
 | |
| .sect .text; .sect .rom; .sect .data; .sect .bss
 | |
| 
 | |
| /* Get address of element of bounds-checked array.
 | |
|  *
 | |
|  * Stack: ( array-adr index descriptor-adr -- element-adr )
 | |
|  * Sets r2 = size of element for .los4, .sts4
 | |
|  * Preserves r25 (the last volatile register)
 | |
|  *
 | |
|  * An array descriptor is:
 | |
|  *
 | |
|  *   +0 lower bound
 | |
|  *   +4 range (upper bound - lower bound); *inclusive*
 | |
|  *   +8 element size
 | |
|  */
 | |
| 
 | |
| .sect .text
 | |
| .define .aar4
 | |
| .aar4:
 | |
| 	lw r4, 0(sp)            ! r4 = address of descriptor
 | |
| 	lw r5, 4(sp)            ! r5 = index
 | |
| 	lw r6, 8(sp)            ! r6 = address of array
 | |
| 
 | |
| 	lw r7, 0(r4)            ! r7 = lower bound
 | |
| 	slt at, r5, r7          ! at = index < lower bound
 | |
| 	bne at, zero, .trap_earray
 | |
| 	nop
 | |
| 	subu r5, r5, r7         ! adjust index for non-zero lower bound
 | |
| 
 | |
| 	lw at, 4(r4)            ! at = range
 | |
| 	slt at, at, r5          ! at = range < adjusted index
 | |
| 	bne at, zero, .trap_earray
 | |
| 	nop
 | |
| 
 | |
| 	lw r2, 8(r4)            ! r2 = size of element
 | |
| 	mul r5, r5, r2          ! scale index by size
 | |
| 	addu r5, r5, r6         ! calculate address of element
 | |
| 
 | |
| 	sw r5, 8(sp)            ! push address of element
 | |
| 	addiu sp, sp, 8
 | |
| 	jr ra
 | |
| 	nop
 | |
| 
 | |
| .define .trap_earray
 | |
| .trap_earray:
 | |
| 	li r4, 0                 ! EARRAY = 0 in h/em_abs.h
 | |
| 	b .trp
 |