📄 sexpm.u
字号:
; i2cmp enra halt; regtoti; rcssp ptr5; ; ; ; ptr5; ptr5!c_sitwo20 ; imul enrb halt; regtoti; rcssp ptr5; ; tioe tisp; ; ; ; i2cmp enrb tioe tisp halt; ; ; ; ; ; ptr5; ptr5!0x700+0xE0 ; i2add enra halt; regtoti; rcsmsw ptr5; ; tioe tisp; ; ptr5; ptr5!0x700+0xE0 call midle1; tioe tisp halt; titoreg; rcsmsw ptr5;kkgtprec: call exp_x; dnop; ; ; ; dnop enrb loaddp halt; tmptoti; rcsmsw; ; dsub enrb loaddp halt; tmptoti; rcslsw; ; dnop; ; ptr5; ptr5!0x700+0xD8 ; dnop enra loaddp halt; regtoti; rcsmsw ptr5; ; dadd alubalu enra loaddp halt; regtoti; rcslsw ptr5; ; dnop tioe timsw; ; ; ; dnop enra tioe timsw loaddp halt;; ; ; dnop enra tioe tilsw loaddp halt;; ; ; dnop; ; ptr5; ptr5!done ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; call eendexpm1; dadd enrb loaddp halt; regtoti; rcslsw ptr5;eexpxm1:|* This should call exp(x) and subtract 1 from the result and return.|* abs(x) is greater than ln2/2:|* Now check whether abs(x) <= ln2 * 3/2 ; dnop; ; ptr5; ptr5!0x700+0xE0 ; dnop enra loaddp halt; regtoti; rcsmsw ptr5; ; dnop enra loaddp halt; regtoti; rcslsw ptr5; ; dnop; ; ptr5; ptr5!c_dinvln2 ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dmul enrb loaddp halt; regtoti; rcslsw ptr5; ; dmul; ; ; ; dnop srccmul clkcc; ; ;|* Convert double to integer: k in c register. Save in SCRATCH 13 register. ; dcvtint aluacreg; ; ; ; dnop; ; ptr5; ptr5!0x700+0xDD|* Calculate t= double k ; dfloat enra tioe tisp loaddp halt;titoreg; rcssp ptr5; ; dfloat enra tioe tisp loaddp halt;; ; ; dnop tioe timsw; ; ; ; dnop enra tioe timsw loaddp halt;; ; ; dnop enra tioe tilsw loaddp halt;; ; ; dnop; ; ptr5; ptr5!c_dln2hi ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dmul enrb loaddp halt; regtoti; rcslsw ptr5; ; dmul; ; ptr5; ptr5!0x700+0xE0 ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;|* Store x - (result) in SCRATCH_10. ; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5; ; dnop tioe tilsw; ; ptr5; ptr5!0x700+0xDA ; dnop tioe tilsw halt; titoreg; rcslsw ptr5; ; dnop tioe timsw halt; titoreg; rcsmsw ptr5;|* get lo = t*ln2lo. Store in SCRATCH_11 and input to RB. ; dnop; ; ptr5; ptr5!c_dln2lo ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dmul enrb loaddp halt; regtoti; rcslsw ptr5; ; dmul; ; ; ; dnop tioe timsw; ; ptr5; ptr5!0x700+0x0DB|* load 'lo' in RB and call calcz = hi - lo. ; dnop enrb tioe timsw loaddp halt;titoreg; rcsmsw ptr5; ; dnop enrb tioe tilsw loaddp halt;titoreg; rcslsw ptr5; ; dnop; ; ptr5; ptr5!0x700+0xDA ; dnop enra loaddp halt; regtoti; rcsmsw ptr5; ; dsub enra loaddp halt; regtoti; rcslsw ptr5; ; dnop tioe tilsw; ; ptr5; ptr5!0x700+0xDC ; dnop tioe tilsw halt; titoreg; rcslsw ptr5; ; dnop tioe timsw halt; titoreg; rcsmsw ptr5; |* First, check to see whether K<-1021. If not, then UNDERFLOW.|* Load K in RA, -1021 in RB and Integer compare: ; ; ; ptr5; ptr5!c_sim1021 ; i2cmp enrb halt; regtoti; rcssp ptr5; ; dnop; ; ptr5; ptr5!0x700+0xDD ; i2cmp enra halt; regtoti; rcssp ptr5; ; ; ; ptr5; ptr5!0x700+0xDC jlt bail.under; dnop enra enrb loaddp halt; regtoti; rcsmsw ptr5;|* compute t = z*z and store in C register: ; dmul enra enrb loaddp halt; regtoti; rcslsw ptr5; ; dmul; ; ; ; dnop srccmul clkcc; ; ptr5; ptr5!c_dp5 ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dmul mulacreg enrb loaddp halt; regtoti; rcslsw ptr5; ; dmul mulacreg; ; ptr5; ptr5!c_dp4 ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5; ; dmul mulaalu mulbcreg; ; ; ; dmul mulaalu mulbcreg; ; ptr5; ptr5!c_dp3 ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5; ; dmul mulaalu mulbcreg; ; ; ; dmul mulaalu mulbcreg; ; ptr5; ptr5!c_dp2 ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5; ; dmul mulaalu mulbcreg; ; ; ; dmul mulaalu mulbcreg; ; ptr5; ptr5!c_dp1 ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5; ; dmul mulaalu mulbcreg; ; ; ; dmul mulaalu mulbcreg; ; ptr5; ptr5!0x700+0xDC ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5; ; dnop tioe timsw; ; ptr5; ptr5!0x700+0xDE ; dnop srccalu clkcc tioe timsw halt;titoreg; rcsmsw ptr5; ; dnop tioe tilsw halt; titoreg; rcslsw ptr5;| Check to see if k = 0 ; dnop; ; ptr5; ptr5!c_sizero ; i2cmp enrb halt; regtoti; rcssp ptr5; ; ; ; ptr5; ptr5!0x700+0xDD ; i2cmp enra halt; regtoti; rcssp ptr5; ; ; ; ptr5; ptr5!dtwo jne rrresult.zero; dnop enra loaddp halt; regtoti; rcsmsw ptr5;| If zero, compute one - ((z*c)/(c-2.0)-z); c in C register as well as in DE ; drsub alubcreg enra loaddp halt;regtoti; rcslsw ptr5; ; dnop tioe timsw; ; ; ; dnop tioe timsw halt; titotmp; rcsmsw; ; dnop tioe tilsw halt; titotmp; rcslsw; ; dnop; ; ptr5; ptr5!0x700+0xDC ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dmul mulacreg enrb loaddp halt; regtoti; rcslsw ptr5; ; dmul mulacreg; ; ; ; dnop tioe timsw; ; ; ; dnop enra tioe timsw loaddp halt;; ; ; dnop enra tioe tilsw loaddp halt;; ; ; dnop; ; ; ; ddiv enrb loaddp halt; tmptoti; rcsmsw; ; ddiv enrb loaddp halt; tmptoti; rcslsw; ; dnop; ; ; ; dnop halt; ; ; ; dnop; ; ; ; dnop; ; ; ; dnop; ; ; ; dmul; ; ; ; dmul tioe timsw halt; ; ; ; dmul tioe timsw halt; titotmp; rcsmsw; ; dmul tioe tilsw halt; titotmp; rcslsw; ; dnop halt; ; ptr5; ptr5!0x700+0xDC ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dnop enrb loaddp halt; regtoti; rcslsw ptr5; ; dnop; ; ; ; dnop enra loaddp halt; tmptoti; rcsmsw; ; dsub enra loaddp halt; tmptoti; rcslsw; ; dsub; ; ptr5; ptr5!done ; dnop enra loaddp halt; regtoti; rcsmsw ptr5; ; dsub alubalu enra loaddp halt; regtoti; rcslsw ptr5; ; dnop tioe tilsw; ; ptr5; ptr5!0x700+0xE0 ; dnop tioe tilsw halt; titoreg; rcslsw ptr5; call mmidle1m1; dnop tioe timsw halt; titoreg; rcsmsw ptr5;rrresult.zero:|* compute y = one -((lo-(z*c)/(2.0-c))-hi). z in RB, c in C. Ptr 5 with dtwo. ; dsub alubcreg; ; ; ; dnop tioe timsw; ; ; ; dnop tioe timsw halt; titotmp; rcsmsw; ; dnop tioe tilsw halt; titotmp; rcslsw; ; dnop; ; ptr5; ptr5!0x700+0xDC ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dmul mulacreg enrb loaddp halt; regtoti; rcslsw ptr5; ; dmul mulacreg; ; ; ; dnop tioe timsw; ; ; ; dnop enra tioe timsw loaddp halt;; ; ; dnop enra tioe tilsw loaddp halt;; ; ; dnop; ; ; ; ddiv enrb loaddp halt; tmptoti; rcsmsw; ; ddiv enrb loaddp halt; tmptoti; rcslsw; ; dnop; ; ; ; dnop halt; ; ; ; dnop; ; ; ; dnop; ; ; ; dnop; ; ; ; dmul; ; ; ; dmul tioe timsw halt; ; ; ; dmul tioe timsw halt; titotmp; rcsmsw; ; dmul tioe tilsw halt; titotmp; rcslsw; ; dnop halt; ; ptr5; ptr5!0x700+0xDB ; dnop enra loaddp halt; regtoti; rcsmsw ptr5; ; dnop enra loaddp halt; regtoti; rcslsw ptr5; ; dnop; ; ; ; dnop enrb loaddp halt; tmptoti; rcsmsw; ; dsub enrb loaddp halt; tmptoti; rcslsw; ; dnop; ; ptr5; ptr5!0x700+0xDA ; dnop enra srccalu clkcc loaddp halt;regtoti; rcsmsw ptr5; ; drsub alubcreg enra loaddp halt;regtoti; rcslsw ptr5; ; drsub alubcreg; ; ptr5; ptr5!done ; dnop enra loaddp halt; regtoti; rcsmsw ptr5; ; dsub alubalu enra loaddp halt; regtoti; rcslsw ptr5; ; dnop tioe tilsw; ; ptr5; ptr5!0x700+0xE0 ; dnop tioe tilsw halt; titoreg; rcslsw ptr5; call scalbn1; dnop tioe timsw halt; titoreg; rcsmsw ptr5;|* Do scalbn(y,k) Add k to the exponent of y. Y is in ptr1 register. K is in SCRATCH_13mmidle1m1: ; dnop; ; ptr5; ptr5!0x700+0xE0 ; dnop enra loaddp halt; regtoti; rcsmsw ptr5; ; dnop enra loaddp halt; regtoti; rcslsw ptr5; ; dnop; ; ptr5; ptr5!dmone ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dadd enrb loaddp halt; regtoti; rcslsw ptr5; ; dnop tioe timsw; ; ptr5; ptr5!0x700+0xE0 ; dnop tioe timsw halt; titoreg; rcsmsw ptr5; call midle1; dnop tioe tilsw halt; titoreg; rcslsw ptr5;ddnotfinx1:|* In order to check for infinity or NAN, we need to look at msw[abs(x)] ANDed with 0x7FF00000,|* which is the msw(infinity) and then compare with msw(infinity). If it's equal, then we have|* NAN or infinity.|* Get msw[abs(x)] and store it in RA. This is done by routing the output to the input. ; dnop tioe timsw; ; ; ; i2cmp enra srccalu clkcc tioe timsw halt;; ; ; ; ; ptr5; ptr5!dinf ; i2land enrb loadsp halt; regtoti; ptr5; ; tioe tisp; ; ; ; i2cmp enra tioe tisp loadsp halt;; ; ; ; ; ptr5; ptr5!c_dln2_2 jeq aabsx1in; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dcmp aluacreg enrb loaddp halt; regtoti; rcslsw ptr5; rtn; dnop; ; ptr5; ptr5!c_dln2_onehalf|* If equal, then x is (NAN or Infinity), else, continue w/ algorithm.|* If there was an error, it is due to underflow or overflow. We will|* deal with this later. (i.e. ignore error here).|* aabsx1in: |* Result was a NAN or infinity. |* Need to check whether it was (-infinity) as exp(-infinity)=0. |* Compare with x with (+inf). If error, then x=NAN. If eq, x=+inf.|* If (-inf), then store 0 in reg2 and call idle. Else, call idle. (reg 2 already|* contains the result: exp(NAN) is NAN, exp(+inf)=+inf, exp(-inf)=0. ; ; ; ptr5; ptr5!dinf ; dnop enra loaddp halt; regtoti; rcsmsw ptr5; ; dnop enra loaddp halt; regtoti; rcslsw ptr5; ; halt; ; ptr5; ptr5!0x700+0xE0 ; dnop enrb loaddp halt; regtoti; rcsmsw ptr5; ; dcmp enrb loaddp halt; regtoti; rcslsw ptr5; ; dcmp; ; ; jtierr bail.out cstat; dcmp; ; ; ; dcmp; ; ptr5; ptr5!dmone jeq rretexp11; dnop halt; regtotmp; rcsmsw ptr5; ; ; regtotmp; rcslsw ptr5; ; ; ; ptr5; ptr5!0x700+0xE0 ; ; tmptoreg; rcsmsw ptr5; call midle1; ; tmptoreg; rcslsw ptr5;rretexp11: ; ; ; ptr2; ; ; regtotmp; rcssp ptr2; ; ; ; ptr1; call idle1; ; tmptoreg; rcssp ptr1;scalbn1:|* Y (DP) in SCRATCH E0|* K (integer) in SCRATCH_13, 0x700+0xDD ; ; ; ptr5; ptr5!0x700+0xDD ; i2cmp enra halt; regtoti; rcssp ptr5; ; ; ; ptr5; ptr5!c_sitwo20 ; imul enrb halt; regtoti; rcssp ptr5; ; tioe tisp; ; ; ; i2cmp enra tioe tisp halt; ; ; ; ; ; ptr5; ptr5!0x700+0xE0 ; i2add enrb halt; regtoti; rcsmsw ptr5; ; tioe tisp; ; ptr5; rtn; tioe tisp halt; titoreg; rcsmsw ptr5;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -