xref: /titanic_51/usr/src/lib/libc/sparcv9/gen/alloca.s (revision bdfc6d18da790deeec2e0eb09c625902defe2498)
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) 1998, by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27#ident	"%Z%%M%	%I%	%E% SMI"
28
29	.file	"%M%"
30
31#include <sys/asm_linkage.h>
32#include <sys/stack.h>
33
34	!
35	! o0: # bytes of space to allocate, already rounded to 0 mod 8
36	! o1: %sp-relative offset of tmp area
37	! o2: %sp-relative offset of end of tmp area
38	!
39	! we want to bump %sp by the requested size
40	! then copy the tmp area to its new home
41	! this is necessary as we could theoretically
42	! be in the middle of a complicated expression.
43	!
44	ENTRY(__builtin_alloca)
45	add	%sp, STACK_BIAS, %g1	! save current sp + STACK_BIAS
46	sub	%sp, %o0, %sp		! bump to new value
47	add	%sp, STACK_BIAS, %g5
48	! copy loop: should do nothing gracefully
49	b	2f
50	subcc	%o2, %o1, %o5		! number of bytes to move
511:
52	ldx	[%g1 + %o1], %o4	! load from old temp area
53	stx	%o4, [%g5 + %o1]	! store to new temp area
54	add	%o1, 8, %o1
552:	bg,pt	%xcc, 1b
56	subcc	%o5, 8, %o5
57	! now return new %sp + end-of-temp
58	add	%sp, %o2, %o0
59	retl
60	add	%o0, STACK_BIAS, %o0
61	SET_SIZE(__builtin_alloca)
62