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

📄 tran.u

📁 操作系统SunOS 4.1.3版本的源码
💻 U
📖 第 1 页 / 共 5 页
字号:
|*		Trig Approximations|*  enter with:|*	x in recovery register|*	loop counter set to no. of constants|*	pointer 5 pointing at last constant (they are in reverse order)|*|*  exit with:|*	z in A register of multiplier|*	z*(c1 + z*(c2 + ( ...+ z*cn) in output of multiplier|*	   (multiply has just started)sexpansion:|*	square x	;		;			;		recoe;	;	;		las cslm;		reg;		recoe;	;	;		lbsf smul cslm;		reg;		recoe;	;|*  enter here if z has just begun multiplyingsexpansion2:	;		;			;		;	;	lpreg-	;		;			;		;	;	;		;			;		;	;	jloop stlp;	las cslm csuxm usp;	;		;	rcssp ptr5;	rtn;		lbsf smul cslm;		reg;		;	;	ptr5-stlp:	;		;			;		;	;	;		;			;		;	;	;		;			;		;	rcssp ptr5;	;		las csla csuxm usp;	reg;		;	;	;		;			;		;	;	ptr5-	;		lbsf sadd csla woem;	;		;	;|*   enter here if addition has just begunsexpansion3:	;		;			;		;	;	lpreg-	;		;			;		;	;	;		;			;		;	;	;		csuxa usp;		;		;	;	jloop stlp;	;			;		;	;	rtn;		lbsf smul cslm woea;;		;	;|*  the following line needed to pass assembler restriction	;		;			;		;	;|*  Enter with:|*	X in location pointed to by ptr1 (location will be overwritten|*	   or restored later).|*	Loop counter set to no. of constants.|*	Pointer 5 pointing at last constant (they are in reverse order).|*|*  Exit with:|*	z in A register of multiplier|*	z*(c1 + z*(c2 + ( ...+ z*cn) in output of multiplier|*	   (multiply has just started)#ifdef OLDdexpansion:	;		;			;		;	rcsmsw ptr1;	;		lam cslm;		reg;		;	rcsmsw ptr1;	;		lbm cslm;		reg;		;	;	;		;			;		;	;	;		;			;		;	rcslsw ptr1;	;		lal cslm;		reg;		;	rcslsw ptr1;	;		lblf dmul cslm;		reg;		;	;|*  enter here if z has just begun multiplying	;		;			;		;	;	;		;			;		;	;	;		;			;		;	;	;		;			;		;	;#endifdexpansion2:	;		;			;		;	rcsmsw ptr5;	;		lbm cslm;		reg;		;	rcslsw ptr5;	;		lbl cslm;		reg;		;	;	lpreg-	;		lam cslm csuxm umsw;	;		;	;	ptr5-	jloop dtlp;	lal cslm csuxm ulsw;	;		;	;	rtn;		lf dmul cslm;		;		;	;dtlp:	;		;			;		;	;	;		;			;		;	;	;		;			;		;	rcsmsw ptr5;	;		lam csla;		reg;		;	rcslsw ptr5;	;		lal csla;		reg;		;	;	;		csuxm umsw;		;		;	;	ptr5-	;		csuxm ulsw;		;		;	;	;		lbm csla woem;		;		;	;	;		lblf dadd csla woem;	;		;	;	;		;			;		;	;	;		;			;		;	;	lpreg-	;		;			;		;	;	;		csuxa ulsw;		;		;	;	;		csuxa umsw;		;		;	;	jloop dtlp;	lbl cslm woea;		;		;	;	rtn;		lbmf dmul cslm woea;	;		;	;	;		;			;		;	;sreturnx:|*   this routine is called to return x with inexact status returned if|*   x is not 0	call wait3;	lf scmp0 csla;		reg;		;	;	;		csuxa usp;		;		;	ptr1;	;		;			;		recoe;	ramwe rcssp ptr1;	jeq sreturnzerostat;woea;		;		recoe;	ramwe ptr1;sreturninexact:	;		;			;		;	;	ptr5!c_sinexact	call wait1;	;			;		recclk;	rcssp ptr5;	jwerr restor.r1 cstat restore;;		;		;	;	call idle1;	;			;		;	;|* this is used for sincos in which case we must restore reg4 in case of errorsreturninexact.4:	;		;			;		;	;	ptr5!c_sinexact	call wait1;	;			;		recclk;	rcssp ptr5;	jwerr restor.r41 cstat restore;;	;		;	;	call idle1;	;			;		;	;#ifdef SQRTsreturnx0:	;		;			;		recoe;	ramwe rcssp ptr1;	;		;			;		recoe;	ramwe ptr1;#endifsreturnzerostat:	;		;			;		;	;	ptr5!c_szerostat	call wait1;	;			;		recclk;	rcssp ptr5;	call idle1 cstat restore;;		;		;	;|		*assumes that x is in ptr1dreturnx:	call wait3;	lf dcmp0 csla;		reg;		;	;	call wait1;	csuxa usp;		;		;	;	jeq dreturnx0;	woea;			;		;	;dreturninexact:	;		;			;		;	;	ptr5!c_sinexact	call wait1;	;			;		recclk;	rcssp ptr5;	jwerr drestor.r1 cstat restore;;	;		;	;	call idle1;	;			;		;	;|		this is used just to conserve linesdrtn.inx.soon:	;		;			;		;	;dwrt1:	call wait1;	;			;		;	;	;		csuxa umsw;		;		;	;	;		csuxa ulsw;		;		;	ptr1;	;		woea;			dtor;		;	ramwe rcsmsw ptr1;	;		woea;			dtor;		;	ramwe rcslsw ptr1;	call dreturninexact;;			dtor;		;	ramwe ptr1;|* This is used for sincos since we must restore ptr4dreturninexact.4:	;		;			;		;	;	ptr5!c_sinexact	call wait1;	;			;		recclk;	rcssp ptr5;	jwerr drestor.r41 cstat restore;;	;		;	;	call idle1;	;			;		;	;oberr:	;		;			;		;	;	ptr5!c_soberr	call wait1;	;			;		recclk;	rcssp ptr5;	call werr cstat restore;;		;		;	;soberr:	;		;			;		;	;	ptr5!c_soberr	call wait1;	;			;		recclk;	rcssp ptr5;	call restor.r1 cstat restore;;		;		;	;doberr:	;		;			;		;	;	ptr5!c_soberr	call wait1;	;			;		recclk;	rcssp ptr5;	call drestor.r1 cstat restore;;		;		;	;dreturnx0:|		assumes ptr1 already contains proper datadreturnzerostat:	;		;			;		;	;	ptr5!c_szerostat	call wait1;	;			;		recclk;	rcssp ptr5;	call idle1 cstat restore;;		;		;	;sreturnx1:	;		;			;		recclk;	rcssp ptr5;	;		;			;		recclk;	ptr1;	;		;			;		recoe;	ramwe rcssp ptr1;	;		;			;		recoe;	ramwe ptr1;sreturnexact:dreturnexact:	;		;			;		;	;	ptr5!c_sexact	call wait1;	;			;		recclk;	rcssp ptr5;	call idle1 cstat restore;;		;		;	;dreturnx1:	;		;			;		recclk;	rcsmsw ptr5;	;		;			;		recclk;	rcslsw ptr5;	;		;			;		;	ptr1;	;		;			;		recoe;	ramwe rcsmsw ptr1;	;		;			;		recoe recclk;ramwe ptr1;	;		;			;		recoe;	ramwe rcslsw ptr1;	call dreturnexact;;			;		recoe;	ramwe ptr1;	#ifdef OLD|*	Inverse Tangent approximationsitanapprox:	;		;			;		;	;	lpreg!7	call sexpansion;;			;		;	;	call wait2;	;			;		;	;	;		las cslm csuxm usp;	;		recoe;	;	;		lbsf smul cslm;		reg;		recoe;	;	;		las csla;		reg;		recoe;	;	;		;			;		;	;	;		;			;		;	;	;		csuxm usp;		;		;	;	;		;			;		;	;	call wait2;	lbsf sadd csla woem;	;		;	;	;		;			;		;	;	ptr5!smone|#				(Note: 12 will cause a delay of 26)	;		lbs csla csuxa usp;	;		;	rcssp ptr5;	lpreg!12	;		lasf sdiv csla;		reg;		;	;	call wait;	;			;		;	;	call salu.inx4;	;			;		;	;#endif|*|*		Single Precision Arctangent Instruction|*routine xs.atan w01000000110 las ssub	call stran.start;;			;		;	;	;		;			;		;	;	ptr5!s39o16	;		;			;		;	rcssp ptr5;	call wait3;	lbsf scmpm csla;	reg;		;	;	;		csuxa usp;		;		;	;	;		csuxa usp;		;		;	;	ptr5!s7o16|*  if the operand was a NaN, branch	jwerr soberr;	woea;			;		;	;|*  if abs(operand) > 39/16 then branch	jgt xsa.e1;	woea;			;		;	;	;		;			;		;	rcssp ptr5;	ptr5!c_satan_big|*   abs(operand) <= 39/16	call wait3;	lbsf scmpm csla;	reg;		;	;	;		csuxa usp;		;		;	;	;		;			;		;	;	ptr5!c_satan_small	jgt xsa.e2;	woea;			;		;	;	;		;			;		;	rcssp ptr5;	ptr5!s19o16|*   abs(operand) <= 7/16	call wait3;	lbsf scmpm csla;	reg;		;	;	call wait1;	csuxa usp;		;		;	;	jlt sreturnx;	woea;			;		;	;|*   small < abs(operand) <= 7/16|		put ptr2 into "t"	;		;			;		;	;	ptr5!c_dSCRATCH_5	;		;			;		;	ptr5;	;		;			;		recoe;	ramwe rcssp ptr5;	;		;			;		recoe;	ramwe ptr5;	ptr5!c_satan_00|		jump to compute atan with hi = 0, lo = 0	call xsa.getz;	;			;		;	;xsa.e2:|*   7/16 < abs(operand) <= 39/16	;		;			;		;	rcssp ptr5;	ptr5!s11o16	call wait3;	lbsf scmpm csla;	reg;		;	;	call wait1;	csuxa usp;		;		;	;	jgt xsa.e3;	woea;			;		;	;	;		;			;		;	rcssp ptr5;|*   7/16 < abs(operand) <= 19/16	call wait3;	lbsf scmpm csla;	reg;		;	;	call wait1;	csuxa usp;		;		;	;	jgt xsa.e4;	woea;			;		;	;|*   7/16 < abs(operand) <= 11/16	;		;			;		;	;	ptr5!stwo	;		;			;		;	rcssp ptr5;|		start y+2	call wait3;	lbsf saddm csla;	reg;		;	;	;		csuxa usp;		;		;	;	ptr5!c_dSCRATCH_5	;		;			;		;	ptr5;|		write y+2 to temp	;		woea;			dtor;		;	ramwe rcssp ptr5;	;		;			dtor;		;	ramwe ptr5;	;		;			;		;	rcssp ptr2;	ptr5!sone	call wait3;	lbsf saddm csla;	reg;		;	;	;		las csla csuxa usp;	;		;	rcssp ptr5;	ptr5!c_dSCRATCH_5	call wait3;	lbsf ssub csla;		reg;		;	;	;		las csla csuxa usp;	;		;	rcssp ptr5;	lpreg!13	call wait;	lbsf sdiv csla;		reg;		;	;	;		csuxa usp;		;		;	;	;		;			;		;	ptr5;|		pass value of "t"	;		woea;			dtor;		;	ramwe rcssp ptr5;	;		;			dtor;		;	ramwe ptr5;	;		;			;		;	rcssp ptr2;	call wait3;	lasf scmp0 csla;	reg;		;	;	call wait1;	csuxa usp;		;		;	;	jgt xsa.getz;	woea;			;		;	;	;		;			;		;	rcssp ptr5;	ptr5!c_satan_hhilo	call wait3;	lasf sneg csla;		reg;		;	;	;		csuxa usp;		;		;	;	ptr5!c_dSCRATCH_5	;		;			;		;	ptr5;|		pass -"t" and -hi, -lo	;		woea;			dtor;		;	ramwe rcssp ptr5;	;		;			dtor;		;	ramwe ptr5;	ptr5!c_satan_mhhilo	call xsa.getz;	;			;		;	;xsa.e4:|*   11/16 < abs(operand) <= 19/16	;		;			;		;	;	ptr5!sone	;		;			;		;	rcssp ptr5;|		start y+1	call wait3;	lbsf saddm csla;	reg;		;	;	;		lf ssubm csla csuxa usp;;		;	;	ptr5!c_dSCRATCH_5	;		;			;		;	ptr5;|		write y+1 to temp	;		woea;			dtor;		;	ramwe rcssp ptr5;	;		;			dtor;		;	ramwe ptr5;	;		las csla csuxa usp;	;		;	rcssp ptr5;	lpreg!13	call wait;	lbsf sdiv csla;		reg;		;	;	;		csuxa usp;		;		;	;	;		;			;		;	ptr5;|		pass value of "t"	;		woea;			dtor;		;	ramwe rcssp ptr5;	;		;			dtor;		;	ramwe ptr5;	;		;			;		;	rcssp ptr2;	call wait3;	lasf scmp0 csla;	reg;		;	;	call wait1;	csuxa usp;		;		;	;	jgt xsa.getz;	woea;			;		;	;	;		;			;		;	rcssp ptr5;	ptr5!c_satan_40	call wait3;	lasf sneg csla;		reg;		;	;	;		csuxa usp;		;		;	;	ptr5!c_dSCRATCH_5	;		;			;		;	ptr5;|		pass -"t" and -hi, -lo	;		woea;			dtor;		;	ramwe rcssp ptr5;	;		;			dtor;		;	ramwe ptr5;	ptr5!c_satan_m40	call xsa.getz;	;			;		;	;xsa.e3:|*   19/16 < abs(operand) <= 39/16	;		;			;		;	rcssp ptr2;	ptr5!stwo	call wait3;	lbsf saddm csla;	reg;		;	;	call wait3;	lbsf saddm csla csuxa usp;;		;	;	;		las csla csuxa usp;	;		;	rcssp ptr5;|		start (y+y+y) + 2	call wait3;	lbsf sadd csla;		reg;		;	;	;		csuxa usp;		;		;	;	ptr5!c_dSCRATCH_5	;		;			;		;	ptr5;|		write (y+y+y) + 2 to temp	;		woea;			dtor;		;	ramwe rcssp ptr5;	;		;			dtor;		;	ramwe ptr5;	;		;			;		;	rcssp ptr2;	ptr5!sone	;		las csla;		reg;		;	rcssp ptr5;|		start y - 1	call wait3;	lbsf ssubm csla;	reg;		;	;	;		las csla csuxa usp;	;		;	;	ptr5!sone|		start z+z	call wait3;	lbsf sadd csla csuxa usp;;		;	;	;		las csla csuxa usp;	;		;	rcssp ptr5;	ptr5!c_dSCRATCH_5	call wait3;	lbsf ssub csla;		reg;		;	;	;		las csla csuxa usp;	;		;	rcssp ptr5;	lpreg!13	call wait;	lbsf sdiv csla;		reg;		;	;	;		csuxa usp;		;		;	;	;		;			;		;	ptr5;|		pass value of "t"	;		woea;			dtor;		;	ramwe rcssp ptr5;	;		;			dtor;		;	ramwe ptr5;	;		;			;		;	rcssp ptr2;	call wait3;	lasf scmp0 csla;	reg;		;	;	call wait1;	csuxa usp;		;		;	;	jgt xsa.getz;	woea;			;		;	;	;		;			;		;	rcssp ptr5;	ptr5!c_satan_lhilo	call wait3;	lasf sneg csla;		reg;		;	;	;		csuxa usp;		;		;	;	ptr5!c_dSCRATCH_5	;		;			;		;	ptr5;|		pass -"t" and -hi, -lo	;		woea;			dtor;		;	ramwe rcssp ptr5;	;		;			dtor;		;	ramwe ptr5;	ptr5!c_satan_mlhilo	call xsa.getz;	;			;		;	;xsa.e1:|*   abs(operand) > 39/16	;		;			;		;	rcssp ptr5;	call wait3;	lbsf scmpm csla;	reg;		;	;	call wait1;	csuxa usp;		;		;	;	jgt xsa.e5;	woea;			;		;	;|*   39/16 < abs(operand) <= big	;		;			;		;	rcssp ptr2;	ptr5!smone	;		lbs csla;		reg;		;	rcssp ptr5;	lpreg!13	call wait;	lasf sdiv csla;		reg;		;	;	;		csuxa usp;		;		;	;	ptr5!c_dSCRATCH_5	;		;			;		;	ptr5;|		pass "t" and pi/2, 0	;		woea;			dtor;		;	ramwe rcssp ptr5;	;		;			dtor;		;	ramwe ptr5;xsa.e6:	;		;			;		;	rcssp ptr2;	call wait3;	lasf scmp0 csla;	reg;		;	;	call wait1;	csuxa usp;		;		;	;	jgt xsa.getz;	woea;			;		;	;	;		;			;		;	;	ptr5!c_satan_20	;		;			;		;	;	ptr5!c_satan_m20	call xsa.getz;	;			;		;	;xsa.e5:|*   abs(operand) > big|		(we already checked for NaN's)	;		;			;		;	;	ptr5!szero	;		;			;		recclk;	rcssp ptr5;	ptr5!c_dSCRATCH_5	;		;			;		recclk;	ptr5;	;		;			;		recoe;	ramwe rcssp ptr5;	;		;			;		recoe;	ramwe ptr5;	ptr5!c_satan_20	call xsa.e6;	;			;		;	;|*   finished with argument reduction;  compute z nowxsa.getz:|		We need to copy hi and low to 2 and 3 first!	;		;			;		recclk;	rcssp ptr5;	ptr5-	;		;			;		recclk;	rcssp ptr5;	ptr5!c_dSCRATCH_2	;		;			;		;	ptr5;	;		;			;		recoe;	ramwe rcssp ptr5;	;		;			;		recoe;	ramwe ptr5;	ptr5!c_dSCRATCH_3	;		;			;		recclk;	ptr5;	;		;			;		recoe;	ramwe rcssp ptr5;	;		;			;		recoe;	ramwe ptr5;	ptr5!c_dSCRATCH_5	;		;			;		;	rcssp ptr5;	lpreg!9	;		las cslm;		reg;		;	rcssp ptr5;	ptr5!c_satan_c9	call sexpansion2;lbsf smul cslm;	reg;		;	;	call wait1;	;			;		;	;	;		;			;		;	;	ptr5!c_dSCRATCH_5	;		las cslm csuxm usp;	;		;	rcssp ptr5;	ptr5!c_dSCRATCH_3	call wait3;	lbsf smul cslm;		reg;		;	;	;		;			;		;	rcssp ptr5;	ptr5!c_dSCRATCH_5	;		las csla csuxm usp;	reg;		;	;	;		;			;		;	;|		start z = lo - z	call wait3;	lbsf ssub csla woem;	;		;	;	;		las csla csuxa usp;	;		;	rcssp ptr5;	ptr5!c_dSCRATCH_2|		start z = z + t	call wait3;	lbsf sadd csla;		reg;		;	;	;		lbs csla csuxa usp;	;		;	rcssp ptr5;|		start z = hi + z	call salu.inx1;	lasf sadd csla;		reg;		;	;|*|*		Double Precision Arctangent Instruction|*routine xd.atan w01000000111 lnop ssub	call dtran.start;;			;		;	;	;		;			;		;	rcsmsw ptr1;	ptr5!s39o16	;		lam csla;		reg;		;	rcssp ptr5;	;		lbs csla;		reg;		;	rcslsw ptr1;|		*save ptr2 for later comparison	;		lalf dcmpm csla;	reg;		recclk;	rcsmsw ptr2;	;		;			;		recclk;	rcslsw ptr2;	ptr5!c_dSCRATCH_6	;		;			;		;	ptr5;	;		;			;		recoe;	ramwe rcsmsw ptr5;	;		csuxa umsw;		;		recoe recclk;ramwe ptr5;	;		csuxa ulsw;		;		recoe;	ramwe rcslsw ptr5;	ptr5!s7o16	jwerr doberr;	woea;			;		recoe;	ramwe ptr5;	jgt xda.e1;	woea;			;		;	;	;		;			;		;	rcssp ptr5;	ptr5!c_sdatan_big|		abs(x) < 39/16	;		lbs csla;		reg;		;	;	call wait3;	lf dcmpm csla;		;		;	;	;		csuxa umsw;		;		;	;	;		;			;		;	;	ptr5!c_sdatan_small	jgt xda.e2;	woea;			;		;	;

⌨️ 快捷键说明

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