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

📄 dexp.u

📁 操作系统SunOS 4.1.3版本的源码
💻 U
📖 第 1 页 / 共 2 页
字号:
|*	@(#)dexp.u 1.1 92/07/30 Copyright Sun Microsystems, Inc.  1988|* |* hi: stored in SCRATCH_10 --> DA|* lo: stored in SCRATCH_11 --> DB|* z:  stored in SCRATCH_12 --> DC|* k:  stored in SCRATCH_13 --> DD|* c:  stored in SCRATCH_14 --> DE|*|* First get abs(x) and store it in the 'C' register in the TI8847.routine xd.ex 001000001101	dnop enra loaddp halt;		regtoti;	rcsmsw imm2;	call dnotfinx;		dabs enra loaddp halt;		regtoti;	rcslsw imm2;|* Compare abs(x) with ln2/2	jgt xgtln2_2;		dnop enrb loaddp halt;		regtoti;	rcsmsw ptr5;	;			dcmp aluacreg enrb loaddp halt;	regtoti;	rcslsw ptr5;		ptr5!c_dln2_onehalf|* Check to see whether abs(x) < twom18.  If so, return x + one.  abs(x) is in C reg.	;			dnop;				;		ptr5; 		ptr5!c_dtwom18	;			dnop enrb loaddp halt;		regtoti;	rcsmsw ptr5;	;			dcmp aluacreg enrb loaddp halt;	regtoti;	rcslsw ptr5;	;			dnop;				;		ptr5;		ptr5!c_ssin	jlt chktwom28;		smul enra enrb halt;		regtoti;	rcssp ptr5;|* If not, z=x, and k = 0.	;			;				regtotmp;	rcslsw ptr2;			jtierr hang cstat;	dnop halt;			regtotmp;	rcsmsw ptr2;	;			dnop;				;		ptr5;		ptr5!0x700+0xDC	;			dnop;				tmptoreg;	rcsmsw ptr5;	;			dnop;				tmptoreg;	rcslsw ptr5;|* Store k=0 in SCRATCH_13	;			dnop;				;		ptr5;		ptr5!c_sizero	;			dnop;				regtotmp;	rcssp ptr5;	;			dnop;				;		ptr5;		ptr5!0x700+0xDD	call z.inrange;		dnop;				tmptoreg;	rcssp ptr5;chktwom28:	jtierr hang cstat;	dnop halt;			;		;	;			dnop halt;			;		ptr5;	ptr5!c_dtwom28	;			dnop enrb loaddp halt;		regtoti;	rcsmsw ptr5;	;			dcmp aluacreg enrb loaddp halt;	regtoti;	rcslsw ptr5;	;			dnop;				;		ptr2;	jlt retxsq;		dnop enra enrb loaddp halt;	regtoti;	rcsmsw ptr2;	;			dmul enra enrb loaddp halt;	regtoti;	rcslsw ptr2;|* Compute 1 + x + 0.5x^2 and store in pointer 1.	;			dmul;				;		ptr5;		ptr5!dhalf	;			dnop enra loaddp halt;		regtoti;	rcsmsw ptr5;	;			dmul mulbmul enra loaddp halt;  regtoti;	rcslsw ptr5;	;			dmul mulbmul;			;		;	;			dadd aluamul halt;		;		ptr5;		ptr5!done	;			dadd aluamul halt;		;		ptr5;		ptr5!done	;			dnop enra loaddp halt;		regtoti;	rcsmsw ptr5;	;			dadd alubalu enra loaddp halt;	regtoti;	rcslsw ptr5;	;			dnop;				;		ptr1;	;			dnop tioe tilsw halt;		titoreg;	rcslsw ptr1;	call idle1;		dnop tioe timsw halt;		titoreg;	rcsmsw ptr1;retxsq:|* Compute 1 + x and store in pointer 2.	;			dmul;				;		ptr5;		ptr5!done	;			dnop enra loaddp halt;		regtoti;	rcsmsw ptr5;	;			dadd enra loaddp halt;		regtoti;	rcslsw ptr5;	;			dnop;				;		ptr1;	;			dnop tioe tilsw halt;		titoreg;	rcslsw ptr1;	call idle1;		dnop tioe timsw halt;		titoreg;	rcsmsw ptr1;xgtln2_2:|* abs(x) is greater than ln2/2:|* Now check whether abs(x) <= ln2 * 3/2	;			dnop;				;		ptr5;	ptr5!c_ssin	jle xlteln2t1.5;	smul enra enrb halt;		regtoti;	rcssp ptr5;        ;                       smul;				;               ptr5;	ptr5!dzero        jtierr hang cstat;	halt;				;		ptr5;	;			dnop enrb loaddp halt;		regtoti;	rcsmsw ptr5;	;			dnop enrb loaddp halt;		regtoti;	rcslsw ptr5;	;			dnop enra loaddp halt;		regtoti;	rcsmsw ptr2;	;			dcmp enra loaddp halt;		regtoti;	rcslsw ptr2;	;			dnop;				;		ptr5;	ptr5!c_dthrsh1	jlt xlzero;		dnop enrb loaddp halt;		regtoti;	rcsmsw ptr5;	;			dcmp aluacreg enrb loaddp halt;	regtoti;	rcslsw ptr5;|* Need to check if abs(x) > thrsh1.  If so, then Bailout.overflow.	;			dnop;				;		ptr5;	ptr5!c_dinvln2			jgt bail.ov;		dnop enrb loaddp halt;		regtoti;	rcsmsw ptr5;	|* Multiply x * invln2  (Note: X is in RA)	;			dmul enrb loaddp halt;		regtoti;	rcslsw ptr5;	;			dmul;				;		;			;			dnop srccmul clkcc;		;		;pmpt5:|* Convert double to integer: k in c register. Save in SCRATCH 13 register.	;			dcvtint aluacreg;		;		;			;			dnop;				;		ptr5;		ptr5!0x700+0xDD|* Calculate t= double k	;			dfloat enra tioe tisp loaddp halt;titoreg;	rcssp ptr5;	;			dfloat enra tioe tisp loaddp halt;;		;	;			dnop;				;		;	;			dnop enra tioe timsw loaddp halt;;		;	;			dnop enra tioe tilsw loaddp halt;;		;	;			dnop;				;		ptr5;		ptr5!c_dln2hi	;			dnop enrb loaddp halt;		regtoti;	rcsmsw ptr5;	;			dmul enrb loaddp halt; 		regtoti; 	rcslsw ptr5;	;			dmul;				;		ptr2;	;			dnop enrb loaddp halt;		regtoti;	rcsmsw ptr2;|* Store x - (result) in SCRATCH_10.	;			drsub aluamul enrb loaddp halt;	regtoti;	rcslsw ptr2;	;			dnop;				;		ptr5;		ptr5!0x700+0xDA	;			dnop tioe tilsw halt;		titoreg;	rcslsw ptr5;	;			dnop tioe timsw halt;		titoreg;	rcsmsw ptr5;|* get lo = t*ln2lo.  Store in SCRATCH_11 and input to RB.	;			dnop;				;		ptr5;		ptr5!c_dln2lo	;			dnop enrb loaddp halt;		regtoti;	rcsmsw ptr5;	;			dmul enrb loaddp halt;		regtoti;	rcslsw ptr5;	;			dmul;				;		;	;			dnop;				;		ptr5;		ptr5!0x700+0x0DB|* load 'lo' in RB and call calcz = hi - lo.	;			dnop enrb tioe timsw loaddp halt;titoreg;	rcsmsw ptr5;	call calcz;		dnop enrb tioe tilsw loaddp halt;titoreg;	rcslsw ptr5;xlzero:|* Need to check if abs(x) > thrsh2.  If so, then Bailout.underflow.	;			dnop;				;		ptr5;	ptr5!c_dthrsh2	;			dnop enrb loaddp halt;		regtoti;	rcsmsw ptr5;	;			dcmp aluacreg enrb loaddp halt;	regtoti;	rcslsw ptr5;	;			dnop;				;		ptr5;	ptr5!c_dinvln2	jgt bail.under;		dnop enrb loaddp halt;		regtoti;	rcsmsw ptr5;		;			dmul enrb loaddp halt;		regtoti;	rcslsw ptr5;|* Multiply x * invln2  (Note: X is in RA) 	;			dmul;				;		;|* Will store in 'C' register, since abs(x) is not needed from here on.	call pmpt5;		dnop srccmul clkcc;		;		;bail.ov:|* Load maxnorm and square it.  Will cause overflow.  Go to bail.out	;			;				;		ptr5;		ptr5!smaxnorm	;			smul enra enrb halt;		regtoti;	rcssp ptr5;	;			;				;		;	call bail.out cstat;	halt;				;		;bail.under:|* Load an 'underflowed' number and pass it through ALU.  jtierr to bail.out -- will report a|* underflow.  If no tierr, then FAST mode is on, so return zero and do not signal an error.	;			dnop;				;		ptr5;		ptr5!dminsub	;			dnop enra loaddp halt;		regtoti;	rcsmsw ptr5;	;			dnop enra loaddp halt;		regtoti;	rcslsw ptr5;	;			dnop;				;		;	jtierr bail.out cstat;	dnop halt;			;		;	;			dnop;				;		ptr1;	;			dnop tioe tilsw halt;		titoreg;	rcslsw ptr1;	call idle1;		dnop tioe timsw halt;		titoreg;	rcsmsw ptr1;xlteln2t1.5:|* abs(x) <= ln2 * 3/2|* Now check whether x => 0.  X is left in RA.  0 in RB	jtierr hang cstat;	dnop;				;		ptr2;	;			dnop enra loaddp halt;		regtoti;	rcsmsw ptr2;	;			dcmp enra loaddp halt;		regtoti;	rcslsw ptr2;	;			dnop;				;		ptr5;	ptr5!c_dln2hi|* hi = x + ln2hi and store in SCRATCH_10	jge ygezero;		dnop enrb loaddp halt;		regtoti;	rcsmsw ptr5;|* Gets here if x<0, ie. msb(x)=1.	;			dadd enrb loaddp halt;		regtoti;	rcslsw ptr5;	;			dnop;				;		ptr5;		ptr5!0x700+0xDA	;			dnop tioe tilsw halt;		titoreg;	rcslsw ptr5;	;			dnop tioe timsw halt;		titoreg;	rcsmsw ptr5;|* Store k=-1 in SCRATCH_13	;			dnop;				;		ptr5;		ptr5!c_simone	;			dnop;				regtotmp;	rcssp ptr5;	;			dnop;				;		ptr5;		ptr5!0x700+0xDD	;			dnop;				tmptoreg;	rcssp ptr5;|* Store -ln2lo in SCRATCH_11 and in RB	;			dnop;				;		ptr5;		ptr5!c_dmln2lo	;			dnop enrb loaddp halt;		regtitmp;	rcsmsw ptr5;	;			dnop enrb loaddp halt;		regtitmp;	rcslsw ptr5;	;			dnop;				;		ptr5;		ptr5!0x700+0xDB	;			dnop;				tmptoreg;	rcsmsw ptr5;	call calcz;		dnop;				tmptoreg;	rcslsw ptr5;ygezero:|* Gets here if x=>0, ie. msb(x)=0	;			dsub;				;		;	;			dnop;				;		ptr5;		ptr5!0x700+0xDA	;			dnop tioe tilsw halt;		titoreg;	rcslsw ptr5;	;			dnop tioe timsw halt;		titoreg;	rcsmsw ptr5;|* Store k= 1 in SCRATCH_13	;			dnop;				;		ptr5;		ptr5!c_sione	;			dnop;				regtotmp;	rcssp ptr5;	;			dnop;				;		ptr5;		ptr5!0x700+0xDD	;			dnop;				tmptoreg;	rcssp ptr5;|* Store ln2lo in SCRATCH_11 and in RB	;			dnop;				;		ptr5;		ptr5!c_dln2lo	;			dnop enrb loaddp halt;		regtitmp;	rcsmsw ptr5;	;			dnop enrb loaddp halt;		regtitmp;	rcslsw ptr5;	;			dnop;				;		ptr5;		ptr5!0x700+0xDB	;			dnop;				tmptoreg;	rcsmsw ptr5;	;			dnop;				tmptoreg;	rcslsw ptr5;calcz:	;			dnop;				;		ptr5;		ptr5!0x700+0xDA	;			dnop enra loaddp halt;		regtoti;	rcsmsw ptr5;	;			dsub enra loaddp halt;		regtoti;	rcslsw ptr5;	;			dnop;				;		ptr5;		ptr5!0x700+0xDC	;			dnop tioe tilsw halt;		titoreg;	rcslsw ptr5;

⌨️ 快捷键说明

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