32 lines
		
	
	
		
			849 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
		
			849 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/* */
 | 
						|
/*	alloca() - allocate space on the stack		Author: Kees J. Bot */
 | 
						|
/*								2 Dec 1993 */
 | 
						|
 | 
						|
#include <machine/asm.h>
 | 
						|
 | 
						|
ENTRY(alloca)
 | 
						|
#if __ACK__
 | 
						|
	pop	%ecx	/* Return address */
 | 
						|
	pop	%eax	/* Bytes to allocate */
 | 
						|
	addl	$2*4+3, %eax	/* Add space for two saved register variables */
 | 
						|
	andb	$0xF8, %al	/* Align */
 | 
						|
	movl	%esp, %ebx	/* Keep current esp */
 | 
						|
	subl	%eax, %esp	/* Lower stack */
 | 
						|
	movl	%esp, %eax	/* Return value */
 | 
						|
	push	4(%ebx)	/* Push what is probably the saved esi */
 | 
						|
	push	(%ebx)	/* Saved edi */
 | 
						|
/* Now ACK can still do: */
 | 
						|
/*	pop edi; pop esi; leave; ret */
 | 
						|
	push	%eax	/* Dummy argument */
 | 
						|
	jmp	*%ecx
 | 
						|
#else
 | 
						|
	pop	%ecx	/* Return address */
 | 
						|
	pop	%eax	/* Bytes to allocate */
 | 
						|
	addl	$3, %eax
 | 
						|
	andb	$0xF8, %al	/* Align */
 | 
						|
	subl	%eax, %esp	/* Lower stack */
 | 
						|
	movl	%esp, %eax	/* Return value */
 | 
						|
	push	%eax	/* Dummy argument */
 | 
						|
	jmp	*%ecx
 | 
						|
#endif
 |