//{{{ 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 //}}}