|
.arch ev6 |
|
|
|
.text |
|
.align 4 |
|
.globl GC_push_regs |
|
.ent GC_push_regs 2 |
|
GC_push_regs: |
|
ldgp $gp, 0($27) |
|
lda $sp, -16($sp) |
|
stq $26, 0($sp) |
|
.mask 0x04000000, 0 |
|
.frame $sp, 16, $26, 0 |
|
|
|
/* $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 */ |
|
|
|
|
|
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 |
|
|
|
|
|
|
|
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: |
|
|
|
|
|
|
|
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 |
|
|
|
.end GC_push_regs |
|
|