|
|
1.1 ! root 1: /* `alloca' standard 4.2 subroutine for 68000's and 16000's and pyramids. ! 2: Also has _setjmp and _longjmp for pyramids. ! 3: Also has hack_sky for sun 2. ! 4: Copyright (C) 1985 Richard M. Stallman. ! 5: ! 6: This file is part of GNU Emacs. ! 7: ! 8: GNU Emacs is distributed in the hope that it will be useful, ! 9: but WITHOUT ANY WARRANTY. No author or distributor ! 10: accepts responsibility to anyone for the consequences of using it ! 11: or for whether it serves any particular purpose or works at all, ! 12: unless he says so in writing. Refer to the GNU Emacs General Public ! 13: License for full details. ! 14: ! 15: Everyone is granted permission to copy, modify and redistribute ! 16: GNU Emacs, but only under the conditions described in the ! 17: GNU Emacs General Public License. A copy of this license is ! 18: supposed to have been given to you along with GNU Emacs so you ! 19: can know your rights and responsibilities. It should be in a ! 20: file named COPYING. Among other things, the copyright notice ! 21: and this notice must be preserved on all copies. */ ! 22: ! 23: ! 24: /* Both 68000 systems I have run this on have had broken versions of alloca. ! 25: Also, I am told that non-berkeley systems do not have it at all. ! 26: So replace whatever system-provided alloca there may be ! 27: on all 68000 systems. */ ! 28: ! 29: #include "config.h" ! 30: ! 31: #ifndef HAVE_ALLOCA /* define this to use system's alloca */ ! 32: ! 33: #ifdef hp9000s200 ! 34: data ! 35: text ! 36: globl _alloca ! 37: _alloca ! 38: move.l (sp)+,a0 ; pop return addr from top of stack ! 39: move.l (sp)+,d0 ; pop size in bytes from top of stack ! 40: add.l #ROUND,d0 ; round size up to long word ! 41: and.l #MASK,d0 ; mask out lower two bits of size ! 42: sub.l d0,sp ; allocate by moving stack pointer ! 43: tst.b PROBE(sp) ; stack probe to allocate pages ! 44: move.l sp,d0 ; return pointer ! 45: add.l #-4,sp ; new top of stack ! 46: jmp (a0) ; not a normal return ! 47: MASK equ -4 ; Longword alignment ! 48: ROUND equ 3 ; ditto ! 49: PROBE equ -128 ; safety buffer for C compiler scratch ! 50: data ! 51: ! 52: #else ! 53: #ifdef m68k /* SGS assembler totally different */ ! 54: file "alloca.s" ! 55: global alloca ! 56: alloca: ! 57: mov.l (%sp)+,%a1 # pop return addr from top of stack ! 58: mov.l (%sp)+,%d0 # pop size in bytes from top of stack ! 59: add.l &R%1,%d0 # round size up to long word ! 60: and.l &-4,%d0 # mask out lower two bits of size ! 61: sub.l %d0,%sp # allocate by moving stack pointer ! 62: tst.b P%1(%sp) # stack probe to allocate pages ! 63: mov.l %sp,%a0 # return pointer as pointer ! 64: mov.l %sp,%d0 # return pointer as int to avoid disaster ! 65: add.l &-4,%sp # new top of stack ! 66: jmp (%a1) # not a normal return ! 67: set S%1,64 # safety factor for C compiler scratch ! 68: set R%1,3+S%1 # add to size for rounding ! 69: set P%1,-132 # probe this far below current top of stack ! 70: ! 71: #else /* not m68k */ ! 72: ! 73: #ifdef m68000 ! 74: ! 75: /* Some systems want the _, some do not. Win with both kinds. */ ! 76: .globl _alloca ! 77: _alloca: ! 78: .globl alloca ! 79: alloca: ! 80: movl sp@+,a0 ! 81: movl a7,d0 ! 82: subl sp@,d0 ! 83: andl #~3,d0 ! 84: movl d0,sp ! 85: tstb sp@(0) /* Make stack pages exist */ ! 86: /* Needed on certain systems ! 87: that lack true demand paging */ ! 88: addql #4,d0 ! 89: jmp a0@ ! 90: ! 91: #endif /* m68000 */ ! 92: #endif /* not m68k */ ! 93: #endif /* not hp9000s200 */ ! 94: ! 95: #ifdef ns16000 ! 96: ! 97: .text ! 98: .align 2 ! 99: /* Some systems want the _, some do not. Win with both kinds. */ ! 100: .globl _alloca ! 101: _alloca: ! 102: .globl alloca ! 103: alloca: ! 104: ! 105: /* Two different assembler syntaxes are used for the same code ! 106: on different systems. */ ! 107: ! 108: #ifdef sequent ! 109: #define IM ! 110: #define REGISTER(x) x ! 111: #else ! 112: #define IM $ ! 113: #define REGISTER(x) 0(x) ! 114: #endif ! 115: ! 116: /* ! 117: * The ns16000 is a little more difficult, need to copy regs. ! 118: * Also the code assumes direct linkage call sequence (no mod table crap). ! 119: * We have to copy registers, and therefore waste 32 bytes. ! 120: * ! 121: * Stack layout: ! 122: * new sp -> junk ! 123: * registers (copy) ! 124: * r0 -> new data ! 125: * | (orig retval) ! 126: * | (orig arg) ! 127: * old sp -> regs (orig) ! 128: * local data ! 129: * fp -> old fp ! 130: */ ! 131: ! 132: movd tos,r1 /* pop return addr */ ! 133: negd tos,r0 /* pop amount to allocate */ ! 134: sprd sp,r2 ! 135: addd r2,r0 ! 136: bicb IM/**/3,r0 /* 4-byte align */ ! 137: lprd sp,r0 ! 138: adjspb IM/**/36 /* space for regs, +4 for caller to pop */ ! 139: movmd 0(r2),4(sp),IM/**/4 /* copy regs */ ! 140: movmd 0x10(r2),0x14(sp),IM/**/4 ! 141: jump REGISTER(r1) /* funky return */ ! 142: #endif /* ns16000 */ ! 143: ! 144: #ifdef pyramid ! 145: ! 146: .globl _alloca ! 147: ! 148: _alloca: addw $3,pr0 # add 3 (dec) to first argument ! 149: bicw $3,pr0 # then clear its last 2 bits ! 150: subw pr0,sp # subtract from SP the val in PR0 ! 151: movw sp,pr0 # ret. current SP ! 152: ret ! 153: ! 154: .globl __longjmp ! 155: .globl _longjmp ! 156: .globl __setjmp ! 157: .globl _setjmp ! 158: ! 159: __longjmp: jump _longjmp ! 160: __setjmp: jump _setjmp ! 161: ! 162: #endif /* pyramid */ ! 163: ! 164: #ifdef ATT3B5 ! 165: ! 166: .align 4 ! 167: .globl alloca ! 168: ! 169: alloca: ! 170: movw %ap, %r8 ! 171: subw2 $9*4, %r8 ! 172: movw 0(%r8), %r1 /* pc */ ! 173: movw 4(%r8), %fp ! 174: movw 8(%r8), %sp ! 175: addw2 %r0, %sp /* make room */ ! 176: movw %sp, %r0 /* return value */ ! 177: jmp (%r1) /* continue... */ ! 178: ! 179: #endif /* ATT3B5 */ ! 180: ! 181: /* ! 182: A Hack to reinitialize the floating point table in C or Fortran ! 183: code. ! 184: There are no arguments to the call ! 185: ! 186: David Robinson ! 187: Jet Propulsion Laboratory ! 188: [email protected] ! 189: ! 190: WARNING: Very SUN dependant Only tested under SUN 2.0 ! 191: */ ! 192: #ifdef sun2 ! 193: .globl _hack_sky ! 194: ! 195: _hack_sky: ! 196: moveml #0xC0C0,sp@- |save registers <d0,d1,a0,a1> ! 197: clrl __skybase |clear out old sky status ! 198: jsr __skyinit |initialize sky board ! 199: tstl d0 |check if successful ! 200: lea floatflavor,a1 ! 201: beqs hack1 ! 202: lea a1@(0x7e),a0 |Sky board exists ! 203: bras hack2 ! 204: hack1: lea a1@(0x12),a0 |No Sky board ! 205: hack2: movw #0x1a,d0 ! 206: lea fvflti,a1 |load destination ! 207: hack3: movl a0@+,a1@+ |copy table ! 208: dbra d0,hack3 ! 209: moveml sp@+,#0x0303 |restore registers ! 210: rts ! 211: #endif /* sun2 */ ! 212: ! 213: #endif /* not HAVE_ALLOCA */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.