[BACK]Return to alpha_mach_dep.s CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / gc

Annotation of OpenXM_contrib2/asir2000/gc/alpha_mach_dep.s, Revision 1.2

1.1       noro        1:  # $Id: alpha_mach_dep.s,v 1.2 1993/01/18 22:54:51 dosser Exp $
                      2:
1.2     ! noro        3: # This is BROKEN on a 21264 running gcc, and probably in other cases.
        !             4: # The compiler may spill pointers to fp registers, and this code doesn't
        !             5: # scan those.
        !             6:
1.1       noro        7: # define call_push(x)                                                  \
                      8:        lda   $16, 0(x);        /* copy x to first argument register */ \
                      9:        jsr   $26, GC_push_one; /* call GC_push_one, ret addr in $26 */ \
                     10:        ldgp  $gp, 0($26)       /* restore $gp register from $ra */
                     11:
                     12:         .text
                     13:         .align  4
                     14:         .globl  GC_push_regs
                     15:         .ent    GC_push_regs 2
                     16: GC_push_regs:
                     17:        ldgp    $gp, 0($27)             # set gp from the procedure value reg
                     18:        lda     $sp, -32($sp)           # make stack frame
                     19:        stq     $26, 8($sp)             # save return address
                     20:         .mask   0x04000000, -8
                     21:         .frame  $sp, 16, $26, 0
                     22:
                     23:  #      call_push($0)    # expression eval and int func result
                     24:
                     25:  #      call_push($1)    # temp regs - not preserved cross calls
                     26:  #      call_push($2)
                     27:  #      call_push($3)
                     28:  #      call_push($4)
                     29:  #      call_push($5)
                     30:  #      call_push($6)
                     31:  #      call_push($7)
                     32:  #      call_push($8)
                     33:
                     34:         call_push($9)    # Saved regs
                     35:         call_push($10)
                     36:         call_push($11)
                     37:         call_push($12)
                     38:         call_push($13)
                     39:         call_push($14)
                     40:
                     41:         call_push($15)   # frame ptr or saved reg
                     42:
                     43:  #      call_push($16)   # argument regs - not preserved cross calls
                     44:  #      call_push($17)
                     45:  #      call_push($18)
                     46:  #      call_push($19)
                     47:  #      call_push($20)
                     48:  #      call_push($21)
                     49:
                     50:  #      call_push($22)   # temp regs - not preserved cross calls
                     51:  #      call_push($23)
                     52:  #      call_push($24)
                     53:  #      call_push($25)
                     54:
                     55:  #      call_push($26)   # return address - expression eval
                     56:  #      call_push($27)   # procedure value or temporary reg
                     57:  #      call_push($28)   # assembler temp - not presrved
                     58:         call_push($29)   # Global Pointer
                     59:  #      call_push($30)   # Stack Pointer
                     60:
                     61:        ldq     $26, 8($sp)             # restore return address
                     62:        lda     $sp, 32($sp)            # pop stack frame
                     63:        ret     $31, ($26), 1           # return ($31 == hardwired zero)
                     64:        .end    GC_push_regs

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>