xref: /netbsd-src/lib/libc/arch/m68k/gen/alloca.S (revision 7a545094551380c64e41174ee8342d0d57e5dd48)
1*7a545094Smatt/*	$NetBSD: alloca.S,v 1.9 2013/07/17 04:57:55 matt Exp $	*/
29f1ee9aeSthorpej
35f709618Spaulus/*-
45f709618Spaulus * Copyright (c) 1990 The Regents of the University of California.
55f709618Spaulus * All rights reserved.
65f709618Spaulus *
75f709618Spaulus * This code is derived from software contributed to Berkeley by
85f709618Spaulus * the Systems Programming Group of the University of Utah Computer
95f709618Spaulus * Science Department.
105f709618Spaulus *
115f709618Spaulus * Redistribution and use in source and binary forms, with or without
125f709618Spaulus * modification, are permitted provided that the following conditions
135f709618Spaulus * are met:
145f709618Spaulus * 1. Redistributions of source code must retain the above copyright
155f709618Spaulus *    notice, this list of conditions and the following disclaimer.
165f709618Spaulus * 2. Redistributions in binary form must reproduce the above copyright
175f709618Spaulus *    notice, this list of conditions and the following disclaimer in the
185f709618Spaulus *    documentation and/or other materials provided with the distribution.
19eb7c1594Sagc * 3. Neither the name of the University nor the names of its contributors
205f709618Spaulus *    may be used to endorse or promote products derived from this software
215f709618Spaulus *    without specific prior written permission.
225f709618Spaulus *
235f709618Spaulus * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
245f709618Spaulus * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
255f709618Spaulus * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
265f709618Spaulus * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
275f709618Spaulus * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
285f709618Spaulus * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
295f709618Spaulus * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
305f709618Spaulus * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
315f709618Spaulus * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
325f709618Spaulus * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
335f709618Spaulus * SUCH DAMAGE.
345f709618Spaulus */
355f709618Spaulus
36d0fed6c8Sthorpej#include <machine/asm.h>
379f1ee9aeSthorpej
385f709618Spaulus#if defined(LIBC_SCCS) && !defined(lint)
399f1ee9aeSthorpej#if 0
409f1ee9aeSthorpej	RCSID("from: @(#)alloca.s	5.1 (Berkeley) 5/12/90")
419f1ee9aeSthorpej#else
42*7a545094Smatt	RCSID("$NetBSD: alloca.S,v 1.9 2013/07/17 04:57:55 matt Exp $")
439f1ee9aeSthorpej#endif
445f709618Spaulus#endif /* LIBC_SCCS and not lint */
455f709618Spaulus
465f709618Spaulus/* like alloc, but automatic free in return */
475f709618Spaulus
485f709618SpaulusENTRY(alloca)
4907a0a325Smatt	movl	(%sp),%a1	/* save return addr */
503b435a73Sthorpej	movl	%sp,%d0		/* get current SP value */
5107a0a325Smatt	subl	4(%sp),%d0	/* allocate requested space */
52*7a545094Smatt	movql	#-4,%d1		/* sign extend a mask */
53*7a545094Smatt	andl	%d1,%d0		/* longword align for efficiency */
543b435a73Sthorpej	addql	#8,%d0		/* reuse space of call frame */
553b435a73Sthorpej	movl	%d0,%sp		/* set new SP value */
56*7a545094Smatt	subql	#4,%sp		/* account for argument pop in caller */
57bcd9993eSkleink#ifdef __SVR4_ABI__
583b435a73Sthorpej	moveal	%d0,%a0
59bcd9993eSkleink#endif
6007a0a325Smatt	jmp 	(%a1)		/* funny return */
6194258182SmattEND(alloca)
62