diff options
Diffstat (limited to '')
-rw-r--r-- | gc/alpha_mach_dep.s | 115 |
1 files changed, 71 insertions, 44 deletions
diff --git a/gc/alpha_mach_dep.s b/gc/alpha_mach_dep.s index 0aaa97b..0e6a842 100644 --- a/gc/alpha_mach_dep.s +++ b/gc/alpha_mach_dep.s @@ -1,60 +1,87 @@ - # $Id: alpha_mach_dep.s,v 1.1 2001/11/08 05:17:06 a-ito Exp $ + # $Id: alpha_mach_dep.s,v 1.2 2001/11/09 04:59:18 a-ito Exp $ + .arch ev6 -# define call_push(x) \ - lda $16, 0(x); /* copy x to first argument register */ \ - jsr $26, GC_push_one; /* call GC_push_one, ret addr in $26 */ \ - ldgp $gp, 0($26) /* restore $gp register from $ra */ - .text .align 4 .globl GC_push_regs .ent GC_push_regs 2 GC_push_regs: - ldgp $gp, 0($27) # set gp from the procedure value reg - lda $sp, -32($sp) # make stack frame - stq $26, 8($sp) # save return address - .mask 0x04000000, -8 + ldgp $gp, 0($27) + lda $sp, -16($sp) + stq $26, 0($sp) + .mask 0x04000000, 0 .frame $sp, 16, $26, 0 - # call_push($0) # expression eval and int func result - - # call_push($1) # temp regs - not preserved cross calls - # call_push($2) - # call_push($3) - # call_push($4) - # call_push($5) - # call_push($6) - # call_push($7) - # call_push($8) + # $0 integer result + # $1-$8 temp regs - not preserved cross calls + # $9-$15 call saved regs + # $16-$21 argument regs - not preserved cross calls + # $22-$28 temp regs - not preserved cross calls + # $29 global pointer - not preserved cross calls + # $30 stack pointer - call_push($9) # Saved regs +# define call_push(x) \ + mov x, $16; \ + jsr $26, GC_push_one; \ + ldgp $gp, 0($26) + + call_push($9) call_push($10) call_push($11) call_push($12) call_push($13) call_push($14) + call_push($15) + + # $f0-$f1 floating point results + # $f2-$f9 call saved regs + # $f10-$f30 temp regs - not preserved cross calls + + # Use the most efficient transfer method for this hardware. + # Bit 1 detects the FIX extension, which includes ftoit. + amask 2, $0 + bne $0, $use_stack + +#undef call_push +#define call_push(x) \ + ftoit x, $16; \ + jsr $26, GC_push_one; \ + ldgp $gp, 0($26) + + call_push($f2) + call_push($f3) + call_push($f4) + call_push($f5) + call_push($f6) + call_push($f7) + call_push($f8) + call_push($f9) + + ldq $26, 0($sp) + lda $sp, 16($sp) + ret $31, ($26), 1 + + .align 4 +$use_stack: + +#undef call_push +#define call_push(x) \ + stt x, 8($sp); \ + ldq $16, 8($sp); \ + jsr $26, GC_push_one; \ + ldgp $gp, 0($26) + + call_push($f2) + call_push($f3) + call_push($f4) + call_push($f5) + call_push($f6) + call_push($f7) + call_push($f8) + call_push($f9) + + ldq $26, 0($sp) + lda $sp, 16($sp) + ret $31, ($26), 1 - call_push($15) # frame ptr or saved reg - - # call_push($16) # argument regs - not preserved cross calls - # call_push($17) - # call_push($18) - # call_push($19) - # call_push($20) - # call_push($21) - - # call_push($22) # temp regs - not preserved cross calls - # call_push($23) - # call_push($24) - # call_push($25) - - # call_push($26) # return address - expression eval - # call_push($27) # procedure value or temporary reg - # call_push($28) # assembler temp - not presrved - call_push($29) # Global Pointer - # call_push($30) # Stack Pointer - - ldq $26, 8($sp) # restore return address - lda $sp, 32($sp) # pop stack frame - ret $31, ($26), 1 # return ($31 == hardwired zero) .end GC_push_regs |