Home | History | Annotate | Download | only in gen
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright (c) 1987 Sun Microsystems, Inc.
     24  */
     25 
     26 #ident	"%Z%%M%	%I%	%E% SMI"
     27 
     28 	.file	"alloca.s"
     29 
     30 #include <sys/asm_linkage.h>
     31 
     32 	!
     33 	! o0: # bytes of space to allocate, already rounded to 0 mod 8
     34 	! o1: %sp-relative offset of tmp area
     35 	! o2: %sp-relative offset of end of tmp area
     36 	!
     37 	! we want to bump %sp by the requested size
     38 	! then copy the tmp area to its new home
     39 	! this is necessasy as we could theoretically
     40 	! be in the middle of a compilicated expression.
     41 	!
     42 	ENTRY(__builtin_alloca)
     43 	mov	%sp, %o3		! save current sp
     44 	sub	%sp, %o0, %sp		! bump to new value
     45 	! copy loop: should do nothing gracefully
     46 	b	2f
     47 	subcc	%o2, %o1, %o5		! number of bytes to move
     48 1:
     49 	ld	[%o3 + %o1], %o4	! load from old temp area
     50 	st	%o4, [%sp + %o1]	! store to new temp area
     51 	add	%o1, 4, %o1
     52 2:	bg	1b
     53 	subcc	%o5, 4, %o5
     54 	! now return new %sp + end-of-temp
     55 	retl
     56 	add	%sp, %o2, %o0
     57 
     58 	SET_SIZE(__builtin_alloca)
     59