libgcc.S   [plain text]


;
; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
; Contributed by Red Hat, Inc and Ubicom, Inc.
;
; This file is part of GNU CC.
;
; GNU CC is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2, or (at your option)
; any later version.
;
; In addition to the permissions in the GNU General Public License, the
; Free Software Foundation gives you unlimited permission to link the
; compiled version of this file with other programs, and to distribute
; those programs without any restriction coming from the use of this
; file.  (The General Public License restrictions do apply in other
; respects; for example, they cover modification of the file, and
; distribution when not linked into another program.)
;
; GNU CC is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with GNU CC; see the file COPYING.  If not, write to
; the Free Software Foundation, 59 Temple Place - Suite 330,
; Boston, MA 02111-1307, USA.  */

/*******************************************************
	load byte from arbitrary memory
	address passed in first bank register, result in W

*******************************************************/
	.macro	movb	to, from
	mov	w, \from
	mov	\to, w
	.endm


#if defined (L_indcall)
/* __indcall - given register containing an address, call the function
 *	at that address.
 */

	.sect	.pram.libgcc,"ax"
	.global	__indcall
	.func	_indcall,__indcall

__indcall:
	page	1f
	call	1f
1:	pop	callh			; Get the call target
	pop	calll
	ret				; Transfer to new function

	.endfunc
#endif


#if defined (L_mulhi3)
	.sect	.pram.libgcc,"ax"
	.global	__mulhi3
	.func	_mulhi3, __mulhi3

__mulhi3:
	mov	w, 2(SP)		; First upper half partial product
	mulu	w, 3(SP)
	mov	3(SP), w
	mov	w, 1(SP)		; Second upper half partial product
	mulu	w, 4(SP)
	add	3(SP), w
	mov	w, 2(SP)		; Lower half partial product
	mulu	w, 4(SP)
	mov	4(SP), w
	mov	w, MULH
	add	3(SP), w

	mov	w, #2			; Adjust the stack leaving the result to
	add	spl, w			; be popped off later.
	ret

	.endfunc

#endif /* defined (L_mulhi3) */

#if defined (L_mulsi3)
/*******************************************************
               Multiplication  32 x 32
*******************************************************/
	
	.sect	.text.libgcc,"ax"
	.global	__mulsi3
	.func	_mulsi3, __mulsi3

__mulsi3:
	clr	$80			; Assume zero result
	clr	$81
	clr	$82
	clr	$83

2:	mov	w, 1(sp)
	or	w, 2(sp)
	or	w, 3(sp)
	or	w, 4(sp)
	snz				; Any more significant bits to multiply?
	page	3f
	jmp	3f

	sb	4(sp), 0		; Check LSB of multiplier
	page	1f			; zero => scale multiplicand & multiplier
	jmp	1f

	mov	w, 8(sp)		; Accumulate product
	add	$83, w
	mov	w, 7(sp)
	addc	$82, w
	mov	w, 6(sp)
	addc	$81, w
	mov	w, 5(sp)
	addc	$80, w
1:	clrb	status, 0		; scale multiplier down
	rr	1(sp)	
	rr	2(sp)
	rr	3(sp)
	rr	4(sp)
	clrb	status, 0
	rl	8(sp)
	rl	7(sp)
	rl	6(sp)
	rl	5(sp)
	page	2b
	jmp	2b

3:	mov	w, #8
	add	spl ,w
	ret

	.endfunc

#endif /* defined (L_mulsi3) */
	
#if defined (L_muldi3)
/*******************************************************
               Multiplication  64 x 64
*******************************************************/
	
	.sect	.text.libgcc,"ax"
	.global	__muldi3
	.func	_muldi3, __muldi3

__muldi3:
	clr	$80			; Assume zero result
	clr	$81
	clr	$82
	clr	$83
	clr	$84
	clr	$85
	clr	$86
	clr	$87

2:	mov	w, 1(sp)
	or	w, 2(sp)
	or	w, 3(sp)
	or	w, 4(sp)
	or	w, 5(sp)
	or	w, 6(sp)
	or	w, 7(sp)
	or	w, 8(sp)
	snz				; Any more significant bits to multiply?
	page	3f
	jmp	3f

	sb	8(sp), 0		; Check LSB of multiplier
	page	1f			; zero => scale multiplicand & multiplier
	jmp	1f

	mov	w, 16(sp)		; Accumulate product
	add	$87, w
	mov	w, 15(sp)
	addc	$86, w
	mov	w, 14(sp)
	addc	$85, w
	mov	w, 13(sp)
	addc	$84, w
	mov	w, 12(sp)
	addc	$83, w
	mov	w, 11(sp)
	addc	$82, w
	mov	w, 10(sp)
	addc	$81, w
	mov	w, 9(sp)
	addc	$80, w

1:	clrb	status, 0		; scale multiplier down
	rr	1(sp)	
	rr	2(sp)
	rr	3(sp)
	rr	4(sp)
	rr	5(sp)
	rr	6(sp)
	rr	7(sp)
	rr	8(sp)
	clrb	status, 0
	rl	16(sp)
	rl	15(sp)
	rl	14(sp)
	rl	13(sp)
	rl	12(sp)
	rl	11(sp)
	rl	10(sp)
	rl	9(sp)
	page	2b
	jmp	2b

3:	mov	w, #16
	add	spl, w
	ret

	.endfunc

#endif /* defined (L_muldi3) */

#if defined (L_divmodhi4)
#define	arg1h 1(SP)
#define arg1l 2(SP)
#define arg2h 3(SP)
#define arg2l 4(SP)
#define resl $81
#define resh $80
#define reml $83
#define remh $82
#define tmp_var	$84
#define cnt $85
#define arg1_sign $86
#define res_sign $87

	.sect	.text.libgcc,"ax"
	.global	__divmodhi4
	.func	_divmodhi4, __divmodhi4

__divmodhi4:
	mov	w,arg2h
	mov	res_sign,w
	mov	w,arg1h
	mov	arg1_sign,w
	xor	res_sign,w

	sb	arg1h,7
	page	1f
	jmp	1f

	not	arg1h
	not	arg1l
	incsnz	arg1l
	inc	arg1h

1:	sb	arg2h, 7
	page	1f
	jmp	1f

	not	arg2h
	not	arg2l
	incsnz	arg2l
	inc	arg2h

1:	page	__udivmodhi4		; Do the unsigned div/mod
	call	__udivmodhi4

	sb	arg1_sign, 7
	page	1f
	jmp	1f

	not	reml
	not	remh
	incsnz	reml
	inc	remh

1:	sb	res_sign, 7
	ret

	not	resl
	not	resh
	incsnz	resl
	inc	resh
	ret

	.endfunc

#undef arg1h
#undef arg1l
#undef arg2h
#undef arg2l
#undef resl
#undef resh
#undef reml
#undef remh
#undef tmp_var
#undef cnt
#undef arg1_sign
#undef res_sign

#endif /* defined (L_divmodhi4) */
	
#if defined (L_udivmodhi4)

#define	arg1h 1(SP)
#define arg1l 2(SP)
#define arg2h 3(SP)
#define arg2l 4(SP)
#define resl $81
#define resh $80
#define reml $83
#define remh $82
#define tmp_var	$84
#define cnt $85

	.sect	.text.libgcc,"ax"
	.global	__udivmodhi4
	.func	_udivmodhi4, __udivmodhi4

__udivmodhi4:
	clr	reml
	clr	remh
	mov	w, #17
	mov	cnt,w
	clrb	status, 0
	page	1f
	jmp	1f

2:	rl	reml
	rl	remh
	mov	w, arg2l
	sub	w, reml
	mov	tmp_var, w
	mov	w, arg2h
	subc	w, remh
	sc
	page	1f
	jmp	1f
	mov	remh, w
	mov	w, tmp_var
	mov	reml, w

1:	rl	arg1l
	rl	arg1h
	decsz	cnt
	page	2b
	jmp	2b
	
	pop	resh
	pop	resl	
	mov	w, #2
	add	spl, w
	ret

	.endfunc

#undef arg1h
#undef arg1l
#undef arg2h
#undef arg2l
#undef resl
#undef resh
#undef reml
#undef remh
#undef tmp_var
#undef cnt

#endif	/* defined (L_udivmodhi4) */

#if defined (L_divmodsi4)

#define	arg1a 1(SP)
#define arg1b 2(SP)
#define arg1c 3(SP)
#define arg1d 4(SP)

#define arg2a 5(SP)
#define arg2b 6(SP)
#define arg2c 7(SP)
#define arg2d 8(SP)
	
#define resa $80
#define resb $81
#define resc $82
#define resd $83

#define rema $84
#define remb $85
#define remc $86
#define remd $87

#define tmp_var	$88
#define tmp_var1 $89
#define tmp_var2 $8a
#define cnt $8b
#define arg1_sign $8c
#define res_sign $8d

	.sect	.text.libgcc,"ax"
	.global	__divmodsi4
	.func	_divmodsi4, __divmodsi4

__divmodsi4:
	mov	w, arg2a
	mov	res_sign, w
	mov	w, arg1a
	mov	arg1_sign, w
	xor	res_sign, w

	sb	arg1a, 7
	page	1f
	jmp	1f

	not	arg1d
	not	arg1c
	not	arg1b
	not	arg1a
	incsnz	arg1d
	incsz	arg1c
	page	1f
	jmp	1f
	incsnz	arg1b
	inc	arg1a

1:	sb	arg2a, 7
	page	1f
	jmp	1f

	not	arg2d
	not	arg2c
	not	arg2b
	not	arg2a
	incsnz	arg2d
	incsz	arg2c
	page	1f
	jmp	1f
	incsnz	arg2b
	inc	arg2a

1:	page	__udivmodsi4		; Do the unsigned div/mod.
	call	__udivmodsi4

	sb	arg1_sign, 7
	page	1f
	jmp	1f

	not	remd
	not	remc
	not	remb
	not	rema
	incsnz	remd
	incsz	remc
	page	1f
	jmp	1f
	incsnz	remb
	inc	rema

1:	sb	res_sign, 7
	ret

	not	resd
	not	resc
	not	resb
	not	resa
	incsnz	resd
	incsz	resc
	ret
	incsnz	resb
	inc	resa
	ret

	.endfunc

#undef arg1a
#undef arg1b
#undef arg1c
#undef arg1d

#undef arg2a
#undef arg2b
#undef arg2c
#undef arg2d
	
#undef resa
#undef resb
#undef resc
#undef resd

#undef rema
#undef remb
#undef remc
#undef remd

#undef tmp_var
#undef tmp_var1
#undef tmp_var2
#undef cnt
#undef arg1_sign
#undef res_sign

#endif /* defined (L_divmodsi4) */

#if defined (L_udivmodsi4)		
#define	arg1a 1(SP)
#define arg1b 2(SP)
#define arg1c 3(SP)
#define arg1d 4(SP)

#define arg2a 5(SP)
#define arg2b 6(SP)
#define arg2c 7(SP)
#define arg2d 8(SP)
	
#define resa $80
#define resb $81
#define resc $82
#define resd $83

#define rema $84
#define remb $85
#define remc $86
#define remd $87

#define tmp_var	$88
#define tmp_var1 $89
#define tmp_var2 $8a
#define cnt $8b

	.sect	.text.libgcc,"ax"
	.global	__udivmodsi4
	.func	_udivmodsi4, __udivmodsi4

__udivmodsi4:
	clr	remd
	clr	remc
	clr	remb
	clr	rema
	mov	w, #33
	mov	cnt, w
	clrb	status, 0
	page	1f
	jmp	1f

2:	rl	remd
	rl	remc
	rl	remb
	rl	rema
	mov	w, arg2d
	sub	w, remd
	mov	tmp_var, w
	mov	w, arg2c
	subc	w, remc
	mov	tmp_var1, w
	mov	w, arg2b
	subc	w, remb
	mov	tmp_var2, w
	mov	w, arg2a
	subc	w, rema
	sc
	page	1f
	jmp	1f

	mov	rema, w
	mov	w, tmp_var2
	mov	remb, w
	mov	w, tmp_var1
	mov	remc, w
	mov	w, tmp_var
	mov	remd, w

