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 */