Annotation of 43BSD/contrib/icon/lib/pret.s, revision 1.1.1.1

1.1       root        1: #include "../h/config.h"
                      2: /*
                      3:  * pret - returns a value from an Icon procedure.  pret takes
                      4:  *  a single argument which is the value to return.  The real
                      5:  *  work is in figuring out whether the return value needs to
                      6:  *  be dereferenced.
                      7:  */
                      8: 
                      9: Global(_deref)         /* Dereference a variable */
                     10: Global(_rtrace)                /* Return trace routine */
                     11: Global(_boundary)      /* Icon/C boundary address */
                     12: Global(_current)       /* Current expression stack */
                     13: Global(_file)          /* Current file name */
                     14: Global(_k_level)       /* Value of &level */
                     15: Global(_k_trace)       /* Value of &trace */
                     16: Global(_line)          /* Current line number */
                     17: 
                     18: Global(_pret)
                     19: #ifdef VAX
                     20: _pret:
                     21:        Mask    0               # Don't need to save any registers because
                     22:                                #  the current frame will be discarded.
                     23:        movl    fp,_boundary    # The boundary is set because deref may
                     24:                                #  cause garbage collection.
                     25:        decl    _k_level        # A procedure is being exited, so &level
                     26:                                #  must be decremented.
                     27: /*
                     28:  * Calculate target address for return value in r11.
                     29:  */
                     30:                                # The frame of the caller is the procedure
                     31:                                #  frame for the Icon procedure returning
                     32:        movl    8(fp),r2        #  a value.  Put it's ap in r2.
                     33:                                # The return value will overwrite arg0,
                     34:                                #  the address of arg0 is calculated via:
                     35:        ashl    $3,4(r2),r11    # r11 = 8 * nargs
                     36:        addl2   $8,r11          #  + 8
                     37:        addl2   r2,r11          #  + ap
                     38:                                # Note that nargs and ap belong to the
                     39:                                #  returning Icon procedure.
                     40: /*
                     41:  * Dereference the return value if it is a local variable or an
                     42:  *  argument.
                     43:  */
                     44:                                # The return value is on the stack as
                     45:                                #  an argument, put type field of return
                     46:        movl    8(ap),r1        #  value in r1 for testing.
                     47:        bitl    $F_NQUAL,r1     # If return value is a string,
                     48:        beql    chktrace        #  it doesn't need dereferencing.
                     49:        bitl    $F_VAR,r1       # If return value isn't a variable,
                     50:        beql    chktrace        #  it doesn't need dereferencing.
                     51:        bitl    $F_TVAR,r1      # If return value is a trapped variable,
                     52:        bneq    chktv           #  it requires some work.
                     53:        movl    12(ap),r1       # Otherwise, get the address of the
                     54:        jmp     chkloc          #  data block for more testing.
                     55:        
                     56: chktv:                         # A trapped variable is being returned,
                     57:                                #  only substring trapped variables need
                     58:                                #  dereferencing.
                     59:        bicl2   $~TYPEMASK,r1   # "and" off all but bits in type field
                     60:        cmpl    $T_TVSUBS,r1    # If the variable isn't a substring t.v.,
                     61:        bneq    chktrace        #  it doesn't need dereferencing.
                     62:        movl    12(ap),r1       # Point r1 at data block for s.s.t.v.
                     63:        movl    16(r1),r1       # Then at actual address of variable
                     64: chkloc:                                #
                     65:                                # See if the variable is on the stack.
                     66:                                #  If it is, it will lie between the
                     67:                                #  sp and the base of the current
                     68:                                #  expression stack. r1 holds address
                     69:                                #  of variable.
                     70:        cmpl    r1,sp           # If address is below the sp,
                     71:        blssu   chktrace        #  it's not a local or an argument
                     72:        movl    _current+4,r0   # Point r0 at data block for current
                     73:                                #  expression.
                     74:        cmpl    r1,12(r0)       # Fourth word is the base of the stack
                     75:                                #  for the current expression.  If the
                     76:                                #  variable address is above the stack
                     77:        bgtru   chktrace        #  base, it's not a local or an argument.
                     78:                                # Otherwise, it is a local or an argument
                     79:                                #  and must be dereferenced.
                     80:        pushal  8(ap)           # Push address of return value
                     81:        calls   $1,_deref       #  and dereference it.
                     82: 
                     83: /*
                     84:  * Print trace message if &trace is set.
                     85:  */
                     86: chktrace:
                     87:        tstl    _k_trace        # If &trace is zero,
                     88:        beql    tracedone       #  no tracing.
                     89:                                # Otherwise, set up to call rtrace
                     90:                                #  with address of proc block and
                     91:                                #  return value.
                     92:        pushal  8(ap)           # Push address of return value
                     93:        pushl   4(r11)          # Push address of procedure block
                     94:        calls   $2,_rtrace      # rtrace(proc. block address,&return value)
                     95:        
                     96: tracedone:                     # The descriptor for the procedure block
                     97:                                #  (arg0) must be replaced by the descriptor
                     98:                                #  of the return value.  r11 points at the
                     99:        movq    8(ap),(r11)     #  procedure block, so a movq does the trick.
                    100: /*
                    101:  * Return from the Icon procedure.  What this really does is to return
                    102:  *  via the frame built by invoke.  Thus, the return below returns from
                    103:  *  the call to invoke.
                    104:  */
                    105:                                
                    106:        movl    12(fp),fp       # Get frame built by invoke on top of stack
                    107:        movl    -4(fp),_line    # Restore _line,
                    108:        movl    -8(fp),_file    #  and _file from procedure block.
                    109:        clrl    _boundary       # Reentering an Icon environment, so
                    110:                                #  the boundary is cleared.
                    111:        ret                     # Return.  This is manifested as a
                    112:                                #  return from invoke.
                    113: #endif VAX
                    114: 
                    115: #ifdef PORT
                    116: DummyFcn(_pret)
                    117: #endif PORT
                    118: #ifdef PDP11
                    119: / pret - return from an Icon procedure.
                    120: / Return value is argument to pret at 6(r5).
                    121: 
                    122: / Register usage:
                    123: /   r1: type or pointer field of returned value
                    124: /   r2: returning procedure frame pointer
                    125: /   r3: address of argument #0 (place-holder for returned value)
                    126: /   r5: current procedure frame pointer
                    127: _pret:
                    128:        mov     r5,-(sp)        / create new procedure frame
                    129:        mov     sp,r5
                    130:        mov     r4,-(sp)
                    131:        mov     r3,-(sp)
                    132:        mov     r2,-(sp)
                    133:        mov     r5,_boundary    / set Icon/C boundary
                    134: 
                    135: / Decrement &level and calculate address of eventual return value.
                    136: 
                    137:        dec     _k_level
                    138:        mov     (r5),r2         / compute address for
                    139:        mov     4(r2),r3        /   return value:
                    140:        asl     r3              /   r3 = r2 + 6 + 4*nargs
                    141:        asl     r3
                    142:        add     r2,r3
                    143:        add     $6,r3
                    144: 
                    145: / Dereference return value if necessary.
                    146: 
                    147:        mov     6(r5),r1        / get type field of return value into r1
                    148:        bit     $F_NQUAL,r1     / if return value is the
                    149:        beq     1f              /   name of a local variable
                    150:        bit     $F_VAR,r1       /   or argument, then it
                    151:        beq     1f              /   needs dereferencing
                    152:        bit     $F_TVAR,r1
                    153:        bne     2f
                    154:        mov     8.(r5),r1       / get pointer field into r1
                    155:        br      3f
                    156: 2:
                    157:        bic     $!TYPEMASK,r1   / check type code for substring t.v.
                    158:        cmp     $T_TVSUBS,r1    /   if not, it doesn't need
                    159:        bne     1f              /   dereferencing
                    160:        mov     8.(r5),r1       / get pointer field from b_tvsubs
                    161:        mov     8.(r1),r1       /   block into r1
                    162: 3:
                    163:        cmp     r1,sp           / if pointer is between
                    164:        blo     1f              /   sp and sbase, it is a local
                    165:        mov     _current+2,r0   /   or an argument
                    166:        cmp     r1,6(r0)
                    167:        bhi     1f
                    168:        mov     r5,-(sp)        / dereference it
                    169:        add     $6,(sp)
                    170:        jsr     pc,_deref
                    171:        tst     (sp)+
                    172: 
                    173: / Print trace message if &trace is set.
                    174: 
                    175: 1:
                    176:        tst     _k_trace
                    177:        beq     1f
                    178:        mov     r5,-(sp)        /   push address of return value
                    179:        add     $6,(sp)
                    180:        mov     2(r3),-(sp)     /   push pointer to procedure block
                    181:        jsr     pc,_rtrace      /   call rtrace; other arguments are in frame
                    182:        cmp     (sp)+,(sp)+
                    183: 
                    184: / Copy return value to the outer expression frame.
                    185: 
                    186: 1:
                    187:        mov     r3,r1           / save r3 to pop stack to this point later
                    188:        mov     6(r5),(r3)+     / move return value down from top of stack
                    189:        mov     8.(r5),(r3)
                    190: 
                    191: / Return.
                    192: 
                    193:        mov     r2,r5           / restore old values of registers
                    194:        mov     r2,r0
                    195:        mov     -(r0),r4        
                    196:        mov     -(r0),r3
                    197:        mov     -(r0),r2
                    198:        mov     -(r0),_line
                    199:        mov     -(r0),_file
                    200:        mov     r5,sp
                    201:        mov     (sp)+,r5
                    202:        mov     (sp)+,r0        / pop return pc
                    203:        mov     r1,sp           / pop stack to return value
                    204:        clr     _boundary       / clear Icon/C boundary
                    205:        jmp     (r0)            / return
                    206: #endif PDP11

unix.superglobalmegacorp.com

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