Inspired by the sparc code (mach/sparc/libem/lar.s). My powerpc code might still have bugs, but it's enough for examples/hilo.mod to work. May need to 'make clean' or touch a build.lua file, so ackbuilder can notice the new lar4.s and sar4.s files and build them.
		
			
				
	
	
		
			45 lines
		
	
	
	
		
			779 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
	
		
			779 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #
 | |
| #include "powerpc.h"
 | |
| 
 | |
| .sect .text
 | |
| 
 | |
| ! Store to bounds-checked array.
 | |
| !
 | |
| ! On entry:
 | |
| !    r3 = ptr to descriptor
 | |
| !    r4 = index
 | |
| !    r5 = address of array
 | |
| 
 | |
| .define .sar4
 | |
| .sar4:
 | |
| 	mfspr r10, lr
 | |
| 	bl .aar4
 | |
| 	mtspr lr, r10
 | |
| 	! r3 = ptr to element
 | |
| 	! r0 = size of element
 | |
| 
 | |
| 	cmpi cr0, 0, r0, 1
 | |
| 	bc IFFALSE, EQ, 1f
 | |
| 	! Store 1 byte.
 | |
| 	lwz r4, 0(sp)
 | |
| 	addi sp, sp, 4
 | |
| 	stb r4, 0(r3)
 | |
| 	bclr ALWAYS, 0, 0
 | |
| 1:
 | |
| 	cmpi cr0, 0, r0, 2
 | |
| 	bc IFFALSE, EQ, 2f
 | |
| 	! Store 2 bytes.
 | |
| 	lwz r4, 0(sp)
 | |
| 	addi sp, sp, 4
 | |
| 	sth r4, 0(r3)
 | |
| 	bclr ALWAYS, 0, 0
 | |
| 2:
 | |
| 	! Store r0 bytes, where r0 must be a positive multiple of 4.
 | |
| 	or r5, r0, r0		! index r5 = length r0
 | |
| 3:
 | |
| 	addic. r5, r5, -4	! r5 -= 4
 | |
| 	lwzx r4, r5, sp
 | |
| 	stwx r4, r5, r3
 | |
| 	bc IFTRUE, GT, 3b	! loop if r5 > 0
 | |
| 	add sp, r0, sp		! move stack pointer up
 | |
| 	bclr ALWAYS, 0, 0
 |