1:	rl	arg1d
	rl	arg1c
	rl	arg1b
	rl	arg1a
	decsz	cnt
	page	2b
	jmp	2b

	pop	resa
	pop	resb
	pop	resc
	pop	resd
	mov	w, #4
	add	spl, w
	ret

	.endfunc

#undef arg1a
#undef arg1b
#undef arg1c
#undef arg1d

#undef arg2a
#undef arg2b
#undef arg2c
#undef arg2d
	
#undef resa
#undef resb
#undef resc
#undef resd

#undef rema
#undef remb
#undef remc
#undef remd

#undef tmp_var
#undef tmp_var1
#undef tmp_var2
#undef cnt

#endif /* defined (L_udivmodsi4) */

#if defined (L_divmoddi4)

#define	arg1s 1(SP)
#define arg1t 2(SP)
#define arg1u 3(SP)
#define arg1v 4(SP)
#define arg1w 5(SP)
#define arg1x 6(SP)
#define arg1y 7(SP)
#define arg1z 8(SP)

#define arg2s 9(SP)
#define arg2t 10(SP)
#define arg2u 11(SP)
#define arg2v 12(SP)
#define arg2w 13(SP)
#define arg2x 14(SP)
#define arg2y 15(SP)
#define arg2z 16(SP)
	
#define ress $80
#define rest $81
#define resu $82
#define resv $83
#define resw $84
#define resx $85
#define resy $86
#define resz $87

#define rems $88
#define remt $89
#define remu $8a
#define remv $8b
#define remw $8c
#define remx $8d
#define remy $8e
#define remz $8f

#define tmp_var	$90
#define tmp_var1 $91
#define tmp_var2 $92
#define tmp_var3 $93
#define tmp_var4 $94
#define tmp_var5 $95
#define tmp_var6 $96
#define cnt $97

	.sect	.text.libgcc,"ax"
	.global	__divmoddi4
	.func	_divmoddi4, __divmoddi4

__divmoddi4:
	rl	w, arg2s		; Use MULH to track sign bits.
	rl	MULH
	rl	w, arg1s
	rl	WREG
	xor	MULH, w
	rl	w, arg1s
	rl	MULH

	sb	arg1s, 7
	page	1f
	jmp	1f

	not	arg1s
	not	arg1t
	not	arg1u
	not	arg1v
	not	arg1w
	not	arg1x
	not	arg1y
	not	arg1z
	incsnz	arg1z
	incsz	arg1y
	page	1f
	jmp	1f
	incsnz	arg1x
	incsz	arg1w
	page	1f
	jmp	1f
	incsnz	arg1v
	incsz	arg1u
	page	1f
	jmp	1f
	incsnz	arg1t
	inc	arg1s

1:	sb	arg2s, 7
	page	1f
	jmp	1f

	not	arg2s
	not	arg2t
	not	arg2u
	not	arg2v
	not	arg2w
	not	arg2x
	not	arg2y
	not	arg2z
	incsnz	arg2z
	incsz	arg2y
	page	1f
	jmp	1f
	incsnz	arg2x
	incsz	arg2w
	page	1f
	jmp	1f
	incsnz	arg2v
	incsz	arg2u
	page	1f
	jmp	1f
	incsnz	arg2t
	inc	arg2s

1:	page	__udivmoddi4		; Do the unsigned div/mod.
	call	__udivmoddi4

	sb	MULH, 0			; Look at the save sign bit for arg 1.
	page	1f
	jmp	1f

	not	rems
	not	remt
	not	remu
	not	remv
	not	remw
	not	remx
	not	remy
	not	remz
	incsnz	remz
	incsz	remy
	page	1f
	jmp	1f
	incsnz	remx
	incsz	remw
	page	1f
	jmp	1f
	incsnz	remv
	incsz	remu
	page	1f
	jmp	1f
	incsnz	remt
	inc	rems

1:	sb	MULH, 1
	ret

	not	ress
	not	rest
	not	resu
	not	resv
	not	resw
	not	resx
	not	resy
	not	resz
	incsnz	resz
	incsz	resy
	ret
	incsnz	resx
	incsz	resw
	ret
	incsnz	resv
	incsz	resu
	ret
	incsnz	rest
	inc	ress
	ret

	.endfunc

