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