Files
Arquivotheca.SunOS-4.1.4/usr.etc/fpa/microcode/tran.u
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

2985 lines
82 KiB
Plaintext

|* 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 multiplying
sexpansion2:
; ; ; ; ; 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 begun
sexpansion3:
; ; ; ; ; 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 OLD
dexpansion:
; ; ; ; 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
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
#endif
dexpansion2:
; ; ; ; 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 error
sreturninexact.4:
; ; ; ; ; ptr5!c_sinexact
call wait1; ; ; recclk; rcssp ptr5;
jwerr restor.r41 cstat restore;; ; ; ;
call idle1; ; ; ; ;
#ifdef SQRT
sreturnx0:
; ; ; recoe; ramwe rcssp ptr1;
; ; ; recoe; ramwe ptr1;
#endif
sreturnzerostat:
; ; ; ; ; ptr5!c_szerostat
call wait1; ; ; recclk; rcssp ptr5;
call idle1 cstat restore;; ; ; ;
| *assumes that x is in ptr1
dreturnx:
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 lines
drtn.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 ptr4
dreturninexact.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 data
dreturnzerostat:
; ; ; ; ; 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 approximation
sitanapprox:
; ; ; ; ; 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 now
xsa.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; ; ; ;
; ; ; ; rcssp ptr5; ptr5!s19o16
|* abs(operand) <= 7/16
; lbs csla; reg; ; ;
call wait3; lf dcmpm csla; ; ; ;
call wait1; csuxa umsw; ; ; ;
jlt dreturnx; woea; ; ; ;
|* small < abs(operand) <= 7/16
| put ptr2 into "t"
; ; ; recclk; rcsmsw ptr2;
; ; ; recclk; rcslsw ptr2; ptr5!c_dSCRATCH_5
; ; ; ; ptr5;
; ; ; recoe; ramwe rcsmsw ptr5;
; ; ; recoe recclk;ramwe ptr5;
; ; ; recoe; ramwe rcslsw ptr5;
; ; ; recoe; ramwe ptr5; ptr5!c_datan_00
| jump to compute atan with hi = 0, lo = 0
call xda.getz; ; ; ; ;
xda.e2:
|* 7/16 < abs(operand) <= 39/16
; ; ; ; rcssp ptr5; ptr5!s11o16
; lbs csla; reg; ; ;
call wait3; lf dcmpm csla; ; ; ;
call wait1; csuxa umsw; ; ; ;
jgt xda.e3; woea; ; ; ;
; ; ; ; rcssp ptr5; ptr5!stwo
|* 7/16 < abs(operand) <= 19/16
; lbs csla; reg; ; ;
call wait3; lf dcmpm csla; ; ; ;
call wait1; csuxa umsw; ; ; ;
jgt xda.e4; woea; ; ; ;
|* 7/16 < abs(operand) <= 11/16
; ; ; ; rcssp ptr5;
| start y+2
; lbs csla; reg; ; ;
call wait3; lf daddm csla; ; ; ;
; csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; csuxa ulsw; ; ; ptr5;
| write y+2 to temp
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5;
; ; ; ; rcsmsw ptr2;
; lbm csla; reg; ; rcslsw ptr2; ptr5!sone
call wait3; lblf daddm csla; reg; ; ;
; lam csla csuxa umsw; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
| start (y+y) - 1
call wait3; lalf dsub csla csuxa ulsw;; ; ;
; lam csla csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; lal csla csuxa ulsw; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5; lpreg!28
call wait; lblf ddiv csla; reg; ; ;
; csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; csuxa ulsw; ; ; ptr5;
| pass value of "t"
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5;
| note: we check the msw as a sp!
; ; ; ; rcsmsw ptr2;
call wait3; lasf scmp0 csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jgt xda.getz; woea; ; ; ;
; ; ; ; ; ptr5!c_datan_hhilo
; ; ; ; ; ptr5!c_dSCRATCH_5
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
call wait3; lalf dneg csla; reg; ; ;
; csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; csuxa ulsw; ; ; ptr5;
| pass value of -"t" and -hi, -lo
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5; ptr5!c_datan_mhhilo
call xda.getz; ; ; ; ;
xda.e4:
|* 11/16 < abs(operand) <= 19/16
; ; ; ; ; ptr5!sone
; ; ; ; rcssp ptr5;
| start y+1
; lbs csla; reg; ; ;
call wait3; lf daddm csla; ; ; ;
; lf dsubm csla csuxa umsw;; ; ; ptr5!c_dSCRATCH_5
; csuxa ulsw; ; ; ptr5;
| write y+1 to temp
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; lam csla csuxa umsw; dtor; ; ramwe ptr5;
; lal csla csuxa ulsw; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5; lpreg!28
call wait; lblf ddiv csla; reg; ; ;
; csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; csuxa ulsw; ; ; ptr5;
| pass value of "t"
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5;
| note: we check the msw as a sp!
; ; ; ; rcsmsw ptr2;
call wait3; lasf scmp0 csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jgt xda.getz; woea; ; ; ;
; ; ; ; ; ptr5!c_datan_40
; ; ; ; ; ptr5!c_dSCRATCH_5
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
call wait3; lalf dneg csla; reg; ; ;
; csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; csuxa ulsw; ; ; ptr5;
| pass value of -"t" and -hi, -lo
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5; ptr5!c_datan_m40
call xda.getz; ; ; ; ;
xda.e3:
|* 19/16 < abs(operand) <= 39/16
; ; ; ; rcsmsw ptr2;
; lbm csla; reg; ; rcslsw ptr2; ptr5!stwo
call wait3; lblf daddm csla; reg; ; ;
; lbm csla csuxa umsw; ; ; ;
call wait3; lblf daddm csla csuxa ulsw;; ; ;
; lam csla csuxa umsw; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
| start (y+y+y) + 2
call wait3; lalf dadd csla csuxa ulsw;; ; ;
; csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; csuxa ulsw; ; ; ptr5;
| write (y+y+y) + 2 to temp
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5;
; ; ; ; rcsmsw ptr2; ptr5!sone
; lam csla; reg; ; rcssp ptr5;
; lbs csla; reg; ; rcslsw ptr2;
| start y - 1
call wait3; lalf dsubm csla; reg; ; ;
; lam csla csuxa umsw; ; ; ;
; lal csla csuxa ulsw; ; ; ;
; lbm csla csuxa umsw; ; ; ; ptr5!sone
| start z+z
call wait3; lblf dadd csla csuxa ulsw;; ; ;
; lam csla csuxa umsw; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
call wait3; lalf dsub csla csuxa ulsw;; ; ;
; lam csla csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; lal csla csuxa ulsw; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5; lpreg!28
call wait; lblf ddiv csla; reg; ; ;
; csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; csuxa ulsw; ; ; ptr5;
| pass value of "t"
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5;
| note: we check the msw as a sp!
; ; ; ; rcsmsw ptr2;
call wait3; lasf scmp0 csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jgt xda.getz; woea; ; ; ;
; ; ; ; ; ptr5!c_datan_lhilo
; ; ; ; ; ptr5!c_dSCRATCH_5
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
call wait3; lalf dneg csla; reg; ; ;
; csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; csuxa ulsw; ; ; ptr5;
| pass value of -"t" and -hi, -lo
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5; ptr5!c_datan_mlhilo
call xda.getz; ; ; ; ;
xda.e1:
|* abs(operand) > 39/16
; ; ; ; rcssp ptr5; ptr5!dzero
; lbs csla; reg; ; ;
call wait3; lf dcmpm csla; ; ; ;
call wait1; csuxa umsw; ; ; ;
jgt xda.e5; woea; ; ; ;
|* 39/16 < abs(operand) <= big
; ; ; ; ;
; ; ; ; rcsmsw ptr2; ptr5!smone
; lbm csla; reg; ; rcssp ptr5;
; las csla; reg; ; rcslsw ptr2; lpreg!28
call wait; lblf ddiv csla; reg; ; ;
; csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; csuxa ulsw; ; ; ptr5;
| pass value of "t"
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5;
xda.e6:
; ; ; ; rcsmsw ptr2;
; lam csla; reg; ; rcslsw ptr2;
call wait3; lalf dcmp0 csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jgt xda.getz; woea; ; ; ;
; ; ; ; ; ptr5!c_datan_20
; ; ; ; ; ptr5!c_datan_m20
call xda.getz; ; ; ; ;
xda.e5:
|* abs(operand) > big
| (we already checked for NaN's)
; ; ; recclk; rcsmsw ptr5;
; ; ; recclk; rcslsw ptr5; ptr5!c_dSCRATCH_5
; ; ; ; ptr5;
; ; ; recoe; ramwe rcsmsw ptr5;
; ; ; recoe recclk;ramwe ptr5;
; ; ; recoe; ramwe rcslsw ptr5;
call xda.e6; ; ; recoe; ramwe ptr5;
|* finished with argument reduction; compute z now
xda.getz:
| We need to get at (ptr5) and (ptr5-) so we copy (ptr5)
| to ptr1, and (ptr5-) to 3
; ; ; recclk; rcsmsw ptr5;
; ; ; recclk; rcslsw ptr5; ptr5-
; ; ; ; ptr1;
; ; ; recoe; ramwe rcsmsw ptr1;
; ; ; recoe recclk;ramwe ptr1;
; ; ; recoe; ramwe rcslsw ptr1;
; ; ; recoe; ramwe ptr1;
; ; ; recclk; rcsmsw ptr5;
; ; ; recclk; rcslsw ptr5; ptr5!c_dSCRATCH_3
; ; ; ; ptr5;
; ; ; recoe; ramwe rcsmsw ptr5;
; ; ; recoe recclk;ramwe ptr5;
; ; ; recoe; ramwe rcslsw ptr5;
; ; ; recoe; ramwe ptr5; ptr5!c_dSCRATCH_5
; ; ; ; rcsmsw ptr5;
; lam cslm; reg; ; rcslsw ptr5;
; lal cslm; reg; ; rcslsw ptr5; lpreg!11
; lbl cslm; reg; ; rcsmsw ptr5; ptr5!c_datan_c11
call wait4; lbmf dmul cslm; reg; ; ;
call dexpansion2;; ; ; ;
call wait4; ; ; ; ;
; lam cslm csuxm umsw; ; ; ; ptr5!c_dSCRATCH_5
; lal cslm csuxm ulsw; ; ; rcslsw ptr5;
; lbl cslm; reg; ; rcsmsw ptr5; ptr5!c_dSCRATCH_3
| start t*z
call wait3; lbmf dmul cslm; reg; ; ;
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
; lal csla csuxm umsw; reg; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
| start z = lo - z
call wait3; lblf dsub csla woem; ; ; ;
; lam csla csuxa umsw; ; ; ; ptr5!c_dSCRATCH_5
; lal csla csuxa ulsw; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
| start z = z + t
call wait3; lblf dadd csla; reg; ; ;
; lbm csla csuxa umsw; ; ; ;
; lbl csla csuxa ulsw; ; ; rcsmsw ptr1;
; lam csla; reg; ; rcslsw ptr1;
| start z = hi + z
call drtn.inx.soon;lalf dadd csla; reg; ; ;
|*
|* Single Precision e**x-1 Instruction
|*
routine xs.ex1 w01000001000 las ssub
call stran.start;; ; ; ;
; ; ; ; ; ptr5!c_s87
; ; ; ; rcssp ptr5;
call wait3; lbsf scmpm csla; reg; ; ;
; csuxa usp; ; ; ; lpreg!9
; csuxa usp; ; ; ; ptr5!c_stwopm26
|* if the operand was a NaN, then branch
jwerr soberr; woea; ; ; ;
|* if abs(operand) > 87 then branch
jgt soberr; woea; ; ; ;
|* abs(operand) <= 87
; ; ; ; rcssp ptr5;
call wait3; lbsf scmpm csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jgt xsx1.e1; woea; ; ; ;
call sreturnx; ; ; ; ;
xsx1.e1:
| * 2**-26 < abs(x) < 87
| if the mode register is not set up with the correct data
| then punt
; ; ; ; ; ptr5!c_dmode
; ; ; ; rcssp ptr5; ptr5!c_dmode_cor
; las csla; reg; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jne soberr; woea; ; ; ;
| proceed with expansion
call sexpn; ; ; ; ;
call sexps; ; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5; ptr5!c_dSCRATCH_1
call wait3; lasf scmp0 csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jne xsx1.e2; woea; ; ; ;
; ; ; ; rcsmsw ptr5;
|* n == 0, return real(e)
; lam csla; reg; ; rcslsw ptr5;
call salu.inx1; lalf dcvts csla; reg; ; ;
xsx1.e2:
call stwoton; ; ; ; ;
|stwoton leaves ptr5 at c_dSCRATCH_1 (e)
; ; ; ; rcsmsw ptr5;
; lam cslm; reg; ; rcslsw ptr5;
; lal cslm; reg; ; ; ptr5!sone
| *start dble(p)
; lasf scvtd csla csuxa ulsw;; ; rcssp ptr5;
call wait2; lbs csla; reg; ; ;
| *start dble(p) - 1(double)
; lf dsub csla csuxa ulsw;; ; ;
; csuxa umsw; ; ; ;
| *start dble(p) * e
; lblf dmul cslm woea; ; ; ;
; lbm cslm woea; ; ; ;
; lam csla csuxa umsw; ; ; ;
call wait2; lal csla csuxa ulsw; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
call wait3; lblf dadd csla woem; ; ; ;
; lam csla csuxa umsw; ; ; ;
call salu.inx1; lalf dcvts csla csuxa ulsw;; ; ;
|*
|* subroutine twoton
|* Enter with:
|* n in c_dSCRATCH_0
|*
|* Exit with:
|* twoton starting calculation in ALU (MUST unload with ulsw!)
|* ptr5 pointing at c_dSCRATCH_1
|*
stwoton:
; ; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5; ptr5!c_s127
; las csla; reg; ; rcssp ptr5;
| *start (n + 127)
; lbsf sadd csla; reg; ; ;
; ; ; ; ; ptr5!c_stwop23
; ; ; ; rcssp ptr5;
; las cslm; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
| *start ((2**23) * (n + 127))
; lbsf smul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_1
rtn; lasf scvtint csla woem; ; ; ;
|*
|* subroutine expn
|* Enter with:
|* x in recovery register
|*
|* Exit with:
|* expn in c_dSCRATCH_0
|*
sexpn:
| *round to nearest int
; lmode3.0 0x0 cslmac; ; recoe; ; ptr5!slog2e
; las cslm; reg; recoe; ;
; ; ; ; rcssp ptr5;
; lbsf smul cslm; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lasf scvtint csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lalf sfloat csla csuxa ulsw;; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; ptr5;
; woea; dtor; ; ramwe rcssp ptr5;
| *reset the default rounding mode (to 0 for fix operations)
rtn; lmode3.0 0x2 cslmac; dtor; ; ramwe ptr5;
|*
|* subroutine exps
|* Enter with:
|* x in recovery register
|* expn in c_dSCRATCH_0
|*
|* Exit with:
|* exps in c_dSCRATCH_1
|*
sexps:
; ; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5; ptr5!c_dloge2a
| *start dble(n)
; lasf scvtd csla; reg; ; rcsmsw ptr5;
; lam cslm; reg; ; rcslsw ptr5;
; lal cslm; reg; ; ;
; ; ; recoe; ;
| *start dble(x)
; lasf scvtd csla; reg; recoe; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
| *start dble(n) * loge2a
; lblf dmul cslm woea; ; ; ;
; lam csla csuxa umsw; ; ; ;
; lal csla csuxa ulsw; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
| *start dble(x) - (dble(n) * loge2a)
; lblf dsub csla woem; ; ; ; ptr5!c_dloge2b
; ; ; ; rcslsw ptr5;
; lal cslm; reg; ; rcsmsw ptr5;
; lam cslm; reg; ; ;
; lf dmul cslm; ; ; ;
; lam csla csuxa umsw; ; ; ;
; lal csla csuxa ulsw; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
; lblf dsub csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lam csla csuxa umsw; ; ; ; ptr5!c_dSCRATCH_15
| *start y = read(dy)
; lalf dcvts csla csuxa ulsw;; ; ptr5;
| *save dy for later use
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5;
; lbs csla csuxa usp; ; ; ; ptr5!c_dSCRATCH_14
; ; ; ; ptr5;
| *save y for later use
; las cslm woea; dtor; ; ramwe rcssp ptr5;
; ; dtor; ; ramwe ptr5; ptr5!c_sexpt3
; ; ; ; rcssp ptr5;
| *start t(3) + y
; lasf sadd csla; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
; lbsf smul cslm woea; ; ; ;
; ; ; ; ; ptr5!c_sexpt2
; ; ; ; rcssp ptr5;
; las csla; reg; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lbsf sadd csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
; lbsf smul cslm woea; ; ; ;
; ; ; ; ; ptr5!c_sexpt1
; ; ; ; rcssp ptr5;
; las csla; reg; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lbsf sadd csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_13
; ; ; ; ptr5;
| *save denominator for later use
; woea; dtor; ; ramwe rcssp ptr5;
; ; dtor; ; ramwe ptr5; ptr5!c_sexps2
; ; ; ; rcssp ptr5;
; las csla; reg; ; ; ptr5!c_dSCRATCH_14
; ; ; ; rcssp ptr5;
; lbsf ssub csla; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
; lbsf smul cslm woea; ; ; ;
; ; ; ; ; ptr5!c_sexps1
; ; ; ; rcssp ptr5;
; las csla; reg; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lbsf sadd csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_13
; las csla csuxa usp; ; ; rcssp ptr5;
; lbsf sdiv csla; reg; ; ; lpreg!13
sexps.e1:
jloop sexps.e1; ; ; ; ;
; ; ; ; ; lpreg-
; csuxa usp; ; ; ;
; ; ; ; ;
; lbsf smul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lbsf smul cslm csuxm usp;; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lasf scvtd csla woem; ; ; ; ptr5!c_dSCRATCH_15
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
; lbl csla; reg; ; ;
; lam csla csuxa umsw; ; ; ;
; lalf dadd csla csuxa ulsw;; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa umsw; ; ; ; ptr5!c_dSCRATCH_1
; csuxa ulsw; ; ; ptr5;
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
rtn; ; dtor; ; ramwe ptr5;
|*
|* Double Precision e**x-1 Instruction
|*
routine xd.ex1 w01000001001 lnop ssub
call dtran.start;; ; ; ;
|* calculate e**x - 1 of ptr1
; ; ; ; rcsmsw ptr1;
; lam csla; reg; ; rcslsw ptr1; ptr5!c_d708
; lal csla; reg; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmpm csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ; ptr5!c_dtwopm54
|* if the operand was a NaN, branch
jwerr doberr; woea; ; ; ;
|* if abs(operand) > 708 then branch
jgt doberr; woea; ; ; ;
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmpm csla; reg; ; ;
call wait1; csuxa umsw; ; ; ;
jle dreturnx; woea; ; ; ;
|* 2**-54 < abs(x) < 708
call dexpapprox;; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5;
call wait3; lasf scmp0 csla; reg; ; ;
; csuxa usp; ; ; ;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_8
jeq xde1.zero; woea; ; ; ;
jgt xde1.npos; woea; ; ; ;
xde1.nneg:
| *y = y + yc
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5; ptr5!c_dSCRATCH_7
; lal csla; reg; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dadd csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ptr5;
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5; ptr5!smone
; las csla; reg; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_7
jne xde1.nnm1; woea; ; ; ;
|* n == -1
; ; ; ; rcsmsw ptr5;
; lam cslma; reg; ; rcslsw ptr5; ptr5!shalf
; lal cslma; reg; ; rcssp ptr5;
call wait5; lbsf dmul cslm; reg; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ;
; lal csla woem; ; ; ; ptr5!shalf
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
call drtn.inx.soon;lf dsub csla; ; ; ;
|* n != -1
xde1.nnm1:
call dtwoton; ; ; ; ;
call wait2; ; ; ; ;
call wait1; csuxa ulsw; ; ; ;
; lam cslm woea; ; ; ; ptr5!dzero
; ; ; ; rcslsw ptr5; ptr5!sone
; lal cslm; reg; ; rcssp ptr5; ptr5!c_dSCRATCH_7
; las csla; reg; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dadd csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
call wait5; lblf dmul cslm woea; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ;
; lal csla woem; ; ; ; ptr5!sone
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
call drtn.inx.soon;lf dsub csla; ; ; ;
xde1.npos:
|* n > 0
; ; ; ; ; ptr5!sone
; ; ; ; rcssp ptr5; ptr5!c_dSCRATCH_7
call wait3; lbsf scmp csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jne xde1.nn1; woea; ; ; ;
; ; ; ; rcsmsw ptr5; ptr5!shalf
; lam csla; reg; ; rcssp ptr5; ptr5!c_dSCRATCH_7
; lbs csla; reg; ; rcslsw ptr5;
call wait3; lalf dadd csla; reg; ; ;
; lam csla csuxa umsw; ; ; ; ptr5!c_dSCRATCH_8
; lal csla csuxa ulsw; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5; ptr5!stwo
| *start (.5+y) + yc
call wait2; lblf dadd csla; reg; ; ;
; ; ; ; rcssp ptr5;
; las cslm csuxa umsw; reg; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
; lblf dmul cslm woea; ; ; ;
dwrite1m:
call wait4; ; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ptr1;
; woem; dtor; ; ramwe rcsmsw ptr1;
; woem; dtor; ; ramwe rcslsw ptr1;
call dreturninexact;; dtor; ; ramwe ptr1;
xde1.nn1:
| *y = y + yc
; ; ; ; ; ptr5!c_dSCRATCH_8
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5; ptr5!c_dSCRATCH_7
; lal csla; reg; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dadd csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ptr5;
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5; ptr5!c_dSCRATCH_0
call dtwoton; ; ; ; ;
call wait2; ; ; ; ;
; csuxa ulsw; ; ; ; ptr5!c_dSCRATCH_9
; ; ; ; ptr5;
; woea; dtor; ; ramwe rcsmsw ptr5;
; ; dtor; ; ramwe ptr5; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5; ptr5!c_s53
; las csla; reg; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_9
jgt xde1.ng53; woea; ; ; ;
; ; ; ; rcsmsw ptr5; ptr5!dzero
|* n <= 53
| *Note that we load both ALU, MUL
; lam cslma; reg; ; rcslsw ptr5; ptr5!c_dSCRATCH_7
; lal cslma; reg; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5; ptr5!sone
| *start p * y
; lblf dmul cslm; reg; ; rcssp ptr5;
; lbs csla; reg; ; ;
| *start p - 1
call wait3; lf dsub csla; ; ; ;
; lam csla csuxma umsw; ; ; ;
; lal csla csuxma ulsw; ; ; ;
; lbm csla woem; ; ; ;
call drtn.inx.soon;lblf dadd csla woem; ; ; ;
|* n == 0
xde1.zero:
| *y = y + yc
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5; ptr5!c_dSCRATCH_7
; lal csla; reg; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call drtn.inx.soon;lblf dadd csla; reg; ; ;
|* n > 53
xde1.ng53:
; lam cslm; reg; ; rcslsw ptr5; ptr5!c_dSCRATCH_7
; lal cslm; reg; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5; ptr5!sone
call wait4; lblf dmul cslm; reg; ; ;
; ; ; ; rcssp ptr5;
; lbs csla csuxm umsw; reg; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ;
call wait3; lalf dsub csla woem; ; ; ;
; lam csla csuxa umsw; ; ; ; ptr5!c_dSCRATCH_9
; lal csla csuxa ulsw; ; ; rcsmsw ptr5; ptr5!dzero
; lbm csla; reg; ; rcslsw ptr5;
call drtn.inx.soon;lblf dadd csla; reg; ; ;
|*
|* double precision expapprox
|* enter with:
|* x pointed to by ptr1
|* exit with:
|* n in c_dSCRATCH_0
|* y in c_dSCRATCH_7
|* yc in c_dSCRATCH_8
|*
dexpapprox:
|* first calculate n
; ; ; ; rcsmsw ptr1;
; lam cslm; reg; ; rcslsw ptr1; ptr5!dlog2e
; lal cslm; reg; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5;
; lblf dmul cslm; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
| *round to nearest int
; lmode3.0 0x0 csla; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ;
; lalf dcvtint csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lalf sfloat csla csuxa ulsw;; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_0
| *reset the default rounding mode (to 0 for fix operations)
; lmode3.0 0x2 csla; ; ; ptr5;
; las cslm woea; dtor; ; ramwe rcssp ptr5;
; ; dtor; ; ramwe ptr5; ptr5!c_dloge2a
|* next calculate y1
; ; ; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5;
; lblf dmul cslm; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; rcsmsw ptr1;
; lam csla; reg; ; rcslsw ptr1;
; lal csla csuxm umsw; reg; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
; lblf dsub csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lam csla csuxa umsw; ; ; ; ptr5!c_dSCRATCH_7
; lal csla csuxa ulsw; ; ; ptr5;
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5; ptr5!c_dSCRATCH_0
|* next calculate y
; ; ; ; rcssp ptr5; ptr5!c_dloge2b
; las cslm; reg; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5;
; lblf dmul cslm; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm umsw; ; ; ; ptr5!c_dSCRATCH_8
; csuxm ulsw; ; ; ptr5;
; lbm csla woem; dtor; ; ramwe rcsmsw ptr5;
; lblf dsub csla woem; dtor; ; ramwe rcslsw ptr5;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lbm csla csuxa umsw; dtor; ; ramwe ptr5;
; lbl csla csuxa ulsw; ; ; ;
; lam cslm woea; ; ; ;
; lal cslm woea; ; ; ; ptr5!c_dexpt5
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
; lalf dadd csla; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
| *start y * (t5+y)
; lblf dmul cslm woea; ; ; ; ptr5!c_dexps4
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
| *start s4 - y
; lalf dsub csla; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ;
; lal csla woem; ; ; ; ptr5!c_dexpt4
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
| *start t4 + y*(t5+y)
; lblf dadd csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
| *start y * (s4-y)
; lblf dmul cslm woea; ; ; ; ptr5!c_dexps3
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
; lal csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
| *start y * (t4+y*(t5+y))
; lblf dmul cslm woea; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
| *start s3 + y*(s4-y)
; lblf dadd csla woem; ; ; ;
; ; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ;
; lal csla woem; ; ; ; ptr5!c_dexpt3
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
| *start t3 + y*(...)
; lblf dadd csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
| *start y * (s3+(y*...))
; lblf dmul cslm woea; ; ; ; ptr5!c_dexps2
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
; lal csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
| *start y * (t3+...)
; lblf dmul cslm woea; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
| *start s2 + y*(...)
; lblf dadd csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ; ptr5!c_dexpt2
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
; lal csla csuxm umsw; reg; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
| *start t2 + y*(...)
; lblf dadd csla woem; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
| *start y * (s2+...)
; lblf dmul cslm woea; ; ; ; ptr5!c_dexps1
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
; lal csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
| *start y * (t2+...)
; lblf dmul cslm woea; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
| *start s1 + y*(...)
; lblf dadd csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ; ptr5!c_dexpt1
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
; lal csla csuxm umsw; reg; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
| *start t1 + y*(...)
; lblf dadd csla woem; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
| *start y * (s1+...)
; lblf dmul cslm woea; ; ; ;
; ; ; ; ;
; lbm csla csuxa umsw; ; ; ;
; lbl csla csuxa ulsw; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ptr1;
; lam csla woem; ; ; ;
| *start y * (s1 + ...)/(t1 + ...)
; lalf ddiv csla woem; ; ; ; lpreg!28
dexp.div:
jloop dexp.div; ; ; ; ;
; ; ; ; ; lpreg-
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
; lblf dmul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_8
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
; lbl csla; reg; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ;
; lalf dsub csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ptr5;
; woea; dtor; ; ramwe rcsmsw ptr5;
; woea; dtor; ; ramwe rcslsw ptr5;
rtn; ; dtor; ; ramwe ptr5;
|*
|* double precision twoton
|* enter with:
|* n in c_dSCRATCH_0 (single precision)
|* exit with:
|* ALU starting
|*
dtwoton:
; ; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5; ptr5!c_s1023
; las csla; reg; ; rcssp ptr5;
; lbsf sadd csla; reg; ; ;
; ; ; ; ;
; ; ; ; ; ptr5!c_stwop20
; ; ; ; rcssp ptr5;
; las cslm csuxa usp; reg; ; ;
; ; ; ; ;
; lbsf smul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
rtn; lasf scvtint csla woem; ; ; ;
|*
|* Single Precision ln(1+x) Instruction
|*
routine xs.ln1 w01000001010 lnop ssub
call stran.start;; ; ; ;
; ; ; ; ; ptr5!c_stwopm25
; ; ; ; rcssp ptr5;
call wait3; lbsf scmpm csla; reg; ; ;
; csuxa usp; ; ; ; lpreg!9
; csuxa usp; ; ; ; ptr5!c_ssqrthalfm1
|* if the operand was a NaN, then branch
jwerr soberr; woea; ; ; ;
|* if abs(operand) >= 2**-25 then branch
jge xsln1.e1; woea; ; ; ;
call sreturnx; ; ; ; rcssp ptr5;
|* abs(operand) >= 2**-25
xsln1.e1:
call wait3; lbsf scmp csla; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ; ptr5!c_ssqrt2m1
jle xsln1.e2 ;woea; ; ; ;
; ; ; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jgt xsln1.e2 ;woea; ; ; ;
call slogapprox;; ; ; ;
call salu.inx2; ; ; ; ;
|*
|* Double Precision ln(1+x) Instruction
|*
routine xd.ln1 w01000001011 lnop ssub
call dtran.start;; ; ; ;
; ; ; ; rcsmsw ptr1;
; lam cslma; reg; ; rcslsw ptr1; ptr5!c_dtwopm54
; lal cslma; reg; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
| *save ptr2 for later comparison
; lblf dcmp csla; reg; recclk; rcsmsw ptr2;
; ; ; recclk; rcslsw ptr2; ptr5!c_dSCRATCH_6
; ; ; ; ptr5;
; ; ; recoe; ramwe rcsmsw ptr5;
; csuxa umsw; ; recoe recclk;ramwe ptr5;
; ; ; recoe; ramwe rcslsw ptr5;
jle xdln1.e1; woea; ; recoe; ramwe ptr5;
; ; ; ; ; ptr5!c_dsqrt2m1
; ; ; ; rcsmsw ptr5;
| *x > 2**-54
; lbm csla; reg; ; rcslsw ptr5; ptr5!c_dsqrt8m1
call wait3; lblf dcmp csla; reg; ; ;
call wait1; csuxa umsw; ; ; ;
jlt xdln1.br2; woea; ; ; ;
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmp csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ; ptr5!sone
jlt xdln1.br31; woea; ; ; ;
jwerr doberr; woea; ; ; ;
xdln1.br4:
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
call wait3; lf dadd csla; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ptr1;
; woea; dtor; ; ramwe rcsmsw ptr1;
; woea; dtor; ; ramwe rcslsw ptr1;
call dlog.entry;; dtor; ; ramwe ptr1;
xdln1.br2:
call dlogapprox;; ; ; ;
call wait2; ; ; ; ;
; ; ; ; rcsmsw ptr1;
; lam csla; reg; ; rcslsw ptr1;
; lal csla csuxm umsw; reg; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
call drtn.inx.soon;lblf dadd csla woem; ; ; ;
xdln1.e1:
; ; ; ; ; ptr5!c_dmtwopm54
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5; ptr5!c_dsqrthalfm1
call wait3; lblf dcmp csla; reg; ; ;
call wait1; csuxa umsw; ; ; ;
jge xdln1.br1; woea; ; ; ;
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5; ptr5!c_dsqrteighthm1
call wait3; lblf dcmp csla; reg; ; ;
call wait1; csuxa umsw; ; ; ;
jge xdln1.br2; woea; ; ; ;
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmp csla; reg; ; ;
call wait1; csuxa umsw; ; ; ;
jle xdln1.br4; woea; ; ; ;
; ; ; ; ; ptr5!sone
xdln1.br32:
; ; ; ; ; ptr5!stwo
; ; ; ; rcssp ptr5; ptr5!sone
call wait4; lbsf dmul cslm; reg; ; ;
; ; ; ; rcssp ptr5;
; las csla csuxm umsw; reg; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
call wait3; lblf dadd csla woem; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ptr1;
; woea; dtor; ; ramwe rcsmsw ptr1;
; woea; dtor; ; ramwe rcslsw ptr1;
call dlogapprox;; dtor; ; ramwe ptr1;
call wait1; ; ; ; ;
; ; ; ; ; ptr5!c_dloge2b
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
; lbl csla csuxm umsw; reg; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ; ptr5!stwo
; lalf dsub csla woem; ; ; ;
; ; ; ; rcssp ptr5; ptr5!c_dSCRATCH_6
; las cslm; reg; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5;
; lblf dmul cslm; reg; ; ;
; lbm csla csuxa umsw; ; ; ; ptr5!c_dloge2afrom1
; lbl csla csuxa ulsw; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
call wait3; lalf dadd csla; reg; ; ;
; lbm csla csuxma umsw; ; ; ;
; lbl csla csuxma ulsw; ; ; ;
; lam csla woem; ; ; ;
call drtn.inx.soon;lalf dadd csla woem; ; ; ;
xdln1.br1:
call wait3; lf dcmp0 csla; ; ; ;
call wait1; csuxa umsw; ; ; ;
jeq dreturnzerostat;woea; ; ; ;
call dreturninexact;; ; ; ;
xdln1.br31:
; ; ; ; ; ptr5!shalf
; ; ; ; rcssp ptr5; ptr5!smhalf
call wait4; lbsf dmul cslm; reg; ; ;
; ; ; ; rcssp ptr5;
; lbs csla csuxm umsw; reg; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ;
call wait3; lalf dadd csla woem; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ptr1;
; woea; dtor; ; ramwe rcsmsw ptr1;
; woea; dtor; ; ramwe rcslsw ptr1;
call dlogapprox;; dtor; ; ramwe ptr1;
call wait1; ; ; ; ;
; ; ; ; ; ptr5!c_dloge2b
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
; lbl csla csuxm umsw; reg; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ; ptr5!shalf
; lalf dadd csla woem; ; ; ;
; ; ; ; rcssp ptr5; ptr5!c_dSCRATCH_6
; las cslm; reg; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5;
; lblf dmul cslm; reg; ; ;
; lbm csla csuxa umsw; ; ; ; ptr5!c_dloge2amhalf
; lbl csla csuxa ulsw; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
call wait3; lalf dadd csla; reg; ; ;
; lbm csla csuxma umsw; ; ; ;
; lbl csla csuxma ulsw; ; ; ;
; lam csla woem; ; ; ;
call drtn.inx.soon;lalf dadd csla woem; ; ; ;
|*
|* Single Precision e**x Instruction
|*
routine xs.ex w01000001100 lnop ssub
call stran.start;; ; ; ;
; ; ; ; ; ptr5!c_s87
; ; ; ; rcssp ptr5;
call wait3; lbsf scmpm csla; reg; ; ;
; csuxa usp; ; ; ; lpreg!9
; csuxa usp; ; ; ; ptr5!c_stwopm13
|* if the operand was a NaN, then branch
jwerr soberr; woea; ; ; ;
|* if abs(operand) > 87 then branch
jgt xsx.t1; woea; ; ; ;
|* abs(operand) <= 87
; ; ; ; rcssp ptr5;
call wait3; lbsf scmpm csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jgt xsx.e1; woea; ; ; ;
; ; ; ; ; ptr5!c_dmode
|* abs(operand) < 2**-13 : return 1 + x
call wait3; lf scmp0 csla; ; ; ;
; csuxa usp; ; ; ;
; ; ; ; ; ptr5!sone
jeq sreturnx1; woea; ; ; ;
; ; ; ; rcssp ptr5;
call salu.inx1; lbsf sadd csla; reg; ; ;
xsx.t1:
| * abs(x) > 87
| if x < -87 and if mode == fast then return zero; else punt
call wait3; lf scmp0 csla; ; ; ;
; csuxa usp; ; ; ; ptr5!c_dmode
; ; ; ; ;
jgt soberr; woea; ; ; ;
; ; ; ; rcssp ptr5; ptr5!c_dmode_fast
; las csla; reg; ; rcssp ptr5; ptr5!szero
call wait3; lbsf scmp csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jne soberr; woea; ; ; ;
; ; ; recclk; rcssp ptr5;
; ; ; recclk; ptr1;
; ; ; recoe; ramwe rcssp ptr1;
call sreturnexact;; ; recoe; ramwe ptr1;
xsx.e1:
| * 2**-13 < abs(x) < 87
| if the mode register is not set up with the correct data
| then punt
; ; ; ; rcssp ptr5; ptr5!c_dmode_cor
; las csla; reg; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jne soberr; woea; ; ; ;
| proceed with expansion
call sexpn; ; ; ; ;
call sexps; ; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5;
call wait3; lasf scmp0 csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jne xsx.e2; woea; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_1
|* n == 0, return real(e) + 1
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
; lalf dcvts csla; reg; ; ; ptr5!sone
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
; ; ; ; ;
; lasf sadd csla csuxa usp;; ; ;
salu.inx1:
; ; ; ; ;
salu.inx2:
call wait1; ; ; ; ;
salu.inx4:
; csuxa usp; ; ; ;
; ; ; ; ptr1;
; woea; dtor; ; ramwe rcssp ptr1;
call sreturninexact;; dtor; ; ramwe ptr1;
xsx.e2:
call stwoton; ; ; ; ;
|stwoton leaves ptr5 at c_dSCRATCH_1 (e)
call wait2; ; ; ; ;
call wait1; csuxa ulsw; ; ; ;
; las cslm woea; ; ; ; ptr5!c_dSCRATCH_1
; ; ; ; rcsmsw ptr5; ptr5!sone
; lam csla; reg; ; rcssp ptr5; ptr5!c_dSCRATCH_1
; lbs csla; reg; ; rcslsw ptr5;
call wait3; lalf dadd csla; reg; ; ;
; lam csla csuxa umsw; ; ; ;
call wait3; lalf dcvts csla csuxa ulsw;; ; ;
call wait1; csuxa usp; ; ; ;
call wait3; lbsf smul cslm woea; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ptr1;
; woem; dtor; ; ramwe rcssp ptr1;
call sreturninexact;; dtor; ; ramwe ptr1;
|* call slog with x + 1
xsln1.e2:
; ; ; ; ; ptr5!sone
; ; ; ; rcssp ptr5;
call wait3; lbsf sadd csla; reg; ; ;
call wait1; las csla csuxa usp; ; ; ;
; woea; dtor; recclk; ;
call slog.entry;; dtor; recclk; ;
|*
|* Double Precision e**x Instruction
|*
routine xd.ex w01000001101 lnop ssub
call dtran.start;; ; ; ;
|* calculate e**x of ptr1
; ; ; ; rcsmsw ptr1;
; lam csla; reg; ; rcslsw ptr1;
; lal csla; reg; ; ;
; ; ; ; ; ptr5!c_d708
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmpm csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ; ptr5!c_dtwopm27
|* if the operand was a NaN, branch
jwerr doberr; woea; ; ; ;
|* if abs(operand) > 708 then branch
jgt xdx.t1; woea; ; ; ;
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmpm csla; reg; ; ;
call wait1; csuxa umsw; ; ; ;
jle dreturnxp1; woea; ; ; ;
call dexpapprox;; ; ; ;
| *put 1 + (y + yc) intot ptr1
; ; ; ; ; ptr5!c_dSCRATCH_8
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5; ptr5!c_dSCRATCH_7
; lal csla; reg; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5; ptr5!sone
call wait3; lblf dadd csla; reg; ; ;
; lam csla csuxa umsw; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
call wait3; lalf dadd csla csuxa ulsw;; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ptr1;
; woea; dtor; ; ramwe rcsmsw ptr1;
; woea; dtor; ; ramwe rcslsw ptr1;
; ; dtor; ; ramwe ptr1; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5;
call wait3; lasf scmp0 csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jeq dreturninexact;woea; ; ; ;
call dtwoton; ; ; ; ;
; ; ; ; rcsmsw ptr1;
; lam cslm; reg; ; rcslsw ptr1; ptr5!dzero
; lal cslm; reg; ; rcslsw ptr5;
; lbl cslm csuxa ulsw; reg; ; ;
; ; ; ; ;
call dwrite1m; lbmf dmul cslm woea; ; ; ;
; ; ; ; ;
xdx.t1:
| * abs(x) > 708
| if x <= -708 and if mode == fast then return zero; else punt
call wait3; lf dcmp0 csla; ; ; ;
; csuxa umsw; ; ; ; ptr5!c_dmode
; ; ; ; ;
jgt doberr; woea; ; ; ;
; ; ; ; rcssp ptr5; ptr5!c_dmode_fast
; las csla; reg; ; rcssp ptr5; ptr5!dzero
call wait3; lbsf scmp csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jne doberr; woea; ; ; ;
; ; ; recclk; rcsmsw ptr5;
; ; ; recclk; rcslsw ptr5;
; ; ; ; ptr1;
; ; ; recoe; ramwe rcsmsw ptr1;
; ; ; recoe recclk;ramwe ptr1;
; ; ; recoe; ramwe rcslsw ptr1;
call dreturnzerostat;; ; recoe; ramwe ptr1;
dreturnxp1:
; ; ; ; ; ptr5!sone
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
call wait3; lf dadd csla; ; ; ;
; csuxa umsw; ; ; ;
; lf dcmp0 csla csuxa ulsw;; ; ptr1;
; woea; dtor; ; ramwe rcsmsw ptr1;
; woea; dtor; ; ramwe rcslsw ptr1;
; ; dtor; ; ramwe ptr1;
; csuxa ulsw; ; ; ;
; ; ; ; ;
jne dreturninexact;woea; ; ; ;
call dreturnexact;; ; ; ;
|*
|* Single Precision ln(x) Instruction
|*
routine xd.ln w01000001110 lnop ssub
call stran.start;; ; ; ;
slog.entry:
; ; ; ; ; ptr5!ssqrthalf
; ; ; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
; csuxa usp; ; ; ;
; csuxa usp; ; ; ; ptr5!ssqrt2
|* if the operand was a NaN, then branch
jwerr soberr; woea; ; ; ;
|* if abs(operand) < sqrt(1/2) then branch
jle xsln.e1; woea; ; ; ;
; ; ; ; rcssp ptr5; ptr5!sone
call wait3; lbsf scmp csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jgt xsln.e1; woea; ; ; ;
; ; ; ; rcssp ptr5;
call wait3; lbsf ssub csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
; woea; dtor; recclk; ;
call slogapprox;; dtor; recclk; ;
call wait2; ; ; ; ;
; csuxa usp; ; ; ;
; ; ; ; ptr1;
; woea; dtor; ; ramwe rcssp ptr1;
call idle1; ; dtor; ; ramwe ptr1;
xsln.e1:
; ; ; ; ; ptr5!sminnorm
; ; ; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
; csuxa usp; ; ; ;
; csuxa usp; ; ; ; ptr5!c_smaxln
jwerr soberr; woea; ; ; ;
jlt soberr; woea; ; ; ;
; ; ; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
jgt soberr; woea; ; ; ;
call sgetmexp; ; ; ; ;
call stwoton; ; ; ; ;
; ; ; ; ;
; ; ; recoe; ;
; las cslm; reg; recoe; ;
call wait1; csuxa ulsw; ; ; ;
| *start x * twoton(-n)
; lbsf smul cslm woea; ; ; ;
; ; ; ; ; ptr5!ssqrt2
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
; las cslm csuxm usp; ; ; ; ptr5!c_dSCRATCH_10
; ; ; ; ptr5;
; lasf scmp csla woem; dtor; ; ramwe rcssp ptr5;
; ; dtor; ; ramwe ptr5;
; ; ; ; ; ptr5!shalf
; ; ; ; rcssp ptr5;
; lbsf smul cslm csuxa usp;reg; ; ;
; ; ; ; ;
jle xsln.e2; woea; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ; ptr5!c_dSCRATCH_10
; ; ; ; ptr5;
; woem; dtor; ; ramwe rcssp ptr5;
; ; dtor; ; ramwe ptr5; ptr5!sone
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5;
| *start m = m - 1 (m is -n)
call wait3; lasf ssub csla; reg; ; ;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; ptr5;
; woea; dtor; ; ramwe rcssp ptr5;
; ; dtor; ; ramwe ptr5;
xsln.e2:
; ; ; ; ; ptr5!c_dSCRATCH_10
; ; ; ; rcssp ptr5;
; las csla; reg; ; ; ptr5!sone
; ; ; ; rcssp ptr5;
call wait3; lbsf ssub csla; reg; ; ;
call wait1; csuxa usp; ; ; ;
; woea; dtor; recclk; ;
; ; dtor; ; ;
; ; ; recclk; ;
call slogapprox;; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5;
; las cslm; reg; ; ; ptr5!c_sloge2b
; las csla csuxa usp; ; ; rcssp ptr5;
call wait3; lbsf smn cslm; reg; ; ;
call wait1; csuxm usp; ; ; ;
| *start (-(-n) * loge2b) + logapprox(p-1)
; lbsf sadd csla woem; ; ; ; ptr5!c_sloge2a
; ; ; ; rcssp ptr5;
| *start -(-n) * loge2a
call wait1; lbsf smn cslm; reg; ; ;
call wait1; las csla csuxa usp; ; ; ;
call wait1; csuxm usp; ; ; ;
| *start (n*loge2a) + (n*loge2b + logapprox(p-1))
call salu.inx1; lbsf sadd csla woem; ; ; ;
|*
|* subroutine get minus exponent
|* Enter with:
|* x in recovery register
|*
|* Exit with:
|* result in c_dSCRATCH_0
|* (Note that the result is the negative of the exponent!)
|*
sgetmexp:
; ; ; recoe; ;
; lalf sfloat csla; reg; recoe; ;
; ; ; ; ; ptr5!c_stwopm23
; ; ; ; rcssp ptr5;
; las cslm; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
; lbsf smul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lasf scvtint csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lalf sfloat csla csuxa ulsw;; ; ;
; ; ; ; ;
; ; ; ; ; ptr5!c_s127
; ; ; ; rcssp ptr5;
; las csla; reg; ; ;
; lbsf ssub csla csuxa usp;; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; ptr5;
; woea; dtor; ; ramwe rcssp ptr5;
rtn; ; dtor; ; ramwe ptr5;
|*
|* subroutine logapprox
|* Enter with:
|* x in recovery register
|*
|* Exit with:
|* result being calculated in ALU
|*
slogapprox:
; ; ; recoe; ; ptr5!stwo
; las csla; reg; recoe; ;
; ; ; ; rcssp ptr5;
; lbsf sadd csla; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lbsf sdiv csla csuxa usp;; ; ; lpreg!13
slogap.e1:
jloop slogap.e1;; ; ; ;
; ; ; ; ; lpreg-
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_9
; csuxa usp; ; ; ptr5;
| *save this in temp9 for later use
; las cslm woea; dtor; ; ramwe rcssp ptr5;
; lbsf smul cslm woea; dtor; ; ramwe ptr5;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ; ptr5!c_slogs3
; las cslm csuxm usp; ; ; rcssp ptr5;
| *start z2 * s(3)
; lbsf smul cslm; reg; ; ;
; ; ; ; ; ptr5!c_slogs2
; ; ; ; rcssp ptr5;
; las csla; reg; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
| *start s(2) + (z2 * s(3))
; lbsf sadd csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
| *start z2 * (s2+z2*s3)
; lbsf smul cslm woea; ; ; ;
; ; ; ; ; ptr5!c_slogs1
; ; ; ; rcssp ptr5;
; las csla; reg; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lbsf sadd csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
| *start z2 * (s1+z2*(s2+z2*s3))
; lbsf smul cslm woea; ; ; ;
; ; ; ; ;
; ; ; recoe; ;
; las csla; reg; recoe; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lbsf ssub csla woem; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_9
; ; ; ; rcssp ptr5;
; las cslm; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
| *start z * (x-z2 ...
; lbsf smul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
| *we clock status here for ln (this will generate exact for
| *ln(1) and inexact for most other cases (all other cases
| *should be inexact))
rtn jwerr werr cstat;lbsf ssub csla woem;; ; ;
|*
|* Double Precision ln(x) Instruction
|*
routine xd.ln w01000001111 lnop ssub
call dtran.start;; ; ; ;
dlog.entry:
; ; ; ; rcsmsw ptr1; ptr5!dsqrthalf
; lam csla; reg; ; rcslsw ptr1;
; lal csla; reg; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmp csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ; ptr5!dsqrt2
|* if the operand is a NaN, then branch
jwerr doberr; woea; ; ; ;
|* if x < sqrt(1/2) then branch
jle xdln.e1; woea; ; ; ;
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmp csla; reg; ; ;
; csuxa umsw; ; ; ;
; ; ; ; ; ptr5!sone
jgt xdln.e1; woea; ; ; ;
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
call wait3; lf dsub csla; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ptr1;
jne xdln.inx; woea; dtor; ; ramwe rcsmsw ptr1;
; woea; dtor; ; ramwe rcslsw ptr1;
; ; dtor; ; ramwe ptr1;
call dlogapprox;; ; ; ;
; ; ; ; ; ptr5!c_szerostat
; ; ; recclk; rcssp ptr5;
xdln.inxrtn:
; ; ; ; ;
jwerr drestor.r1 cstat restore;; ; ; rcsmsw ptr1;
; lam csla; reg; ; rcslsw ptr1;
; lal csla csuxm umsw; reg; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
call wait3; lblf dadd csla woem; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ptr1;
; woea; dtor; ; ramwe rcsmsw ptr1;
; woea; dtor; ; ramwe rcslsw ptr1;
call idle1; ; dtor; ; ramwe ptr1;
xdln.inx:
|* generate inexact status
; ; dtor; ; ramwe ptr1;
call dlogapprox;; ; ; ;
; ; ; ; ; ptr5!c_sinexact
call xdln.inxrtn;; ; recclk; rcssp ptr5;
xdln.e1:
; ; ; ; ; ptr5!dminnorm
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmp csla; reg; ; ;
; csuxa umsw; ; ; ; ptr5!c_dmaxln
; ; ; ; ;
jlt doberr; woea; ; ; ;
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmp csla; reg; ; ;
call wait1; csuxa umsw; ; ; ;
jgt doberr; woea; ; ; ;
call dgetmexp; ; ; ; ;
call dtwoton; ; ; ; ;
; ; ; ; rcsmsw ptr1;
; lam cslm; reg; ; rcslsw ptr1; ptr5!dzero
; lal cslm; reg; ; rcslsw ptr5;
; lbl cslm csuxa ulsw; reg; ; ;
; ; ; ; ;
| *start x * twoton(-n)
; lbmf dmul cslm woea; ; ; ; ptr5!dsqrt2
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
; lbl csla; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; lam cslm csuxm umsw; ; ; ; ptr5!c_dSCRATCH_10
; lal cslm csuxm ulsw; ; ; ptr5;
| *save p in c_dSCRATCH_10
; lam csla woem; dtor; ; ramwe rcsmsw ptr5;
; lalf dcmp csla woem; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5; ptr5!shalf
; ; ; ; ;
; ; ; ; rcssp ptr5;
; lbsf dmul cslm csuxa umsw;reg; ; ; ptr5!c_dSCRATCH_10
; ; ; ; ;
jle xdln.e2; woea; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_10
; ; ; ; ;
; ; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ptr5;
; woem; dtor; ; ramwe rcsmsw ptr5;
; woem; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5; ptr5!sone
; ; ; ; rcssp ptr5; ptr5!c_dSCRATCH_0
; lbs csla; reg; ; rcssp ptr5;
| *start m = m - 1 (m is -n)
call wait3; lasf ssub csla; reg; ; ;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; ptr5;
; woea; dtor; ; ramwe rcssp ptr5;
; ; dtor; ; ramwe ptr5; ptr5!c_dSCRATCH_10
xdln.e2:
; ; ; ; rcsmsw ptr5; ptr5!sone
; lam csla; reg; ; rcssp ptr5; ptr5!c_dSCRATCH_10
; lbs csla; reg; ; rcslsw ptr5;
call wait3; lalf dsub csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ptr1;
; woea; dtor; ; ramwe rcsmsw ptr1;
; woea; dtor; ; ramwe rcslsw ptr1;
call dlogapprox;; dtor; ; ramwe ptr1;
call wait2; ; ; ; ;
; ; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; rcssp ptr5; ptr5!c_dloge2b
; las cslm; reg; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5;
| *start dble(n) * dloge2b
; lblf dmn cslm; reg; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ;
call wait1; lal csla woem; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
| *start (n*loge2b + logapprox(p))
; lblf dadd csla woem; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; ;
; ; ; ; rcsmsw ptr5;
; las cslm; reg; ; ;
; lbm csla csuxa umsw; ; ; ;
; lbl csla csuxa ulsw; ; ; rcsmsw ptr1;
; lam csla; reg; ; rcslsw ptr1; ptr5!c_dloge2a
; lalf dadd csla; reg; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5;
| *start dble(n) * dloge2a
; lblf dmn cslm; reg; ; ;
; ; ; ; ;
; lbm csla csuxa umsw; ; ; ;
call wait2; lbl csla csuxa ulsw; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ;
| *start (n*loge2a) + (n*loge2b + logapprox(p))
call drtn.inx.soon;lalf dadd csla woem; ; ; ;
|*
|* subroutine get minus exponent
|* Enter with:
|* x at ptr1
|*
|* Exit with:
|* result in c_dSCRATCH_0 (single precision)
|* (Note that the result is the negative of the exponent!)
|*
dgetmexp:
; ; ; ; rcsmsw ptr1;
; lalf sfloat csla; reg; ; ; ptr5!c_stwopm20
; ; ; ; ;
; ; ; ; rcssp ptr5;
; las cslm; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
; lbsf smul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lasf scvtint csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lalf sfloat csla csuxa ulsw;; ; ; ptr5!c_s1023
; ; ; ; ;
; ; ; ; ;
; ; ; ; rcssp ptr5;
; las csla; reg; ; ;
; lbsf ssub csla csuxa usp;; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; ptr5;
; woea; dtor; ; ramwe rcssp ptr5;
rtn; ; dtor; ; ramwe ptr5;
|*
|* subroutine logapprox
|* Enter with:
|* x ptr1
|*
|* Exit with:
|* result being calculated in MUL
|*
dlogapprox:
; ; ; ; rcsmsw ptr1; ptr5!stwo
; lam csla; reg; ; rcssp ptr5;
; lbs csla; reg; ; rcslsw ptr1;
; lalf dadd csla; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lbm csla csuxa umsw; ; ; ;
; lblf ddiv csla csuxa ulsw;; ; ; lpreg!28
dlogap.e1:
jloop dlogap.e1;; ; ; ;
; ; ; ; ; lpreg-
; csuxa umsw; ; ; ; ptr5!c_dSCRATCH_9
; csuxa ulsw; ; ; ptr5;
| *save z in temp9 for later use
; lam cslm csuxa umsw woea;dtor; ; ramwe rcsmsw ptr5;
; lal cslm csuxa ulsw woea;dtor; ; ramwe rcslsw ptr5;
; lbm cslm woea; dtor; ; ramwe ptr5;
; lblf dmul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lam cslm csuxm umsw; ; ; ; ptr5!c_dlogs7
; lal cslm csuxm ulsw; ; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5;
; lblf dmul cslm; reg; ; ; lpreg!6
dlogapp.lp:
; ; ; ; ;
; ; ; ; ; ptr5-
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
; lal csla; reg; ; ; lpreg-
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
; lblf dadd csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
jloop dlogapp.lp;lbm cslm woea; ; ; ;
; lblf dmul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; rcsmsw ptr1;
; lbm csla; reg; ; rcslsw ptr1;
; lbl csla; reg; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lam csla woem; ; ; ; ptr5!c_dSCRATCH_9
; lalf dsub csla woem; ; ; ;
; ; ; ; rcsmsw ptr5;
; lam cslm; reg; ; rcslsw ptr5;
; lal cslm; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
rtn; lblf dmul cslm woea;; ; ;
|* for sincos we must also restore reg4
restor.r41:
; ; ; ; ; ptr5!c_dSCRATCH_11
; ; ; recclk; rcssp ptr5;
; ; ; recclk; ptr4;
; ; ; recoe; ramwe rcssp ptr4;
; ; ; recoe; ramwe ptr4;
|* after writing into reg 1, we want to restore it
restor.r1:
; ; ; ; ; ptr5!c_dSCRATCH_4
; ; ; recclk; rcssp ptr5;
; ; ; recclk; ptr1;
; ; ; recoe; ramwe rcssp ptr1;
call hang; ; ; recoe; ramwe ptr1;
|* this is used for sincos
drestor.r41:
; ; ; ; ; ptr5!c_dSCRATCH_11
; ; ; recclk; rcsmsw ptr5;
; ; ; recclk; rcslsw ptr5;
; ; ; ; ptr4;
; ; ; recoe; ramwe rcsmsw ptr4;
; ; ; recoe recclk;ramwe ptr4;
; ; ; recoe; ramwe rcslsw ptr4;
; ; ; recoe; ramwe ptr4;
drestor.r1:
; ; ; ; ; ptr5!c_dSCRATCH_4
; ; ; recclk; rcsmsw ptr5;
; ; ; recclk; rcslsw ptr5;
; ; ; ; ptr1;
; ; ; recoe; ramwe rcsmsw ptr1;
; ; ; recoe recclk;ramwe ptr1;
; ; ; recoe; ramwe rcslsw ptr1;
call hang; ; ; recoe; ramwe ptr1;
#ifdef SQRT
|*
|* Single Precision Sqrt
|*
routine xs.sqrt w01000010000 lnop ssub
call stran.start;; ; ; ;
; ; ; ; ; ptr5!shalf
; ; ; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ; ptr5!stwo
jlt ssqrt.e1; woea; ; ; ;
; ; ; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ; ptr5!stwo
jgt ssqrt.e1; woea; ; ; ;
call ckmode; ; ; ; ;
|* .5 < x < 2
|* make sure rounding mode is the default (2)
|* copy ptr2 to ptr1
; ; ; recclk; rcssp ptr2;
; ; ; recclk; ptr1;
; ; ; recoe; ramwe rcssp ptr1;
; ; ; recoe; ramwe ptr1;
|* now begin sqrt calculation with x in ptr1
; ; ; ; ;
call ssqrtapprox;; ; ; ;
call wait2; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ptr1;
; woem; dtor; ; ramwe rcssp ptr1;
call idle1; ; dtor; ; ramwe ptr1;
ssqrt.e1:
call wait3; lf scmp0 csla; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
jeq sreturnx0; woea; ; ; ;
; ; ; ; ptr1;
; ; ; ; ; ptr5!sminnorm
; ; ; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
; csuxa usp; ; ; ;
; csuxa usp; ; ; ;
jwerr soberr; woea; ; ; ;
jlt soberr; woea; ; ; ;
; ; ; ; ; ptr5!smaxnorm
; ; ; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
jgt soberr; woea; ; ; ;
|* make sure rounding mode is the default (2)
; ; ; ; ; ptr5!c_dmode
; ; ; ; rcssp ptr5;
; las csla; reg; ; ; ptr5!c_dmode_cor
; ; ; ; rcssp ptr5;
call wait3; lbsf scmp csla; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
jne soberr; woea; ; ; ;
; ; ; ; ;
call sgethalfexp;; ; ; ;
| *get result and save it in c_dSCRATCH_15 while negating it
; ; ; recclk; rcssp ptr5; ptr5!c_dSCRATCH_15
; lasf sneg csla; reg; recclk; ptr5;
; ; ; recoe; ramwe rcssp ptr5;
; ; ; recoe; ramwe rcssp ptr5;
; ; ; ; ;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; ptr5;
; woea; dtor; ; ramwe rcssp ptr5;
call stwoton; ; dtor; ; ramwe ptr5;
call wait2; ; ; ; ;
; csuxa ulsw; ; ; ;
; csuxa ulsw; ; ; ;
; las cslm woea; ; ; ;
call wait3; lbsf smul cslm woea; ; ; ;
; las cslm csuxm usp; ; ; rcssp ptr2;
call wait3; lbsf smul cslm; reg; ; ;
; csuxm usp; ; ; ;
; ; ; ; ptr1;
; woem; dtor; ; ramwe rcssp ptr1;
call ssqrtapprox;; dtor; ; ramwe ptr1;
call wait2; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ptr1;
; woem; dtor; ; ramwe rcssp ptr1;
; ; dtor; ; ramwe ptr1; ptr5!c_dSCRATCH_15
; ; ; recclk; rcssp ptr5; ptr5!c_dSCRATCH_0
; ; ; recclk; ptr5;
; ; ; recoe; ramwe rcssp ptr5;
call stwoton; ; ; recoe; ramwe ptr5;
call wait1; ; ; ; ;
; ; ; ; rcssp ptr1;
; las cslm csuxa ulsw; reg; ; ;
; ; ; ; ;
call wait3; lbsf smul cslm woea; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ptr1;
; woem; dtor; ; ramwe rcssp ptr1;
call idle1; ; dtor; ; ramwe ptr1;
sgethalfexp:
; ; ; recoe; ;
; lalf sfloat csla; reg; recoe; ;
; ; ; ; ;
; ; ; ; ; ptr5!c_stwopm24
; ; ; ; rcssp ptr5;
; las cslm csuxa usp; reg; ; ;
; ; ; ; ;
; lbsf smul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lasf scvtint csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lalf sfloat csla csuxa ulsw;; ; ;
; ; ; ; ; ptr5!c_s63
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
; lasf ssub csla csuxa usp;; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; ptr5;
; woea; dtor; ; ramwe rcssp ptr5;
rtn; ; dtor; ; ramwe ptr5;
|*
|* Single Square Root Approximation
|*
|* enter with:
|* x in ptr1
|* exit with:
|* MUL starting last calculation
|*
|*
ssqrtapprox:
; ; ; ; ; ptr5!shalf
; ; ; ; rcssp ptr5;
| *Note that we load both the MUL and the ALU
; las cslma; reg; ; ;
; ; ; ; rcssp ptr1;
; lbsf smul cslm; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lbsf scmp csla woem; dtor; recclk; ;
; ; dtor; recclk; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ;
; ; ; ; ; lpreg!0
jge ssqrta.l1; woea; ; ; ;
; ; ; ; ; ptr5!c_ssqrtr3
jmp soverlap.expansion;; ; ; ;
; ; ; ; ;
ssqrta.l1:
; ; ; ; ; ptr5!c_ssqrts3
jmp soverlap.expansion;; ; ; ;
ssqrta.c1:
; ; ; ; ;
; ; ; ; ;
; las cslm csuxm usp; ; recoe; ;
; lbsf smul cslm; reg; recoe; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lbsf smul cslm csuxm usp;; ; ;
; ; ; ; ;
; ; ; ; ; ptr5!c_s3o2
; ; ; ; rcssp ptr5;
; las csla csuxm usp; reg; ; ;
; ; ; ; ;
; lbsf ssub csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
; lbsf smul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; las cslm csuxm usp; ; ; rcssp ptr1;
; lbsf smul cslm; reg; ; ;
; ; ; ; ;
| *round to +infinity for divide
; lmode3.0 0xa csla; ; ; ;
; ; ; ; rcssp ptr1;
; las csla csuxm usp; reg; ; ;
; ; ; ; ;
; lbsf sdiv csla woem; ; ; ; lpreg!13
sqrtlp:
jloop sqrtlp; ; ; ; ;
; ; ; ; ; lpreg-
| *round to zero for add
; lmode3.0 0x6 csla; ; ; ;
; lasf scmp csla csuxa usp;; ; ;
; ; ; ; ;
| *if divide is inexact, then sqrt is inexact
jwerr restor.r1 cstat;woea; ; ; ;
; ; ; ; ;
; lf sadd csla csuxa usp; ; ; ;
; ; ; ; ; ptr5!shalf
jne ssqrtap.e1; woea; ; ; ;
; ; ; ; rcssp ptr5;
; las cslm csuxa usp; reg; ; ;
| *restore original rounding mode
; lmode3.0 0x2 csla; ; ; ;
rtn; lbsf smul cslm woea; ; ; ;
|* y != t so we must punt iff inexact mask is set
ssqrtap.e1:
; ; ; ; ; ptr5!c_sinexact
; ; ; recclk; rcssp ptr5;
; ; ; ; ; ptr5!shalf
jwerr restor.r1 cstat restore;; ; ; ;
; ; ; ; rcssp ptr5;
; las cslm csuxa usp; reg; ; ;
| *restore original rounding mode
; lmode3.0 0x2 csla; ; ; ;
rtn; lbsf smul cslm woea; ; ; ;
|*
|* Single Precision Overlapped Expansion
|*
|* enter with:
|* ptr5 points to s3 (s5, s2, s4, s1)
|* x (xreal) is in recovery register
|* lpreg contains: 0 for s.p.; 1 for d.p.
|*
|* exit with:
|* last multiplication beginning
|*
soverlap.expansion:
; ; ; recoe; ;
| *Note that we load MUL and ALU both
; las cslma; reg; recoe; ;
; ; ; ; rcssp ptr5; ptr5-
| *start xreal * r3
; lbsf smul cslm; reg; ; rcssp ptr5; ptr5-
| *start xreal + r5
; lbsf sadd csla; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; las csla woem; ; ; ;
; ; ; ; rcssp ptr5; ptr5-
| *start r2 + (xreal * r3)
; lbsf sadd csla; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
| *start xreal * (xreal + r5)
; lbsf smul cslm woea; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
| *start xreal * (r2+(xreal*r3))
; lbsf smul cslm woea; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; las csla woem; ; ; ;
; ; ; ; rcssp ptr5; ptr5-
| *start r4 + (xreal*(xreal+r5))
; lbsf sadd csla; reg; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; las csla woem; ; ; ;
; ; ; ; rcssp ptr5; ptr5-
| *start r1 + (xreal*(r2+xreal*r3))
; lbsf sadd csla; reg; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
; lbs cslm woea; ; ; ;
; csuxa usp; ; ; ;
; ; ; ; ;
this is an illegal loading sequence!
jloop0 ssqrta.c1;lasf smul cslm woea; ; ; ;
jloop dsqrta.c1;; ; ; ;
; ; ; ; ;
|*
|* Double Precision Sqrt
|*
routine xd.sqrt w01000010001 lnop ssub
; lam csla; reg; ; rcslsw ptr2; ptr5!shalf
; lal csla; reg; ; rcssp ptr5;
; lbs csla; reg; ; ;
call wait3; lf dcmp csla; ; ; ;
; csuxa umsw; ; ; ;
; ; ; ; ; ptr5!stwo
jlt dsqrt.e1; woea; ; ; ;
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
call wait3; lf dcmp csla; ; ; ;
call wait1; csuxa umsw; ; ; ;
jge dsqrt.e1; woea; ; ; ;
; ; ; ; ;
|* .5 < x < 2
call dtran.start;; ; ; ;
call dsqrtapprox;; ; ; ;
call wait4; ; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ptr1;
; woem; dtor; ; ramwe rcsmsw ptr1;
; woem; dtor; ; ramwe rcslsw ptr1;
call idle1; ; dtor; ; ramwe ptr1;
dsqrt.e1:
call wait3; lf dcmp0 csla; ; ; ;
; csuxa umsw; ; ; ;
; ; ; ; ;
jne dsqrt.e2; woea; ; ; ;
| *x = 0
; ; ; recclk; rcsmsw ptr2;
; ; ; recclk; rcslsw ptr2;
; ; ; ; ptr1;
; ; ; recoe; ramwe rcsmsw ptr1;
; ; ; recoe recclk;ramwe ptr1;
; ; ; recoe; ramwe rcslsw ptr1;
call dreturnzerostat;; ; recoe; ramwe ptr1;
dsqrt.e2:
; ; ; ; ; ptr5!dminnorm
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmp csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa umsw; ; ; ; ptr5!dmaxnorm
jlt doberr; woea; ; ; ;
jwerr doberr; woea; ; ; ;
; ; ; ; rcsmsw ptr5;
; lbm csla; reg; ; rcslsw ptr5;
call wait3; lblf dcmp csla; reg; ; ;
; csuxa umsw; ; ; ;
; csuxa umsw; ; ; ;
jgt doberr; woea; ; ; ;
call dtran.start;; ; ; ;
call dgethalfexp;; ; ; ;
| *get result and save it in c_dSCRATCH_15 while negating it
; ; ; recclk; rcssp ptr5; ptr5!c_dSCRATCH_15
; lasf sneg csla; reg; recclk; ptr5;
; ; ; recoe; ramwe rcssp ptr5;
call wait1; ; ; recoe; ramwe ptr5;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; ptr5;
; woea; dtor; ; ramwe rcssp ptr5;
call dtwoton; ; dtor; ; ramwe ptr5;
; ; ; ; ; ptr5!dzero
; ; ; ; rcslsw ptr5;
; lal cslm; reg; ; rcslsw ptr5;
; lbl cslm csuxa ulsw; reg; ; ;
; csuxa ulsw; ; ; ;
; lam cslm woea; ; ; ;
call wait5; lbmf dmul cslm woea; ; ; ;
; lam cslm csuxm umsw; ; ; ;
; lal cslm csuxm ulsw; ; ; rcsmsw ptr2;
; lbm cslm; reg; ; rcslsw ptr2;
call wait5; lblf dmul cslm; reg; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ptr1;
; woem; dtor; ; ramwe rcsmsw ptr1;
; woem; dtor; ; ramwe rcslsw ptr1;
call dsqrtapprox;; dtor; ; ramwe ptr1;
call wait4; ; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ptr1;
; woem; dtor; ; ramwe rcsmsw ptr1;
; woem; dtor; ; ramwe rcslsw ptr1;
; ; dtor; ; ramwe ptr1; ptr5!c_dSCRATCH_15
; ; ; recclk; rcssp ptr5; ptr5!c_dSCRATCH_0
; lasf sneg csla; reg; recclk; ptr5;
; ; ; recoe; ramwe rcssp ptr5;
call dtwoton; ; ; recoe; ramwe ptr5;
; ; ; ; rcsmsw ptr1;
; lam cslm; reg; ; rcslsw ptr1; ptr5!dzero
; lal cslm; reg; ; rcslsw ptr5;
; lbl cslm csuxa ulsw; reg; ; ;
; ; ; ; ;
call wait5; lbmf dmul cslm woea; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ptr1;
; woem; dtor; ; ramwe rcsmsw ptr1;
; woem; dtor; ; ramwe rcslsw ptr1;
call idle1; ; dtor; ; ramwe ptr1;
|* enter with:
|* x in ptr1
|* exit with:
|* result in c_dSCRATCH_0
dgethalfexp:
; ; ; ; rcsmsw ptr1;
; lalf sfloat csla; reg; ; ;
; ; ; ; ;
; ; ; ; ; ptr5!c_stwopm21
; ; ; ; rcssp ptr5;
; las cslm csuxa usp; reg; ; ;
; ; ; ; ;
; lbsf smul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm usp; ; ; ;
; ; ; ; ;
; lasf scvtint csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lalf sfloat csla csuxa ulsw;; ; ;
; ; ; ; ; ptr5!c_s511
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
; lasf ssub csla csuxa usp;; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa usp; ; ; ; ptr5!c_dSCRATCH_0
; ; ; ; ptr5;
; woea; dtor; ; ramwe rcssp ptr5;
rtn; ; dtor; ; ramwe ptr5;
|*
|* Double Precision Square Root Approximation
|*
|* enter with:
|* x in ptr1
|* exit with:
|* MUL starting last calculation
|*
dsqrtapprox:
; ; ; ; ; ptr5!shalf
; ; ; ; rcssp ptr5;
; las cslm; reg; ; rcsmsw ptr1;
; lbm cslm; reg; ; rcslsw ptr1;
; lblf dmul cslm; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm umsw; ; ; ; ptr5!c_dSCRATCH_12
; csuxm ulsw; ; ; ptr5;
; lam csla woem; dtor; ; ramwe rcsmsw ptr5;
; lalf dcvts csla woem; dtor; ; ramwe rcslsw ptr5;
; ; dtor; ; ramwe ptr5; ptr5!shalf
; ; ; ; rcssp ptr5;
; lbs csla; reg; ; ;
; lasf scmp csla csuxa usp;; ; ;
; ; ; ; ;
; woea; dtor; recclk; ;
; ; dtor; recclk; ;
; csuxa usp; ; ; ;
; ; ; ; ; lpreg!1
jge dsqrta.l1; woea; ; ; ;
; ; ; ; ; ptr5!c_ssqrts3
jmp soverlap.expansion;; ; ; ;
; ; ; ; ;
dsqrta.l1:
; ; ; ; ; ptr5!c_ssqrtr3
jmp soverlap.expansion;; ; ; ;
dsqrta.c1:
; ; ; ; ;
; ; ; ; ;
|!!!???***this stinks; use your brain!
; csuxm usp; ; ; ;
; ; ; ; ;
; lasf scvtd csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lam cslm woea; ; ; ;
; lal cslm woea; ; ; ; ptr5!c_dSCRATCH_12
; ; ; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5;
; lblf dmul cslm; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lbm cslm csuxm umsw; ; ; ;
; lblf dmul cslm csuxm ulsw;; ; ;
; ; ; ; ;
; ; ; ; ; ptr5!c_d3o2
; ; ; ; rcsmsw ptr5;
; lam csla; reg; ; rcslsw ptr5;
; lal csla; reg; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
; lblf dsub csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
; lblf dmul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lam cslm csuxm umsw; ; ; ; ptr5!c_dSCRATCH_12
; lal cslm csuxm ulsw; ; ; rcsmsw ptr5;
; lbm cslm; reg; ; rcslsw ptr5;
; lblf dmul cslm; reg; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lbm cslm csuxm umsw; ; ; ;
; lblf dmul cslm csuxm ulsw;; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
; lblf dsub csla woem; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
; lblf dmul cslm woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lam cslm csuxm umsw; ; ; ;
; lal cslm csuxm ulsw; ; ; rcsmsw ptr1;
; lbm cslm; reg; ; rcslsw ptr1;
; lblf dmul cslm; reg; ; ;
; ; ; ; ;
; ; ; ; ;
| *round to +infinity for divide
; lmode3.0 0xa csla; ; ; rcsmsw ptr1;
; lam csla; reg; ; rcslsw ptr1;
; lal csla; reg; ; ;
; csuxm umsw; ; ; ;
; csuxm ulsw; ; ; ;
; lbm csla woem; ; ; ;
; lblf ddiv csla woem; ; ; ; lpreg!28
dsqrt.lp:
jloop dsqrt.lp; ; ; ; ;
; ; ; ; ; lpreg-
| *round to zero for add
; lmode3.0 0x6 csla ; ; ; ;
; lam csla csuxa umsw; ; ; ;
; lalf dcmp csla csuxa ulsw;; ; ; ptr5!shalf
jwerr doberr; woea; ; ; ;
; ; ; ; ;
; ; ; ; ;
; lf dadd csla csuxa umsw;; ; ;
; ; ; ; ;
| *if divide is inexact, then sqrt in inexact
jne dsqrtap.e1; woea; ; ; ;
; ; ; ; rcssp ptr5;
; las cslm; reg; ; ;
| *restore original rounding mode
; lmode3.0 0x2 csla; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
rtn; lblf dmul cslm woea; ; ; ;
dsqrtap.e1:
|* y != t so we must punt iff inexact mask is set
; ; ; ; ; ptr5!c_sinexact
; ; ; recclk; rcssp ptr5;
; ; ; ; ; ptr5!shalf
jwerr drestor.r1 cstat restore;; ; ; ;
; ; ; ; rcssp ptr5;
; las cslm; reg; ; ;
| *restore original rounding mode
; lmode3.0 0x2 csla; ; ; ;
; csuxa umsw; ; ; ;
; csuxa ulsw; ; ; ;
; lbm cslm woea; ; ; ;
rtn; lblf dmul cslm woea; ; ; ;
#endif
stran.start:
; ; ; ; ; ptr5!c_dmode
; ; ; ; rcssp ptr5; ptr5!c_dmode_cor
; las csla; reg; ; rcssp ptr5;
; lbsf scmp csla; reg; recclk; rcssp ptr1; ptr5!c_dSCRATCH_4
; ; ; recclk; ptr5;
; ; ; recoe; ramwe rcssp ptr5;
; ; ; recoe; ramwe ptr5;
; ; ; recclk; rcssp ptr2;
; las csla; reg; recclk; rcssp ptr2; ptr5!c_spio4
; csuxa usp; ; ; ;
; ; ; ; ;
jne soberr; woea; ; ; ;
rtn; ; ; ; ;
dtran.start:
|* make sure rounding mode is the default (2)
; ; ; ; ; ptr5!c_dmode
; ; ; ; rcssp ptr5; ptr5!c_dmode_cor
; las csla; reg; ; rcssp ptr5;
|* save ptr1 in c_dSCRATCH_4
; lbsf scmp csla; reg; recclk; rcsmsw ptr1;
; ; ; recclk; rcslsw ptr1; ptr5!c_dSCRATCH_4
; ; ; ; ptr5;
; ; ; recoe; ramwe rcsmsw ptr5;
; csuxa usp; ; recoe recclk;ramwe ptr5;
; ; ; recoe; ramwe rcslsw ptr5;
jne doberr; woea; ; recoe; ramwe ptr5;
|* save ptr2 in ptr1 (we will overwrite ptr1 later)
; ; ; recclk; rcsmsw ptr2;
; ; ; recclk; rcslsw ptr2;
; ; ; ; ptr1;
; ; ; recoe; ramwe rcsmsw ptr1;
; ; ; recoe recclk;ramwe ptr1;
; ; ; recoe; ramwe rcslsw ptr1;
rtn; ; ; recoe; ramwe ptr1;