#undef arg1s
#undef arg1t
#undef arg1u
#undef arg1v
#undef arg1w
#undef arg1x
#undef arg1y
#undef arg1z

#undef arg2s
#undef arg2t
#undef arg2u
#undef arg2v
#undef arg2w
#undef arg2x
#undef arg2y
#undef arg2z
	
#undef ress
#undef rest
#undef resu
#undef resv
#undef resw
#undef resx
#undef resy
#undef resz

#undef rems
#undef remt
#undef remu
#undef remv
#undef remw
#undef remx
#undef remy
#undef remz

#undef tmp_var
#undef tmp_var1
#undef tmp_var2
#undef tmp_var3
#undef tmp_var4
#undef tmp_var5
#undef tmp_var6
#undef cnt

#endif /* defined (L_divmoddi4) */

#if defined (L_udivmoddi4)		
#define	arg1s 1(SP)
#define arg1t 2(SP)
#define arg1u 3(SP)
#define arg1v 4(SP)
#define arg1w 5(SP)
#define arg1x 6(SP)
#define arg1y 7(SP)
#define arg1z 8(SP)

#define arg2s 9(SP)
#define arg2t 10(SP)
#define arg2u 11(SP)
#define arg2v 12(SP)
#define arg2w 13(SP)
#define arg2x 14(SP)
#define arg2y 15(SP)
#define arg2z 16(SP)
	
#define ress $80
#define rest $81
#define resu $82
#define resv $83
#define resw $84
#define resx $85
#define resy $86
#define resz $87

#define rems $88
#define remt $89
#define remu $8a
#define remv $8b
#define remw $8c
#define remx $8d
#define remy $8e
#define remz $8f

#define tmp_var	$90
#define tmp_var1 $91
#define tmp_var2 $92
#define tmp_var3 $93
#define tmp_var4 $94
#define tmp_var5 $95
#define tmp_var6 $96
#define cnt $97

	.sect	.text.libgcc,"ax"
	.global	__udivmoddi4
	.func	_udivmoddi4, __udivmoddi4

__udivmoddi4:
	clr	rems
	clr	remt
	clr	remu
	clr	remv
	clr	remw
	clr	remx
	clr	remy
	clr	remz
	mov	w, #65
	mov	cnt, w
	clrb	status, 0
	page	1f
	jmp	1f

2:	rl	remz
	rl	remy
	rl	remx
	rl	remw
	rl	remv
	rl	remu
	rl	remt
	rl	rems
	mov	w, arg2z
	sub	w, remz
	mov	tmp_var, w
	mov	w, arg2y
	subc	w, remy
	mov	tmp_var1, w
	mov	w, arg2x
	subc	w, remx
	mov	tmp_var2, w
	mov	w, arg2w
	subc	w, remw
	mov	tmp_var3, w
	mov	w, arg2v
	subc	w, remv
	mov	tmp_var4, w
	mov	w, arg2u
	subc	w, remu
	mov	tmp_var5, w
	mov	w, arg2t
	subc	w, remt
	mov	tmp_var6, w
	mov	w, arg2s
	subc	w, rems
	sc
	page	1f
	jmp	1f

	mov	rems, w
	mov	w, tmp_var6
	mov	remt, w
	mov	w, tmp_var5
	mov	remu, w
	mov	w, tmp_var4
	mov	remv, w
	mov	w, tmp_var3
	mov	remw, w
	mov	w, tmp_var2
	mov	remx, w
	mov	w, tmp_var1
	mov	remy, w
	mov	w, tmp_var
	mov	remz, w

1:	rl	arg1z
	rl	arg1y
	rl	arg1x
	rl	arg1w
	rl	arg1v
	rl	arg1u
	rl	arg1t
	rl	arg1s
	decsz	cnt
	page	2b
	jmp	2b

	pop	ress
	pop	rest
	pop	resu
	pop	resv
	pop	resw
	pop	resx
	pop	resy
	pop	resz
	mov	w, #8
	add	spl, w
	ret

	.endfunc

#undef arg1s
#undef arg1t
#undef arg1u
#undef arg1v
#undef arg1w
#undef arg1x
#undef arg1y
#undef arg1z

