📄 dexp.u
字号:
; dnop tioe timsw halt; titoreg; rcsmsw ptr5; z.inrange:|* 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; ; 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 result.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; ; ; ; 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; ; ; ; dnop enra tioe timsw loaddp halt;; ; ; dnop enra tioe tilsw loaddp halt;; ; ; ddiv enrb loaddp halt; tmptoti; rcsmsw; ; ddiv enrb loaddp halt; tmptoti; rcslsw; ; dnop; ; ; ; dnop halt; ; ; ; dnop; ; ; ; dnop; ; ; ; dnop; ; ; ; dmul; ; ; ; dmul 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; ; ptr1; ; dnop tioe tilsw halt; titoreg; rcslsw ptr1; call idle1; dnop tioe timsw halt; titoreg; rcsmsw ptr1;result.zero:|* compute y = one -((lo-(z*c)/(2.0-c))-hi). z in RB, c in C. Ptr 5 with dtwo. ; dsub alubcreg; ; ; ; dnop; ; ; ; 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; ; ; ; dnop enra tioe timsw loaddp halt;; ; ; dnop enra tioe tilsw loaddp halt;; ; ; ddiv enrb loaddp halt; tmptoti; rcsmsw; ; ddiv enrb loaddp halt; tmptoti; rcslsw; ; dnop; ; ; ; dnop halt; ; ; ; dnop; ; ; ; dnop; ; ; ; dnop; ; ; ; dmul; ; ; ; dmul 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; ; ptr1; ; dnop tioe tilsw halt; titoreg; rcslsw ptr1; call scalbn; dnop tioe timsw halt; titoreg; rcsmsw ptr1;|* Do scalbn(y,k) Add k to the exponent of y. Y is in ptr2 register. K is in SCRATCH_13 pipe idl1; snop halt; ; imm2;scalbn:|* Y (DP) in ptr2|* 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; ; ; ; ; ; i2cmp enra tioe tisp halt; ; ; ; i2add enrb halt; regtoti; rcsmsw ptr1; ; ; ; ptr1; rtn; tioe tisp halt; titoreg; rcsmsw ptr1;dnotfinx:|* 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. ; dabs tioe timsw; ; ; ; i2cmp enra srccalu clkcc tioe timsw halt;; ; ; ; ; ptr5; ptr5!dinf ; i2land enrb loadsp halt; regtoti; ptr5; ; tioe tisp; ; ;|* Unload MASKED msw[abs(x)] and store in RA, compare with lsw(infinity), already in RB. ; i2cmp enra tioe tisp loadsp halt;; ; ; ; ; ptr5; ptr5!c_dln2_2 jeq absx.in; 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).|* absx.in: |* 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; ; dnop enrb loaddp halt; regtoti; rcsmsw ptr2; ; dcmp enrb loaddp halt; regtoti; rcslsw ptr2; ; dcmp; ; ; |* If tierr, result was NAN. Bailout. jtierr bail.out cstat; dcmp; ; ;|* If result is not equal, x = (-inf) so load ptr2 with 0.0; Else, return x. ; dcmp; ; ptr5; ptr5!dzero jeq retexp1; dnop halt; regtotmp; rcsmsw ptr5; ; ; regtotmp; rcslsw ptr5; ; ; ; ptr1; ; ; tmptoreg; rcsmsw ptr1; call idle1; ; tmptoreg; rcslsw ptr1;retexp1: ; ; regtotmp; rcsmsw ptr2; ; ; regtotmp; rcslsw ptr2; ; ; ; ptr1; ; ; tmptoreg; rcsmsw ptr1; call idle1; ; tmptoreg; rcslsw ptr1;bail.out:|* Signal an error to the cpu so it can recompute: Replace ptr1 into ptr2. hng; halt; ; ; call idle1; halt; ; ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -