|* 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;