Files
TeslaRel410/sda4/DPL3/VRENDER/PXPL5TRI.S
T
CydandClaude Fable 5 db7745fcd0 sda4: commit the Glaze developer hard-drive dump
Un-ignored: the dev drive is the ground truth the restoration and
emulator work constantly reference (DPL3/LIBDPL + VRENDER i860 renderer
source, BT/RP live+dev game trees, VGL_LABS pod boot, scene/audio
content). Kept in-repo for the pod-owner community.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 19:41:15 -05:00

3350 lines
77 KiB
ArmAsm

// nicked from output of PGC Rel 1.4 -opt 2
.text
.align 8
.text
//
// aiming for -
//
// icoeff_p = vpx ( icoeff_ref, codeword, opcode0, conn, backwards, n_polys );
//
// problem - edgizing quads, pents and hexes
//
//{{{ about this code
//
//
// The triangle functions are C-callable, and simply chain together
// calls to other functions in this module, which do not themselves
// adhere to C calling conventions and register allocation
//
// These are the triangle functions - for each type of triangle
// rendereable by the system, a different function exists. The currently
// implemented set of triangles is
//
// _tri_zb_rgb
// _tri_zb_rgb_t
// _tri_zb_d_s
// _tri_zb_d_s_t
// _tri_zb_f
// _tri_zb_f_t
// _tri_zb_d
// _tri_zb_d_t
//
// which are enough to cover PAZ 1 shading model, white light PAZ 2
// shading model, optimized lightscape / Eindhoven radiosity, skyfly
// texturing, white light texturing
//}}}
//
// integer registers first
//
// icoeff_p = vpx ( icoeff_p, codeword, opcode0, conn, backwards );
// icoeff_p = vpx ( icoeff_p, codeword, opcode0, conn, backwards );
//
//
// r12 r13 etc only used early in binitization
//
// fp registers
//
//
// screen-space minimax for binitizing
// PASS NO FLOAT PARAMETERS IN HERE OR YOU ARE S T U F F E D
//
//
// some sphere-only registers
//
// re-use lz - not needed after load
// x, y coords for tris/quads
// repeated expressions fx32, fx13, fx21, fC
// screen-space function values for planarizing
//{{{ some load macros
//}}}
//{{{ declare offsets in VERTEX structure
//
// Note new placement of next field - ensures double-alignment of
// position, normal and texcoords
//
// typedef struct s_rvert {
// 0 dpl_POINT position;
// 16 dpl_POINT normcol;
// 32 float32 texcoords [3];
// 44 struct s_rvert *next;
// 48 dpl_POINT xform_posn;
// 64 float32 rendered_color[3];
// int32 touched;
// 80 } dpl_REMOTE_VERTEX;
// typedef struct s_conn {
// struct s_conn *next; /* 0 */
// int32 r8 ; /* 4 */
// dpl_REMOTE_VERTEX* indices[6]; /* 8 */
// dpl_POINT planeEqn; /* 32 */
// float32 rendered_color[3]; /* 48 */
// int32 touched; /* 60 */
// } dpl_REMOTE_CONNECTION;
//
//}}}
// /////////////////////////////////
// triangle support code
// preplane, planarize, binitize
//{{{ triangle_entry
//}}}
//{{{ triangle_exit
//}}}
//{{{ edgize_fn
//
// NOTE WEIRDNESSS - in viewing matrix, y was INVERTED - thus,
// the sign of all Ys in here is flipped. dont think about it, just
// BELIEVE the expressions below and all will be well...
//
//
// eqn[0]=p1[Y] - p2[Y];
// eqn[1]=p2[X] - p1[X];
// eqn[2]=(p2[Y]*p1[X]) - (p2[X]*p1[Y]);
//
// NB we already have
// f21 f22 f20 in registers
//
.align 8
edgize_fn::
d.pfsub.ss f13 , f15 , f0
btne 0x3, r8 , edgize_poly_fn
d.pfsub.ss f15 , f17 , f0
nop
d.pfsub.ss f17 , f13 , f0
nop
d.m12tpm.ss f12 , f15 , f28
fst.l f28 , 8( r22 ) // edge[0] eqn[0]
d.m12tpm.ss f14 , f17 , f29
fst.l f29 , 24( r22 ) // edge[1] eqn [0]
d.m12tpm.ss f16 , f13 , f28
fst.l f28 , 40( r22 ) // edge[2] eqn [0]
d.pfmul.ss f13 , f14 , f31 // f15 * f12
fst.l f22 , 12( r22 ) // edge[0] eqn [1]
d.pfmul.ss f15 , f16 , f27 // f17 * f14
fst.l f20 , 28( r22 ) // edge[1] eqn[1]
d.pfmul.ss f17 , f12 , f4 // f13 * f16
fst.l f21 , 44( r22 ) // edge[2] eqn[1]
d.i2s1.ss f31 , f0, f0 // push y2*x1 - x2*y1
st.l r11 , 4( r22 )
d.i2s1.ss f27 , f0, f0
st.l r11 , 20( r22 )
d.i2s1.ss f4 , f0, f0
st.l r11 , 36( r22 )
d.pfadd.ss f0, f0, f28
fst.l f28 , 16( r22 ) // edge[0] eqn[2]
d.pfadd.ss f0, f0, f29
fst.l f29 , 32( r22 ) // edge[1] eqn[2]
pfadd.ss f0, f0, f30
bri r1
fnop
fst.l f30 , 48( r22 )++ // edge[2] eqn[2]
// edgize a polygon rather than a triangle...
//}}}
//{{{ edgize_poly_fn
// NOTE WEIRDNESSS - in viewing matrix, y was INVERTED - thus,
// the sign of all Ys in here is flipped. dont think about it, just
// BELIEVE the expressions below and all will be well...
//
// eqn[0]=p1[Y] - p2[Y];
// eqn[1]=p2[X] - p1[X];
// eqn[2]=(p2[Y]*p1[X]) - (p2[X]*p1[Y]);
//
// NB we already have
// f21 f22 f20 in registers
//
.align 8
edgize_poly_fn_entry::
d.pfsub.ss f13 , f15 , f0
nop
edgize_poly_fn::
// do 1st 2 edges in optimal manner, then wimp out for remainder
d.pfsub.ss f15 , f17 , f0
st.l r11 , 4( r22 ) // opcode edge 1
d.m12ttpa.ss f12 , f15 , f0
fst.l f22 , 12( r22 ) // edge 1 B
d.m12ttpa.ss f14 , f13 , f28
fst.l f28 , 8( r22 ) // edge 1 A
d.m12ttpa.ss f14 , f17 , f29
fst.l f29 , 24( r22 ) // edge 2 A
d.m12ttpa.ss f16 , f15 , f0 // x1y2 into t
st.l r11 , 20( r22 )
d.i2st.ss f0, f0, f0 // x1y2 - x2y1 adder 1
adds -2, r8 , r8
d.i2ap1.ss f0, f0, f0 // x2y3 into t 2
fst.l f20 , 28( r22 )++ // edge[1] eqn[1]
d.i2st.ss f0, f0, f0 // x2y3-x3y2->a.1, x1y2-x2y1->a.3
xor 0x1, r8 , r0
d.pfadd.ss f0, f0, f28 // edge 1 C
fst.l f28 , -12( r22 )
d.pfadd.ss f0, f0, f0
bte 0x1, r8 , edgize_last_poly_vert
//
// ok - what about rest of edges ?
//
// we have executed edges 1->2 and 2->3
// for all remaining edges BUT THE LAST,
// copy 2->3, load new 3, re-execute 2->3
//
// use x3 y3 and x2 y2 to construct edge
// eqn[0]=y2-y3
// eqn[1]=x3-x2
// eqn[2]=y3*x2 - x3*y2
//
// r29 =vertex_index
// r30 =vertex_ptr
//
// set r29 =2, ready for increment
// and re-execute last instruction due to bc.t !
//
d.fnop
or ( 8 +12), r0, r29
// move x3y3 to x2y2, and load x3y3
carry_on_branching::
d.fmov.dd f16 , f14
ld.l r29 ( r24 ), r30
d.pfadd.ss f0, f0, f28 // edge 2 C
fld.d 48 ( r30 ), f16
d.pfsub.ss f15 , f17 , f0
fst.l f28 , 4( r22 )++
d.pfsub.ss f16 , f14 , f0
st.l r11 , 4( r22 ) // opcode edge
d.m12ttpa.ss f17 , f14 , f0
nop
d.m12ttpa.ss f15 , f16 , f28 // edge A
fst.l f28 , 8( r22 )++
d.m12ttpa.ss f0, f0, f29
fst.l f29 , 4( r22 )++ // edge B
d.m12ttpa.ss f0, f0, f0 // y1x3->t
adds 4, r29 , r29
d.i2st.ss f0, f0, f0 // y3x1 - x3y1 into adder 1
adds -1, r8 , r8
d.pfadd.ss f0, f0, f0 // y3x1 - x3y1 into adder 2
ld.l r29 ( r24 ), r30
d.pfadd.ss f0, f0, f0 // y3x1 - x3y1 into adder 3
btne 0x1, r8 , carry_on_branching
edgize_last_poly_vert::
// use x3 y3 and x1 y1 to construct edge
// eqn[0]=y3-y1
// eqn[1]=x1-x3
// eqn[2]=y1*x3 - x1*y3
// only x1y1 are known good, so re-load x2y2 and x3y3
d.pfadd.ss f0, f0, f28 // y3x1 - x3y1 into f28
fst.l f28 , 4( r22 )++ // edge C and exit
d.pfsub.ss f17 , f13 , f0
st.l r11 , 4( r22 ) // opcode edge
d.pfsub.ss f12 , f16 , f0
nop
d.m12ttpa.ss f13 , f16 , f0
nop
d.m12ttpa.ss f17 , f12 , f28 // edge A
fst.l f28 , 8( r22 )++
d.m12ttpa.ss f0, f0, f29
fst.l f29 , 4( r22 )++ // edge B
d.m12ttpa.ss f0, f0, f0 // y1x3->t
nop
d.i2st.ss f0, f0, f0 // y3x1 - x3y1 into adder 1
fld.d 48 ( r19 ), f14
d.pfadd.ss f0, f0, f0 // y3x1 - x3y1 into adder 2
fld.d 48 ( r20 ), f16
pfadd.ss f0, f0, f0 // y3x1 - x3y1 into adder 3
bri r1
pfadd.ss f0, f0, f28 // y3x1 - x3y1 into f28
fst.l f28 , 4( r22 )++ // edge C and exit
//}}}
//{{{ preplanarize_fn_p
//
//
//
.globl _preplanarize_fn_p
.align 8
//
// preplanarize_fn ( float *coeffs, unused, v1, v2, v3, v4 );
//
// preplanarize sets up all of the triangle code
//
// we need to cache all x,y into registers,
// precompute x23, x31, x12 and C, and determine
// minimax x, y for the triangle
//
// VICIOUS - returns TRIV_REJECT in r31
//
//
_preplanarize_fn_p::
adds 8 , r0, r30 // index into vert[2] of connection
orh ha% .C00037 , r0, r31; fld.l l% .C00037 (r31), f30
ld.l r30 ( r24 ), r9 // r9 is vertex[0]
orh ha% .C362436 , r0, r31; fld.l l% .C362436 (r31), f28
fld.d 48 ( r9 ), f8
fld.l (( 48 ) + 8) ( r9 ), f5
orh ha% .Cmax_x , r0, r31; fld.d l% .Cmax_x (r31), f18
fmov.dd f8 , f10
fmov.ss f5 , f2
// rvert_p should be pointing at conn->verts[0]
// nv should be a temp, ditto minus1
adds -2, r8 , r31 // set up for bla - will loop twice on triangle
adds -1, r0, r29 // auto-dec for bla
adds 4, r30 , r30 // bump vertex for minimax tests
bla r29 , r31, vertloop_db
vertloop::
ld.l r30 ( r24 ), r9
vertloop_db::
fld.d 48 ( r9 ), f14
pfgt.ss f14 , f10 , f0
bnc xmax_ok
br xmin_ok
fmov.ss f14 , f10
xmax_ok::
pfgt.ss f8 , f14 , f0
bnc xmin_ok
fmov.ss f14 , f8
xmin_ok::
ycheck::
pfgt.ss f15 , f11 , f0
bnc ymax_ok
br ymin_ok
fmov.ss f15 , f11
ymax_ok::
pfgt.ss f9 , f15 , f0
bnc ymin_ok
fmov.ss f15 , f9
ymin_ok::
zcheck::
bte 0x0, r21 , zmin_ok
fld.l (( 48 ) + 8) ( r9 ), f25
pfgt.ss f25 , f2 , f0
bnc texscale_ok
br zmin_ok
fmov.ss f25 , f2
texscale_ok::
pfgt.ss f5 , f25 , f0
bnc zmin_ok
fmov.ss f25 , f5
zmin_ok::
bla r29 , r31, vertloop
adds 4, r30 , r30
// re-load x any y registers we have trashed
fld.d 48 ( r18 ), f12
fld.d 48 ( r19 ), f14
fld.d 48 ( r20 ), f16
// now pipe up repeated expressions
pfsub.ss f13 , f15 , f0
pfsub.ss f17 , f13 , f0
pfsub.ss f15 , f17 , f0
pfsub.ss f0, f0, f22
pfsub.ss f0, f0, f21
pfsub.ss f0, f0, f20
// repeated expressions f20 , f21 , f22 , f23
//
// The definitive planarization algorithm
//
// invC=1.0f / ( f12 * ( f15 - f17 )) +
// ( f14 * ( f17 - f13 )) +
// ( f16 * ( f13 - f15 ));
//
// eqn[0]= invC*( f13 * ( f26 - f25 )) +
// ( f15 * ( f24 - f26 )) +
// ( f17 * ( f25 - f24 ));
//
// eqn[1]= invC*( f24 * ( f16 - f14 )) +
// ( f25 * ( f12 - f16 )) +
// ( f26 * ( f14 - f12 ));
//
// eqn[2]= invC*( f12 *(( f15 * f26 ) - ( f17 * f25 ))) +
// ( f14 *(( f17 * f24 ) - ( f13 * f26 ))) +
// ( f16 *(( f13 * f25 ) - ( f15 * f24 )));
//
// 11 ticks all told
pfmul.ss f12 , f20 , f0
pfmul.ss f14 , f21 , f0
pfmul.ss f16 , f22 , f0
// use T-reg as staging post...
rat1s2.ss f12 , f16 , f0
i2pt.ss f0, f0, f0
rat1s2.ss f14 , f12 , f0
pfsub.ss f16 , f14 , f21
i2apt.ss f0, f0, f0
pfadd.ss f0, f0, f22
pfadd.ss f0, f0, f20
pfadd.ss f0, f0, f23
// ******************************************
// clamp minimax against screen max coordinates
// now get real minimax xy for binning
//
// firstly check triv rejection, max < 0 etc.
//
pfgt.ss f28 , f10 , f0
bc .triv_reject
pfgt.ss f28 , f11 , f0
bc .triv_reject
pfgt.ss f8 , f18 , f0
bc .triv_reject
pfgt.ss f9 , f19 , f0
bc .triv_reject
// now check binning
// get real minx
pfgt.ss f8 , f0, f0
bc .no_clamp_fminx
fmov.ss f0, f8
.no_clamp_fminx::
// get real miny
pfgt.ss f9 , f0, f0
bc .no_clamp_fminy
fmov.ss f0, f9
.no_clamp_fminy::
// get real maxx
pfgt.ss f18 , f10 , f0
bc .no_clamp_fmaxx
fmov.ss f18 , f10
.no_clamp_fmaxx::
// get real maxy
pfgt.ss f19 , f11 , f0
bc .no_clamp_fmaxy
fmov.ss f19 , f11
.no_clamp_fmaxy::
// if entire patch is on-screen, we can just come here
// ok, lets think about the minimum area test
// we have in registers x13 x21 x32
// and y31 y12 y23
//
//
// we need to check that (x21*y21) + (x32*y32) + (x13*y13) < min
// SO we compute (x21*y12 + x32*y23 + x13*y31) > min
//
// around 18 tick overhead, reduce to 12 ish by pfs
//
// fmul.ss f22 , f22 , f28 // 3
// fmul.ss f20 , f20 , f29 // 6
// fmul.ss f21 , f21 , f30 // 9
// fadd.ss f28 , f29 , f29 // 12
// fadd.ss f30 , f29 , f29 // 15
// pfgt.ss f29 , f28 , f0 // 17
pfmul.ss f22 , f22 , f0 // 1
pfmul.ss f20 , f20 , f0 // 2
pfmul.ss f21 , f21 , f0 // 3
i2ap1.ss f0, f0, f0 // 4 last-stage mul into T
i2pt.ss f0, f0, f0 // 5 add last-stage mul and T
i2ap1.ss f0, f0, f0 // 6 last-stage mul into T again
pfadd.ss f0, f0, f0 // 7 adder stage3 now x21*y12
i2apt.ss f0, f0, f0 // 8 add adder 3 and T
pfadd.ss f0, f0, f0 // 9 adder stage2 now result
pfadd.ss f0, f0, f0 // 10 adder stage3 now result
pfadd.ss f0, f0, f29 // 11
pfgt.ss f29 , f28 , f0 // 12
bnc .triv_reject
//
// straight out of the i860 prog ref man
//
// to iterate towards 1/V;
//
// G_new=G_old*(2.0f-(G_old*V))
//
// 20 ticks !? pretty poor
frcp.ss f23 , f28 // start 1.0 / f23 - 2^-8
fmul.ss f23 , f28 , f29 // guess * divisor
// fld.l 16(r31), f2
fsub.ss f30 , f29 , f29 // 2 - (guess * divisor)
fld.l r17 ( r18 ), f24
fmul.ss f28 , f29 , f28 // 2^-15
fld.l r17 ( r19 ), f25
fmul.ss f23 , f28 , f29 // guess * divisor
fsub.ss f30 , f29 , f29 // 2 - (guess * divisor)
fld.l r17 ( r20 ), f26
fmul.ss f28 , f29 , f23 // 2^-23 - run with it
bri r1
or 0x0, r0, r31
.triv_reject::
bri r1
or 0x1, r0, r31
//}}}
//{{{ _planarize_fn_p pipelined
//
// Hey Ho Lets Go!
//
// The definitive planarization algorithm
//
// invC=1.0f / ( f12 * ( f15 - f17 )) +
// ( f14 * ( f17 - f13 )) +
// ( f16 * ( f13 - f15 ));
//
// eqn[0]= invC*( f13 * ( f26 - f25 )) +
// ( f15 * ( f24 - f26 )) +
// ( f17 * ( f25 - f24 ));
//
// a = f26 - f25
// b = f24 - f26
// c = f25 - f24
// d = f13 * a
// e = f15 * b
// f = f17 * c
// g = d + e
// h = g + f
// eqn[0] = f23 * h
//
// eqn[1]= invC*( f24 * ( f16 - f14 )) +
// ( f25 * ( f12 - f16 )) +
// ( f26 * ( f14 - f12 ));
//
// i = f24 * f20
// j = f25 * f21
// k = f26 * f22
// l = i + j
// m = k + l
// eqn[1] = f23 * m
//
// eqn[2]= invC*( f12 *(( f15 * f26 ) - ( f17 * f25 ))) +
// ( f14 *(( f17 * f24 ) - ( f13 * f26 ))) +
// ( f16 *(( f13 * f25 ) - ( f15 * f24 )));
//
// n = f15 * f26
// o = f17 * f25
// p = f17 * f24
// q = f13 * f26
// r = f13 * f25
// s = f15 * f24
// t = n - o
// u = p - q
// v = r - s
// w = f12 * t
// x = f14 * u
// y = f16 * v
// z = w + x
// aa= y + z
// eqn[2] = invC * aa
//
.globl _planarize_fn_p
.align 8
_planarize_fn_p::
// m1 m2 m3 | T | a1 a2 a3 | KR | t1 t2 t3
pfmul.ss f15 , f26 , f0 // n ? ? | ? | ? ? ? | ? | ? ? ?
pfmul.ss f17 , f25 , f0 // o n ? | ? | ? ? ? | ? | ? ? ?
pfmul.ss f17 , f24 , f0 // p o n | ? | ? ? ? | ? | ? ? ?
mm12ttpm.ss f13 , f26 , f0 // q p o | n | ? ? ? | ? | ? ? ?
m12tsm.ss f13 , f25 , f0 // r q p | ? | t ? ? | ? | ? ? ?
mm12ttpm.ss f15 , f24 , f0 // s r q | p | ? t ? | ? | ? ? ?
m12tsm.ss f24 , f20 , f0 // i s r | ? | u ? t | ? | ? ? ?
pfsub.ss f26 , f25 , f28 // i s r | ? | a u ? | ? | t ? ?
mm12ttpm.ss f25 , f21 , f0 // j i s | r | ? a u | ? | t ? ?
m12tsm.ss f26 , f22 , f29 // k j i | ? | v ? a | ? | t u ?
pfmul.ss f12 , f28 , f30 // w k j | ? | v ? a | ? | ? u i
pfmul.ss f14 , f29 , f28 // x w k | ? | v ? a | ? | j ? i
pfadd.ss f28 , f30 , f29 // x w k | ? | l v ? | ? | ? a ?
mm12mpm.ss f13 , f29 , f30 // d x w | ? | ? l v | ? | ? ? k
d.pfsub.ss f24 , f26 , f28 // d x w | ? | b ? l | ? | v ? k
nop
d.pfsub.ss f25 , f24 , f29 // d x w | ? | c b ? | ? | v l k
fld.l r17 ( r20 ), f26
d.rat1p2.ss f29 , f30 , f0 // ? d x | w | m c b | ? | v ? ?
nop
d.m12tpm.ss f16 , f28 , f29 // y ? d | ? | z m c | ? | ? b ?
nop
d.m12ttpa.ss f15 , f29 , f28 // e y ? | d | ? z m | ? | c ? ?
fld.l r17 ( r19 ), f25
d.m12apm.ss f17 , f28 , f29 // f e y | d | ? ? z | ? | ? m ?
nop
d.pfmul.ss f23 , f29 , f28 // e1 f e | d | ? ? z | ? | y ? ?
nop
d.r2pt.ss f23 , f0, f29 // ? e1 f | ? | g ? ? | ? | y z ?
fld.l r17 ( r18 ), f24
d.mrm1p2.ss f28 , f29 , f30 // ? ? e1| ? | aa g ? | ? | ? ? f
nop
d.mm12mpm.ss f0, f0, f29 // ? ? ? | ? | ? aa g | ? | ? e1 f
st.l r16 , 4( r22 )
d.r2ap1.ss f30 , f0, f0 // ? ? ? | ? | h ? aa | ? | ? e1 ?
nop
d.ra1p2.ss f0, f0, f0 // e2 ? ? | ? | ? h ? | ? | ? e1 ?
nop
d.i2p1.ss f0, f0, f0 // ? e2 ? | ? | ? ? h | ? | ? e1 ?
fst.l f29 , 12( r22 )
d.rat1p2.ss f0, f0, f0
nop
d.mi2p1.ss f0, f0, f28
nop
d.mi2p1.ss f30 , f0, f0
fst.l f28 , 16( r22 )++
mi2p1.ss f0, f0, f30
bri r1
fnop
fst.l f30 , -8( r22 )
//}}}
//{{{ _texture_rescale
.globl _texture_rescale
.align 8
_texture_rescale::
//
// ENSURE YOU CALL THIS STRAIGHT AFTER PLANARIZING texu, v and z !!!
//
// note that at the nearest point on a triangle, the texz value is
// forced to 'turn_tex_to_z'. premultiply the far z by 8. then
//
// while (far_z < turn_tex_to_z) {
// enable_pixels_if_lt_turn_tex_to_z_by_8;
// far_z *= 8.0f;
// }
//
// i.e repeatedly execute MEMltTREE_C1 ( turn_z_to_tex / 8);
//
// r22 points at the next free word
//
// i just wrote
// tree a b c
// tree a b c
// tree a b c
// ==> tree_lt_mem c
// tree 8a 8b 8c
// tree 8a 8b 8c
// tree 8a 8b 8c
//
// so the first tree is at r22 -(12*4)
orh ha% _.Cturn_z_to_tex_by_4 , r0, r31; fld.l l% _.Cturn_z_to_tex_by_4 (r31), f29
orh ha% .four_point_0 , r0, r31; fld.l l% .four_point_0 (r31), f30
// precompute this opcode in parallel with multiply
or ( ( 0x300 | ((( ( 154 ) ) & 0xff) << 0) ) )&0xffff, r0, r17 ; orh (( ( 0x300 | ((( ( 154 ) ) & 0xff) << 0) ) )>>16)&0xffff, r17 , r17
// adds 1, r0, r28 // this 1 deals with push / pop opcodes
fmul.ss f30 , f5 , f5 // minz*=8
adds 4, r22 , r22
// so now r22 is next free opcode
// precompute the selective disable opcode
// N.B - STAY ENABLED if my texz < (tex_to_z / 8)
or ( ( ( 0x422100 | ((( ( ( 32 ) ) ) & 0xff) << 0) | ((((( ( ( 20 ) ) )+2)+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x422100 | ((( ( ( 32 ) ) ) & 0xff) << 0) | ((((( ( ( 20 ) ) )+2)+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )>>16)&0xffff, r16 , r16
// the delayed branch op
fld.l -(12*4)( r22 ), f4
.loop_8x:
pfgt.ss f5 , f2 , f0
bc .done_8x
// do texu - note delayed branch opcode is missing
fld.l -(11*4)( r22 ), f6
fld.l -(10*4)( r22 ), f7
fld.l -(9*4)( r22 ), f31
pfmul.ss f30 , f6 , f0
pfmul.ss f30 , f7 , f0
pfmul.ss f30 , f31 , f0
pfmul.ss f0, f0, f6
pfmul.ss f0, f0, f7
pfmul.ss f0, f0, f31
// do the disable pixels thing
st.l r16 , 0( r22 )
fst.l f29 , 4( r22 )
fst.l f4 , 8( r22 )
fst.l f6 , 12( r22 )
fst.l f7 , 16( r22 )
fst.l f31 , 20( r22 )
// do texu
fld.l -(8*4)( r22 ), f4
fld.l -(7*4)( r22 ), f6
fld.l -(6*4)( r22 ), f7
fld.l -(5*4)( r22 ), f31
pfmul.ss f30 , f6 , f0
pfmul.ss f30 , f7 , f0
pfmul.ss f30 , f31 , f0
pfmul.ss f0, f0, f6
pfmul.ss f0, f0, f7
pfmul.ss f0, f0, f31
fst.l f4 , 24( r22 )
fst.l f6 , 28( r22 )
fst.l f7 , 32( r22 )
fst.l f31 , 36( r22 )
// do texv
fld.l -(4*4)( r22 ), f4
fld.l -(3*4)( r22 ), f6
fld.l -(2*4)( r22 ), f7
fld.l -(1*4)( r22 ), f31
pfmul.ss f30 , f6 , f0
pfmul.ss f30 , f7 , f0
pfmul.ss f30 , f31 , f0
pfmul.ss f0, f0, f6
pfmul.ss f0, f0, f7
pfmul.ss f0, f0, f31
fst.l f4 , 40( r22 )
fst.l f6 , 44( r22 )
fst.l f7 , 48( r22 )
fst.l f31 , 52( r22 )
fmul.ss f30 , f5 , f5
adds 7, r28 , r28
adds 56, r22 , r22
bte 22, r28 , .done_8x
// clamp at a maximum of 3 rescans, roughly 1.5x time
br .loop_8x // do something in delayed branch!!
fld.l -(12*4)( r22 ), f4
.done_8x:
bri r1
st.l r17 , 0( r22 )
//}}}
//{{{ locals defines for this fn
// head, tail
// DMA_opcodes[512]
// int r8
// *next
// byte count of 254*2
// 16 bins in 1024
//}}}
//{{{ the incredibly expensive 'bin is full branch'
// dont panic -
// this branch is infrequent - happens every 256 triangles
// note that it can result in a call to malloc!
//
// if ( r9 -> r8 == 2032 ) {
// binchunk *nextbin=next_binchunk ();
//
// r9 ->DMA_opcodes[ r8 ++]=(int) nextbin;
// r9 ->DMA_opcodes[ r8 ++]= ( 0x00000000 ) ;
// r9 =nextbin;
// r5 ->tail= r9 ;
// r8 =0;
// }
//
// damn, we enter C land here - push all registers onto stack
// note that floating-point registers are no longer needed
//
.align 8
bin_was_full::
st.l r16, -4(sp)
st.l r17, -8(sp)
st.l r18, -12(sp)
st.l r19, -16(sp)
st.l r20, -20(sp)
st.l r21, -24(sp)
st.l r22, -28(sp)
st.l r23, -32(sp)
st.l r24, -36(sp)
st.l r25, -40(sp)
st.l r26, -44(sp)
st.l r27, -48(sp)
st.l r28, -52(sp)
st.l r29, -56(sp)
st.l r30, -60(sp)
st.l r1, -64(sp)
call _next_binchunk
adds -80, sp, sp
// lets restore registers
adds 80, sp, sp
ld.l -8(sp), r17
ld.l -12(sp), r18
ld.l -16(sp), r19
ld.l -20(sp), r20
ld.l -24(sp), r21
ld.l -28(sp), r22
ld.l -32(sp), r23
ld.l -36(sp), r24
ld.l -40(sp), r25
ld.l -44(sp), r26
ld.l -48(sp), r27
ld.l -52(sp), r28
ld.l -56(sp), r29
ld.l -60(sp), r30
ld.l -64(sp), r1
// now r16 holds nextbin
adds r8 , r9 , r31 // construct pointer to coeff store
st.l r16 , 2044 ( r9 ) // do linked list thing
mov r16 , r9 // return val from next_binchunk
st.l r16 , 0(r31) // save it away
adds ( 0x00000000 ) , r0, r16 // chain in new r9
st.l r16 , 4(r31) // and save this opcode away
// restore r16
ld.l -4(sp), r16
// so now to patch up the new r9 - simply fall thru
// into the r9 not full branch
mov r0, r8
bri r1
st.l r9 , 4 ( r5 )
//}}}
//{{{ safe_binitize_fn pipelined intro
// void safe_binitize ( int macro_lo, int macro_hi,
// float f8 , float f9 ,
// float f10 , float f11 ,
// int screen_bins_x )
//
// binitize a triangle known to be on-screen, i.e minimax x y
// are within screen-space
//
.globl _safe_binitize_fn
.align 8
// binitize a primitive
.align 8
_safe_binitize_fn::
//
// NB fxfr MUST have NOP as companion, or you are shafted
//
// minx=(int) f8 ;
// miny=(int) f9 ;
// maxx=(int) f10 ;
// maxy=(int) f11 ;
// minx >>= 6 ;
// miny >>= 7 ;
// maxx >>= 6 ;
// maxy >>= 7 ;
// {
// screenbin * r4 =&screenbins[(miny<<bins_shift)+minx];
// screenbin * r5 = r4 ;
// ==> go mango
// r22 holds last place we wrote
// r23 is base of data
// so, ( r22 +7 - rcoeffbase) >> 3 gives n_words
ixfr r23 , f24 // f24
adds 7, r22 , r31
subs r31, r23 , r23
shr 0x3, r23 , r31
orh ( 0x10000000 >>16)&0xffff, r31, r17
adds 35, r22 , r22
d.pftrunc.sd f8 , f0
andnot 31, r22 , r23
d.pftrunc.sd f9 , f0
orh ha%_screenbins, r0, r31
d.pftrunc.sd f10 , f0
ld.l l%_screenbins(r31), r31
d.pftrunc.sd f11 , f28
ixfr r17 , f25 // f25
d.fxfr f28 , r29
nop
d.pfadd.sd f0, f0, f30
shr 6 , r29 , r12
d.fxfr f30 , r30
nop
d.pfadd.sd f0, f0, f28
shr 7 , r30 , r13
d.fxfr f28 , r29
nop
pfadd.sd f0, f0, f30
shr 6 , r29 , r14
fxfr f30 , r30
nop
shl 4 , r13 , r4
adds r12 , r4 , r4
shr 7 , r30 , r15
// each r9 is head/tail pointer, so 8 bytes per r9 entry
shl 3, r4 , r4
adds r31, r4 , r4
subs r15 , r13 , r6
// while ( r6 )
_y_loop::
mov r4 , r5
_y_loopdb::
subs r14 , r12 , r7
// while ( r7 )
_x_loop::
ld.l 4 ( r5 ), r9
_x_loopdb::
ld.l 2040 ( r9 ), r8
xor 2032 , r8 , r0
bnc.t _bin_not_full
fst.d f24, r8 ( r9 )
_bin_full::
st.l r1, -4(sp)
call bin_was_full
adds -8, sp, sp
adds 8, sp, sp
ld.l -4(sp), r1
fst.d f24, r8 ( r9 )
_bin_not_full::
// r9 ->DMA_opcodes[ r8 ++]=macro_lo;
// r9 ->DMA_opcodes[ r8 ++]=macro_hi;
// r9 -> r8 = r8 ;
// r5 ++;
adds 8, r8 , r8
adds 8 , r5 , r5
st.l r8 , 2040 ( r9 )
_bump_x::
// r4 +=screen_bins_x;
bte r0, r7 , _bump_y
ld.l 4 ( r5 ), r9
br _x_loopdb
adds -1, r7 , r7
_bump_y::
bte r0, r6 , _exit_binitize
adds 128 , r4 , r4
adds -1, r6 , r6
br _y_loopdb
mov r4 , r5
_exit_binitize:
bri r1
nop
//}}}
//{{{ chunk_fn
.align 8
chunk_fn::
subs r26 , r23 , r0
bnc .dont_grab_chunk
// do we need to malloc, or shall we just chain the list
// find last_coeffchunk from r26
// well - r26 =lastcoeffchunk+65532-512, so
// add 512 to r26 , and we have the next pointer
// hmm trace regs here ?
ld.l 512( r26 ), r23
// r23 =lcc->next
btne 0x0, r23 , .dont_malloc
st.l r16, -4(sp)
st.l r17, -8(sp)
st.l r18, -12(sp)
st.l r19, -16(sp)
st.l r20, -20(sp)
st.l r21, -24(sp)
st.l r22, -28(sp)
st.l r23, -32(sp)
st.l r24, -36(sp)
st.l r25, -40(sp)
st.l r26, -44(sp)
st.l r27, -48(sp)
st.l r28, -52(sp)
st.l r29, -56(sp)
st.l r30, -60(sp)
st.l r1, -64(sp)
mov 65536, r16
call _newBytes
adds -80, sp, sp
// lets restore registers
adds 80, sp, sp
ld.l -8(sp), r17
ld.l -12(sp), r18
ld.l -16(sp), r19
ld.l -20(sp), r20
ld.l -24(sp), r21
ld.l -28(sp), r22
ld.l -32(sp), r23
ld.l -36(sp), r24
ld.l -40(sp), r25
ld.l -44(sp), r26
ld.l -48(sp), r27
ld.l -52(sp), r28
ld.l -56(sp), r29
ld.l -60(sp), r30
ld.l -64(sp), r1
mov r16, r23
// r23 =malloc(64k)
st.l r16, 512( r26 )
// lcc->next = r23
mov 65532 , r31
fst.l f0, r31( r23 )
// r23 ->next = NULL
.dont_malloc::
// last_coeffchunk=next,
// r22 =next,
// r26 =next+65020,
orh ha%_last_coeffchunk, r0, r31
st.l r23 , l%_last_coeffchunk(r31)
mov ( 65532 -512), r31
adds r31, r23 , r26
.dont_grab_chunk::
bri r1
nop
//}}}
//{{{ opacity_intro(label1, label2)
//}}}
//{{{ ignore_opacity_intro(label1,label2)
//}}}
//{{{ next_poly(label)
//}}}
// /////////////////////////////
// the currently implemented functions
// _tri_zb_rgb
// _tri_zb_rgb_t
// _tri_zb_f
// _tri_zb_f_t
//
// NOTE the texturing triangle functions now need to compute
// zscale based on smallest z in triangle, and multiply up
// z, u and v by this number
//
// use register r11 to hold edge opcode, so intro needs to go,
// if r11 , opcode=tree_ge_zero, else opcode=tree_lt_zero
//
//
// triangle, z-buffered, flat
//
//{{{ _tri_zb_f
.globl _tri_zb_f
.align 8
_tri_zb_f::
fst.d f2, -8(sp); fst.d f4, -16(sp); fst.d f6, -24(sp); st.l r1, -28(sp); st.l r3, -32(sp); st.l r4, -36(sp); st.l r5, -40(sp); st.l r6, -44(sp); st.l r7, -48(sp); st.l r8, -52(sp); st.l r9, -56(sp); st.l r10, -60(sp); st.l r11, -64(sp); st.l r12, -68(sp); st.l r13, -72(sp); st.l r14, -76(sp); st.l r15, -80(sp); adds -96, sp, sp; or ( ( ( 0x414200 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r11 ; orh (( ( ( 0x414200 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r11 , r11 ; bte 0x0, r19 , back_000 ; or ( ( ( 0x400d00 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r11 ; orh (( ( ( 0x400d00 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r11 , r11 ; back_000 :: ; mov r16 , r25 ; mov r17 , r10 ; mov r18 , r24 ; mov r20 , r27 ; fmov.ss f8 , f3 ; ld.l r0( r25 ), r23 ; orh ha%_last_coeffchunk, r0, r31; ld.l l%_last_coeffchunk(r31), r26 ; mov ( 65532 -512), r31; adds r31, r26 , r26
adds 0, r0, r21
// 4 4
//
// new opacity code
//
label000 ::;ld.l (60) ( r24 ), r31;ld.l 4 ( r24 ), r8 ; bte 0x0, r31, label001 ; call chunk_fn; ld.l ( 8 +0)( r24 ), r18 ; adds 12, r23 , r22 ; ld.l ( 8 +4)( r24 ), r19 ; or ( 0x100 ) , r0, r17 ; ld.l ( 8 +8)( r24 ), r20 ; st.l r17 , 0( r23 ); or ( ( ( 0x80016c00 | (((( ( ( 5 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80016c00 | (((( ( ( 5 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )>>16)&0xffff, r17 , r17 ; st.l r17 , 4( r23 ); or ( 0 | ((( 52 ) & 0xff) << 0) ) , r0, r17 ; st.l r17 , 8( r23 ); st.l r10 , 12( r23 )
call _preplanarize_fn_p
adds (( 48 ) + 8) , r0, r17
// should we just exit ?
xor 0x0, r31, r0
bnc label001
or ( ( ( 0x422100 | ((( ( 97 ) ) & 0xff) << 0) | ((((( ( 20 ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16
call edgize_fn
orh (( ( ( 0x422100 | ((( ( 97 ) ) & 0xff) << 0) | ((((( ( 20 ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 48 ) + 8) , r0, r17
fld.l 48 ( r24 ), f25
// store 'do zbuffer, no arguments' into coeff store
or ( ( ( 0x24300 | ((( ( ( 97 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(0<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 97 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(0<<20)) )>>16)&0xffff, r16 , r16
st.l r16 , 4( r22 )
adds 4, r22 , r22
or ( ( ( 0x80435a00 | ((( ( ( 117 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 117 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
st.l r16 , 8( r22 )
fst.l f25 , 12( r22 )++
fld.l (48+4) ( r24 ), f25
or ( ( ( 0x80435a00 | ((( ( ( 125 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 125 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
st.l r16 , 8( r22 )
fst.l f25 , 12( r22 )++
fld.l (48+8) ( r24 ), f25
or ( ( ( 0x80435a00 | ((( ( ( 133 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 133 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
st.l r16 , 8( r22 )
fst.l f25 , 12( r22 )++
or ( ( ( 0xf700 | ((( ( ( 141 ) ) ) & 0xff) << 0) | (((( ( ( 13 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0xf700 | ((( ( ( 141 ) ) ) & 0xff) << 0) | (((( ( ( 13 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )>>16)&0xffff, r16 , r16
st.l r16 , 4( r22 )
fst.l f3 , 8( r22 )++
call _safe_binitize_fn
fst.l f0, 4( r22 )++ // addu 10, r0, r18
label001 ::;adds -1, r27 , r27 ; xor 0x0000, r27 , r0; bnc.t label000 ; ld.l 0( r24 ), r24
.bomb_tri_zb_f::
st.l r23 , 0( r25 ); adds 96, sp, sp; adds 4, r22 , r16 ; ld.l -80(sp), r15; ld.l -76(sp), r14; ld.l -72(sp), r13; ld.l -68(sp), r12; ld.l -64(sp), r11; ld.l -60(sp), r10; ld.l -56(sp), r9; ld.l -52(sp), r8; ld.l -48(sp), r7; ld.l -44(sp), r6; ld.l -40(sp), r5; ld.l -36(sp), r4; ld.l -32(sp), r3; ld.l -28(sp), r1; fld.d -24(sp), f6; fld.d -16(sp), f4; bri r1; fld.d -8(sp), f2
//}}}
// triangle, z-buffered, rgb
//
//{{{ _tri_zb_rgb
.globl _tri_zb_rgb
.align 8
_tri_zb_rgb::
fst.d f2, -8(sp); fst.d f4, -16(sp); fst.d f6, -24(sp); st.l r1, -28(sp); st.l r3, -32(sp); st.l r4, -36(sp); st.l r5, -40(sp); st.l r6, -44(sp); st.l r7, -48(sp); st.l r8, -52(sp); st.l r9, -56(sp); st.l r10, -60(sp); st.l r11, -64(sp); st.l r12, -68(sp); st.l r13, -72(sp); st.l r14, -76(sp); st.l r15, -80(sp); adds -96, sp, sp; or ( ( ( 0x414200 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r11 ; orh (( ( ( 0x414200 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r11 , r11 ; bte 0x0, r19 , back_001 ; or ( ( ( 0x400d00 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r11 ; orh (( ( ( 0x400d00 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r11 , r11 ; back_001 :: ; mov r16 , r25 ; mov r17 , r10 ; mov r18 , r24 ; mov r20 , r27 ; fmov.ss f8 , f3 ; ld.l r0( r25 ), r23 ; orh ha%_last_coeffchunk, r0, r31; ld.l l%_last_coeffchunk(r31), r26 ; mov ( 65532 -512), r31; adds r31, r26 , r26
adds 0, r0, r21
// 4 4
//
// new opacity code
//
label002 ::;ld.l (60) ( r24 ), r31;ld.l 4 ( r24 ), r8 ; bte 0x0, r31, label003 ; call chunk_fn; ld.l ( 8 +0)( r24 ), r18 ; adds 12, r23 , r22 ; ld.l ( 8 +4)( r24 ), r19 ; or ( 0x100 ) , r0, r17 ; ld.l ( 8 +8)( r24 ), r20 ; st.l r17 , 0( r23 ); or ( ( ( 0x80016c00 | (((( ( ( 5 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80016c00 | (((( ( ( 5 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )>>16)&0xffff, r17 , r17 ; st.l r17 , 4( r23 ); or ( 0 | ((( 52 ) & 0xff) << 0) ) , r0, r17 ; st.l r17 , 8( r23 ); st.l r10 , 12( r23 )
call _preplanarize_fn_p
adds (( 48 ) + 8) , r0, r17
// should we just exit ?
xor 0x0, r31, r0
bnc label003
or ( ( ( 0x422100 | ((( ( 97 ) ) & 0xff) << 0) | ((((( ( 20 ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16
call edgize_fn
orh (( ( ( 0x422100 | ((( ( 97 ) ) & 0xff) << 0) | ((((( ( 20 ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or ( 64 ) , r0, r17
// store 'do zbuffer, no arguments' into coeff store
or ( ( ( 0x24300 | ((( ( ( 97 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(0<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 97 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(0<<20)) )>>16)&0xffff, r16 , r16
st.l r16 , 4( r22 )
// 2 23
or ( ( ( 0xf700 | ((( ( ( 141 ) ) ) & 0xff) << 0) | (((( ( ( 13 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0xf700 | ((( ( ( 141 ) ) ) & 0xff) << 0) | (((( ( ( 13 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 8( r22 )
fst.l f3 , 12( r22 )++
// 15 38
or ( ( ( 0x80435a00 | ((( ( ( 117 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 117 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
adds 4, r22 , r22
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 64 )+4) , r0, r17
or ( ( ( 0x80435a00 | ((( ( ( 125 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 125 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
adds 4, r22 , r22
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 64 )+8) , r0, r17
or ( ( ( 0x80435a00 | ((( ( ( 133 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 133 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
adds 4, r22 , r22
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 64 )+8) , r0, r17
// or ( ( 0x10000000 |( 19 )) )&0xffff, r0, r17 ; orh (( ( 0x10000000 |( 19 )) )>>16)&0xffff, r17 , r17
//
// fix_rcoeffptr(19)
//
// mov r23 , r16
call _safe_binitize_fn
fst.l f0, 4( r22 )++ // addu 10, r0, r18
label003 ::;adds -1, r27 , r27 ; xor 0x0000, r27 , r0; bnc.t label002 ; ld.l 0( r24 ), r24
.bomb_tri_zb_rgb::
st.l r23 , 0( r25 ); adds 96, sp, sp; adds 4, r22 , r16 ; ld.l -80(sp), r15; ld.l -76(sp), r14; ld.l -72(sp), r13; ld.l -68(sp), r12; ld.l -64(sp), r11; ld.l -60(sp), r10; ld.l -56(sp), r9; ld.l -52(sp), r8; ld.l -48(sp), r7; ld.l -44(sp), r6; ld.l -40(sp), r5; ld.l -36(sp), r4; ld.l -32(sp), r3; ld.l -28(sp), r1; fld.d -24(sp), f6; fld.d -16(sp), f4; bri r1; fld.d -8(sp), f2
//}}}
//
// Now the textured triangles
// NB if you need 1 bit of pushed storage during triangle processing,
// use texz LSB, it is dropped before perspective divide...
//
//
// all these functions need the texture rescale
//
//
// triangle, z-buffered, flat, textured
//
//{{{ _tri_zb_f_t
.globl _tri_zb_f_t
.align 8
_tri_zb_f_t::
fst.d f2, -8(sp); fst.d f4, -16(sp); fst.d f6, -24(sp); st.l r1, -28(sp); st.l r3, -32(sp); st.l r4, -36(sp); st.l r5, -40(sp); st.l r6, -44(sp); st.l r7, -48(sp); st.l r8, -52(sp); st.l r9, -56(sp); st.l r10, -60(sp); st.l r11, -64(sp); st.l r12, -68(sp); st.l r13, -72(sp); st.l r14, -76(sp); st.l r15, -80(sp); adds -96, sp, sp; or ( ( ( 0x414200 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r11 ; orh (( ( ( 0x414200 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r11 , r11 ; bte 0x0, r19 , back_002 ; or ( ( ( 0x400d00 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r11 ; orh (( ( ( 0x400d00 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r11 , r11 ; back_002 :: ; mov r16 , r25 ; mov r17 , r10 ; mov r18 , r24 ; mov r20 , r27 ; fmov.ss f8 , f3 ; ld.l r0( r25 ), r23 ; orh ha%_last_coeffchunk, r0, r31; ld.l l%_last_coeffchunk(r31), r26 ; mov ( 65532 -512), r31; adds r31, r26 , r26
adds 1, r0, r21
label004 ::;ld.l (60) ( r24 ), r31;ld.l 4 ( r24 ), r8 ; bte 0x0, r31, label005 ; call chunk_fn; ld.l ( 8 +0)( r24 ), r18 ; adds 12, r23 , r22 ; ld.l ( 8 +4)( r24 ), r19 ; or ( 0x100 ) , r0, r17 ; ld.l ( 8 +8)( r24 ), r20 ; st.l r17 , 0( r23 ); or ( ( ( 0x80016c00 | (((( ( ( 5 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80016c00 | (((( ( ( 5 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )>>16)&0xffff, r17 , r17 ; st.l r17 , 4( r23 ); or ( 0 | ((( 52 ) & 0xff) << 0) ) , r0, r17 ; st.l r17 , 8( r23 ); st.l r10 , 12( r23 )
call _preplanarize_fn_p
adds (( 48 ) + 8) , r0, r17
// should we just exit ?
xor 0x0, r31, r0
bnc label005
or ( ( ( 0x422100 | ((( ( 97 ) ) & 0xff) << 0) | ((((( ( 20 ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16
call edgize_fn
orh (( ( ( 0x422100 | ((( ( 97 ) ) & 0xff) << 0) | ((((( ( 20 ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
// TEXTURIZE TO FIND ZSCALE
orh ha% _.Cturn_z_to_tex , r0, r31; fld.l l% _.Cturn_z_to_tex (r31), f29
frcp.ss f2 , f28
fmul.ss f28 , f29 , f28
// store 'do zbuffer, no arguments' into coeff store
or ( ( ( 0x24300 | ((( ( ( 97 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(0<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 97 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(0<<20)) )>>16)&0xffff, r16 , r16
fmul.ss f24 , f28 , f6
st.l r16 , 20( r22 )
fmul.ss f25 , f28 , f7
fmul.ss f26 , f28 , f31
fmul.ss f5 , f28 , f5
or ( ( ( 0x422100 | ((( ( ( 97 ) ) ) & 0xff) << 0) | ((((( ( ( 20 ) ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x422100 | ((( ( ( 97 ) ) ) & 0xff) << 0) | ((((( ( ( 20 ) ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 32 )+0) , r0, r17
fmov.ss f6 , f24
fmov.ss f7 , f25
fmov.ss f31 , f26
// push enable flag for texture support
or ( ( 0xb500 | ((( ( 154 ) ) & 0xff) << 0) ) )&0xffff, r0, r16 ; orh (( ( 0xb500 | ((( ( 154 ) ) & 0xff) << 0) ) )>>16)&0xffff, r16 , r16 ;
st.l r16 , 8( r22 )
adds 8, r22 , r22
// 4 25 tex z-coordinate
or ( ( ( 0x24300 | ((( ( ( 32 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 32 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 32 )+0) , r0, r17
// fix u-coordinate
orh ha% _Cdelta_u , r0, r31; fld.l l% _Cdelta_u (r31), f29
pfadd.ss f29 , f24 , f0
pfadd.ss f29 , f25 , f0
pfadd.ss f29 , f26 , f0
pfadd.ss f0, f0, f24
m12apm.ss f6 , f24 , f25
m12apm.ss f7 , f25 , f26
pfmul.ss f31 , f26 , f0
pfmul.ss f0, f0, f24
pfmul.ss f0, f0, f25
pfmul.ss f0, f0, f26
// 4 29 tex v-coordinate
or ( ( ( 0x24300 | ((( ( ( 57 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 57 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 32 )+4) , r0, r17
// fix v-coordinate
orh ha% _Cdelta_v , r0, r31; fld.l l% _Cdelta_v (r31), f29
pfadd.ss f29 , f24 , f0
pfadd.ss f29 , f25 , f0
pfadd.ss f29 , f26 , f0
pfadd.ss f0, f0, f24
m12apm.ss f6 , f24 , f25
m12apm.ss f7 , f25 , f26
pfmul.ss f31 , f26 , f0
pfmul.ss f0, f0, f24
pfmul.ss f0, f0, f25
pfmul.ss f0, f0, f26
// 4 33 tex u-coordinate
or ( ( ( 0x24300 | ((( ( ( 77 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 77 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 48 ) + 8) , r0, r17
// do texture dynamic range frig
call _texture_rescale
adds 1, r0, r28
// 9 42
fld.l 48 ( r24 ), f25
or ( ( ( 0x80435a00 | ((( ( ( 117 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 117 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
st.l r16 , 8( r22 )
fst.l f25 , 12( r22 )++
fld.l (48+4) ( r24 ), f25
or ( ( ( 0x80435a00 | ((( ( ( 125 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 125 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
st.l r16 , 8( r22 )
fst.l f25 , 12( r22 )++
fld.l (48+8) ( r24 ), f25
or ( ( ( 0x80435a00 | ((( ( ( 133 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 133 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(1<<18)|(1<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
st.l r16 , 8( r22 )
fst.l f25 , 12( r22 )++
// 2 44
or ( ( ( 0xf700 | ((( ( ( 141 ) ) ) & 0xff) << 0) | (((( ( ( 13 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0xf700 | ((( ( ( 141 ) ) ) & 0xff) << 0) | (((( ( ( 13 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )>>16)&0xffff, r16 , r16
st.l r16 , 4( r22 )
fst.l f3 , 8( r22 )++
// adds 22, r28 , r17
// orh ( 0x10000000 >>16)&0xffff, r17 , r17
// adds 35, r22 , r22
// andnot 31, r22 , r22
// adds -4, r22 , r22
// mov r23 , r16
call _safe_binitize_fn
fst.l f0, 4( r22 )++ // addu 10, r0, r18
label005 ::;adds -1, r27 , r27 ; xor 0x0000, r27 , r0; bnc.t label004 ; ld.l 0( r24 ), r24
.bomb_tri_zb_f_t::
st.l r23 , 0( r25 ); adds 96, sp, sp; adds 4, r22 , r16 ; ld.l -80(sp), r15; ld.l -76(sp), r14; ld.l -72(sp), r13; ld.l -68(sp), r12; ld.l -64(sp), r11; ld.l -60(sp), r10; ld.l -56(sp), r9; ld.l -52(sp), r8; ld.l -48(sp), r7; ld.l -44(sp), r6; ld.l -40(sp), r5; ld.l -36(sp), r4; ld.l -32(sp), r3; ld.l -28(sp), r1; fld.d -24(sp), f6; fld.d -16(sp), f4; bri r1; fld.d -8(sp), f2
//}}}
// triangle, z-buffered, rgb, textured
// 24 64-bit words
//
//{{{ _tri_zb_rgb_t
.globl _tri_zb_rgb_t
.align 8
_tri_zb_rgb_t::
fst.d f2, -8(sp); fst.d f4, -16(sp); fst.d f6, -24(sp); st.l r1, -28(sp); st.l r3, -32(sp); st.l r4, -36(sp); st.l r5, -40(sp); st.l r6, -44(sp); st.l r7, -48(sp); st.l r8, -52(sp); st.l r9, -56(sp); st.l r10, -60(sp); st.l r11, -64(sp); st.l r12, -68(sp); st.l r13, -72(sp); st.l r14, -76(sp); st.l r15, -80(sp); adds -96, sp, sp; or ( ( ( 0x414200 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r11 ; orh (( ( ( 0x414200 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r11 , r11 ; bte 0x0, r19 , back_003 ; or ( ( ( 0x400d00 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r11 ; orh (( ( ( 0x400d00 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r11 , r11 ; back_003 :: ; mov r16 , r25 ; mov r17 , r10 ; mov r18 , r24 ; mov r20 , r27 ; fmov.ss f8 , f3 ; ld.l r0( r25 ), r23 ; orh ha%_last_coeffchunk, r0, r31; ld.l l%_last_coeffchunk(r31), r26 ; mov ( 65532 -512), r31; adds r31, r26 , r26
adds 1, r0, r21
// 4 4
//
// new opacity code
//
label006 ::;ld.l (60) ( r24 ), r31;ld.l 4 ( r24 ), r8 ; bte 0x0, r31, label007 ; call chunk_fn; ld.l ( 8 +0)( r24 ), r18 ; adds 12, r23 , r22 ; ld.l ( 8 +4)( r24 ), r19 ; or ( 0x100 ) , r0, r17 ; ld.l ( 8 +8)( r24 ), r20 ; st.l r17 , 0( r23 ); or ( ( ( 0x80016c00 | (((( ( ( 5 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80016c00 | (((( ( ( 5 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )>>16)&0xffff, r17 , r17 ; st.l r17 , 4( r23 ); or ( 0 | ((( 52 ) & 0xff) << 0) ) , r0, r17 ; st.l r17 , 8( r23 ); st.l r10 , 12( r23 )
call _preplanarize_fn_p
adds (( 48 ) + 8) , r0, r17
// should we just exit ?
xor 0x0, r31, r0
bnc label007
or ( ( ( 0x422100 | ((( ( 97 ) ) & 0xff) << 0) | ((((( ( 20 ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16
call edgize_fn
orh (( ( ( 0x422100 | ((( ( 97 ) ) & 0xff) << 0) | ((((( ( 20 ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
// TEXTURIZE TO FIND ZSCALE
orh ha% _.Cturn_z_to_tex , r0, r31; fld.l l% _.Cturn_z_to_tex (r31), f29
frcp.ss f2 , f28
fmul.ss f28 , f29 , f28
pfmul.ss f24 , f28 , f0
pfmul.ss f25 , f28 , f0
pfmul.ss f26 , f28 , f0
pfmul.ss f0, f0, f6
pfmul.ss f0, f0, f7
pfmul.ss f0, f0, f31
call _planarize_fn_p
or (( 32 )+0) , r0, r17
// push enable flag for texture support
or ( ( 0xb500 | ((( ( 154 ) ) & 0xff) << 0) ) )&0xffff, r0, r16 ; orh (( ( 0xb500 | ((( ( 154 ) ) & 0xff) << 0) ) )>>16)&0xffff, r16 , r16 ;
st.l r16 , 4( r22 )
or ( ( ( 0x24300 | ((( ( ( 97 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(0<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 97 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(0<<20)) )>>16)&0xffff, r16 , r16
st.l r16 , 8( r22 )
fmov.ss f6 , f24
adds 8, r22 , r22 // cater for tree_l0 and enable push
fmov.ss f7 , f25
or ( ( ( 0x24300 | ((( ( ( 32 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 32 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
fmov.ss f31 , f26
// 4 25 tex z-coordinate
call _planarize_fn_p
or (( 32 )+0) , r0, r17
// fix u-coordinate
// fix v-coordinate
orh ha% _Cdelta_u , r0, r31; fld.l l% _Cdelta_u (r31), f29
pfadd.ss f29 , f24 , f0
pfadd.ss f29 , f25 , f0
pfadd.ss f29 , f26 , f0
pfadd.ss f0, f0, f24
m12apm.ss f6 , f24 , f25
m12apm.ss f7 , f25 , f26
pfmul.ss f31 , f26 , f0
pfmul.ss f0, f0, f24
pfmul.ss f0, f0, f25
pfmul.ss f0, f0, f26
// 4 29 tex v-coordinate
or ( ( ( 0x24300 | ((( ( ( 57 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 57 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 32 )+4) , r0, r17
// fix v-coordinate
// fix v-coordinate
orh ha% _Cdelta_v , r0, r31; fld.l l% _Cdelta_v (r31), f29
pfadd.ss f29 , f24 , f0
pfadd.ss f29 , f25 , f0
pfadd.ss f29 , f26 , f0
pfadd.ss f0, f0, f24
m12apm.ss f6 , f24 , f25
m12apm.ss f7 , f25 , f26
pfmul.ss f31 , f26 , f0
pfmul.ss f0, f0, f24
pfmul.ss f0, f0, f25
pfmul.ss f0, f0, f26
// 4 33 tex u-coordinate
or ( ( ( 0x24300 | ((( ( ( 77 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 77 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or ( 64 ) , r0, r17
// do texture dynamic range frig
call _texture_rescale
adds 1, r0, r28
// 2 35
or ( ( ( 0xf700 | ((( ( ( 141 ) ) ) & 0xff) << 0) | (((( ( ( 13 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0xf700 | ((( ( ( 141 ) ) ) & 0xff) << 0) | (((( ( ( 13 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )>>16)&0xffff, r16 , r16
st.l r16 , 4( r22 )
fst.l f3 , 8( r22 )++
// 15 50
or ( ( ( 0x80435a00 | ((( ( ( 117 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 117 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
adds 4, r22 , r22
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 64 )+4) , r0, r17
or ( ( ( 0x80435a00 | ((( ( ( 125 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 125 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
adds 4, r22 , r22
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 64 )+8) , r0, r17
or ( ( ( 0x80435a00 | ((( ( ( 133 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 133 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
adds 4, r22 , r22
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 64 )+8) , r0, r17
// adds 25, r28 , r17
// orh ( 0x10000000 >>16)&0xffff, r17 , r17
// adds 35, r22 , r22
// andnot 31, r22 , r22
// adds -4, r22 , r22
// mov r23 , r16
call _safe_binitize_fn
fst.l f0, 4( r22 )++ // addu 10, r0, r18
label007 ::;adds -1, r27 , r27 ; xor 0x0000, r27 , r0; bnc.t label006 ; ld.l 0( r24 ), r24
.bomb_tri_zb_rgb_t::
st.l r23 , 0( r25 ); adds 96, sp, sp; adds 4, r22 , r16 ; ld.l -80(sp), r15; ld.l -76(sp), r14; ld.l -72(sp), r13; ld.l -68(sp), r12; ld.l -64(sp), r11; ld.l -60(sp), r10; ld.l -56(sp), r9; ld.l -52(sp), r8; ld.l -48(sp), r7; ld.l -44(sp), r6; ld.l -40(sp), r5; ld.l -36(sp), r4; ld.l -32(sp), r3; ld.l -28(sp), r1; fld.d -24(sp), f6; fld.d -16(sp), f4; bri r1; fld.d -8(sp), f2
//}}}
// triangle, z-buffered, rgb, textured, opacity-per-vertex
// 24 64-bit words
//
//{{{ _tri_zb_rgb_o_t
.globl _tri_zb_rgb_o_t
.align 8
_tri_zb_rgb_o_t::
fst.d f2, -8(sp); fst.d f4, -16(sp); fst.d f6, -24(sp); st.l r1, -28(sp); st.l r3, -32(sp); st.l r4, -36(sp); st.l r5, -40(sp); st.l r6, -44(sp); st.l r7, -48(sp); st.l r8, -52(sp); st.l r9, -56(sp); st.l r10, -60(sp); st.l r11, -64(sp); st.l r12, -68(sp); st.l r13, -72(sp); st.l r14, -76(sp); st.l r15, -80(sp); adds -96, sp, sp; or ( ( ( 0x414200 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r11 ; orh (( ( ( 0x414200 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r11 , r11 ; bte 0x0, r19 , back_004 ; or ( ( ( 0x400d00 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r11 ; orh (( ( ( 0x400d00 | ((((2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r11 , r11 ; back_004 :: ; mov r16 , r25 ; mov r17 , r10 ; mov r18 , r24 ; mov r20 , r27 ; fmov.ss f8 , f3 ; ld.l r0( r25 ), r23 ; orh ha%_last_coeffchunk, r0, r31; ld.l l%_last_coeffchunk(r31), r26 ; mov ( 65532 -512), r31; adds r31, r26 , r26
adds 1, r0, r21
// 1 1
//
// new opacity code
//
// destination for per-triangle loop - what registers are still in shape?
label008 ::;ld.l (60) ( r24 ), r31;ld.l 4 ( r24 ), r8 ; bte 0x0, r31, label009 ; call chunk_fn; ld.l ( 8 +0)( r24 ), r18 ; adds 0, r23 , r22 ; ld.l ( 8 +4)( r24 ), r19 ; or ( 0x100 ) , r0, r17 ; ld.l ( 8 +8)( r24 ), r20 ; st.l r17 , 0( r22 )
call _preplanarize_fn_p
adds (( 32 )+8) , r0, r17
// should we just exit ?
xor 0x0, r31, r0
bnc label009
or ( ( ( 0x422800 | ((( ( 52 ) ) & 0xff) << 0) | ((((( ( 5 ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16
call edgize_fn
orh (( ( ( 0x422800 | ((( ( 52 ) ) & 0xff) << 0) | ((((( ( 5 ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 48 ) + 8) , r0, r17
or ( ( ( 0x422100 | ((( ( ( 97 ) ) ) & 0xff) << 0) | ((((( ( ( 20 ) ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x422100 | ((( ( ( 97 ) ) ) & 0xff) << 0) | ((((( ( ( 20 ) ) )+2)+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
// 5 22
// TEXTURIZE TO FIND ZSCALE
orh ha% _.Cturn_z_to_tex , r0, r31; fld.l l% _.Cturn_z_to_tex (r31), f29
frcp.ss f2 , f28
fmul.ss f28 , f29 , f28
pfmul.ss f24 , f28 , f0
pfmul.ss f25 , f28 , f0
pfmul.ss f26 , f28 , f0
pfmul.ss f0, f0, f6
pfmul.ss f0, f0, f7
pfmul.ss f0, f0, f31
call _planarize_fn_p
or (( 32 )+0) , r0, r17
// push enable flag for texture support
or ( ( 0xb500 | ((( ( 154 ) ) & 0xff) << 0) ) )&0xffff, r0, r16 ; orh (( ( 0xb500 | ((( ( 154 ) ) & 0xff) << 0) ) )>>16)&0xffff, r16 , r16 ;
st.l r16 , 4( r22 )
or ( ( ( 0x24300 | ((( ( ( 97 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(0<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 97 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(0<<20)) )>>16)&0xffff, r16 , r16
st.l r16 , 8( r22 )
fmov.ss f6 , f24
adds 8, r22 , r22 // cater for tree_l0 and enable push
fmov.ss f7 , f25
or ( ( ( 0x24300 | ((( ( ( 32 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 32 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
fmov.ss f31 , f26
// 4 26 tex z-coordinate
call _planarize_fn_p
or (( 32 )+0) , r0, r17
// fix u-coordinate
// fix v-coordinate
orh ha% _Cdelta_u , r0, r31; fld.l l% _Cdelta_u (r31), f29
pfadd.ss f29 , f24 , f0
pfadd.ss f29 , f25 , f0
pfadd.ss f29 , f26 , f0
pfadd.ss f0, f0, f24
m12apm.ss f6 , f24 , f25
m12apm.ss f7 , f25 , f26
pfmul.ss f31 , f26 , f0
pfmul.ss f0, f0, f24
pfmul.ss f0, f0, f25
pfmul.ss f0, f0, f26
// 4 30 tex v-coordinate
or ( ( ( 0x24300 | ((( ( ( 57 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 57 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 32 )+4) , r0, r17
// fix v-coordinate
// fix v-coordinate
orh ha% _Cdelta_v , r0, r31; fld.l l% _Cdelta_v (r31), f29
pfadd.ss f29 , f24 , f0
pfadd.ss f29 , f25 , f0
pfadd.ss f29 , f26 , f0
pfadd.ss f0, f0, f24
m12apm.ss f6 , f24 , f25
m12apm.ss f7 , f25 , f26
pfmul.ss f31 , f26 , f0
pfmul.ss f0, f0, f24
pfmul.ss f0, f0, f25
pfmul.ss f0, f0, f26
// 4 34 tex u-coordinate
or ( ( ( 0x24300 | ((( ( ( 77 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0x24300 | ((( ( ( 77 ) ) ) & 0xff) << 0) | (((( ( ( 20 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or ( 64 ) , r0, r17
// do texture dynamic range frig
call _texture_rescale
adds 1, r0, r28
// 2 36
or ( ( ( 0xf700 | ((( ( ( 141 ) ) ) & 0xff) << 0) | (((( ( ( 13 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )&0xffff, r0, r16 ; orh (( ( ( 0xf700 | ((( ( ( 141 ) ) ) & 0xff) << 0) | (((( ( ( 13 ) ) )+116) & 0x7f) << 23) ) |(1<<20)) )>>16)&0xffff, r16 , r16
st.l r16 , 4( r22 )
fst.l f3 , 8( r22 )++
// 15 51
or ( ( ( 0x80435a00 | ((( ( ( 117 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 117 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
adds 4, r22 , r22
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 64 )+4) , r0, r17
or ( ( ( 0x80435a00 | ((( ( ( 125 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 125 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
adds 4, r22 , r22
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 64 )+8) , r0, r17
or ( ( ( 0x80435a00 | ((( ( ( 133 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )&0xffff, r0, r17 ; orh (( ( ( 0x80435a00 | ((( ( ( 133 ) ) ) & 0xff) << 0) | (((( ( ( 8 ) ) )+115) & 0xff) << 23) ) |(2<<18)|(2<<20)) )>>16)&0xffff, r17 , r17
st.l r17 , 4( r22 )
adds 4, r22 , r22
or ( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )&0xffff, r0, r16 ; orh (( ( 0 | ((( ( ( 8 ) ) ) & 0x7f) << 16) ) )>>16)&0xffff, r16 , r16
call _planarize_fn_p
or (( 64 )+8) , r0, r17
// fst.l f0, 4( r22 )++
// adds 26, r28 , r17
// orh ( 0x10000000 >>16)&0xffff, r17 , r17
// adds 35, r22 , r22
// andnot 31, r22 , r22
// adds -4, r22 , r22
// mov r23 , r16
call _safe_binitize_fn
fst.l f0, 4( r22 )++ // addu 10, r0, r18
label009 ::;adds -1, r27 , r27 ; xor 0x0000, r27 , r0; bnc.t label008 ; ld.l 0( r24 ), r24
.bomb_tri_zb_rgb_o_t::
st.l r23 , 0( r25 ); adds 96, sp, sp; adds 4, r22 , r16 ; ld.l -80(sp), r15; ld.l -76(sp), r14; ld.l -72(sp), r13; ld.l -68(sp), r12; ld.l -64(sp), r11; ld.l -60(sp), r10; ld.l -56(sp), r9; ld.l -52(sp), r8; ld.l -48(sp), r7; ld.l -44(sp), r6; ld.l -40(sp), r5; ld.l -36(sp), r4; ld.l -32(sp), r3; ld.l -28(sp), r1; fld.d -24(sp), f6; fld.d -16(sp), f4; bri r1; fld.d -8(sp), f2
//}}}
//{{{ _reg_dump
.globl _reg_dump
.align 8
_reg_dump::
//{{{ proc entry - save r1 r2 r3
addu -256, sp, sp
st.l r1,0(sp)
adds 256,sp,r1
// save r2 **before** call into stack frame
st.l r1,4(sp)
st.l fp,8(sp)
//}}}
//{{{ save r4..r31, f2..f31
st.l r4, 12(sp)
st.l r5, 16(sp)
st.l r6, 20(sp)
st.l r7, 24(sp)
st.l r8, 28(sp)
st.l r9, 32(sp)
st.l r10, 36(sp)
st.l r11, 40(sp)
st.l r12, 44(sp)
st.l r13, 48(sp)
st.l r14, 52(sp)
st.l r15, 56(sp)
st.l r16, 60(sp)
//st.l r17, 64(sp)
st.l r18, 68(sp)
st.l r19, 72(sp)
st.l r20, 76(sp)
st.l r21, 80(sp)
st.l r22, 84(sp)
st.l r23, 88(sp)
st.l r24, 92(sp)
st.l r25, 96(sp)
st.l r26, 100(sp)
st.l r27, 104(sp)
st.l r28, 108(sp)
st.l r29, 112(sp)
st.l r30, 116(sp)
st.l r31, 120(sp)
adds 120, sp, sp
fst.l f2, 4(sp)++
fst.l f3, 4(sp)++
fst.l f4, 4(sp)++
fst.l f5, 4(sp)++
fst.l f6, 4(sp)++
fst.l f7, 4(sp)++
fst.l f8, 4(sp)++
fst.l f9, 4(sp)++
fst.l f10, 4(sp)++
fst.l f11, 4(sp)++
fst.l f12, 4(sp)++
fst.l f13, 4(sp)++
fst.l f14, 4(sp)++
fst.l f15, 4(sp)++
fst.l f16, 4(sp)++
fst.l f17, 4(sp)++
fst.l f18, 4(sp)++
fst.l f19, 4(sp)++
fst.l f20, 4(sp)++
fst.l f21, 4(sp)++
fst.l f22, 4(sp)++
fst.l f23, 4(sp)++
fst.l f24, 4(sp)++
fst.l f25, 4(sp)++
fst.l f26, 4(sp)++
fst.l f27, 4(sp)++
fst.l f28, 4(sp)++
fst.l f29, 4(sp)++
fst.l f30, 4(sp)++
fst.l f31, 4(sp)++
adds -240, sp, sp
//}}}
call _trace_regs
mov sp, r16
//{{{ restore all
ld.l 12(sp) , r4
ld.l 16(sp) , r5
ld.l 20(sp) , r6
ld.l 24(sp) , r7
ld.l 28(sp) , r8
ld.l 32(sp) , r9
ld.l 36(sp) , r10
ld.l 40(sp) , r11
ld.l 44(sp) , r12
ld.l 48(sp) , r13
ld.l 52(sp) , r14
ld.l 56(sp) , r15
ld.l 60(sp) , r16
ld.l 64(sp) , r17
ld.l 68(sp) , r18
ld.l 72(sp) , r19
ld.l 76(sp) , r20
ld.l 80(sp) , r21
ld.l 84(sp) , r22
ld.l 88(sp) , r23
ld.l 92(sp) , r24
ld.l 96(sp) , r25
ld.l 100(sp) , r26
ld.l 104(sp) , r27
ld.l 108(sp) , r28
ld.l 112(sp) , r29
ld.l 116(sp) , r30
ld.l 120(sp) , r31
adds 120, sp, sp
fld.l 4(sp)++, f2
fld.l 4(sp)++, f3
fld.l 4(sp)++, f4
fld.l 4(sp)++, f5
fld.l 4(sp)++, f6
fld.l 4(sp)++, f7
fld.l 4(sp)++, f8
fld.l 4(sp)++, f9
fld.l 4(sp)++, f10
fld.l 4(sp)++, f11
fld.l 4(sp)++, f12
fld.l 4(sp)++, f13
fld.l 4(sp)++, f14
fld.l 4(sp)++, f15
fld.l 4(sp)++, f16
fld.l 4(sp)++, f17
fld.l 4(sp)++, f18
fld.l 4(sp)++, f19
fld.l 4(sp)++, f20
fld.l 4(sp)++, f21
fld.l 4(sp)++, f22
fld.l 4(sp)++, f23
fld.l 4(sp)++, f24
fld.l 4(sp)++, f25
fld.l 4(sp)++, f26
fld.l 4(sp)++, f27
fld.l 4(sp)++, f28
fld.l 4(sp)++, f29
fld.l 4(sp)++, f30
fld.l 4(sp)++, f31
adds -240, sp, sp
//}}}
//{{{ proc exit
ld.l 0(sp),r1
ld.l 8(sp),fp
bri r1
addu 256, sp, sp
//}}}
//}}}
// constant for 1/x code
.data
.align 8
.globl _Cmax_x
.globl _Cmax_y
.globl _Cdelta_u
.globl _Cdelta_v
_Cdelta_u:
.long 0x0
_Cdelta_v:
.long 0x0
_Cmax_x: // (0)
.Cmax_x: // (0)
.C640:
.long 0x442fbf5c // 7.02989990E+02
_Cmax_y: // (0)
.Cmax_y: // (0)
.C480:
.long 0x43ff7eb8 // 5.10989990E+02
.fminus_one:
.long 0xbf800000 // -1.00000000E+00
.fminus_256:
.long 0xc37ffd71 // -2.55990005E+02
.C00037: // (0)
.two_point_0: // (0)
.long 0x40000000 // 2.00000000E+00
.eight_point_0: // (0)
.long 0x41000000 // 8.00000000E+00
.four_point_0: // (0)
.long 0x40800000 // 4.00000000E+00
.C362436: // (0)
.long 0x3ecccccd // 4.00000006E-01
//.Czscale1024: // (0)
// .long 0x49800000 // 1.04857600E+06
.Czscale: // (0)
.long 0x497fffff // 1.04857588E+06
.Ctexscale: // (0)
.long 0x477fffff // 6.55359883E+04
_.Cturn_z_to_tex: // (0)
// .long 0x4879999a // 2.55590406E+05
.long 0x48f99980 // 5.11180000E+05
// NB this is now by 4 !!!!!
_.Cturn_z_to_tex_by_4: // (0)
.long 0x47f99980 // 1.27795000E+05
_.Cturn_z_to_tex_by_8: // (0)
.long 0x4779999a // 6.38976016E+04
.r5r6r7opcodes:
.string "r5 r6 r7 have opcodes?"
.byte 0x0
.done_opacity_intro:
.string "done opacity intro"
.byte 0x0
.have_binitized:
.string "have binitized, about to go next_triangle"
.byte 0x0
.run_out_of_coeffs:
.string "run out of coeffstore"
.byte 0x0
.bini_pipe_minimax:
.string "computed minimax piped"
.byte 0x0