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

📄 smovecr.s

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 S
字号:
||	smovecr.sa 3.1 12/10/90||	The entry point sMOVECR returns the constant at the|	offset given in the instruction field.||	Input: An offset in the instruction word.||	Output:	The constant rounded to the user's rounding|		mode unchecked for overflow.||	Modified: fp0.|||		Copyright (C) Motorola, Inc. 1990|			All Rights Reserved||	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA |	The copyright notice above does not evidence any  |	actual or intended publication of such source code.|SMOVECR	idnt	2,1 | Motorola 040 Floating Point Software Package	|section 8	.include "fpsp.h"	|xref	nrm_set	|xref	round	|xref	PIRN	|xref	PIRZRM	|xref	PIRP	|xref	SMALRN	|xref	SMALRZRM	|xref	SMALRP	|xref	BIGRN	|xref	BIGRZRM	|xref	BIGRPFZERO:	.long	00000000||	FMOVECR |	.global	smovcrsmovcr:	bfextu	CMDREG1B(%a6){#9:#7},%d0 |get offset	bfextu	USER_FPCR(%a6){#26:#2},%d1 |get rmode|| check range of offset|	tstb	%d0		|if zero, offset is to pi	beqs	PI_TBL		|it is pi	cmpib	#0x0a,%d0		|check range $01 - $0a	bles	Z_VAL		|if in this range, return zero	cmpib	#0x0e,%d0		|check range $0b - $0e	bles	SM_TBL		|valid constants in this range	cmpib	#0x2f,%d0		|check range $10 - $2f	bles	Z_VAL		|if in this range, return zero 	cmpib	#0x3f,%d0		|check range $30 - $3f	ble  	BG_TBL		|valid constants in this rangeZ_VAL:	fmoves	FZERO,%fp0	rtsPI_TBL:	tstb	%d1		|offset is zero, check for rmode	beqs	PI_RN		|if zero, rn mode	cmpib	#0x3,%d1		|check for rp	beqs	PI_RP		|if 3, rp modePI_RZRM:	leal	PIRZRM,%a0	|rmode is rz or rm, load PIRZRM in a0	bra	set_finxPI_RN:	leal	PIRN,%a0		|rmode is rn, load PIRN in a0	bra	set_finxPI_RP:	leal	PIRP,%a0		|rmode is rp, load PIRP in a0	bra	set_finxSM_TBL:	subil	#0xb,%d0		|make offset in 0 - 4 range	tstb	%d1		|check for rmode	beqs	SM_RN		|if zero, rn mode	cmpib	#0x3,%d1		|check for rp	beqs	SM_RP		|if 3, rp modeSM_RZRM:	leal	SMALRZRM,%a0	|rmode is rz or rm, load SMRZRM in a0	cmpib	#0x2,%d0		|check if result is inex	ble	set_finx	|if 0 - 2, it is inexact	bra	no_finx		|if 3, it is exactSM_RN:	leal	SMALRN,%a0	|rmode is rn, load SMRN in a0	cmpib	#0x2,%d0		|check if result is inex	ble	set_finx	|if 0 - 2, it is inexact	bra	no_finx		|if 3, it is exactSM_RP:	leal	SMALRP,%a0	|rmode is rp, load SMRP in a0	cmpib	#0x2,%d0		|check if result is inex	ble	set_finx	|if 0 - 2, it is inexact	bra	no_finx		|if 3, it is exactBG_TBL:	subil	#0x30,%d0		|make offset in 0 - f range	tstb	%d1		|check for rmode	beqs	BG_RN		|if zero, rn mode	cmpib	#0x3,%d1		|check for rp	beqs	BG_RP		|if 3, rp modeBG_RZRM:	leal	BIGRZRM,%a0	|rmode is rz or rm, load BGRZRM in a0	cmpib	#0x1,%d0		|check if result is inex	ble	set_finx	|if 0 - 1, it is inexact	cmpib	#0x7,%d0		|second check	ble	no_finx		|if 0 - 7, it is exact	bra	set_finx	|if 8 - f, it is inexactBG_RN:	leal	BIGRN,%a0	|rmode is rn, load BGRN in a0	cmpib	#0x1,%d0		|check if result is inex	ble	set_finx	|if 0 - 1, it is inexact	cmpib	#0x7,%d0		|second check	ble	no_finx		|if 0 - 7, it is exact	bra	set_finx	|if 8 - f, it is inexactBG_RP:	leal	BIGRP,%a0	|rmode is rp, load SMRP in a0	cmpib	#0x1,%d0		|check if result is inex	ble	set_finx	|if 0 - 1, it is inexact	cmpib	#0x7,%d0		|second check	ble	no_finx		|if 0 - 7, it is exact|	bra	set_finx	;if 8 - f, it is inexactset_finx:	orl	#inx2a_mask,USER_FPSR(%a6) |set inex2/ainexno_finx:	mulul	#12,%d0			|use offset to point into tables	movel	%d1,L_SCR1(%a6)		|load mode for round call	bfextu	USER_FPCR(%a6){#24:#2},%d1	|get precision	tstl	%d1			|check if extended precision|| Precision is extended|	bnes	not_ext			|if extended, do not call round	fmovemx (%a0,%d0),%fp0-%fp0		|return result in fp0	rts|| Precision is single or double|not_ext:	swap	%d1			|rnd prec in upper word of d1	addl	L_SCR1(%a6),%d1		|merge rmode in low word of d1	movel	(%a0,%d0),FP_SCR1(%a6)	|load first word to temp storage	movel	4(%a0,%d0),FP_SCR1+4(%a6)	|load second word	movel	8(%a0,%d0),FP_SCR1+8(%a6)	|load third word	clrl	%d0			|clear g,r,s	lea	FP_SCR1(%a6),%a0	btstb	#sign_bit,LOCAL_EX(%a0)	sne	LOCAL_SGN(%a0)		|convert to internal ext. format		bsr	round			|go round the mantissa	bfclr	LOCAL_SGN(%a0){#0:#8}	|convert back to IEEE ext format	beqs	fin_fcr	bsetb	#sign_bit,LOCAL_EX(%a0)fin_fcr:	fmovemx (%a0),%fp0-%fp0	rts	|end

⌨️ 快捷键说明

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