Commit | Line | Data |
---|---|---|
33fde5e7 WN |
1 | /*- |
2 | * Copyright (c) 1990 The Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * This code is derived from software contributed to Berkeley by | |
6 | * William Jolitz. | |
7 | * | |
1c15e888 C |
8 | * Redistribution and use in source and binary forms are permitted |
9 | * provided that: (1) source distributions retain this entire copyright | |
10 | * notice and comment, and (2) distributions including binaries display | |
11 | * the following acknowledgement: ``This product includes software | |
12 | * developed by the University of California, Berkeley and its contributors'' | |
13 | * in the documentation or other materials provided with the distribution | |
14 | * and in all advertising materials mentioning features or use of this | |
15 | * software. Neither the name of the University nor the names of its | |
16 | * contributors may be used to endorse or promote products derived | |
17 | * from this software without specific prior written permission. | |
18 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR | |
19 | * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED | |
20 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | |
33fde5e7 WN |
21 | */ |
22 | ||
23 | #if defined(LIBC_SCCS) && !defined(lint) | |
1c15e888 | 24 | .asciz "@(#)alloca.s 5.2 (Berkeley) 5/14/90" |
33fde5e7 WN |
25 | #endif /* LIBC_SCCS and not lint */ |
26 | ||
27 | /* like alloc, but automatic automatic free in return */ | |
28 | ||
29 | #include "DEFS.h" | |
30 | ||
31 | ENTRY(alloca) | |
33fde5e7 WN |
32 | popl %edx /* pop return addr */ |
33 | popl %eax /* pop amount to allocate */ | |
34 | movl %esp,%ecx | |
3608740e | 35 | addl $3,%eax /* round up to next word */ |
33fde5e7 WN |
36 | andl $0xfffffffc,%eax |
37 | subl %eax,%esp | |
3608740e | 38 | movl %esp,%eax /* base of newly allocated space */ |
33fde5e7 WN |
39 | pushl 8(%ecx) /* copy possible saved registers */ |
40 | pushl 4(%ecx) | |
41 | pushl 0(%ecx) | |
42 | pushl %eax /* dummy to pop at callsite */ | |
43 | jmp %edx /* "return" */ |