#undef arg2s
#undef arg2t
#undef arg2u
#undef arg2v
#undef arg2w
#undef arg2x
#undef arg2y
#undef arg2z
	
#undef ress
#undef rest
#undef resu
#undef resv
#undef resw
#undef resx
#undef resy
#undef resz

#undef rems
#undef remt
#undef remu
#undef remv
#undef remw
#undef remx
#undef remy
#undef remz

#undef tmp_var
#undef tmp_var1
#undef tmp_var2
#undef tmp_var3
#undef tmp_var4
#undef tmp_var5
#undef tmp_var6
#undef cnt

#endif /* defined (L_udivmoddi4) */

#define LT	#0
#define EQ	#1
#define GT	#2

#if defined(L_cmphi2)
#define arg1l 2(sp)
#define arg1h 1(sp)
#define arg2l 4(sp)
#define arg2h 3(sp)

	.sect	.text.libgcc,"ax"
	.global	__cmphi2
	.global	__cmp_ret
	.global	__cmpqi_ret
	.func	_cmphi2, __cmphi2

__cmphi2:
	mov	w,arg1l	
	sub	w,arg2l
	snz
	page	2f
	jmp	2f
	mov	w,arg1h
1:
	subc	w,arg2h
	clr	arg2l
	rl	arg2l
	snb	arg1h,7
	setb	arg2l,2
	snb	arg2h,7
	setb	arg2l,1
	mov	w,#3

__cmp_ret:
	add	spl,w			;  sign1
	pop	wreg			;   sign2

__cmpqi_ret:
	add	pcl,w			;    carry of arg1 - arg2
	retw	GT			; [000] arg1 > arg2
	retw	LT			; [001] arg1 < arg2
	retw	GT			; [010] arg1 > arg2
	retw	GT			; [011] arg1 > arg2
	retw	LT			; [100] arg1 < arg2
	retw	LT			; [101] arg1 < arg2
	retw	GT			; [110] arg1 > arg2
	retw	LT			; [111] arg1 < arg2
2:
	mov	w,arg1h
	cse	w,arg2h
	page	1b
	jmp	1b
	mov	w,#4
	add	spl,w
	retw	EQ

	.endfunc
#undef arg1l
#undef arg1h
#undef arg2l
#undef arg2h
#endif  /* L_cmphi2 */

#if defined(L_cmpqi2)
#define arg1 1(sp)
#define arg2 2(sp)

	.sect	.text.libgcc,"ax"
	.global	__cmpqi2
	.func	_cmpqi2, __cmpqi2

__cmpqi2:
	mov	w, arg1
	sub	w, arg2
	snz
	page	2f
	jmp	2f

	clr	wreg
	rl	wreg
	snb	arg1, 7
	setb	wreg, 2
	snb	arg2, 7
	setb	wreg, 1
	inc	spl
	inc	spl
	page	__cmpqi_ret
	jmp	__cmpqi_ret

2:	mov	w, #2
	add	spl, w
	retw	EQ

	.endfunc
#undef arg1l
#undef arg2l
#endif  /* L_cmpqi2 */

#if defined(L_cmpsi2)
#define arg1d 4(sp)
#define arg1c 3(sp)
#define arg1b 2(sp)
#define arg1a 1(sp)
#define arg2d 8(sp)
#define arg2c 7(sp)
#define arg2b 6(sp)
#define arg2a 5(sp)
	
	.sect	.text.libgcc,"ax"
	.global	__cmpsi2
	.func	_cmpsi2, __cmpsi2

__cmpsi2:
	mov	w, arg1d
	sub	w, arg2d
	snz
	page	2f
	jmp	2f

1:	mov	w, arg1c
	subc	w, arg2c
	mov	w, arg1b
	subc	w, arg2b
	mov	w, arg1a
	subc	w, arg2a

	clr	arg2d
	rl	arg2d
	snb	arg1a, 7
	setb	arg2d, 2
	snb	arg2a, 7
	setb	arg2d, 1
	mov	w, #7
	page	__cmp_ret
	jmp	__cmp_ret

