88 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|  # $Id: alpha_mach_dep.s,v 1.3 2001/11/15 00:32:13 a-ito Exp $
 | |
| 	.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
 |