⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libgcc.s

📁 linux下的gcc编译器
💻 S
📖 第 1 页 / 共 2 页
字号:
;; 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	1f1:	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	$832:	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, w1:	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	2b3:	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	$872:	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, w1:	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	2b3:	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	arg1h1:	sb	arg2h, 7	page	1f	jmp	1f	not	arg2h	not	arg2l	incsnz	arg2l	inc	arg2h1:	page	__udivmodhi4		; Do the unsigned div/mod	call	__udivmodhi4	sb	arg1_sign, 7	page	1f	jmp	1f	not	reml	not	remh	incsnz	reml	inc	remh1:	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	1f2:	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, w1:	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	arg1a1:	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	arg2a1:	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	rema1:	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	1f2:	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, w1:	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	arg1s1:	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	arg2s1:	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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -