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>
2371 lines
35 KiB
ArmAsm
2371 lines
35 KiB
ArmAsm
//{{{ stuff
|
|
//
|
|
// The plan is to build up a library of often-used and highly
|
|
// optimised i860 assembler functions in here.
|
|
//
|
|
// So typically,
|
|
// homogeneous transformers,
|
|
// matrix concatenators,
|
|
// matrix inverters,
|
|
// equation solvers (e.g point/plane intersectors)
|
|
//
|
|
// will eventually be put in here and tweaked to hell.
|
|
//
|
|
|
|
//}}}
|
|
|
|
.align 8
|
|
.text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//{{{ fn_bbox_plane
|
|
// This is just a very good piece of compiler
|
|
// output which I have hand-tweaked and saved for posterity
|
|
// I cannot believe the compiler did this ...
|
|
|
|
.globl _fn_bbox_plane
|
|
.align 8
|
|
_fn_bbox_plane:
|
|
|
|
// lineno: 0
|
|
adds -1, r0, r18
|
|
// lineno: 190
|
|
fld.l r0(r17), f11
|
|
fld.l 4(r17), f12
|
|
fld.l 8(r17), f13
|
|
fld.l 12(r17), f14
|
|
mov r16, r21
|
|
adds 1, r0, r19
|
|
addu -12, r16, r26
|
|
addu -8, r16, r27
|
|
mov r0, r16
|
|
bla r18, r19,.B1088
|
|
pfmul.dd f0, f0, f0
|
|
// lineno: 201
|
|
.B1088: //.M0000
|
|
.align 8
|
|
d.pfadd.dd f0, f0, f0
|
|
nop
|
|
.align 8
|
|
.PD0.B1088105:
|
|
d.fnop
|
|
mov r26, r29
|
|
.DB.B10881088:
|
|
d.fnop
|
|
fld.l 16(r29)++, f17
|
|
d.fnop
|
|
fld.l 16(r29)++, f18
|
|
d.fnop
|
|
fld.l 16(r29)++, f19
|
|
d.fnop
|
|
addu 16, r29, r26
|
|
d.fnop
|
|
fld.l r0(r26), f9
|
|
d.pfmul.ss f19, f12, f0
|
|
mov r21, r30
|
|
d.pfmul.ss f0, f0, f0
|
|
mov r30, r22
|
|
d.pfmul.ss f9, f12, f0
|
|
fld.l 16(r30)++, f23
|
|
d.pfmul.ss f0, f0, f21
|
|
fld.l 16(r30)++, f24
|
|
d.pfmul.ss f0, f0, f0
|
|
fld.l r0(r22), f25
|
|
d.pfmul.ss f0, f0, f20
|
|
fld.l 16(r30)++, f10
|
|
d.pfmul.ss f24, f11, f0
|
|
mov r27, r23
|
|
d.pfmul.ss f0, f0, f0
|
|
fld.l 16(r23)++, f29
|
|
d.pfmul.ss f10, f11, f0
|
|
fld.l 16(r23)++, f30
|
|
d.mi2p1.ss f21, f0, f16
|
|
fld.l 16(r23)++, f31
|
|
d.mm12msm.ss f18, f12, f0
|
|
addu 16, r23, r27
|
|
d.mi2p1.ss f20, f0, f26
|
|
fld.l r0(r27), f8
|
|
d.m12tpa.ss f31, f13, f19
|
|
addu 16, r30, r21
|
|
d.mm12msm.ss f23, f11, f26
|
|
nop
|
|
d.m12tpa.ss f8, f13, f27
|
|
nop
|
|
d.mi2p1.ss f19, f0, f24
|
|
nop
|
|
d.mi2p1.ss f26, f0, f18
|
|
nop
|
|
d.mi2p1.ss f27, f0, f15
|
|
nop
|
|
d.pfadd.ss f14, f16, f16
|
|
nop
|
|
d.m12tpa.ss f30, f13, f20
|
|
nop
|
|
d.ia1p2.ss f14, f28, f28
|
|
nop
|
|
d.ia1p2.ss f0, f0, f21
|
|
nop
|
|
d.mm12msm.ss f0, f0, f31
|
|
nop
|
|
d.pfadd.ss f0, f0, f22
|
|
nop
|
|
d.pfgt.ss f22, f0, f0
|
|
nop
|
|
d.fnop
|
|
bnc ..L3
|
|
d.fnop
|
|
adds 1, r16, r16
|
|
..L3:
|
|
|
|
d.pfgt.ss f21, f0, f0
|
|
nop
|
|
d.fnop
|
|
bnc ..L2
|
|
d.fnop
|
|
adds 1, r16, r16
|
|
..L2:
|
|
|
|
d.pfadd.ss f20, f31, f0
|
|
nop
|
|
d.mm12msm.ss f25, f11, f0
|
|
nop
|
|
d.mm12msm.ss f17, f12, f0
|
|
nop
|
|
d.ia1p2.ss f14, f23, f23
|
|
nop
|
|
d.mm12msm.ss f0, f0, f19
|
|
nop
|
|
d.mm12msm.ss f0, f0, f18
|
|
nop
|
|
d.pfadd.ss f0, f0, f24
|
|
nop
|
|
d.pfgt.ss f24, f0, f0
|
|
nop
|
|
d.fnop
|
|
bnc ..L1
|
|
d.fnop
|
|
adds 1, r16, r16
|
|
..L1:
|
|
|
|
d.pfadd.ss f19, f18, f0
|
|
nop
|
|
d.mm12msm.ss f29, f13, f0
|
|
nop
|
|
d.mm12msm.ss f0, f0, f0
|
|
nop
|
|
d.ia1p2.ss f0, f0, f26
|
|
nop
|
|
d.mi2p1.ss f26, f0, f15
|
|
nop
|
|
d.pfadd.ss f0, f0, f0
|
|
nop
|
|
d.pfadd.ss f0, f0, f0
|
|
nop
|
|
d.pfadd.ss f14, f27, f27
|
|
nop
|
|
d.pfadd.ss f0, f0, f0
|
|
nop
|
|
d.pfadd.ss f0, f0, f0
|
|
nop
|
|
d.pfadd.ss f0, f0, f16
|
|
nop
|
|
d.pfgt.ss f16, f0, f0
|
|
nop
|
|
d.fnop
|
|
bnc ..L0
|
|
d.fnop
|
|
adds 1, r16, r16
|
|
..L0:
|
|
d.fnop
|
|
bla r18, r19, .DB.B10881088
|
|
d.fnop
|
|
mov r26, r29
|
|
fnop
|
|
bri r1
|
|
fnop
|
|
nop
|
|
// lineno: 0
|
|
//}}}
|
|
|
|
//{{{ p_memcpy
|
|
//
|
|
// p_memcpy
|
|
//
|
|
// uses pflds to load - use for copying tristrips from database to
|
|
// scratchpad - N.B does NOT cache the source
|
|
//
|
|
// must be given at least 32 bytes to copy or will fall over
|
|
//
|
|
// assumes .double aligned data
|
|
//
|
|
.globl _p_memcpy
|
|
.align 8
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_p_memcpy::
|
|
or -1,r0, r19 // decrement by 1
|
|
addu 7, r18 , r18 // copy up to and including a double
|
|
shr 3, r18 , r18 // correct for sizeof double
|
|
adds -1, r18 , r18 // correct for bla
|
|
adds -8, r17 , r17 // correct for autoincrement
|
|
|
|
bla r19 , r18 ,.L666666
|
|
adds -8, r16 , r16 // and again
|
|
.L666666:
|
|
fld.d 8( r17 )++,f16
|
|
bla r19 , r18 ,.L666666
|
|
fst.d f16,8( r16 )++
|
|
|
|
bri r1
|
|
nop
|
|
|
|
|
|
|
|
|
|
|
|
//}}}
|
|
|
|
|
|
|
|
//{{{ matrix_copy
|
|
//
|
|
// matrix_copy
|
|
//
|
|
// assumes .double aligned data
|
|
//
|
|
.globl _matrix_copy
|
|
.align 8
|
|
|
|
_matrix_copy::
|
|
fld.l 0(r17), f8
|
|
fld.l 4(r17), f9
|
|
fld.l 8(r17), f10
|
|
fld.l 12(r17), f11
|
|
fld.l 16(r17), f12
|
|
fld.l 20(r17), f13
|
|
fld.l 24(r17), f14
|
|
fld.l 28(r17), f15
|
|
fld.l 32(r17), f16
|
|
fld.l 36(r17), f17
|
|
fld.l 40(r17), f18
|
|
fld.l 44(r17), f19
|
|
fld.l 48(r17), f20
|
|
fld.l 52(r17), f21
|
|
fld.l 56(r17), f22
|
|
fld.l 60(r17), f23
|
|
|
|
fst.d f8, 0(r16)
|
|
fst.d f10, 8(r16)
|
|
fst.d f12, 16(r16)
|
|
fst.d f14, 24(r16)
|
|
fst.d f16, 32(r16)
|
|
fst.d f18, 40(r16)
|
|
fst.d f20, 48(r16)
|
|
bri r1
|
|
fst.d f22, 56(r16)
|
|
//}}}
|
|
|
|
|
|
//{{{ matrix registers
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//}}}
|
|
|
|
//{{{ fn_cache_mtx
|
|
.align 8
|
|
|
|
_fn_cache_mtx::
|
|
adds -4,r16,r31
|
|
fld.l 4(r31)++, f8
|
|
fld.l 4(r31)++, f9
|
|
fld.l 4(r31)++, f10
|
|
fld.l 4(r31)++, f11
|
|
fld.l 4(r31)++, f12
|
|
fld.l 4(r31)++, f13
|
|
fld.l 4(r31)++, f14
|
|
fld.l 4(r31)++, f15
|
|
fld.l 4(r31)++, f16
|
|
fld.l 4(r31)++, f17
|
|
fld.l 4(r31)++, f18
|
|
fld.l 4(r31)++, f19
|
|
fld.l 4(r31)++, f20
|
|
fld.l 4(r31)++, f21
|
|
fld.l 4(r31)++, f22
|
|
bri r1
|
|
fld.l 4(r31)++, f23
|
|
//}}}
|
|
|
|
//{{{ fn_cache_opt_mtx
|
|
.align 8
|
|
|
|
_fn_cache_opt_mtx::
|
|
adds -4,r16,r31
|
|
fld.l 4(r31)++, f8
|
|
fld.l 4(r31)++, f9
|
|
fld.l 4(r31)++, f10
|
|
fld.l 8(r31)++, f12
|
|
fld.l 4(r31)++, f13
|
|
fld.l 4(r31)++, f14
|
|
fld.l 8(r31)++, f16
|
|
fld.l 4(r31)++, f17
|
|
fld.l 4(r31)++, f18
|
|
fld.l 8(r31)++, f20
|
|
fld.l 4(r31)++, f21
|
|
bri r1
|
|
fld.l 4(r31)++, f22
|
|
//}}}
|
|
|
|
//{{{ fn_cache_mtx
|
|
.align 8
|
|
|
|
_fn_cache_mtxd::
|
|
adds -8,r16,r31
|
|
fld.d 8(r31)++, f8
|
|
fld.d 8(r31)++, f10
|
|
fld.d 8(r31)++, f12
|
|
fld.d 8(r31)++, f14
|
|
fld.d 8(r31)++, f16
|
|
fld.d 8(r31)++, f18
|
|
fld.d 8(r31)++, f20
|
|
bri r1
|
|
fld.d 8(r31)++, f22
|
|
//}}}
|
|
|
|
//{{{ fn_cache_opt_mtx
|
|
.align 8
|
|
|
|
_fn_cache_opt_mtxd::
|
|
adds -8,r16,r31
|
|
fld.d 8(r31)++, f8
|
|
fld.d 8(r31)++, f10
|
|
fld.d 8(r31)++, f12
|
|
fld.d 8(r31)++, f14
|
|
fld.d 8(r31)++, f16
|
|
fld.d 8(r31)++, f18
|
|
fld.d 8(r31)++, f20
|
|
bri r1
|
|
fld.d 8(r31)++, f22
|
|
//}}}
|
|
|
|
//{{{ fn_xform in 43 ticks
|
|
//
|
|
// #define fullxform(d,s) // sx =*s++; sy =*s++; sz =*s++; sw=*s++; // *d++ = (sx* f8 ) + (sy* f12 ) + (sz* f16 ) + (sw* f20 ); // *d++ = (sx* f9 ) + (sy* f13 ) + (sz* f17 ) + (sw* f21 ); // *d++ = (sx* f10 ) + (sy* f14 ) + (sz* f18 ) + (sw* f22 ); // *d++ = (sx* f11 ) + (sy* f15 ) + (sz* f19 ) + (sw* f23 )
|
|
//
|
|
// matrix held in f13 .. m44
|
|
// r16 points to destn
|
|
// r17 points at the point to transform,
|
|
//
|
|
|
|
.align 8
|
|
|
|
_fn_xform::
|
|
|
|
fld.l 0(r17), f24
|
|
fld.l 4(r17), f25
|
|
fld.l 8(r17), f26
|
|
|
|
pfmul.ss f24 , f8 ,f0
|
|
fld.l 12(r17), f27
|
|
pfmul.ss f25 , f12 ,f0
|
|
pfmul.ss f26 , f16 ,f0
|
|
pfmul.ss f27 , f20 , f28
|
|
pfmul.ss f24 , f9 , f29
|
|
pfadd.ss f28 , f29 ,f0 // adder 1 = x00+y10
|
|
pfmul.ss f25 , f13 , f28
|
|
pfmul.ss f26 , f17 , f29
|
|
pfadd.ss f28 , f29 ,f0 // adder 1 = z20 + w30
|
|
pfmul.ss f27 , f21 , f28
|
|
pfmul.ss f24 , f10 , f29
|
|
pfadd.ss f28 , f29 ,f0 // adder 1 = x01+y11
|
|
pfmul.ss f25 , f14 , f28
|
|
pfmul.ss f26 , f18 , f29
|
|
pfadd.ss f28 , f29 , f30 // adder1 = z21+w31 f30 =x00+y10
|
|
pfmul.ss f27 , f22 , f28
|
|
pfmul.ss f24 , f11 , f29
|
|
pfadd.ss f28 , f29 , f31 // adder1 = x02+y12 f31 =z20+w30
|
|
pfmul.ss f25 , f15 , f28
|
|
pfmul.ss f26 , f19 , f29
|
|
pfadd.ss f28 , f29 , f7 // adder1 = z22+w32 f7 =x01+y11
|
|
pfmul.ss f27 , f23 , f28
|
|
pfmul.ss f0,f0, f29
|
|
pfadd.ss f28 , f29 , f24 // adder1 = x03+y13 f24 =z21+w31
|
|
pfmul.ss f0,f0, f28
|
|
pfmul.ss f0,f0, f29
|
|
pfadd.ss f28 , f29 , f25 // adder1=z23+w33 f25 =x02+y12
|
|
pfadd.ss f30 , f31 , f28 // adder1=rx f28 =z22+w32
|
|
pfadd.ss f7 , f24 , f29 // adder1=ry f29 =x03+y13
|
|
pfadd.ss f28 , f25 , f30 // adder1=rz f30 =z23+w33
|
|
pfadd.ss f29 , f30 , f24
|
|
fst.l f24 , 0(r16)
|
|
pfadd.ss f0,f0, f25
|
|
fst.l f25 , 4(r16)
|
|
pfadd.ss f0,f0, f26
|
|
fst.l f26 , 8(r16)
|
|
pfadd.ss f0,f0, f27
|
|
bri r1
|
|
fst.l f27 , 12(r16) // total 43 ticks
|
|
|
|
//}}}
|
|
|
|
//{{{ fn_optxform in 28 ticks
|
|
//
|
|
// only called on vertices, which are quad-aligned
|
|
//
|
|
// #define optxform(s,d) // sx =*s++; sy =*s++; sz =*s++; sw=*s++; // *d++ = (sx* f8 ) + (sy* f12 ) + (sz* f16 ) + f20 ; // *d++ = (sx* f9 ) + (sy* f13 ) + (sz* f17 ) + f21 ; // *d++ = (sx* f10 ) + (sy* f14 ) + (sz* f18 ) + f22 ; // *d++ = 1
|
|
//
|
|
// matrix held in f13 .. m44
|
|
// r16 points to destn
|
|
// r17 points at the point to transform,
|
|
//
|
|
|
|
.align 8
|
|
|
|
_fn_optxform::
|
|
|
|
fld.l 0(r17), f24
|
|
fld.l 4(r17), f25
|
|
|
|
pfmul.ss f24 , f8 ,f0
|
|
fld.l 8(r17), f26
|
|
pfmul.ss f25 , f12 ,f0
|
|
pfmul.ss f24 , f9 ,f0
|
|
pfmul.ss f25 , f13 , f28
|
|
pfmul.ss f24 , f10 , f29
|
|
pfadd.ss f28 , f29 ,f0 // adder 1 = x00+y10
|
|
pfmul.ss f25 , f14 , f28
|
|
pfmul.ss f26 , f16 , f29
|
|
pfadd.ss f28 , f29 ,f0 // adder 1 = x01+y11
|
|
pfmul.ss f26 , f17 , f28
|
|
pfmul.ss f26 , f18 , f29
|
|
pfadd.ss f28 , f29 ,f0 // adder 1 = x02+y12
|
|
//
|
|
//
|
|
// here we have a full adder and a full multiplier
|
|
// we just drop the numbers out of each and add them
|
|
// leaving 3 results in the adder pipe to store
|
|
//
|
|
//
|
|
m12apm.ss f0,f0,f0 // fill adder unit with adder+mul units
|
|
m12apm.ss f0,f0,f0 //
|
|
m12apm.ss f0,f0,f0 //
|
|
|
|
r2ap1.ss f20 ,f0,f0
|
|
r2ap1.ss f21 ,f0,f0
|
|
r2ap1.ss f22 ,f0,f0
|
|
|
|
pfadd.ss f0,f0, f24
|
|
fst.l f24 , 0(r16)
|
|
pfadd.ss f0,f0, f25
|
|
fst.l f25 , 4(r16)
|
|
pfadd.ss f0,f0, f26
|
|
bri r1
|
|
fst.l f26 , 8(r16)
|
|
|
|
//}}}
|
|
|
|
//{{{ _fn_xform_bound in 256 ticks == 10 uS on i860-25
|
|
.globl _fn_xform_bound
|
|
// void xform_bound ( POINT *dest, POINT *src, MATRIX b )
|
|
// a bounding box is 8 points, so we just call xform 8 times
|
|
|
|
.align 8
|
|
_fn_xform_bound::
|
|
mov r1,r19
|
|
mov r16, r20
|
|
|
|
call _fn_cache_opt_mtx
|
|
mov r18,r16
|
|
|
|
// call 1
|
|
call _fn_optxform
|
|
mov r20,r16
|
|
|
|
// call 2
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 3
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 4
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 5
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 6
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 7
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 8
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
|
|
bri r19
|
|
nop
|
|
|
|
|
|
//}}}
|
|
|
|
//{{{ _fn_xform_boundtroid in 288 ticks == 10 uS on i860-25
|
|
.globl _fn_xform_boundtroid
|
|
// void xform_boundtroid ( POINT *dest, POINT *src, MATRIX b )
|
|
// a bounding box plus centroid is 9 points, so we just call xform 9 times
|
|
|
|
.align 8
|
|
_fn_xform_boundtroid::
|
|
mov r1,r19
|
|
mov r16, r20
|
|
|
|
call _fn_cache_opt_mtx
|
|
mov r18,r16
|
|
|
|
// call 1
|
|
call _fn_optxform
|
|
mov r20,r16
|
|
|
|
// call 2
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 3
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 4
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 5
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 6
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 7
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
// call 8
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
|
|
// call 9
|
|
addu 16,r16,r16
|
|
call _fn_optxform
|
|
addu 16,r17,r17
|
|
|
|
bri r19
|
|
nop
|
|
|
|
|
|
//}}}
|
|
|
|
//{{{ _fn_concatenate in 190 ticks == 7.6 uS on i860-25
|
|
|
|
.globl _fn_concatenate
|
|
// extern void _concatenate ( MATRIX res, MATRIX a, MATRIX b );
|
|
// a matrix is 4 points, so we just call xform 8 times
|
|
|
|
.align 8
|
|
_fn_concatenate::
|
|
mov r1,r19
|
|
mov r16, r20
|
|
|
|
mov .C00038, r22
|
|
|
|
fxfr f7 , r21
|
|
|
|
call _fn_cache_mtx
|
|
mov r18,r16 // caches matrix B
|
|
|
|
// call 1
|
|
call _fn_xform
|
|
mov r22,r16
|
|
|
|
// call 2
|
|
addu 16,r16,r16
|
|
call _fn_xform
|
|
addu 16,r17,r17
|
|
// call 3
|
|
addu 16,r16,r16
|
|
call _fn_xform
|
|
addu 16,r17,r17
|
|
// call 4
|
|
addu 16,r16,r16
|
|
call _fn_xform
|
|
addu 16,r17,r17
|
|
|
|
// copy matrix from temporary (r22) to param 1 (r20)
|
|
|
|
fld.q 0(r22),f16
|
|
fld.q 16(r22),f20
|
|
fld.q 32(r22),f24
|
|
fld.q 48(r22),f28
|
|
|
|
//{{{ double precision stores
|
|
//fst.d f16, 0(r20) // store 0
|
|
//fst.d f18, 8(r20)
|
|
//fst.d f20, 16(r20)
|
|
//fst.d f22, 24(r20)
|
|
//fst.d f24, 32(r20)
|
|
//fst.d f26, 40(r20)
|
|
//fst.d f28, 48(r20)
|
|
//fst.d f30, 56(r20)
|
|
//}}}
|
|
//{{{ single
|
|
fst.l f16, 0(r20) // store 0
|
|
fst.l f17, 4(r20) // store 0
|
|
fst.l f18, 8(r20)
|
|
fst.l f19, 12(r20)
|
|
fst.l f20, 16(r20)
|
|
fst.l f21, 20(r20)
|
|
fst.l f22, 24(r20)
|
|
fst.l f23, 28(r20)
|
|
fst.l f24, 32(r20)
|
|
fst.l f25, 36(r20)
|
|
fst.l f26, 40(r20)
|
|
fst.l f27, 44(r20)
|
|
fst.l f28, 48(r20)
|
|
fst.l f29, 52(r20)
|
|
fst.l f30, 56(r20)
|
|
fst.l f31, 60(r20)
|
|
//}}}
|
|
|
|
bri r19
|
|
ixfr r21, f7
|
|
|
|
//}}}
|
|
|
|
// some rapid hack functions exploiting the 1/sqr(x) opcode
|
|
|
|
//{{{ quick_renorm
|
|
.globl _quick_renorm
|
|
.align 8
|
|
|
|
|
|
// f8, f9, f10 are normalized, multiplied by f11 and stored to *r16
|
|
|
|
_quick_renorm::
|
|
|
|
fmul.ss f8, f8, f19
|
|
fmul.ss f9, f9, f20
|
|
fmul.ss f10, f10, f21
|
|
|
|
fadd.ss f20, f21, f22
|
|
fadd.ss f19, f22, f23
|
|
frsqr.ss f23, f20
|
|
fmul.ss f20, f11, f20
|
|
|
|
fmul.ss f20, f8, f8
|
|
fmul.ss f20, f9, f9
|
|
fmul.ss f20, f10, f10
|
|
|
|
fst.l f8, 0(r16)
|
|
fst.l f9, 4(r16)
|
|
bri r1
|
|
fst.l f10, 8(r16)
|
|
//}}}
|
|
|
|
//{{{ quick_radius
|
|
.globl _quick_radius
|
|
.align 8
|
|
|
|
|
|
// f8, f9, f10 are squared and roughly rooted -- 18 ticks
|
|
|
|
_quick_radius::
|
|
fmul.ss f8, f8, f19
|
|
|
|
|
|
fmul.ss f9, f9, f20
|
|
|
|
|
|
fmul.ss f10, f10, f21
|
|
|
|
|
|
fadd.ss f20, f21, f22
|
|
|
|
|
|
fadd.ss f19, f22, f23
|
|
|
|
|
|
frsqr.ss f23, f20
|
|
bri r1
|
|
frcp.ss f20, f8
|
|
//}}}
|
|
|
|
//{{{ quick_root
|
|
.globl _quick_root
|
|
.align 8
|
|
|
|
|
|
// f8 is roughly square rooted
|
|
|
|
_quick_root::
|
|
frsqr.ss f8, f20
|
|
bri r1
|
|
frcp.ss f20, f8
|
|
//}}}
|
|
|
|
//{{{ quick_recip
|
|
.globl _quick_recip
|
|
.align 8
|
|
|
|
|
|
// f8 is roughly 1/f8
|
|
|
|
_quick_recip::
|
|
bri r1
|
|
frcp.ss f8, f8
|
|
//}}}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//{{{ copy_spoint
|
|
.globl _copy_spoint
|
|
.align 8
|
|
//
|
|
// hand-coded this as i was disgusted with the compilers output
|
|
//
|
|
|
|
_copy_spoint:
|
|
adds -1, r0, r18
|
|
adds 6, r0, r19
|
|
adds 4, r0, r20
|
|
adds -4, r16, r16
|
|
bla r18, r19,.B1264
|
|
adds -4, r17, r17
|
|
.B1264:
|
|
fld.l r20(r16)++, f16
|
|
bla r18, r19, .B1264
|
|
fst.l f16, r20(r17)++
|
|
|
|
bri r1
|
|
nop
|
|
//}}}
|
|
|
|
//{{{ smintersect
|
|
.globl _smintersect
|
|
.align 8
|
|
|
|
//
|
|
// this is slightly hand-tweaked compiler output
|
|
// it looks like some 89 cycles, and should be tweakable down to about 45
|
|
//
|
|
_smintersect:
|
|
// lineno: 234
|
|
shl 2, r19, r29
|
|
fld.l r17(r29), f16
|
|
fld.l r18(r29), f17
|
|
orh ha%.C00037, r0, r31
|
|
fld.l l%.C00037(r31), f21
|
|
fsub.ss f17, f16, f18
|
|
|
|
|
|
frcp.ss f18, f19
|
|
fmul.ss f18, f19, f20
|
|
fld.l r0(r17), f29
|
|
fld.l r0(r18), f30
|
|
|
|
|
|
fsub.ss f21, f20, f22
|
|
|
|
|
|
fmul.ss f19, f22, f23
|
|
|
|
|
|
fmul.ss f18, f23, f24
|
|
|
|
|
|
fsub.ss f21, f24, f25
|
|
|
|
|
|
fmul.ss f25, f23, f26
|
|
|
|
|
|
fsub.ss f8, f16, f27
|
|
|
|
|
|
fmul.ss f27, f26, f28
|
|
|
|
|
|
fsub.ss f30, f29, f31
|
|
|
|
|
|
fmul.ss f31, f28, f9
|
|
fld.l 4(r17), f11
|
|
fld.l 4(r18), f12
|
|
fadd.ss f29, f9, f10
|
|
|
|
|
|
fsub.ss f12, f11, f13
|
|
fst.l f10, r0(r16)
|
|
|
|
fmul.ss f28, f13, f14
|
|
fld.l 8(r17), f17
|
|
fld.l 8(r18), f20
|
|
fadd.ss f11, f14, f15
|
|
|
|
|
|
fsub.ss f20, f17, f22
|
|
fst.l f15, 4(r16)
|
|
|
|
fmul.ss f28, f22, f19
|
|
fld.l 16(r17), f21
|
|
fld.l 16(r18), f23
|
|
fadd.ss f17, f19, f24
|
|
|
|
|
|
fsub.ss f23, f21, f25
|
|
fst.l f24, 8(r16)
|
|
|
|
fmul.ss f28, f25, f18
|
|
fld.l 20(r17), f26
|
|
fld.l 20(r18), f27
|
|
fadd.ss f21, f18, f16
|
|
|
|
|
|
fsub.ss f27, f26, f30
|
|
fst.l f16, 16(r16)
|
|
|
|
fmul.ss f28, f30, f31
|
|
fld.l 24(r18), f10
|
|
fld.l 24(r17), f29
|
|
fadd.ss f26, f31, f9
|
|
|
|
|
|
fsub.ss f10, f29, f12
|
|
fst.l f9, 20(r16)
|
|
|
|
fmul.ss f28, f12, f13
|
|
|
|
fst.l f8, r29(r16)
|
|
fadd.ss f29, f13, f14
|
|
|
|
bri r1
|
|
fst.l f14, 24(r16)
|
|
//}}}
|
|
|
|
//{{{ _dnc_wait_count
|
|
.globl _dnc_Wait_count
|
|
.align 8
|
|
|
|
// while (*r16 == 0) spin(r17);
|
|
|
|
_dnc_Wait_count::
|
|
or r0, r0, r20
|
|
dnc_Wait_count1::
|
|
adds 1, r20, r20
|
|
st.l r20, 4(r16)
|
|
ld.l r0(r16), r18
|
|
btne r0,r18,.wait_loop
|
|
adds 1,r0,r18
|
|
bri r1
|
|
st.l r18,0(r16)
|
|
|
|
.wait_loop::
|
|
or r17,r0,r19
|
|
adds -1,r0,r18
|
|
bla r18,r19,.wait_spin
|
|
nop
|
|
.wait_spin::
|
|
bla r18,r19,.wait_spin
|
|
nop
|
|
br dnc_Wait_count1
|
|
nop
|
|
|
|
//}}}
|
|
|
|
//{{{ _bla
|
|
.globl _bla
|
|
.align 8
|
|
|
|
// simply loops r16 times, taking 2 x r16 cycles
|
|
_bla::
|
|
adds -1,r0,r17
|
|
bla r17,r16,bla_bla
|
|
nop
|
|
bla_bla::
|
|
bla r17,r16,bla_bla
|
|
nop
|
|
|
|
bri r1
|
|
nop
|
|
//}}}
|
|
|
|
//{{{ _xform_and_project_fn:
|
|
.globl _xform_and_project_fn
|
|
.align 8
|
|
|
|
_xform_and_project_fn:
|
|
.a18 = 0
|
|
.f18 = 96
|
|
orh h%.STACK+.f18-16, r0, r28
|
|
or l%.STACK+.f18-16, r28, r28
|
|
fst.d f2, -72(r28)
|
|
fst.d f4, -64(r28)
|
|
fst.d f6, -56(r28)
|
|
st.l r4, -48(r28)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// lineno: 0
|
|
orh ha%.C00037, r0, r31
|
|
fld.l l%.C00037(r31), f15
|
|
adds -1, r0, r19
|
|
// lineno: 1281
|
|
orh ha%.C00036, r0, r31
|
|
fld.l l%.C00036(r31), f16
|
|
fld.l 172(r16), f17
|
|
fld.l 144(r16), f19
|
|
fld.l 176(r16), f22
|
|
fadd.ss f17, f16, f18
|
|
orh ha%_sub_pixel_correct, r0, r31
|
|
fld.l l%_sub_pixel_correct(r31), f2
|
|
fmul.ss f19, f18, f20
|
|
fld.l 152(r16), f24
|
|
fld.l 164(r16), f26
|
|
fadd.ss f2, f20, f21
|
|
fld.l 128(r16), f27
|
|
fld.l 8(r17), f31
|
|
fst.l f21, -40(r28)
|
|
fadd.ss f22, f16, f23
|
|
orh ha%_Czscale, r0, r31
|
|
fld.l l%_Czscale(r31), f29
|
|
fmul.ss f24, f23, f25
|
|
fld.l 12(r17), f17
|
|
fld.l 24(r17), f18
|
|
fadd.ss f2, f25, f7
|
|
fld.l 28(r17), f20
|
|
fld.l 40(r17), f21
|
|
fmul.ss f27, f26, f28
|
|
fld.l 44(r17), f16
|
|
fld.l 56(r17), f22
|
|
fmul.ss f29, f28, f5
|
|
fld.l 60(r17), f23
|
|
fld.l 16(r17), f11
|
|
fmul.ss f27, f19, f30
|
|
fld.l 32(r17), f12
|
|
fld.l 48(r17), f13
|
|
fst.l f30, -36(r28)
|
|
fmul.ss f27, f24, f6
|
|
fld.l 64(r17), f14
|
|
ld.l 4(r18), r4
|
|
fst.l f31, -4(r28)
|
|
fst.l f17, -8(r28)
|
|
fst.l f18, -12(r28)
|
|
fst.l f20, -16(r28)
|
|
fst.l f21, -20(r28)
|
|
fst.l f16, -24(r28)
|
|
fst.l f22, -28(r28)
|
|
fst.l f23, -32(r28)
|
|
addu 8, r18, r21
|
|
subs 0, r4, r0
|
|
|
|
bnc .B1209
|
|
adds -1, r4, r20
|
|
bla r19, r20,.B1878
|
|
pfmul.dd f0, f0, f0
|
|
// lineno: 1307
|
|
.B1878: //.M0014
|
|
.align 8
|
|
d.pfadd.dd f0, f0, f0
|
|
nop
|
|
.align 8
|
|
.PD0.B1878105:
|
|
d.fnop
|
|
ld.l 76(r21), r18
|
|
d.fnop
|
|
fld.l r0(r21), f16
|
|
.DB.B18781878:
|
|
d.fnop
|
|
fld.l 4(r21), f9
|
|
d.fnop
|
|
fld.l 8(r21), f20
|
|
d.pfmul.ss f16, f11, f0
|
|
and r18, r18, r0
|
|
d.pfmul.ss f9, f12, f0
|
|
fld.l -4(r28), f31
|
|
d.pfmul.ss f20, f13, f0
|
|
bc .not_touched
|
|
d.pfmul.ss f31, f16, f17
|
|
nop
|
|
d.mi2p1.ss f17, f0, f18
|
|
fld.l -12(r28), f31
|
|
d.mm12msm.ss f0, f0, f21
|
|
nop
|
|
d.mm12msm.ss f0, f0, f18
|
|
nop
|
|
d.pfadd.ss f21, f19, f19
|
|
nop
|
|
d.mm12msm.ss f31, f9, f0
|
|
fld.l -20(r28), f21
|
|
d.mm12msm.ss f0, f0, f0
|
|
nop
|
|
d.ia1p2.ss f14, f22, f22
|
|
nop
|
|
d.mm12msm.ss f0, f0, f17
|
|
nop
|
|
d.pfadd.ss f0, f0, f0
|
|
nop
|
|
d.pfadd.ss f0, f0, f23
|
|
nop
|
|
d.frcp.ss f23, f24
|
|
nop
|
|
d.pfmul.ss f23, f24, f0
|
|
nop
|
|
d.ia1p2.ss f18, f17, f0
|
|
nop
|
|
d.mm12msm.ss f21, f20, f0
|
|
fld.l -28(r28), f17
|
|
d.mi2s1.ss f15, f0, f25
|
|
fld.l -36(r28), f18
|
|
d.ia1p2.ss f0, f0, f19
|
|
nop
|
|
d.mi2p1.ss f19, f0, f31
|
|
nop
|
|
d.m12tpa.ss f24, f26, f26
|
|
fld.l -40(r28), f31
|
|
d.mm12msm.ss f0, f0, f0
|
|
fld.l -8(r28), f24
|
|
d.ia1p2.ss f17, f22, f22
|
|
nop
|
|
d.mm12msm.ss f23, f27, f27
|
|
fld.l -16(r28), f17
|
|
d.mm12msm.ss f16, f24, f0
|
|
nop
|
|
d.m12tpa.ss f18, f4, f4
|
|
nop
|
|
d.mi2s1.ss f15, f0, f28
|
|
fld.l -24(r28), f18
|
|
d.mm12msm.ss f0, f0, f22
|
|
nop
|
|
d.mm12msm.ss f9, f17, f21
|
|
nop
|
|
d.m12tpa.ss f20, f18, f29
|
|
nop
|
|
d.pfmul.ss f27, f29, f0
|
|
fld.l -32(r28), f18
|
|
d.mi2p1.ss f22, f0, f24
|
|
nop
|
|
d.mm12msm.ss f0, f0, f28
|
|
nop
|
|
d.mm12msm.ss f21, f30, f30
|
|
nop
|
|
d.ia1p2.ss f28, f16, f16
|
|
nop
|
|
d.mm12msm.ss f5, f30, f0
|
|
nop
|
|
d.mi2p1.ss f31, f0, f25
|
|
nop
|
|
d.ia1p2.ss f18, f17, f17
|
|
nop
|
|
d.mm12msm.ss f0, f0, f24
|
|
fst.l f24, 56(r21)
|
|
d.pfsub.ss f19, f2, f19
|
|
nop
|
|
d.m12tpa.ss f6, f3, f3
|
|
nop
|
|
d.mm12msm.ss f0, f0, f0
|
|
nop
|
|
d.ia1p2.ss f0, f0, f26
|
|
fst.l f26, 48(r21)
|
|
d.pfmul.ss f30, f20, f20
|
|
nop
|
|
d.pfmul.ss f0, f0, f0
|
|
nop
|
|
d.pfmul.ss f0, f0, f0
|
|
nop
|
|
d.mi2p1.ss f7, f0, f29
|
|
nop
|
|
d.pfadd.ss f0, f0, f0
|
|
nop
|
|
d.pfadd.ss f0, f0, f0
|
|
nop
|
|
d.pfsub.ss f27, f2, f27
|
|
nop
|
|
d.pfadd.ss f0, f0, f0
|
|
nop
|
|
d.pfadd.ss f0, f0, f0
|
|
nop
|
|
d.pfadd.ss f0, f0, f23
|
|
fst.l f23, 52(r21)
|
|
d.fiadd.ss f30, f0, f8
|
|
nop
|
|
.not_touched:
|
|
d.fnop
|
|
ld.l 44(r21), r21
|
|
d.fnop
|
|
bla r19, r20, .PD0.B1878105
|
|
d.fnop
|
|
nop
|
|
.align 8
|
|
fnop
|
|
nop
|
|
fnop
|
|
nop
|
|
// lineno: 0
|
|
// lineno: 0
|
|
.B1209: //.B0085
|
|
// lineno: 1321
|
|
|
|
|
|
|
|
|
|
fld.d -72(r28), f2
|
|
fld.d -64(r28), f4
|
|
fld.d -56(r28), f6
|
|
ld.l -48(r28), r4
|
|
bri r1
|
|
nop
|
|
.align 8
|
|
//}}}
|
|
|
|
//{{{ _solve_fn:
|
|
.globl _solve_fn
|
|
.align 8
|
|
|
|
_solve_fn:
|
|
.a16 = 0
|
|
.f16 = 32
|
|
orh h%.STACK+.f16-16, r0, r28
|
|
or l%.STACK+.f16-16, r28, r28
|
|
st.l r4, -8(r28)
|
|
|
|
// lineno: 0
|
|
adds 1, r0, r19
|
|
// lineno: 1403
|
|
fld.d r0(r17), f8
|
|
fld.d 8(r17), f10
|
|
addu 8, r16, r4
|
|
bte 0x0000, r4, .sB1176
|
|
|
|
// lineno: 1410
|
|
.sB1819: //.M0012
|
|
fld.d 32(r4), f16
|
|
.sDB.B18191819:
|
|
fld.d 40(r4), f18
|
|
// plane eqn now in f16 f17 f18 f19,
|
|
// view in f8 f9 f10 f11
|
|
|
|
pfmul.ss f8, f16, f0
|
|
pfmul.ss f9, f17, f0
|
|
pfmul.ss f10, f18, f0
|
|
pfmul.ss f11, f19, f16 // f16=nx*vx
|
|
i2p1.ss f16, f0, f0 // adder 1=nx.vx+ny.vy
|
|
i2ap1.ss f0, f0, f0 // t=nz.vz
|
|
i2pt.ss f0, f0, f0 // adder 1=nz.vz+nw.vw
|
|
pfadd.ss f0, f0, f16 // f16 = first 2
|
|
pfadd.ss f0, f0, f0 // click adder
|
|
i2ap1.ss f16, f0, f0 // adder1=total
|
|
pfadd.ss f0, f0, f0 // click adder
|
|
pfadd.ss f0, f0, f0 // click adder
|
|
pfadd.ss f0, f0, f26 // got it
|
|
|
|
pfle.ss f26, f0, f0
|
|
ld.l 8(r4), r29
|
|
|
|
bnc .sB1178
|
|
st.l r19, 60(r4)
|
|
adds 3, r0, r18
|
|
addu 16, r4, r24
|
|
st.l r19, 76(r29)
|
|
addu 4, r4, r25
|
|
ld.l 12(r4), r30
|
|
|
|
st.l r19, 76(r30)
|
|
|
|
ld.l 16(r4), r22
|
|
|
|
st.l r19, 76(r22)
|
|
|
|
ld.l 4(r4), r23
|
|
|
|
subs r18, r23, r0
|
|
|
|
bnc .sB1181
|
|
mov r24, r20
|
|
mov r25, r21
|
|
// lineno: 1420
|
|
.sB1818: //.M0011
|
|
ld.l 4(r20), r29
|
|
.sDB.B18181818:
|
|
addu 4, r20, r20
|
|
st.l r19, 76(r29)
|
|
adds r19, r18, r18
|
|
ld.l r0(r21), r30
|
|
|
|
subs r18, r30, r0
|
|
|
|
bc.t .sDB.B18181818
|
|
ld.l 4(r20), r29
|
|
// lineno: 0
|
|
// lineno: 1421
|
|
.sB1181: //.B0100
|
|
br .sDB.B11831183
|
|
ld.l r0(r4), r4
|
|
// lineno: 1425
|
|
.sB1178: //.B0098
|
|
st.l r0, 60(r4)
|
|
.sDB.B11781178:
|
|
// lineno: 1427
|
|
.sB1183: //.B0101
|
|
ld.l r0(r4), r4
|
|
.sDB.B11831183:
|
|
|
|
xor 0x0000, r4, r0
|
|
bnc.t .sDB.B18191819
|
|
fld.d 32(r4), f16
|
|
// lineno: 0
|
|
// lineno: 0
|
|
.sB1176: //.B0097
|
|
// lineno: 1428
|
|
|
|
bri r1
|
|
ld.l -8(r28), r4
|
|
//}}}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//{{{ _wait_locked_nonzero
|
|
.globl _wait_locked_nonzero
|
|
.align 8
|
|
|
|
// while (*r16 != 0) spin(r17);
|
|
_wait_locked_nonzero::
|
|
or r0, r0, r20
|
|
wait_locked_nonzero1::
|
|
adds 1, r20, r20
|
|
st.l r20, 4(r16)
|
|
bte 0x0, r16, .wait_locked_exit
|
|
ld.l r0(r16), r18
|
|
bte 0x0, r18, .wait_locked_loop
|
|
.wait_locked_exit::
|
|
bri r1
|
|
nop
|
|
|
|
.wait_locked_loop::
|
|
or r17,r0,r19
|
|
adds -1,r0,r18
|
|
bla r18,r19,.wait_locked_spin
|
|
nop
|
|
.wait_locked_spin::
|
|
bla r18,r19,.wait_locked_spin
|
|
nop
|
|
br wait_locked_nonzero1
|
|
nop
|
|
|
|
//}}}
|
|
|
|
//{{{ _i860_locked_read
|
|
.globl _i860_locked_read
|
|
.align 8
|
|
|
|
_i860_locked_read::
|
|
lock
|
|
ld.l r0(r16), r17
|
|
unlock
|
|
st.l r0, 4(r16)
|
|
bri r1
|
|
mov r17, r16
|
|
|
|
//}}}
|
|
|
|
//{{{ _manual_flush
|
|
|
|
.globl _manual_flush
|
|
.align 8
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_manual_flush::
|
|
mov r1, r17
|
|
ld.c dirbase, r21
|
|
andnot 0x0f00, r21 , r20
|
|
adds -1, r0, r23
|
|
adds -32, r16, r19
|
|
|
|
// flush pass 1
|
|
or 0x800, r20 , r18
|
|
call D_FLUSH
|
|
st.c r18 , dirbase
|
|
// flush pass 2
|
|
or 0x900, r20 , r18
|
|
call D_FLUSH
|
|
st.c r18 , dirbase
|
|
// am i an XP?
|
|
ld.c epsr, r18
|
|
shr 19, r18 , r18
|
|
and 0x07, r18 , r18
|
|
bc RESTORE_DIRBASE
|
|
// flush pass 3
|
|
or 0xa00, r20 , r18
|
|
call D_FLUSH
|
|
st.c r18 , dirbase
|
|
// flush pass 4
|
|
or 0xb00, r20 , r18
|
|
call D_FLUSH
|
|
st.c r18 , dirbase
|
|
RESTORE_DIRBASE::
|
|
st.c r21 , dirbase
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
bri r17
|
|
nop
|
|
|
|
D_FLUSH::
|
|
mov 127, r24
|
|
bla r23 , r24 ,D_FLUSH_LOOP
|
|
mov r19 , r22
|
|
D_FLUSH_LOOP::
|
|
bla r23 , r24 ,D_FLUSH_LOOP
|
|
flush 32( r22 )++
|
|
|
|
bri r1
|
|
nop
|
|
|
|
//}}}
|
|
|
|
//{{{ some data
|
|
.data
|
|
.align 8
|
|
|
|
.C00036: // (16)
|
|
.long 0x3f800000 // 1.00000000E+00
|
|
|
|
.C00037: // (64)
|
|
.long 0x40000000 // 2.00000000E+00
|
|
|
|
.align 16
|
|
.C00038:
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
.long 0x0
|
|
|
|
.C00066: // (64)
|
|
.long 0x3f800000 // 1.00000000E+00
|
|
|
|
.C00067: // (64)
|
|
.long 0xbf800000 // -1.00000000E+00
|
|
|
|
.lcomm .STACK,96
|
|
.lcomm .BSS,32
|
|
|
|
//}}}
|