2:	mov	w, arg1c
	cse	w, arg2c
	page	1b
	jmp	1b

	mov	w, arg1b
	cse	w, arg2b
	page	1b
	jmp	1b

	mov	w, arg1a
	cse	w, arg2a
	page	1b
	jmp	1b

	mov	w, #8
	add	spl, w
	retw	EQ

	.endfunc

#undef arg1d
#undef arg1c
#undef arg1b
#undef arg1a
#undef arg2d
#undef arg2c
#undef arg2b
#undef arg2a
#endif  /* L_cmpsi2 */

#if defined(L_cmpdi2)
#define arg1z 8(sp)
#define arg1y 7(sp)
#define arg1x 6(sp)
#define arg1w 5(sp)
#define arg1v 4(sp)
#define arg1u 3(sp)
#define arg1t 2(sp)
#define arg1s 1(sp)

#define arg2z 16(sp)
#define arg2y 15(sp)
#define arg2x 14(sp)
#define arg2w 13(sp)
#define arg2v 12(sp)
#define arg2u 11(sp)
#define arg2t 10(sp)
#define arg2s 9(sp)
	
	.sect	.text.libgcc,"ax"
	.global	__cmpdi2
	.func	_cmpdi2, __cmpdi2

__cmpdi2:
	mov	w, arg1z
	sub	w, arg2z
	snz
	page	2f
	jmp	2f

1:	mov	w, arg1y
	subc	w, arg2y
	mov	w, arg1x
	subc	w, arg2x
	mov	w, arg1w
	subc	w, arg2w
	mov	w, arg1v
	subc	w, arg2v
	mov	w, arg1u
	subc	w, arg2u
	mov	w, arg1t
	subc	w, arg2t
	mov	w, arg1s
	subc	w, arg2s
	clr	arg2z
	rl	arg2z
	snb	arg1s, 7
	setb	arg2z, 2
	snb	arg2s, 7
	setb	arg2z, 1
	mov	w, #15
	page	__cmp_ret
	jmp	__cmp_ret

2:	mov	w, arg1y
	cse	w, arg2y
	page	1b
	jmp	1b

	mov	w, arg1x
	cse	w, arg2x
	page	1b
	jmp	1b

	mov	w, arg1w
	cse	w, arg2w
	page	1b
	jmp	1b

	mov	w, arg1v
	cse	w, arg2v
	page	1b
	jmp	1b

	mov	w, arg1u
	cse	w, arg2u
	page	1b
	jmp	1b

	mov	w, arg1t
	cse	w, arg2t
	page	1b
	jmp	1b

	mov	w, arg1s
	cse	w, arg2s
	page	1b
	jmp	1b

	mov	w, #16
	add	spl, w
	retw	EQ

	.endfunc
	
#undef arg1z
#undef arg1y
#undef arg1x
#undef arg1w
#undef arg1v
#undef arg1u
#undef arg1t
#undef arg1s
#undef arg2z
#undef arg2y
#undef arg2x
#undef arg2w
#undef arg2v
#undef arg2u
#undef arg2t
#undef arg2s

#endif  /* L_cmpdi2 */
	
#if defined(L_cmpdi2_dp)
	.sect	.text.libgcc,"ax"
	.global	__cmpdi2_dp
	.func	_cmpdi2_dp, __cmpdi2_dp

__cmpdi2_dp:
	push	7(dp)
	push	6(dp)
	push	5(dp)
	push	4(dp)
	push	3(dp)
	push	2(dp)
	push	1(dp)
	push	(dp)
	page	__cmpdi2
	jmp	__cmpdi2

	.endfunc
#endif  /* L_cmpdi2_dp */

#if defined(L_fp_pop_args_ret)
	.sect	.pram.libgcc,"ax"
	.global	__fp_pop_args_ret
	.global	__pop_args_ret
	.global	__pop2_args_ret
	.func	__fp_pop2_args_ret, __fp_pop2_args_ret

__fp_pop2_args_ret:
	mov	w, #2
__fp_pop_args_ret:
	pop	0xfd
	pop	0xfe
__pop_args_ret:
	pop	callh
	pop	calll
	add	spl, w
	ret

	.endfunc
#endif /* L_fp_pop_args_ret */

