| .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 */ | |
| # 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 | |
| .end GC_push_regs | |