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

860 lines
33 KiB
Plaintext

|* @(#)ssincos.u 1.1 94/10/31 Copyright Sun Microsystems, Inc. 1988
|*
|* Single Precision Sin, Cos, SinCos.
|* lpreg is 0 for cos, 1 for sin, 2 for sincos
|*
routine xs.sin 001000000000 ; ; ;
; ; ; ; lpreg!1
; ; ; ; ptr5!c_dmode
call sinckmode; i2cmp enra halt; regtoti; rcssp ptr5;
call sckifinf; i2land enra halt; regtoti; rcssp ptr5;
routine xs.cos 001000000010 ; ; ;
; ; ; ; lpreg!0
; ; ; ; ptr5!c_dmode
call sinckmode; i2cmp enra halt; regtoti; rcssp ptr5;
call sckifinf; i2land enra halt; regtoti; rcssp ptr5;
routine xs.sincos 001001100000 ; ; ;
; ; ; ; lpreg!2
; ; ; ; ptr5!c_dmode
call sinckmode; i2cmp enra halt; regtoti; rcssp ptr5;
call sckifinf; i2land enra halt; regtoti; rcssp ptr5;
sckifinf:
; i2land; ; ;
; i2cmp enrb tioe tisp halt; ; ;
; ; ; ptr5; ptr5!c_ssin
jeq bail.out; halt; ; ptr5;
|* Check for INEXACT
; smul enra enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!stwom7
jtierr bail.out cstat; scmp aluacreg enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_stwom5
jge tisOK; scmp aluacreg enrb halt; regtoti; rcssp ptr5;
; ; ; ptr2;
jge tsgetiny; smul enra enrb halt; regtoti; rcssp ptr2;
; ; ; ptr5; ptr5!sone
|* if DO_COS, return 1.0
jloop0 scostiny; snop enra halt; regtoti; rcssp ptr5;
; ; ; ptr1;
; ; ; ; lpreg-
|* if DO_SIN of abs(x)<tiny, sin(x) = x
jloop0 idle1; snop halt; tmptoreg; ptr1;
|* if SIN_COS, return x to ptr1, 1.0 to ptr4
; ; ; ptr4;
call idle1; tioe tisp halt; titoreg; rcssp ptr4;
scostiny:
call idle1; tioe tisp halt; titoreg; rcssp ptr1;
tsgetiny:
|* DO_COS, start halt*z
; srccmul clkcc halt; ; ptr5; ptr5!shalf
jloop0 scosgetiny; ; ; ptr5;
; smul mulacreg enrb halt; regtoti; rcssp ptr5;
|* DO_SIN, retrun x-z*(x*f1_6) x is in RA
; ; ; ptr5; ptr5!c_s1_6
; smul enrb halt; regtoti; rcssp ptr5;
; ; ; ; lpreg-
; smul mulacreg mulbmul halt;; ;
; smul mulacreg mulbmul; ; ptr2;
; srsub aluamul enrb halt; regtoti; rcssp ptr2;
jloop0 idle1; ; ; ptr1;
; tioe tisp halt; titoreg; rcssp ptr1;
; ; ; ptr5; ptr5!shalf
; smul mulacreg enrb halt; regtoti; rcssp ptr5;
; smul mulacreg; ; ptr5; ptr5!sone
; srsub aluamul enrb halt; regtoti; rcssp ptr5;
; ; ; ptr4;
call idle1; tioe tisp halt; titoreg; rcssp ptr4;
scosgetiny:
; smul mulacreg; ; ptr5; ptr5!sone
; srsub aluamul enrb halt; regtoti; rcssp ptr5;
; ; ; ptr1;
call idle1; tioe tisp halt; titoreg; rcssp ptr1;
tisOK:
; ; ; ptr2;
; scvtd enra halt; regtoti; rcssp ptr2;
; scvtd enra halt; regtoti; rcssp ptr2;
; dnop; ; ptr5; ptr5!0x700+0xD1
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; ; ; ptr5; ptr5!c_sizero
; ; regtotmp; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD0
; ; tmptoreg; rcssp ptr5;
; ; ; ptr5; ptr5!c_spio4
; scmp aluacreg enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_spio2
jle stlepio4; scmp aluacreg enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!szero
jgt stgtpio2; enrb halt; regtoti; rcssp ptr5;
; scmp enra halt; regtoti; rcssp ptr2;
; ; ; ptr5; ptr5!c_sione
jle sxis0; halt; regtotmp; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD0
; halt; tmptoreg; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD1
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dnop enra loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!c_dpio2
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dsub enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop tioe tilsw; ; ptr5; ptr5!0x700+0xD1
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
call stlepio4; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
sxis0:
; ; ; ptr5; ptr5!c_simone
; halt; regtotmp; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD0
; halt; tmptoreg; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD1
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dnop enra loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!c_dpio2
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!0x700+0xD1
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
call stlepio4; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
stgtpio2:
; ; ; ptr5; ptr5!c_stwo19pio2
; scmp aluacreg enrb halt; regtoti; rcssp ptr5;
; ; ; ptr2;
jgt stisbig; enra halt; regtoti; rcssp ptr2;
; ; ; ptr5; ptr5!c_sinvpio2
; smul enrb halt; regtoti; rcssp ptr5;
|* convert it to int:
; smul; ; ;
; scvtint aluamul halt; ; ;
; scvtint aluamul; ; ptr5; ptr5!0x700+0xD0
; dfloat enra tioe tisp halt; titoreg; rcssp ptr5;
; dfloat enra tioe tisp halt; ; ;
; dnop; ; ptr5; ptr5!0x700+0xD2
; dnop srccalu clkcc tioe tilsw halt;titoreg; rcslsw ptr5;
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop; ; ptr5; ptr5!c_dpio2
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmul mulacreg enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulacreg; ; ptr5; ptr5!0x700+0xD1
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ;
; dnop srccalu clkcc tioe tilsw halt;; ;
|* Get msw of z ANDED w/ 7ff0 0000
|*
; i2cmp enrb tioe timsw halt; ; ptr5; ptr5!c_si7ffmask
; i2land enra halt; regtoti; rcssp ptr5;
; ; ; ;
; tioe tisp halt; titotmp; rcssp; ptr5!0x700+0xD2
|* Get msw of w ANDED w/ 0x7ff00000
|*
; i2land enrb tioe tisp halt; regtoti; rcsmsw ptr5;
; i2land; ; ;
; i2sub alubalu enra halt; tmptoti; rcssp;
; i2sub alubalu; ; ptr5; ptr5!c_ssin_cons
; i2cmp alubalu enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_dpio2_1
jle yeqz; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dnop aluacreg enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!0x700+0xD2
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dmul enra loaddp halt; regtoti; rcslsw ptr5;
; dmul; ; ptr5; ptr5!0x700+0xD1
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop ; ; ptr5; ptr5!c_dsnpio2_t66
; dnop enrb srccalu clkcc loaddp halt;regtoti; rcsmsw ptr5;
; dmul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul; ; ;
; dnop halt; ; ;
; drsub aluamul alubcreg halt; ; ;
; dnop; ; ptr5; ptr5!0x700+0xD1
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
call stlepio4; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
yeqz:
|* dnop of aluacreg has started. Pass it over to D1
; dnop; ; ptr5; ptr5!0x700+0xD1
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
call stlepio4; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
stisbig:
|* Fist make msw of y positive by logical AND w/ 7FFFFFFF
; ; ; ptr5; ptr5!sqnan
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD1
; i2land enra halt; regtoti; rcsmsw ptr5;
; ; ; ;
call r_argred; i2cmp enra tioe tisp halt; ; ;
|note: r_argred will call stlepio4 at the end
stlepio4:
; ; ; ptr5; ptr5!0x700+0xD1
; dnop enra enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmul enra enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul; ; ;
; dnop srccmul clkcc; ; ;
; dnop; ; ptr5; ptr5!0x700+0xD0
|* Add 1 to n (n++)
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sione
jloop snotcos; i2add enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD0
; i2cmp enra tioe tisp halt; titoreg; rcssp ptr5; lpreg!1
snotcos:
; i2land halt; ; ; lpreg-
; i2land; ; ptr5; ptr5!c_sizero
jloop sdosincos; i2cmp alubalu enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_dssin2
jne nisnoteq0; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmul mulacreg enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulacreg; ; ptr5; ptr5!c_dssin1
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulaalu mulbcreg; ; ;
; dmul mulaalu mulbcreg; ; ptr5; ptr5!c_dssin0
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulaalu mulbcreg; ; ;
; dmul mulaalu mulbcreg; ; ptr5; ptr5!done
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; drsub aluamul; ; ptr5; ptr5!0x700+0xD1
; dnop enrb srccalu clkcc loaddp halt;regtoti; rcsmsw ptr5;
; dmul mulacreg enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulacreg; ; ;
; dnop halt; ; ;
; dnop tioe tilsw halt; titotmp; rcslsw;
call endit; dnop tioe timsw halt; titotmp; rcsmsw;
nisnoteq0:
; dnop; ; ptr5; ptr5!c_dscos_2
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmul mulacreg enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulacreg; ; ptr5; ptr5!c_dscos_1
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulaalu mulbcreg; ; ;
; dmul mulaalu mulbcreg; ; ptr5; ptr5!c_dscos_0
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulaalu mulbcreg; ; ;
; dmul mulaalu mulbcreg; ; ptr5; ptr5!dhalf
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulaalu mulbcreg; ; ;
; dmul mulaalu mulbcreg; ; ptr5; ptr5!done
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ;
; dnop tioe tilsw halt; titotmp; rcslsw;
call endit; dnop tioe timsw halt; titotmp; rcsmsw;
endit: ; ; ; ptr5; ptr5!0x700+0xD0
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sitwo
; i2land enrb halt; regtoti; rcssp ptr5;
; i2land; ; ptr5; ptr5!c_sizero
; i2cmp alubalu enra halt; regtoti; rcssp ptr5;
; ; ; ;
jeq nand2; dnop enra enrb loaddp halt; tmptoti; rcsmsw;
; dneg enra enrb loaddp halt; tmptoti; rcslsw;
; dnop; ; ;
; dnop srccalu clkcc halt; ; ;
; dcvts aluacreg halt; ; ;
; ; ; ptr1;
call idle1; tioe tisp halt; titoreg; rcssp ptr1;
nand2:
; dnop enra loaddp halt; tmptoti; rcsmsw;
; dcvts enra loaddp halt; tmptoti; rcslsw;
; ; ; ptr1;
call idle1; tioe tisp halt; titoreg; rcssp ptr1;
sdosincos:
; dnop; ; ptr5; ptr5!c_dscos_2
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmul mulacreg enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulacreg; ; ptr5; ptr5!c_dscos_1
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulaalu mulbcreg; ; ;
; dmul mulaalu mulbcreg; ; ptr5; ptr5!c_dscos_0
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulaalu mulbcreg; ; ;
; dmul mulaalu mulbcreg; ; ptr5; ptr5!dhalf
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulaalu mulbcreg; ; ;
; dmul mulaalu mulbcreg; ; ptr5; ptr5!done
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dcvts enra tioe tilsw loaddp halt;; ;
; ; ; ptr5; ptr5!0x700+0xD5
; tioe tisp halt; titoreg; rcssp ptr5;
; ; ; ptr5; ptr5!c_dssin2
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmul mulacreg enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulacreg; ; ptr5; ptr5!c_dssin1
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulaalu mulbcreg; ; ;
; dmul mulaalu mulbcreg; ; ptr5; ptr5!c_dssin0
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulaalu mulbcreg; ; ;
; dmul mulaalu mulbcreg; ; ptr5; ptr5!done
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; drsub aluamul; ; ptr5; ptr5!0x700+0xD1
; dnop enrb srccalu clkcc loaddp halt;regtoti; rcsmsw ptr5;
; dmul mulacreg enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul mulacreg; ; ;
; dcvts aluamul; ; ;
; ; ; ptr5; ptr5!0x700+0xD6
; tioe tisp halt; titoreg; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD0
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sithree
; i2land enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sizero
; i2cmp enrb tioe tisp halt; ; ;
; ; ; ptr5;
|* Route output to input RA
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sione
jeq squad0; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sitwo
jeq squad1; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD5
jeq squad2; sneg enra halt; regtoti; rcssp ptr5;
|* squad3 from here on:
; ; ; ptr1;
; tioe tisp halt; titoreg; rcssp ptr1; ptr5!0x700+0xD6
; ; regtotmp; rcssp ptr5;
; ; ; ptr4;
call idle1; ; tmptoreg; rcssp ptr4;
squad2:
; sneg halt; ; ;
; ; ; ptr4;
; tioe tisp halt; titoreg; rcssp ptr4; ptr5!0x700+0xD6
; sneg enra halt; regtoti; rcssp ptr5;
; ; ; ptr1;
call idle1; tioe tisp halt; titoreg; rcssp ptr1;
squad1:
; snop enra halt; regtoti; rcssp ptr5;
; ; ; ptr1;
; tioe tisp halt; titoreg; rcssp ptr1; ptr5!0x700+0xD6
; sneg enra halt; regtoti; rcssp ptr5;
; ; ; ptr4;
call idle1; tioe tisp halt; titoreg; rcssp ptr4;
squad0:
; ; ; ptr5; ptr5!0x700+0xD5
; ; regtotmp; rcssp ptr5;
; ; ; ptr4;
; ; tmptoreg; rcssp ptr4; ptr5!0x700+0xD6
; ; regtotmp; rcssp ptr5;
; ; ; ptr1;
call idle1; ; tmptoreg; rcssp ptr1;
sinckmode:
|* Make sure rounding mode is the default: 2.
|* The current rounding mode is stored at 0x700+0xF3
|* The correct rounding mode is stored at 0x700+0xF2
|* Do a single precision compare of both values and if they're
|* not equal, goto hang
; ; ; rcssp ptr5; ptr5!0x700+0xF2
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr2;
jne hang cstat; sabs enra halt; regtitmp; rcssp ptr2;
; sabs; ; ;
; snop srccalu clkcc tioe tisp; ; ;
rtn; i2cmp enrb tioe tisp halt; ; ptr5; ptr5!sinf
|* Huge argument reduction
r_argred:
; ; ; ptr5; ptr5!c_si20
; i2sftrl enrb halt; regtoti; rcssp ptr5;
; ; ; ;
; i2cmp enra tioe tisp halt; ; ptr5; ptr5!c_sibias
; i2sub enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD0
|* k1 = (n - 26) / 24, but since we're in round to nearest mode, (and the fact that if k1<0, k1=0
|* subtract 12 from the numerator before the division: k1 = (n - 38) / 24
; i2cmp enra tioe tisp halt; titoreg; rcssp ptr5;
; ; ; ptr5; ptr5!c_si38
; i2sub enrb halt; regtoti; rcssp ptr5;
; ; ; ;
; i2cmp enra tioe tisp halt; ; ;
; ; ; ptr5; ptr5!c_si24
; idiv enrb halt; regtoti; rcssp ptr5;
; ; ; ;
; ; ; ;
; ; ; ;
; ; ; ;
; ; ; ;
; ; ; ;
; ; ; ;
; halt; ; ptr5; ptr5!0x700+0xDA
; i2cmp enra tioe tisp halt; titoreg; rcssp ptr5;
; ; ; ptr5; ptr5!szero
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD0
jlt setk1eq0; i2cmp enra halt; regtoti; rcssp ptr5;
contdiv:
|* Here we need to adjust the numerator again:
|* k2 = (n +60) / 24 and since n is always positive:
|* k2 = (n + 60 - 12) / 24
; ; ; ptr5; ptr5!c_si48
; i2add enrb halt; regtoti; rcssp ptr5;
; ; ; ;
; i2cmp enra tioe tisp halt; ; ;
; ; ; ptr5; ptr5!c_si24
; idiv enrb halt; regtoti; rcssp ptr5;
; ; ; ;
; ; ; ;
; ; ; ;
; ; ; ;
; ; ; ;
; ; ; ;
; ; ; ;
; halt; ; ptr5; ptr5!0x700+0xDB
; i2cmp enra tioe tisp halt; titoreg; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDA
; i2sub enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDC
; tioe tisp halt; titoreg; rcssp ptr5;
|* Now do for loop, unrolled 8 times! i.e. up to i = 7
|* For i= 0, q[0] = fv[k1] * x
; ; ; ptr5; ptr5!0x700+0xDA
call forfv; i2cmp enra halt; regtoti; rcssp ptr5;
; dnop; ; ptr5; ptr5!0x700+0xE0
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
|* If i > k, continue algorithm. i = 1 here:
; ; ; ptr5; ptr5!0x700+0xDC
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sione
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDA
jlt contalg; i2add enra halt; regtoti; rcssp ptr5;
; ; ; ;
call forfv; i2cmp enra tioe tisp halt; ; ;
; dnop; ; ptr5; ptr5!0x700+0xE1
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
|* If i > k, continue algorithm. i = 2 here:
; ; ; ptr5; ptr5!0x700+0xDC
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sitwo
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDA
jlt contalg; i2add enra halt; regtoti; rcssp ptr5;
; ; ; ;
call forfv; i2cmp enra tioe tisp halt; ; ;
; dnop; ; ptr5; ptr5!0x700+0xE2
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
|* If i > k, continue algorithm. i = 3 here:
; ; ; ptr5; ptr5!0x700+0xDC
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sithree
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDA
jlt contalg; i2add enra halt; regtoti; rcssp ptr5;
; ; ; ;
call forfv; i2cmp enra tioe tisp halt; ; ;
; dnop; ; ptr5; ptr5!0x700+0xE3
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
|* If i > k, continue algorithm. i = 4 here:
; ; ; ptr5; ptr5!0x700+0xDC
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sifour
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDA
jlt contalg; i2add enra halt; regtoti; rcssp ptr5;
; ; ; ;
call forfv; i2cmp enra tioe tisp halt; ; ;
; dnop; ; ptr5; ptr5!0x700+0xE4
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
|* If i > k, continue algorithm. i = 5 here:
; ; ; ptr5; ptr5!0x700+0xDC
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sifive
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDA
jlt contalg; i2add enra halt; regtoti; rcssp ptr5;
; ; ; ;
call forfv; i2cmp enra tioe tisp halt; ; ;
; dnop; ; ptr5; ptr5!0x700+0xE5
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
|* If i > k, continue algorithm. i = 6 here:
; ; ; ptr5; ptr5!0x700+0xDC
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sisix
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDA
jlt contalg; i2add enra halt; regtoti; rcssp ptr5;
; ; ; ;
call forfv; i2cmp enra tioe tisp halt; ; ;
; dnop; ; ptr5; ptr5!0x700+0xE6
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
|* If i > k, continue algorithm. i = 7 here:
; ; ; ptr5; ptr5!0x700+0xDC
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_siseven
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDA
jlt contalg; i2add enra halt; regtoti; rcssp ptr5;
; ; ; ;
call forfv; i2cmp enra tioe tisp halt; ; ;
; dnop; ; ptr5; ptr5!0x700+0xE7
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
|* It should never get here!
call hang; ; ; ;
contalg:
|*
|* Now get q[0]:
; ; ; ptr5; ptr5!0x700+0xE0
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dnop enra loaddp halt; regtoti; rcslsw ptr5;
; ; ; ptr5; ptr5!d1o8
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul; ; ;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dnop enra tioe tilsw loaddp halt;; ;
; dnop; ; ptr5; ptr5!c_dtwo52
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dcpmam enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!dzero
jgt nochange; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dcmp enrb loaddp halt; regtoti; rcslsw ptr5;
|* get AINT(RA)
; dnop; ; ptr5;ptr5!c_dtwo52
jlt q0minus; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dsub enra tioe tilsw loaddp halt;; ;
; dsub; ; ptr5; ptr5!done
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; drsub alubalu enra loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dnop enra tioe tilsw loaddp halt;; ; ptr5!deight
nochange:
; 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;
; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5;
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
|* Now get new q[1]:
; dnop; ; ptr5; ptr5!0x700+0xE1
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dnop enra loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!d1o8
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul; ; ;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dnop enra tioe tilsw loaddp halt;; ;
; dnop; ; ptr5; ptr5!c_dtwo52
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dcpmam enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!dzero
jgt qnochange; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dcmp enrb loaddp halt; regtoti; rcslsw ptr5;
|* get AINT(RA)
; dnop; ; ptr5; ptr5!c_dtwo52
jlt q1minus; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dsub enra tioe tilsw loaddp halt;; ;
; dsub; ; ptr5; ptr5!done
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; drsub alubalu enra loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dnop enra tioe tilsw loaddp halt;; ; ptr5!deight
qnochange:
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul; ; ptr5; ptr5!0x700+0xE1
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; drsub aluamul enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5;
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
|* get new n:
getnewn:
; dnop; ; ptr5; ptr5!0x700+0xE2
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dnop enra loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!d1o8
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul; ; ;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dnop enra tioe tilsw loaddp halt;; ;
; dnop; ; ptr5; ptr5!dzero
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dcmp enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!dhalf
jlt nislt0; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dsub enrb loaddp halt; regtoti; rcslsw ptr5;
contwithn:
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dcvtint enra tioe tilsw loaddp halt;; ;
; dnop; ; ;
; i2cmp enra tioe tisp halt; ; ;
; ; ; ptr5; ptr5!szero
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sithree
jeq keepgoing; i2sftll enrb halt; regtoti; rcssp ptr5;
|* modify q[2]
; i2sftll; ; ;
; dfloat enra tioe tisp halt; ; ;
; dfloat enra tioe tisp halt; ; ;
; dnop; ; ;
; dnop enrb tioe timsw loaddp halt;; ;
; dnop enrb tioe tilsw loaddp halt;; ;
; dnop; ; ptr5; ptr5!0x700+0xE2
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dsub enra loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ;
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
keepgoing:
|* get t = q[k]
; ; ; ptr5; ptr5!0x700+0xDC
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sitwo
; i2add enrb halt; regtitmp; rcssp ptr5;
; ; ; ;
; i2cmp enra tioe tisp halt; ; ;
; ; ; ptr5; ptr5!c_sione
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDF
forloop2:
; i2sub halt; ; ;
; ; ; ptr5; ptr5+
; i2cmp enra tioe tisp halt; ; ;
; ; ; ;
jne forloop2; halt; ; ;
; ; ; ptr5;
|* Do: for ( i= k -1; i >= 0; i--) t += q[i]
|* Translated to:
|* for ( i = 1; i <= k -1; i++) t = t + q[i]
|* Load t in C reg
|* Set RA to k + 1 and store in tmp
|* set ptr5 to address of q[0], minus 1
|* Loop until i = 1:
|* incr ptr5
|* add ptr5 to C reg and store in C
|* load RA from tmp
|* decr and save in tmp
|* check to see if i = 1;
|*
; dnop enra loaddp halt; regtotmp; rcsmsw ptr5;
; dnop enra loaddp halt; regtotmp; rcslsw ptr5;
; dnop; ; ;
; dnop srccalu clkcc; ; ;
; ; ; ptr5; ptr5!0x700+0xDC
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sione
; i2add enrb halt; regtoti; rcssp ptr5;
; ; ; ;
; i2cmp enra tioe tisp halt; titotmp; rcssp;
; ; ; ptr5; ptr5!0x700+0xDF
forloop3:
; ; ; ptr5; ptr5+
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dadd alubcreg enra loaddp halt; regtoti; rcslsw ptr5;
; dadd alubcreg; ; ;
; dnop srccalu clkcc; ; ;
; i2sub enra halt; tmptoti; rcssp;
; ; ; ;
; i2cmp enra tioe tisp halt; titotmp; rcssp;
; ; ; ;
jgt forloop3; dnop halt; ; ;
; dnop halt; ; ptr5;
; dnop; ; ptr5; ptr5!dzero
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dcmp aluacreg enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!dhalf
jlt tis0; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dsub aluacreg enrb loaddp halt; regtoti; rcslsw ptr5;
contt:
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dcvtint enra tioe tilsw loaddp halt;; ;
; dcvtint; ; ptr5; ptr5!0x700+0xDE
; dfloat enra tioe tisp loaddp halt;titoreg; rcssp ptr5;
; dfloat enra tioe tisp loaddp halt;; ;
; dnop; ; ;
; dnop enrb tioe timsw loaddp halt;; ;
; dsub aluacreg enrb tioe tilsw loaddp halt;; ;
; dnop; ; ptr5; ptr5!0x700+0xDF
; dnop enra tioe timsw loaddp halt;titoreg; rcsmsw ptr5;
; dnop enra tioe tilsw loaddp halt;titoreg; rcslsw ptr5;
; dnop; ; ptr5; ptr5!dhalf
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dcmp enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!dmone
jle continue; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!0x700+0xDF
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
; ; ; ptr5; ptr5!c_sione
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDE
; i2add enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5;
; tioe tisp halt; titoreg; rcssp ptr5;
continue:
; ; ; ptr5; ptr5!0x700+0xDF
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dnop enra loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!c_dtwom19
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dcpmam enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!dpio2
jlt modifyt; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmul enrb loaddp halt; regtoti; rcslsw ptr5;
; dmul; ; ;
tismod:
; dnop; ; ;
; dnop tioe timsw halt; titotmp; rcsmsw;
; dnop tioe tilsw halt; titotmp; rcslsw;
; dnop; ; ptr5; ptr5!dzero
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dnop enrb loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ptr5; ptr5!0x700+0xD1
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dcmp enra loaddp halt; regtoti; rcslsw ptr5;
; ; ; ptr5; ptr5!c_siseven
jlt adjustt; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDE
; i2land enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD0
; tioe tisp halt; titoreg; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD1
; ; tmptoreg; rcsmsw ptr5;
call stlepio4; ; tmptoreg; rcslsw ptr5;
adjustt:
; i2negy2 enra halt; regtoti; rcssp ptr5;
; ; ; ;
; i2cmp enra tioe tisp halt; ; ;
; ; ; ptr5; ptr5!c_siseven
; i2land enrb; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xD0
; tioe tisp halt; titoreg; rcssp ptr5;
; ; ; ;
; dnop enra loaddp halt; tmptoti; rcsmsw;
; dneg enra loaddp halt; tmptoti; rcslsw;
; ; ; ptr5; ptr5!0x700+0xD1
; dnop tioe timsw halt; titoreg; rcsmsw ptr5;
call stlepio4; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
forfv:
|* RA has k1 + i
|* Setup pointer 5 at (base - 1), increment k1 times:
|* Add 2 to k1:
; ; ; ptr5; ptr5!c_sitwo
; i2add enrb halt; regtitmp; rcssp ptr5;
; ; ; ;
; i2cmp enra tioe tisp halt; ; ;
; ; ; ptr5; ptr5!c_sione
; i2cmp enrb halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xB8
forloop:
; i2sub halt; ; ;
; ; ; ptr5; ptr5+
; i2cmp enra tioe tisp halt; ; ;
; ; ; ;
jne forloop; halt; ; ;
; ; ; ptr5;
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dnop enra loaddp halt; regtoti; rcslsw ptr5;
; ; ; ptr5; ptr5!0x700+0xD1
; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dmmb enrb loaddp halt; regtoti; rcslsw ptr5;
rtn; dmmb; ; ;
setk1eq0:
; ; ; ptr5; ptr5!szero
; ; regtotmp; rcssp ptr5;
; ; ; ptr5; ptr5!0x700+0xDA
jmp contdiv; ; ; ptr5;
; ; tmptoreg; rcssp ptr5;
nislt0:
jmp contwithn; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd enrb loaddp halt; regtoti; rcslsw ptr5;
tis0:
jmp contt; dnop enrb loaddp halt; regtoti; rcsmsw ptr5;
; dadd aluacreg enrb loaddp halt; regtoti; rcslsw ptr5;
modifyt:
; dnop; ; ptr5; ptr5!0x700+0xDE
; dfloat enra loaddp halt; regtoti; rcssp ptr5;
; dfloat enra loaddp halt; regtoti; rcssp ptr5;
; dnop; ; ptr5; ptr5!0x700+0xE0
; dnop enrb tioe timsw loaddp halt;; ;
; dnop enrb tioe tilsw loaddp halt;; ;
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dsub enra loaddp halt; regtoti; rcslsw ptr5;
; dsub; ; ptr5; ptr5!0x700+0xDF
; dnop srccalu clkcc tioe timsw halt;titoreg; rcsmsw ptr5;
; dnop tioe tilsw halt; titoreg; rcslsw ptr5;
; ; ; ptr5; ptr5!0x700+0xDC
; i2cmp enra halt; regtoti; rcssp ptr5;
; ; ; ptr5; ptr5!c_sione
; i2add enrb halt; regtoti; rcssp ptr5;
; ; ; ;
; i2cmp enra tioe tisp halt; titotmp; rcssp;
; ; ; ptr5; ptr5!0x700+0xDF
forloop4:
; ; ; ptr5; ptr5+
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dadd alubcreg enra loaddp halt; regtoti; rcslsw ptr5;
; dadd alubcreg; ; ;
; dnop srccalu clkcc; ; ;
; i2sub enra halt; tmptoti; rcssp;
; ; ; ;
; i2cmp enra tioe tisp halt; titotmp; rcssp;
; ; ; ;
jgt forloop4; dnop halt; ; ;
; dnop halt; ; ptr5;
; dnop; ; ptr5; ptr5!dpio2
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dmul alubcreg enra loaddp halt; regtoti; rcslsw ptr5;
call tismod; dmul alubcreg; ; ;
q0minus:
; dsub halt; ; ;
; dsub halt; ; ;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dsub enra tioe tilsw loaddp halt;; ;
; dsub; ; ptr5; ptr5!done
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dadd alubalu enra loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ; ptr5!deight
call nochange; dnop enra tioe tilsw loaddp halt;; ;
q1minus:
; dsub halt; ; ;
; dsub halt; ; ;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ;
; dsub enra tioe tilsw loaddp halt;; ;
; dsub; ; ptr5; ptr5!done
; dnop enra loaddp halt; regtoti; rcsmsw ptr5;
; dadd alubalu enra loaddp halt; regtoti; rcslsw ptr5;
; dnop; ; ;
; dnop enra tioe timsw loaddp halt;; ; ptr5!deight
call qnochange; dnop enra tioe tilsw loaddp halt;; ;