#if defined(L__pop2_args_ret)
	.sect	.pram.libgcc,"ax"
	.global	__pop2_args_ret
	.func	__pop2_args_ret, __pop2_args_ret

__pop2_args_ret:
	mov	w, #2
	pop	callh
	pop	calll
	add	spl, w
	ret

	.endfunc
#endif /* L__pop2_args_ret */

#if defined(L_leaf_fp_pop_args_ret)
	.sect	.pram.libgcc,"ax"
	.global	__leaf_fp_pop_args_ret, __leaf_fp_pop2_args_ret
	.func	__leaf_fp2_pop_args_ret, __leaf_fp_pop2_args_ret

__leaf_fp_pop2_args_ret:
	mov	w, #2
__leaf_fp_pop_args_ret:
	pop	0xfd
	pop	0xfe
	add	spl, w
	ret

	.endfunc
#endif /* L_leaf_fp_pop_args_ret */

#if defined(L_movstrhi_countqi)
	.sect	.pram.libgcc,"ax"
	.global	__movstrhi_countqi
	.func	_movstrhi_countqi, __movstrhi_countqi

__movstrhi_countqi:
	push	dph			; Save our pointer regs
	push	dpl
	push	iph
	push	ipl

	mov	w, 5(SP)		; Get our dest pointer
	mov	dph, w
	mov	w, 6(SP)
	mov	dpl, w
	mov	w, 7(SP)		; And our source pointer
	mov	iph, w
	mov	w, 8(SP)
	mov	ipl, w

1:	push	(IP)			; *dest++ = *src++
	pop	0(DP)
	inc	ipl
	inc	dpl
	decsz	9(SP)			; Loop until completed
	page	1b
	jmp	1b

	pop	ipl			; Restore our pointer regs
	pop	iph
	pop	dpl
	pop	dph

	mov	w, #5			; Tidy up our stack args
	add	spl, w
	ret

	.endfunc
#endif

#if defined(L_movstrhi_counthi)
	.sect	.text.libgcc,"ax"
	.global	__movstrhi_counthi
	.func	_movstrhi_counthi, __movstrhi_counthi

__movstrhi_counthi:
	push	dph			; Save our pointer regs
	push	dpl
	push	iph
	push	ipl

	mov	w, 5(SP)		; Get our dest pointer
	mov	dph, w
	mov	w, 6(SP)
	mov	dpl, w
	mov	w, 7(SP)		; And our source pointer
	mov	iph, w
	mov	w, 8(SP)
	mov	ipl, w

	test	10(SP)			; If we have a nonzero LSB then adjust the
	sz				; MSB of the loop count to allow us to use
	inc	9(SP)			; skip tricks!

1:	push	(IP)			; *dest++ = *src++
	pop	0(DP)
	inc	ipl
	inc	dpl
	decsnz	10(SP)			; Loop until completed - note the skip trick
	decsz	9(SP)			; on the MSB!
	page	1b
	jmp	1b

	pop	ipl			; Restore our pointer regs
	pop	iph
	pop	dpl
	pop	dph

	mov	w, #6			; Tidy up our stacked args.
	add	spl, w
	ret

	.endfunc
#endif

#if defined(L_exit)
	.sect	.text.libgcc,"ax"
	.global	__exit
	.global	_exit
	.func	_exit, __exit
	.weak	__exit
	.weak	_exit

_exit:		
__exit:
	pop	$88
	pop	wreg
	or	w, $88
	push    wreg
	push	#0
	push	#1
	system				; Exit wreg
	page	__exit			; Never return
	jmp	__exit

	.endfunc
#endif

#if defined(Labort)
	.sect	.text.libgcc,"ax"
	.global	_abort
	.func	abort, _abort

_abort:
	push	#1
	push	#0
	push	#1
	system				; Exit 1
	ret

	.endfunc
#endif

#if defined(Lwrite)
	/* Dummy entrypoint to suppress problems with glue code. */
	.sect	.text.libgcc,"ax"
	.global	_write
	.func	write, _write
;;
;; write (fil,buf,len) - say that write succeeds....
;; 
_write:
	movb	$80, 5(SP)
	movb	$81, 6(SP)		; Return length written
	mov	w, #6
	add	spl, w
	ret
	
	.endfunc
#endif