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

📄 cpdo.s

📁 microwindows移植到S3C44B0的源码
💻 S
字号:
/*Inside the emulator the FP numbers are kept with 32 bit accuracy for bothmantissa and exponent. The FP structure has 4 words reserved for eachregister, the first is used just for the sign in bit 31, the second is themantissa (unsigned integer) and the third is the exponent (signed integer).The functions do actually only work properly for normalized values, and ifno overflow occurs. Hopfully most programs are not disturbed by this, and itwill probably be improved in future versions.The parameters to these functions are r0=destination pointer, r1 and r2source pointers. r4 is the instruction. They may use r0-r7. The return addressis in r14, except CPDO_rnf_core which expects the return address in r5 tosave memory accesses.*//*---------------------------------------------------------------------------*/	.globl	CPDO_adfCPDO_adf:	ldmia	r1,{r1,r3,r5}	ldmia	r2,{r2,r4,r6}	cmp	r1,r2	bne	CPDO_suf_sCPDO_adf_s:	subs	r2,r5,r6	bge	CPDO_adf_1		rsb	r2,r2,#0	mov	r5,r6	adds	r3,r4,r3,lsr r2	b	CPDO_adf_2	CPDO_adf_1:	adds	r3,r3,r4,lsr r2CPDO_adf_2:	addcs	r5,r5,#1	movcss	r3,r3,rrx	beq	CPDO_zero	stmia	r0,{r1,r3,r5}		mov	pc,r14/*---------------------------------------------------------------------------*/	.globl	CPDO_sufCPDO_suf:	ldmia	r1,{r1,r3,r5}	ldmia	r2,{r2,r4,r6}CPDO_suf_l:	cmp	r1,r2	bne	CPDO_adf_sCPDO_suf_s:		subs	r2,r5,r6	bge	CPDO_suf_1		rsb	r2,r2,#0	mov	r5,r6	rsbs	r3,r4,r3,lsr r2	b	CPDO_suf_2	CPDO_suf_1:	subs	r3,r3,r4,lsr r2	CPDO_suf_2:        beq	CPDO_zero		eorcc	r1,r1,#0x80000000	rsbcc	r3,r3,#0		cmp	r3,#0x00010000	movcc	r3,r3,lsl#16	subcc	r5,r5,#16		cmp	r3,#0x01000000	movcc	r3,r3,lsl#8	subcc	r5,r5,#8		cmp	r3,#0x10000000	movcc	r3,r3,lsl#4	subcc	r5,r5,#4		cmp	r3,#0x40000000	movcc	r3,r3,lsl#2	subcc	r5,r5,#2		cmp	r3,#0x80000000	movcc	r3,r3,lsl#1	subcc	r5,r5,#1		stmia	r0,{r1,r3,r5}		mov	pc,r14/*---------------------------------------------------------------------------*/	.globl CPDO_rsfCPDO_rsf:	mov	r3,r2	ldmia	r1,{r2,r4,r6}	ldmia	r3,{r1,r3,r5}	b	CPDO_suf_l	/*---------------------------------------------------------------------------*/	.globl	CPDO_mufCPDO_muf:	ldmia	r1,{r1,r3,r5}	ldmia	r2,{r2,r4,r6}		eor	r1,r1,r2	add	r6,r5,r6	umulls	r2,r5,r4,r3	beq	CPDO_zero	bpl	CPDO_muf_norm		add	r6,r6,#1	stmia	r0,{r1,r5,r6}	mov	pc,r14CPDO_muf_norm:	adds	r2,r2,r2	adcs	r5,r5,r5		stmia	r0,{r1,r5,r6}	mov	pc,r14/*---------------------------------------------------------------------------*//* Divison ignores the LSB in both mantissa, but needs only ~110 cycles.     */	.globl	CPDO_dvfCPDO_dvf:	ldmia	r1,{r1,r3,r5}	ldmia	r2,{r2,r4,r6}CPDO_dvf_l:	eor	r1,r1,r2	sub	r6,r5,r6	movs	r3,r3,lsr#1	beq	CPDO_zero	mov	r4,r4,lsr#1	rsb	r4,r4,#0		.macro	div_step	adcs	r3,r4,r3,lsl#1	subcc	r3,r3,r4	adc	r5,r5,r5	.endm		adds	r3,r4,r3	adc	r5,r5,r5	bcs	CPDO_dvf_b	subcc	r3,r3,r4	add	r3,r4,r3,lsl#1	mov	r5,#1	sub	r6,r6,#1	CPDO_dvf_b:		div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	div_step	CPDO_dvf_e:		stmia	r0,{r1,r5,r6}	mov	pc,r14	CPDO_zero:	mov	r1,#0	mov	r2,#0	mov	r3,#0x80000000	stmia	r0,{r1-r3}	mov	pc,r14/*---------------------------------------------------------------------------*/	.globl	CPDO_rdfCPDO_rdf:	mov	r3,r2	ldmia	r1,{r2,r4,r6}	ldmia	r3,{r1,r3,r5}	b	CPDO_dvf_l/*---------------------------------------------------------------------------*/	.globl	CPDO_rmfCPDO_rmf:	mov	pc,r14	/*---------------------------------------------------------------------------*//*---------------------------------------------------------------------------*/	.globl	CPDO_mvfCPDO_mvf:	ldmia	r2,{r1,r2,r3}	stmia	r0,{r1,r2,r3}	mov	pc,r14/*---------------------------------------------------------------------------*/	.globl	CPDO_mnfCPDO_mnf:	ldmia	r2,{r1,r2,r3}	eor	r1,r1,#0x80000000	stmia	r0,{r1,r2,r3}	mov	pc,r14/*---------------------------------------------------------------------------*/	.globl	CPDO_absCPDO_abs:	ldmia	r2,{r1,r2,r3}	bic	r1,r1,#0x80000000	stmia	r0,{r1,r2,r3}	mov	pc,r14/*---------------------------------------------------------------------------*/		.globl	CPDO_sqtCPDO_sqt:	ldmia	r2,{r1,r2,r4}		and	r5,r4,#1	movs	r2,r2,lsl r5		mov	r3,#0x80000000	sub	r2,r2,#0x80000000	.macro sqrt_step,N	add	r5,r3,#(0x40000000>>\N)	cmpcc	r2,r5	addcs	r3,r3,#(0x80000000>>\N)	subcs	r2,r2,r5	movs	r2,r2,lsl#1	.endm		sqrt_step 1	sqrt_step 2	sqrt_step 3	sqrt_step 4	sqrt_step 5	sqrt_step 6	sqrt_step 7	sqrt_step 8	sqrt_step 9	sqrt_step 10	sqrt_step 11	sqrt_step 12	sqrt_step 13	sqrt_step 14	sqrt_step 15	sqrt_step 16	sqrt_step 17	sqrt_step 18	sqrt_step 19	sqrt_step 20	sqrt_step 21	sqrt_step 22	sqrt_step 23	sqrt_step 24	sqrt_step 25	sqrt_step 26	sqrt_step 27	sqrt_step 28	sqrt_step 29	sqrt_step 30 	sqrt_step 31 		mov	r4,r4,asr#1	stmia	r0,{r1,r3,r4}	mov	pc,r14/*---------------------------------------------------------------------------*/		.globl	CPDO_rndCPDO_rnd:	adr	r5,CPDO_rnd_store	b	CPDO_rnd_coreCPDO_rnd_store:	stmia	r0,{r1,r2,r3}    	mov	pc,r14	/*---------------------------------------------------------------------------*/	.globl	CPDO_rnd_coreCPDO_rnd_core:	ldmia	r2,{r1,r2,r3}	and	r4,r4,#0x00000060	add	pc,pc,r4,lsr#3	mov	r0,r0	b	CPDO_rnd_N	b	CPDO_rnd_P	b	CPDO_rnd_M	b	CPDO_rnd_Z	CPDO_rnd_N:	cmp	r3,#-1	blt	CPDO_rnd_zero	cmp	r3,#31	bge	CPDO_rnd_end		rsb	r4,r3,#30	mov	r2,r2,lsr r4	add	r2,r2,#1	bic	r2,r2,#1	movs	r2,r2,lsl r4	addcs	r3,r3,#1	movcs	r2,r2,rrx		mov	pc,r5CPDO_rnd_P:	cmp	r3,#0	blt	CPDO_rnd_P_small	cmp	r3,#31	movge	pc,r5		tst	r1,#0x80000000	bne	CPDO_rnd_end		mov	r4,#0x80000000	sub	r4,r4,#1	adds	r2,r2,r4,lsr r3	addcs	r3,r3,#1	movcs	r2,r2,rrx	b	CPDO_rnd_end	CPDO_rnd_P_small:	cmp	r2,#0		beq	CPDO_rnd_zero	tst	r1,#0x80000000	bne	CPDO_rnd_zero	b	CPDO_rnd_one		CPDO_rnd_M:	cmp	r3,#0	blt	CPDO_rnd_M_small	cmp	r3,#31	movge	pc,r5		tst	r1,#0x80000000	beq	CPDO_rnd_end		mov	r4,#0x80000000	sub	r4,r4,#1	adds	r2,r2,r4,lsr r3	addcs	r3,r3,#1	movcs	r2,r2,rrx	b	CPDO_rnd_end	CPDO_rnd_M_small:	cmp	r2,#0		beq	CPDO_rnd_zero	tst	r1,#0x80000000	beq	CPDO_rnd_zero	b	CPDO_rnd_one	CPDO_rnd_Z:	cmp	r3,#0	blt	CPDO_rnd_zero	cmp	r3,#31	movge	pc,r5		b	CPDO_rnd_endCPDO_rnd_one:	mov	r2,#0x80000000	mov	r3,#0	mov	pc,r5	CPDO_rnd_zero:	mov	r1,#0	mov	r2,#0	mov	r3,#0x80000000	mov	pc,r5CPDO_rnd_end:	rsb	r4,r3,#31	mov	r2,r2,lsr r4	mov	r2,r2,lsl r4	mov	pc,r5	/*---------------------------------------------------------------------------*/

⌨️ 快捷键说明

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