54 lines
		
	
	
	
		
			820 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
	
		
			820 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
#
 | 
						|
! $Source$
 | 
						|
! $State$
 | 
						|
! $Revision$
 | 
						|
 | 
						|
#include "powerpc.h"
 | 
						|
	
 | 
						|
.sect .text
 | 
						|
 | 
						|
! Loads a variable-sized structure onto the stack.
 | 
						|
!
 | 
						|
!     r3 = size
 | 
						|
!     r4 = address
 | 
						|
 | 
						|
.define .los
 | 
						|
.los:
 | 
						|
	! These sizes are handled specially.
 | 
						|
	
 | 
						|
	cmpi cr0, 0, r3, 1
 | 
						|
	bc IFFALSE, GT, size1
 | 
						|
	
 | 
						|
	cmpi cr0, 0, r3, 2
 | 
						|
	bc IFFALSE, GT, size2
 | 
						|
	
 | 
						|
	cmpi cr0, 0, r3, 4
 | 
						|
	bc IFFALSE, GT, size4
 | 
						|
	
 | 
						|
	! Variable-sized structure.
 | 
						|
	
 | 
						|
	addi r3, r3, 3
 | 
						|
	andi. r3, r3, ~3         ! align size
 | 
						|
	
 | 
						|
	add r4, r4, r3           ! adjust address to top of block
 | 
						|
 | 
						|
	srawi r3, r3, 2          ! convert size to the number of words
 | 
						|
	mtspr ctr, r3
 | 
						|
	
 | 
						|
1:
 | 
						|
	lwzu r5, -4(r4)
 | 
						|
	stwu r5, -4(sp)
 | 
						|
	bc DNZ, 0, 1b            ! decrement CTR, jump if non-zero
 | 
						|
	bclr ALWAYS, 0, 0
 | 
						|
	
 | 
						|
size1:
 | 
						|
	lbz r3, 0(r4)
 | 
						|
	b 1f
 | 
						|
size2:
 | 
						|
	lhz r3, 0(r4)
 | 
						|
	b 1f
 | 
						|
size4:
 | 
						|
	lwz r3, 0(r4)
 | 
						|
1:
 | 
						|
	stwu r3, -4(sp)
 | 
						|
	bclr ALWAYS, 0, 0
 |