Annotation of 43BSD/contrib/emacs/src/alloca.s, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.