428
|
1 /* `alloca' standard 4.2 subroutine for 68000's and 16000's and others.
|
|
2 Copyright (C) 1985, 1986, 1988 Free Software Foundation, Inc.
|
|
3
|
|
4 This file is part of XEmacs.
|
|
5
|
|
6 XEmacs is free software; you can redistribute it and/or modify it
|
|
7 under the terms of the GNU General Public License as published by the
|
|
8 Free Software Foundation; either version 2, or (at your option) any
|
|
9 later version.
|
|
10
|
|
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
|
|
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
14 for more details.
|
|
15
|
|
16 You should have received a copy of the GNU General Public License
|
|
17 along with XEmacs; see the file COPYING. If not, write to
|
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
19 Boston, MA 02111-1307, USA. */
|
|
20
|
|
21 /* Synched up with: FSF 19.30. */
|
|
22
|
|
23 /* Both 68000 systems I have run this on have had broken versions of alloca.
|
|
24 Also, I am told that non-berkeley systems do not have it at all.
|
|
25 So replace whatever system-provided alloca there may be
|
|
26 on all 68000 systems. */
|
|
27
|
|
28 #define NOT_C_CODE
|
|
29 #ifdef emacs
|
|
30 #include <config.h>
|
|
31 #else
|
|
32 #include "config.h"
|
|
33 #endif
|
|
34
|
|
35 #ifndef HAVE_ALLOCA /* define this to use system's alloca */
|
|
36
|
|
37 #ifndef m68k
|
|
38 #ifndef m68000
|
|
39 you
|
|
40 lose!!
|
|
41 #endif /* m68000 */
|
|
42 #endif /* m68k */
|
|
43
|
|
44
|
|
45 #ifdef m68k /* SGS assembler totally different */
|
|
46 file "alloca.s"
|
|
47 global alloca
|
|
48 alloca:
|
|
49 mov.l (%sp)+,%a1 # pop return addr from top of stack
|
|
50 mov.l (%sp)+,%d0 # pop size in bytes from top of stack
|
|
51 add.l &R%1,%d0 # round size up to long word
|
|
52 and.l &-4,%d0 # mask out lower two bits of size
|
|
53 sub.l %d0,%sp # allocate by moving stack pointer
|
|
54 tst.b P%1(%sp) # stack probe to allocate pages
|
|
55 mov.l %sp,%a0 # return pointer as pointer
|
|
56 mov.l %sp,%d0 # return pointer as int to avoid disaster
|
|
57 add.l &-4,%sp # new top of stack
|
|
58 jmp (%a1) # not a normal return
|
|
59 set S%1,64 # safety factor for C compiler scratch
|
|
60 set R%1,3+S%1 # add to size for rounding
|
|
61 set P%1,-132 # probe this far below current top of stack
|
|
62
|
|
63 #else /* not m68k */
|
|
64
|
|
65 #ifdef m68000
|
|
66
|
|
67 /* Some systems want the _, some do not. Win with both kinds. */
|
|
68 .globl _alloca
|
|
69 _alloca:
|
|
70 .globl alloca
|
|
71 alloca:
|
|
72 movl sp@+,a0
|
|
73 movl a7,d0
|
|
74 subl sp@,d0
|
|
75 andl #~3,d0
|
|
76 movl d0,sp
|
|
77 tstb sp@(0) /* Make stack pages exist */
|
|
78 /* Needed on certain systems
|
|
79 that lack true demand paging */
|
|
80 addql #4,d0
|
|
81 jmp a0@
|
|
82
|
|
83 #endif /* m68000 */
|
|
84 #endif /* not m68k */
|
|
85
|
|
86 #endif /* not HAVE_ALLOCA */
|