home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quakeworld_src / client / mathlib68k.s < prev    next >
Encoding:
Text File  |  2000-06-17  |  21.6 KB  |  1,105 lines

  1. * Copyright (C) 1996-1997 Id Software, Inc. 
  2. * This program is free software; you can redistribute it and/or 
  3. * modify it under the terms of the GNU General Public License 
  4. * as published by the Free Software Foundation; either version 2 
  5. * of the License, or (at your option) any later version. 
  6. * This program is distributed in the hope that it will be useful, 
  7. * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  8. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   
  9. * See the GNU General Public License for more details. 
  10. * You should have received a copy of the GNU General Public License 
  11. * along with this program; if not, write to the Free Software 
  12. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
  13.  
  14. **
  15. ** mathlib68k.asm
  16. ** math primitives, M68040/68060 or 68881/68882 (define M881)
  17. ** written by Frank Wille <frank@phoenix.owl.de>
  18. **
  19.  
  20. ; structure mplane_t
  21.         rsreset
  22. normal          rs.l    3
  23. dist            rs.s    1
  24. type            rs.b    1
  25. signbits        rs.b    1
  26.  
  27.  
  28.     code
  29.  
  30.     xref    _Sys_Error
  31.     IFD    STORMC
  32.     xref    _sin__r
  33.     xref    _cos__r
  34.     ELSE
  35.     xref    _sin
  36.     xref    _cos
  37.  
  38.     xdef    _anglemod
  39.     xdef    _anglemod__r
  40.     cnop    0,4
  41. _anglemod:
  42. _anglemod__r:
  43.     setso   4
  44. .a      so.s    1
  45.  
  46. ; a = (360.0/65536) * ((int)(a*(65536/360.0)) & 65535);
  47.     fmove.s .a(sp),fp0
  48.     fmul.d    #$4066c16c16c16c17,fp0 ;(182.04444)double precision required!
  49.     fmove.l fp0,d0
  50.     swap    d0
  51.     clr.w   d0
  52.     swap    d0
  53.     fmove.l d0,fp0
  54.     fmul.s  #0.0054931641,fp0
  55.     rts
  56.  
  57.  
  58.     xdef    _BoxOnPlaneSide
  59.     xdef    _BoxOnPlaneSide__r
  60.     cnop    0,4
  61. _BoxOnPlaneSide:
  62. _BoxOnPlaneSide__r:
  63.     move.l  a2,d1
  64.     fmovem.x fp2-fp6,-(sp)
  65.     setso   4+5*12
  66. .emins  so.l    1
  67. .emaxs  so.l    1
  68. .p      so.l    1
  69.  
  70.     move.l  .p(sp),a2
  71.     move.l  a2,a0                   ; preload normal[0..2]
  72.     fmove.s (a0)+,fp1
  73.     fmove.s (a0)+,fp2
  74.     move.l  .emins(sp),a1
  75.     fmove.s (a0),fp3
  76.     move.l  .emaxs(sp),a0
  77.  
  78. ; switch (p->signbits)
  79.     moveq   #7,d0
  80.     and.b   signbits(a2),d0
  81.     jmp     ([.jtab,pc,d0.w*4])
  82.  
  83. .jtab:  dc.l    .c0,.c1,.c2,.c3,.c4,.c5,.c6,.c7
  84.  
  85. ; dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
  86. ; dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
  87. .c0:    fmove.s (a0)+,fp5
  88.     fmul    fp1,fp5
  89.     fmove.s (a1)+,fp6
  90.     fmul    fp1,fp6
  91.     fmove.s (a1)+,fp0
  92.     fmul    fp2,fp0
  93.     fmove.s (a0)+,fp4
  94.     fadd    fp0,fp5
  95.     fmul    fp2,fp4
  96.     fmove.s (a1)+,fp0
  97.     fadd    fp4,fp6
  98.     fmul    fp3,fp0
  99.     fmove.s (a0)+,fp4
  100.     fadd    fp0,fp5
  101.     fmul    fp3,fp4
  102.     fadd    fp4,fp6
  103.     bra     .1
  104.  
  105. ; dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
  106. ; dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
  107. .c1:    fmove.s (a1)+,fp5
  108.     fmul    fp1,fp5
  109.     fmove.s (a0)+,fp6
  110.     fmul    fp1,fp6
  111.     fmove.s (a0)+,fp0
  112.     fmul    fp2,fp0
  113.     fmove.s (a1)+,fp4
  114.     fadd    fp0,fp5
  115.     fmul    fp2,fp4
  116.     fmove.s (a0)+,fp0
  117.     fadd    fp4,fp6
  118.     fmul    fp3,fp0
  119.     fmove.s (a1)+,fp4
  120.     fadd    fp0,fp5
  121.     fmul    fp3,fp4
  122.     fadd    fp4,fp6
  123.     bra     .1
  124.  
  125. ; dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
  126. ; dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
  127. .c2:    fmove.s (a0)+,fp5
  128.     fmul    fp1,fp5
  129.     fmove.s (a1)+,fp6
  130.     fmul    fp1,fp6
  131.     fmove.s (a1)+,fp0
  132.     fmul    fp2,fp0
  133.     fmove.s (a0)+,fp4
  134.     fadd    fp0,fp5
  135.     fmul    fp2,fp4
  136.     fmove.s (a0)+,fp0
  137.     fadd    fp4,fp6
  138.     fmul    fp3,fp0
  139.     fmove.s (a1)+,fp4
  140.     fadd    fp0,fp5
  141.     fmul    fp3,fp4
  142.     fadd    fp4,fp6
  143.     bra     .1
  144.  
  145. ; dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
  146. ; dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
  147. .c3:    fmove.s (a1)+,fp5
  148.     fmul    fp1,fp5
  149.     fmove.s (a0)+,fp6
  150.     fmul    fp1,fp6
  151.     fmove.s (a1)+,fp0
  152.     fmul    fp2,fp0
  153.     fmove.s (a0)+,fp4
  154.     fadd    fp0,fp5
  155.     fmul    fp2,fp4
  156.     fmove.s (a0)+,fp0
  157.     fadd    fp4,fp6
  158.     fmul    fp3,fp0
  159.     fmove.s (a1)+,fp4
  160.     fadd    fp0,fp5
  161.     fmul    fp3,fp4
  162.     fadd    fp4,fp6
  163.     bra     .1
  164.  
  165. ; dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
  166. ; dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
  167. .c4:    fmove.s (a0)+,fp5
  168.     fmul    fp1,fp5
  169.     fmove.s (a1)+,fp6
  170.     fmul    fp1,fp6
  171.     fmove.s (a0)+,fp0
  172.     fmul    fp2,fp0
  173.     fmove.s (a1)+,fp4
  174.     fadd    fp0,fp5
  175.     fmul    fp2,fp4
  176.     fmove.s (a1)+,fp0
  177.     fadd    fp4,fp6
  178.     fmul    fp3,fp0
  179.     fmove.s (a0)+,fp4
  180.     fadd    fp0,fp5
  181.     fmul    fp3,fp4
  182.     fadd    fp4,fp6
  183.     bra     .1
  184.  
  185. ; dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
  186. ; dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
  187. .c5:    fmove.s (a1)+,fp5
  188.     fmul    fp1,fp5
  189.     fmove.s (a0)+,fp6
  190.     fmul    fp1,fp6
  191.     fmove.s (a0)+,fp0
  192.     fmul    fp2,fp0
  193.     fmove.s (a1)+,fp4
  194.     fadd    fp0,fp5
  195.     fmul    fp2,fp4
  196.     fmove.s (a1)+,fp0
  197.     fadd    fp4,fp6
  198.     fmul    fp3,fp0
  199.     fmove.s (a0)+,fp4
  200.     fadd    fp0,fp5
  201.     fmul    fp3,fp4
  202.     fadd    fp4,fp6
  203.     bra     .1
  204.  
  205. ; dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
  206. ; dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
  207. .c6:    fmove.s (a0)+,fp5
  208.     fmul    fp1,fp5
  209.     fmove.s (a1)+,fp6
  210.     fmul    fp1,fp6
  211.     fmove.s (a1)+,fp0
  212.     fmul    fp2,fp0
  213.     fmove.s (a0)+,fp4
  214.     fadd    fp0,fp5
  215.     fmul    fp2,fp4
  216.     fmove.s (a1)+,fp0
  217.     fadd    fp4,fp6
  218.     fmul    fp3,fp0
  219.     fmove.s (a0)+,fp4
  220.     fadd    fp0,fp5
  221.     fmul    fp3,fp4
  222.     fadd    fp4,fp6
  223.     bra     .1
  224.  
  225. ; dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
  226. ; dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
  227. .c7:    fmove.s (a1)+,fp5
  228.     fmul    fp1,fp5
  229.     fmove.s (a0)+,fp6
  230.     fmul    fp1,fp6
  231.     fmove.s (a1)+,fp0
  232.     fmul    fp2,fp0
  233.     fmove.s (a0)+,fp4
  234.     fadd    fp0,fp5
  235.     fmul    fp2,fp4
  236.     fmove.s (a1)+,fp0
  237.     fadd    fp4,fp6
  238.     fmul    fp3,fp0
  239.     fmove.s (a0)+,fp4
  240.     fadd    fp0,fp5
  241.     fmul    fp3,fp4
  242.     fadd    fp4,fp6
  243.  
  244. .1:
  245. ; if (dist1 >= p->dist) sides = 1;
  246.     fmove.s dist(a2),fp0
  247.     moveq   #0,d0                   ; sides=0
  248.     fcmp    fp0,fp5
  249.     fblt    .2
  250.     moveq   #1,d0                   ; sides=1
  251. .2:
  252. ; if (dist2 < p->dist)  sides |= 2;
  253.     fcmp    fp0,fp6
  254.     fbge    .3
  255.     addq.b  #2,d0                   ; sides|=2
  256.  
  257. .3:     fmovem.x (sp)+,fp2-fp6
  258.     move.l  d1,a2
  259.     rts
  260.  
  261.  
  262.     xdef    _AngleVectors
  263.     xdef    _AngleVectors__r
  264.     cnop    0,4
  265. _AngleVectors:
  266. _AngleVectors__r:
  267.     fmovem.x fp2-fp7,-(sp)
  268.     move.l  a2,-(sp)
  269.     setso   4+6*12+1*4
  270. .angles so.l    1
  271. .forward so.l   1
  272. .right  so.l    1
  273. .up     so.l    1
  274.  
  275.     move.l  .angles(sp),a2
  276.     fmove.s #0.01745329252,fp5      ; M_PI*2 / 360
  277.  
  278. ; angle = angles[PITCH] * (M_PI*2 / 360);
  279. ; sp = sin(angle);
  280. ; cp = cos(angle);
  281.     fmove   fp5,fp2
  282.     fmul.s  (a2)+,fp2
  283.     IFD     M881
  284.     fsincos fp2,fp6:fp3
  285.     ELSE
  286.     fmove.d fp2,-(sp)
  287.     IFD    STORMC
  288.     jsr     _sin__r
  289.     ELSE
  290.     jsr    _sin
  291.     ENDC
  292.     fmove   fp0,fp3                 ; sp
  293.     IFD    STORMC
  294.     jsr     _cos__r
  295.     ELSE
  296.     jsr    _cos
  297.     ENDC
  298.     fmove   fp0,fp6                 ; cp
  299.     ENDC
  300.  
  301. ; angle = angles[YAW] * (M_PI*2 / 360);
  302. ; sy = sin(angle);
  303. ; cy = cos(angle);
  304.     fmove   fp5,fp2
  305.     fmul.s  (a2)+,fp2
  306.     IFD     M881
  307.     fsincos fp2,fp7:fp4
  308.     ELSE
  309.     fmove.d fp2,(sp)
  310.     IFD    STORMC
  311.     jsr     _sin__r
  312.     ELSE
  313.     jsr    _sin
  314.     ENDC
  315.     fmove   fp0,fp4                 ; sy
  316.     IFD    STORMC
  317.     jsr     _cos__r
  318.     ELSE
  319.     jsr    _cos
  320.     ENDC
  321.     fmove   fp0,fp7                 ; cy
  322.     ENDC
  323.  
  324. ; angle = angles[ROLL] * (M_PI*2 / 360);
  325. ; sr = sin(angle);
  326. ; cr = cos(angle);
  327.     fmove   fp5,fp2
  328.     fmul.s  (a2)+,fp2
  329.     IFD     M881
  330.     fsincos fp2,fp5:fp2
  331.     ELSE
  332.     fmove.d fp2,(sp)
  333.     IFD    STORMC
  334.     jsr     _sin__r
  335.     ELSE
  336.     jsr    _sin
  337.     ENDC
  338.     fmove   fp0,fp2                 ; sr
  339.     IFD    STORMC
  340.     jsr     _cos__r
  341.     ELSE
  342.     jsr    _cos
  343.     ENDC
  344.     fmove   fp0,fp5                 ; cr
  345.     addq.w  #8,sp
  346.     ENDC
  347.  
  348. ; forward[0] = cp*cy;
  349. ; forward[1] = cp*sy;
  350. ; forward[2] = -sp;
  351.     fmove   fp6,fp0
  352.     fmul    fp7,fp0
  353.     move.l  .forward(sp),a0
  354.     fmove.s fp0,(a0)+
  355.     fmove   fp6,fp0
  356.     fmul    fp4,fp0
  357.     fneg    fp3,fp1
  358.     fmove.s fp0,(a0)+
  359.     fmove.s fp1,(a0)+
  360.  
  361. ; right[0] = (-1*sr*sp*cy+-1*cr*-sy);
  362. ; right[1] = (-1*sr*sp*sy+-1*cr*cy);
  363. ; right[2] = -1*sr*cp;
  364.     fmove   fp4,fp0
  365.     fmul    fp5,fp0
  366.     fmove   fp2,fp1
  367.     fmul    fp3,fp1
  368.     fmove.d fp7,-(sp)
  369.     fmul    fp1,fp7
  370.     move.l  .right+8(sp),a0
  371.     fsub    fp7,fp0
  372.     fmove.s fp0,(a0)+
  373.     fmul    fp4,fp1
  374.     fmove.d (sp)+,fp7
  375.     fneg    fp5,fp0
  376.     fmul    fp7,fp0
  377.     fsub    fp1,fp0
  378.     fmove.s fp0,(a0)+
  379.     fneg    fp2,fp1
  380.     fmul    fp6,fp1
  381.     fmove.s fp1,(a0)+
  382.  
  383. ; up[0] = (cr*sp*cy+-sr*-sy);
  384. ; up[1] = (cr*sp*sy+-sr*cy);
  385. ; up[2] = cr*cp;
  386.     fmul    fp5,fp3
  387.     fneg    fp4,fp1
  388.     fmove   fp7,fp0
  389.     fmul    fp2,fp1
  390.     fmul    fp3,fp0
  391.     move.l  .up(sp),a0
  392.     fsub    fp1,fp0
  393.     fmul    fp7,fp2
  394.     fmove.s fp0,(a0)+
  395.     fmul    fp4,fp3
  396.     move.l  (sp)+,a2
  397.     fsub    fp2,fp3
  398.     fmove.s fp3,(a0)+
  399.     fmul    fp6,fp5
  400.     fmove.s fp5,(a0)+
  401.     fmovem.x (sp)+,fp2-fp7
  402.     rts
  403.  
  404.  
  405.     xdef    _VectorCompare
  406.     xdef    _VectorCompare__r
  407.     cnop    0,4
  408. _VectorCompare:
  409. _VectorCompare__r:
  410.     setso   4
  411. .v1     so.l    1
  412. .v2     so.l    1
  413.  
  414.     move.l  .v1(sp),a0
  415.     fmove.s (a0)+,fp0
  416.     move.l  .v2(sp),a1
  417.     fcmp.s  (a1)+,fp0
  418.     fbne    .1
  419.     fmove.s (a0)+,fp0
  420.     fcmp.s  (a1)+,fp0
  421.     fbne    .1
  422.     fmove.s (a0),fp0
  423.     fcmp.s  (a1),fp0
  424.     fbne    .1
  425.     moveq   #1,d0
  426.     rts
  427. .1:     moveq   #0,d0
  428.     rts
  429.  
  430.     xdef    _VectorMA
  431.     xdef    _VectorMA__r
  432.     cnop    0,4
  433. _VectorMA:
  434. _VectorMA__r:
  435.     setso   4
  436. .veca   so.l    1
  437. .scale  so.s    1
  438. .vecb   so.l    1
  439. .vecc   so.l    1
  440.  
  441.     move.l  a2,d1
  442.     move.l  .vecb(sp),a1
  443.     fmove.s (a1)+,fp0
  444.     fmove.s .scale(sp),fp1
  445.     fmul    fp1,fp0
  446.     move.l  .veca(sp),a0
  447.     fadd.s  (a0)+,fp0
  448.     move.l  .vecc(sp),a2
  449.     fmove.s fp0,(a2)+
  450.     fmove.s (a1)+,fp0
  451.     fmul    fp1,fp0
  452.     fadd.s  (a0)+,fp0
  453.     fmul.s  (a1),fp1
  454.     fmove.s fp0,(a2)+
  455.     fadd.s  (a0),fp1
  456.     fmove.s fp1,(a2)
  457.     move.l  d1,a2
  458.     rts
  459.  
  460.     xdef    __DotProduct
  461.     xdef    __DotProduct__r
  462.     cnop    0,4
  463. __DotProduct:
  464. __DotProduct__r:
  465.     setso   4
  466. .v1     so.l    1
  467. .v2     so.l    1
  468.  
  469.     move.l  .v1(sp),a0
  470.     fmove.s (a0)+,fp0
  471.     move.l  .v2(sp),a1
  472.     fmul.s  (a1)+,fp0
  473.     fmove.s (a0)+,fp1
  474.     fmul.s  (a1)+,fp1
  475.     fadd    fp1,fp0
  476.     fmove.s (a0),fp1
  477.     fmul.s  (a1)+,fp1
  478.     fadd    fp1,fp0
  479.     rts
  480.  
  481.     xdef    __VectorSubtract
  482.     xdef    __VectorSubtract__r
  483.     cnop    0,4
  484. __VectorSubtract:
  485. __VectorSubtract__r:
  486.     setso   4
  487. .veca   so.l    1
  488. .vecb   so.l    1
  489. .vecc   so.l    1
  490.  
  491.     move.l  .veca(sp),a0
  492.     fmove.s (a0)+,fp0
  493.     move.l  .vecb(sp),a1
  494.     fsub.s  (a1)+,fp0
  495.     move.l  a2,d1
  496.     fmove.s (a0)+,fp1
  497.     move.l  .vecc(sp),a2
  498.     fmove.s fp0,(a2)+
  499.     fsub.s  (a1)+,fp1
  500.     fmove.s (a0),fp0
  501.     fmove.s fp1,(a2)+
  502.     fsub.s  (a1),fp0
  503.     fmove.s fp0,(a2)
  504.     move.l  d1,a2
  505.     rts
  506.  
  507.  
  508.     xdef    __VectorAdd
  509.     xdef    __VectorAdd__r
  510.     cnop    0,4
  511. __VectorAdd:
  512. __VectorAdd__r:
  513.     setso   4
  514. .veca   so.l    1
  515. .vecb   so.l    1
  516. .vecc   so.l    1
  517.  
  518.     move.l  .veca(sp),a0
  519.     fmove.s (a0)+,fp0
  520.     move.l  .vecb(sp),a1
  521.     fadd.s  (a1)+,fp0
  522.     move.l  a2,d1
  523.     fmove.s (a0)+,fp1
  524.     move.l  .vecc(sp),a2
  525.     fmove.s fp0,(a2)+
  526.     fadd.s  (a1)+,fp1
  527.     fmove.s (a0),fp0
  528.     fmove.s fp1,(a2)+
  529.     fadd.s  (a1),fp0
  530.     fmove.s fp0,(a2)
  531.     move.l  d1,a2
  532.     rts
  533.  
  534.  
  535.     xdef    __VectorCopy
  536.     xdef    __VectorCopy__r
  537.     cnop    0,4
  538. __VectorCopy:
  539. __VectorCopy__r:
  540.     setso   4
  541. .in     so.l    1
  542. .out    so.l    1
  543.  
  544.     move.l  .in(sp),a0
  545.     move.l  .out(sp),a1
  546.     move.l  (a0)+,(a1)+
  547.     move.l  (a0)+,(a1)+
  548.     move.l  (a0),(a1)
  549.     rts
  550.  
  551.  
  552.     xdef    _CrossProduct
  553.     xdef    _CrossProduct__r
  554.     cnop    0,4
  555. _CrossProduct:
  556. _CrossProduct__r:
  557.     fmovem.x fp2-fp5,-(sp)
  558.     setso   4+4*12
  559. .v1     so.l    1
  560. .v2     so.l    1
  561. .cross  so.l    1
  562.  
  563. ; cross[0] = v1[1]*v2[2] - v1[2]*v2[1];
  564. ; cross[1] = v1[2]*v2[0] - v1[0]*v2[2];
  565. ; cross[2] = v1[0]*v2[1] - v1[1]*v2[0];
  566.     move.l  a2,d1
  567.     move.l  .v1(sp),a1
  568.     fmove.s (a1)+,fp0
  569.     move.l  .v2(sp),a2
  570.     fmove.s (a2)+,fp1
  571.     fmove.s (a1)+,fp2
  572.     fmove   fp1,fp4
  573.     fmove.s (a2)+,fp3
  574.     fmul    fp2,fp4
  575.     fmove   fp0,fp5
  576.     move.l  .cross(sp),a0
  577.     fmul    fp3,fp5
  578.     add.w   #12,a0
  579.     fsub    fp4,fp5
  580.     fmove.s (a1),fp4
  581.     fmove.s fp5,-(a0)
  582.     fmul    fp4,fp1
  583.     fmove.s (a2),fp5
  584.     fmul    fp5,fp0
  585.     move.l  d1,a2
  586.     fmul    fp4,fp3
  587.     fsub    fp0,fp1
  588.     fmul    fp5,fp2
  589.     fmove.s fp1,-(a0)
  590.     fsub    fp3,fp2
  591.     fmove.s fp2,-(a0)
  592.     fmovem.x (sp)+,fp2-fp5
  593.     rts
  594.  
  595.  
  596.     xdef    _Length
  597.     xdef    _Length__r
  598.     cnop    0,4
  599. _Length:
  600. _Length__r:
  601.     setso   4
  602. .v      so.l    1
  603.  
  604. ; length = 0;
  605. ; for (i=0 ; i< 3 ; i++)
  606. ;   length += v[i]*v[i];
  607. ; length = sqrt (length);
  608.     move.l  .v(sp),a0
  609.     fmove.s (a0)+,fp0
  610.     fmul    fp0,fp0
  611.     fmove.s (a0)+,fp1
  612.     fmul    fp1,fp1
  613.     fadd    fp1,fp0
  614.     fmove.s (a0),fp1
  615.     fmul    fp1,fp1
  616.     fadd    fp1,fp0
  617.     fsqrt   fp0
  618.     rts
  619.  
  620.  
  621.     xdef    _VectorNormalize
  622.     xdef    _VectorNormalize__r
  623.     cnop    0,4
  624. _VectorNormalize:
  625. _VectorNormalize__r:
  626.     fmovem.x fp2-fp4,-(sp)
  627.     setso   4+3*12
  628. .v      so.l    1
  629.  
  630. ; length = v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
  631. ; length = sqrt (length);
  632.     move.l  .v(sp),a0
  633.     fmove.s (a0)+,fp2
  634.     fmove   fp2,fp0
  635.     fmul    fp2,fp0
  636.     fmove.s (a0)+,fp3
  637.     fmove   fp3,fp1
  638.     fmul    fp3,fp1
  639.     fmove.s (a0),fp4
  640.     fadd    fp1,fp0
  641.     fmove   fp4,fp1
  642.     fmul    fp4,fp1
  643.     fadd    fp1,fp0
  644.     fsqrt   fp0
  645.  
  646. ; if (length)
  647. ; {
  648. ;   ilength = 1/length;
  649. ;   v[0] *= ilength;
  650. ;   v[1] *= ilength;
  651. ;   v[2] *= ilength;
  652. ; }
  653.     ftst    fp0
  654.     fbeq    .1
  655.     fmove.s #1.0,fp1
  656.     fdiv    fp0,fp1
  657.     subq.w  #8,a0
  658.     fmul    fp1,fp2
  659.     fmove.s fp2,(a0)+
  660.     fmul    fp1,fp3
  661.     fmove.s fp3,(a0)+
  662.     fmul    fp1,fp4
  663.     fmove.s fp4,(a0)
  664. .1:     fmovem.x (sp)+,fp2-fp4
  665.     rts
  666.  
  667.  
  668.     xdef    _VectorInverse
  669.     xdef    _VectorInverse__r
  670.     cnop    0,4
  671. _VectorInverse:
  672. _VectorInverse__r:
  673.     setso   4
  674. .v      so.l    1
  675.  
  676. ; v[0] = -v[0];
  677. ; v[1] = -v[1];
  678. ; v[2] = -v[2];
  679.     move.l  .v(sp),a0
  680.     fneg.s  (a0),fp0
  681.     fmove.s fp0,(a0)+
  682.     fneg.s  (a0),fp0
  683.     fmove.s fp0,(a0)+
  684.     fneg.s  (a0),fp0
  685.     fmove.s fp0,(a0)
  686.     rts
  687.  
  688.  
  689.     xdef    _VectorScale
  690.     xdef    _VectorScale__r
  691.     cnop    0,4
  692. _VectorScale:
  693. _VectorScale__r:
  694.     setso   4
  695. .in     so.l    1
  696. .scale  so.l    1
  697. .out    so.l    1
  698.  
  699. ; out[0] = in[0]*scale;
  700. ; out[1] = in[1]*scale;
  701. ; out[2] = in[2]*scale;
  702.     fmove.s .scale(sp),fp1
  703.     move.l  .in(sp),a0
  704.     fmove.s (a0)+,fp0
  705.     fmul    fp1,fp0
  706.     move.l  .out(sp),a1
  707.     fmove.s fp0,(a1)+
  708.     fmove.s (a0)+,fp0
  709.     fmul    fp1,fp0
  710.     fmove.s fp0,(a1)+
  711.     fmul.s  (a0),fp1
  712.     fmove.s fp1,(a1)
  713.     rts
  714.  
  715.  
  716.     xdef    _Q_log2
  717.     xdef    _Q_log2__r
  718.     cnop    0,4
  719. _Q_log2:
  720. _Q_log2__r:
  721.     setso   4
  722. .val    so.l    1
  723.  
  724. ; int answer=0;
  725. ; while (val>>=1) answer++;
  726.     moveq   #-1,d0
  727. .1:     addq.l  #1,d0
  728.     asr.l   #1,d0
  729.     bne.b   .1
  730.     rts
  731.  
  732.     xdef    _R_ConcatRotations
  733.     xdef    _R_ConcatRotations__r
  734.     cnop    0,4
  735. _R_ConcatRotations:
  736. _R_ConcatRotations__r:
  737.     fmovem.x fp2/fp4/fp5/fp6,-(sp)
  738.     move.l  a2,d1
  739.     setso   4+4*12
  740. .in1    so.l    1
  741. .in2    so.l    1
  742. .out    so.l    1
  743.  
  744.     move.l  .in1(sp),a0
  745.     move.l  .in2(sp),a1
  746.     move.l  .out(sp),a2
  747.  
  748. ; out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + in1[0][2] * in2[2][0];
  749. ; out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + in1[0][2] * in2[2][1];
  750. ; out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + in1[0][2] * in2[2][2];
  751.     fmove.s (a0)+,fp4
  752.     fmove   fp4,fp0
  753.     fmul.s  (0*12+0*4,a1),fp0
  754.     fmove.s (a0)+,fp5
  755.     fmove   fp5,fp1
  756.     fmul.s  (1*12+0*4,a1),fp1
  757.     fmove.s (a0)+,fp6
  758.     fmove   fp6,fp2
  759.     fmul.s  (2*12+0*4,a1),fp2
  760.     fadd    fp0,fp1
  761.     fmove   fp4,fp0
  762.     fmul.s  (0*12+1*4,a1),fp0
  763.     fadd    fp1,fp2
  764.     fmove   fp5,fp1
  765.     fmul.s  (1*12+1*4,a1),fp1
  766.     fmove.s fp2,(a2)+
  767.     fmove   fp6,fp2
  768.     fmul.s  (2*12+1*4,a1),fp2
  769.     fadd    fp0,fp1
  770.     fmul.s  (0*12+2*4,a1),fp4
  771.     fadd    fp1,fp2
  772.     fmul.s  (1*12+2*4,a1),fp5
  773.     fmove.s fp2,(a2)+
  774.     fadd    fp4,fp5
  775.     fmul.s  (2*12+2*4,a1),fp6
  776.     fadd    fp5,fp6
  777.     fmove.s fp6,(a2)+
  778.  
  779. ; out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] + in1[1][2] * in2[2][0];
  780. ; out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] + in1[1][2] * in2[2][1];
  781. ; out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] + in1[1][2] * in2[2][2];
  782.     fmove.s (a0)+,fp4
  783.     fmove   fp4,fp0
  784.     fmul.s  (0*12+0*4,a1),fp0
  785.     fmove.s (a0)+,fp5
  786.     fmove   fp5,fp1
  787.     fmul.s  (1*12+0*4,a1),fp1
  788.     fmove.s (a0)+,fp6
  789.     fmove   fp6,fp2
  790.     fmul.s  (2*12+0*4,a1),fp2
  791.     fadd    fp0,fp1
  792.     fmove   fp4,fp0
  793.     fmul.s  (0*12+1*4,a1),fp0
  794.     fadd    fp1,fp2
  795.     fmove   fp5,fp1
  796.     fmul.s  (1*12+1*4,a1),fp1
  797.     fmove.s fp2,(a2)+
  798.     fmove   fp6,fp2
  799.     fmul.s  (2*12+1*4,a1),fp2
  800.     fadd    fp0,fp1
  801.     fmul.s  (0*12+2*4,a1),fp4
  802.     fadd    fp1,fp2
  803.     fmul.s  (1*12+2*4,a1),fp5
  804.     fmove.s fp2,(a2)+
  805.     fadd    fp4,fp5
  806.     fmul.s  (2*12+2*4,a1),fp6
  807.     fadd    fp5,fp6
  808.     fmove.s fp6,(a2)+
  809.  
  810. ; out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] + in1[2][2] * in2[2][0];
  811. ; out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + in1[2][2] * in2[2][1];
  812. ; out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + in1[2][2] * in2[2][2];
  813.     fmove.s (a0)+,fp4
  814.     fmove   fp4,fp0
  815.     fmul.s  (0*12+0*4,a1),fp0
  816.     fmove.s (a0)+,fp5
  817.     fmove   fp5,fp1
  818.     fmul.s  (1*12+0*4,a1),fp1
  819.     fmove.s (a0)+,fp6
  820.     fmove   fp6,fp2
  821.     fmul.s  (2*12+0*4,a1),fp2
  822.     fadd    fp0,fp1
  823.     fmove   fp4,fp0
  824.     fmul.s  (0*12+1*4,a1),fp0
  825.     fadd    fp1,fp2
  826.     fmove   fp5,fp1
  827.     fmul.s  (1*12+1*4,a1),fp1
  828.     fmove.s fp2,(a2)+
  829.     fmove   fp6,fp2
  830.     fmul.s  (2*12+1*4,a1),fp2
  831.     fadd    fp0,fp1
  832.     fmul.s  (0*12+2*4,a1),fp4
  833.     fadd    fp1,fp2
  834.     fmul.s  (1*12+2*4,a1),fp5
  835.     fmove.s fp2,(a2)+
  836.     fadd    fp4,fp5
  837.     fmul.s  (2*12+2*4,a1),fp6
  838.     fadd    fp5,fp6
  839.     fmove.s fp6,(a2)+
  840.  
  841.     move.l  d1,a2
  842.     fmovem.x (sp)+,fp2/fp4/fp5/fp6
  843.     rts
  844.  
  845.  
  846.     xdef    _R_ConcatTransforms
  847.     xdef    _R_ConcatTransforms__r
  848.     cnop    0,4
  849. _R_ConcatTransforms:
  850. _R_ConcatTransforms__r:
  851.     fmovem.x fp2/fp4/fp5/fp6,-(sp)
  852.     move.l  a2,d1
  853.     setso   4+4*12
  854. .in1    so.l    1
  855. .in2    so.l    1
  856. .out    so.l    1
  857.  
  858.     move.l  .in1(sp),a0
  859.     move.l  .in2(sp),a1
  860.     move.l  .out(sp),a2
  861.  
  862. ; out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + in1[0][2] * in2[2][0];
  863. ; out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + in1[0][2] * in2[2][1];
  864. ; out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + in1[0][2] * in2[2][2];
  865. ; out[0][3] = in1[0][0] * in2[0][3] + in1[0][1] * in2[1][3] + in1[0][2] * in2[2][3] + in1[0][3];
  866.     fmove.s (a0)+,fp4
  867.     fmove   fp4,fp0
  868.     fmul.s  (0*16+0*4,a1),fp0
  869.     fmove.s (a0)+,fp5
  870.     fmove   fp5,fp1
  871.     fmul.s  (1*16+0*4,a1),fp1
  872.     fmove.s (a0)+,fp6
  873.     fmove   fp6,fp2
  874.     fmul.s  (2*16+0*4,a1),fp2
  875.     fadd    fp0,fp1
  876.     fmove   fp4,fp0
  877.     fmul.s  (0*16+1*4,a1),fp0
  878.     fadd    fp1,fp2
  879.     fmove   fp5,fp1
  880.     fmul.s  (1*16+1*4,a1),fp1
  881.     fmove.s fp2,(a2)+
  882.     fmove   fp6,fp2
  883.     fmul.s  (2*16+1*4,a1),fp2
  884.     fadd    fp0,fp1
  885.     fmove   fp4,fp0
  886.     fmul.s  (0*16+2*4,a1),fp0
  887.     fadd    fp1,fp2
  888.     fmove   fp5,fp1
  889.     fmul.s  (1*16+2*4,a1),fp1
  890.     fmove.s fp2,(a2)+
  891.     fmove   fp6,fp2
  892.     fmul.s  (2*16+2*4,a1),fp2
  893.     fadd    fp0,fp1
  894.     fmul.s  (0*16+3*4,a1),fp4
  895.     fadd    fp1,fp2
  896.     fmul.s  (1*16+3*4,a1),fp5
  897.     fmove.s fp2,(a2)+
  898.     fadd    fp4,fp5
  899.     fmul.s  (2*16+3*4,a1),fp6
  900.     fadd.s  (a0)+,fp5
  901.     fadd    fp5,fp6
  902.     fmove.s fp6,(a2)+
  903.  
  904. ; out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] + in1[1][2] * in2[2][0];
  905. ; out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] + in1[1][2] * in2[2][1];
  906. ; out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] + in1[1][2] * in2[2][2];
  907. ; out[1][3] = in1[1][0] * in2[0][3] + in1[1][1] * in2[1][3] + in1[1][2] * in2[2][3] + in1[1][3];
  908.     fmove.s (a0)+,fp4
  909.     fmove   fp4,fp0
  910.     fmul.s  (0*16+0*4,a1),fp0
  911.     fmove.s (a0)+,fp5
  912.     fmove   fp5,fp1
  913.     fmul.s  (1*16+0*4,a1),fp1
  914.     fmove.s (a0)+,fp6
  915.     fmove   fp6,fp2
  916.     fmul.s  (2*16+0*4,a1),fp2
  917.     fadd    fp0,fp1
  918.     fmove   fp4,fp0
  919.     fmul.s  (0*16+1*4,a1),fp0
  920.     fadd    fp1,fp2
  921.     fmove   fp5,fp1
  922.     fmul.s  (1*16+1*4,a1),fp1
  923.     fmove.s fp2,(a2)+
  924.     fmove   fp6,fp2
  925.     fmul.s  (2*16+1*4,a1),fp2
  926.     fadd    fp0,fp1
  927.     fmove   fp4,fp0
  928.     fmul.s  (0*16+2*4,a1),fp0
  929.     fadd    fp1,fp2
  930.     fmove   fp5,fp1
  931.     fmul.s  (1*16+2*4,a1),fp1
  932.     fmove.s fp2,(a2)+
  933.     fmove   fp6,fp2
  934.     fmul.s  (2*16+2*4,a1),fp2
  935.     fadd    fp0,fp1
  936.     fmul.s  (0*16+3*4,a1),fp4
  937.     fadd    fp1,fp2
  938.     fmul.s  (1*16+3*4,a1),fp5
  939.     fmove.s fp2,(a2)+
  940.     fadd    fp4,fp5
  941.     fmul.s  (2*16+3*4,a1),fp6
  942.     fadd.s  (a0)+,fp5
  943.     fadd    fp5,fp6
  944.     fmove.s fp6,(a2)+
  945.  
  946. ; out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] + in1[2][2] * in2[2][0];
  947. ; out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + in1[2][2] * in2[2][1];
  948. ; out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + in1[2][2] * in2[2][2];
  949. ; out[2][3] = in1[2][0] * in2[0][3] + in1[2][1] * in2[1][3] + in1[2][2] * in2[2][3] + in1[2][3];
  950.     fmove.s (a0)+,fp4
  951.     fmove   fp4,fp0
  952.     fmul.s  (0*16+0*4,a1),fp0
  953.     fmove.s (a0)+,fp5
  954.     fmove   fp5,fp1
  955.     fmul.s  (1*16+0*4,a1),fp1
  956.     fmove.s (a0)+,fp6
  957.     fmove   fp6,fp2
  958.     fmul.s  (2*16+0*4,a1),fp2
  959.     fadd    fp0,fp1
  960.     fmove   fp4,fp0
  961.     fmul.s  (0*16+1*4,a1),fp0
  962.     fadd    fp1,fp2
  963.     fmove   fp5,fp1
  964.     fmul.s  (1*16+1*4,a1),fp1
  965.     fmove.s fp2,(a2)+
  966.     fmove   fp6,fp2
  967.     fmul.s  (2*16+1*4,a1),fp2
  968.     fadd    fp0,fp1
  969.     fmove   fp4,fp0
  970.     fmul.s  (0*16+2*4,a1),fp0
  971.     fadd    fp1,fp2
  972.     fmove   fp5,fp1
  973.     fmul.s  (1*16+2*4,a1),fp1
  974.     fmove.s fp2,(a2)+
  975.     fmove   fp6,fp2
  976.     fmul.s  (2*16+2*4,a1),fp2
  977.     fadd    fp0,fp1
  978.     fmul.s  (0*16+3*4,a1),fp4
  979.     fadd    fp1,fp2
  980.     fmul.s  (1*16+3*4,a1),fp5
  981.     fmove.s fp2,(a2)+
  982.     fadd    fp4,fp5
  983.     fmul.s  (2*16+3*4,a1),fp6
  984.     fadd.s  (a0)+,fp5
  985.     fadd    fp5,fp6
  986.     fmove.s fp6,(a2)+
  987.  
  988.     move.l  d1,a2
  989.     fmovem.x (sp)+,fp2/fp4/fp5/fp6
  990.     rts
  991.  
  992.  
  993.     xdef    _FloorDivMod
  994.     xdef    _FloorDivMod__r
  995.     cnop    0,4
  996. _FloorDivMod:
  997. _FloorDivMod__r:
  998.     setso   4+4
  999. .numer  so.d    1
  1000. .denom  so.d    1
  1001. .quot   so.l    1
  1002. .rem    so.l    1
  1003.  
  1004. ; set rounding mode towards minus infinity
  1005.     fmove.l fpcr,d0
  1006.     move.l  d0,-(sp)
  1007.     moveq   #%10,d1
  1008.     bfins   d1,d0{26:2}
  1009.     fmove.l d0,fpcr
  1010.  
  1011. ; if (numer >= 0.0)
  1012.     fmove.d .numer(sp),fp0
  1013.     fmove.d .denom(sp),fp1
  1014.     ftst    fp0
  1015.     fblt    .1
  1016.  
  1017. ; x = floor(numer / denom);
  1018. ; q = (int)x;
  1019. ; r = (int)floor(numer - (x * denom));
  1020.     fdiv    fp1,fp0
  1021.     move.l  .quot(sp),a0
  1022.     move.l  .rem(sp),a1
  1023.     fmove.l fp0,(a0)
  1024.     fmul.l  (a0),fp1
  1025.     fmove.d .numer(sp),fp0
  1026.     fsub    fp1,fp0
  1027.     fmove.l fp0,(a1)
  1028.     fmove.l (sp)+,fpcr
  1029.     rts
  1030.  
  1031. ; else /* numer < 0.0) */
  1032. .1:
  1033. ; x = floor(-numer / denom);
  1034. ; q = -(int)x;
  1035. ; r = (int)floor(-numer - (x * denom));
  1036.     fmovem.x fp2/fp3,-(sp)
  1037.     fneg    fp0
  1038.     fmove   fp0,fp2
  1039.     fdiv    fp1,fp0
  1040.     move.l  .quot+2*12(sp),a0
  1041.     move.l  .rem+2*12(sp),a1
  1042.     fmove.l fp0,d0
  1043.     fmove   fp1,fp3
  1044.     fmul.l  d0,fp1
  1045.     neg.l   d0
  1046.     fsub    fp1,fp2
  1047.     move.l  d0,(a0)
  1048.     fmove.l fp2,d0
  1049.     move.l  d0,d1
  1050.     beq.b   .2
  1051.     fmove.l fp3,d1
  1052.     subq.l  #1,(a0)
  1053.     sub.l   d0,d1
  1054. .2:     move.l  d1,(a1)
  1055.     fmovem.x (sp)+,fp2/fp3
  1056.     fmove.l (sp)+,fpcr
  1057.     rts
  1058.     
  1059.  
  1060.     xdef    _GreatestCommonDivisor
  1061.     xdef    _GreatestCommonDivisor__r
  1062.     cnop    0,4
  1063. _GreatestCommonDivisor:
  1064. _GreatestCommonDivisor__r:
  1065.     setso   4
  1066. .i1     so.l    1
  1067. .i2     so.l    1
  1068.  
  1069.     move.l  .i1(sp),d1
  1070.     move.l  d2,a0
  1071.     move.l  .i2(sp),d0
  1072.     bra.b   .2
  1073. .1:     move.l  d0,d2
  1074.     divsl.l d1,d0:d2
  1075. .2:     cmp.l   d1,d0
  1076.     bge.b   .3
  1077.     exg     d0,d1
  1078. .3:     tst.l   d1
  1079.     bne.b   .1
  1080.     move.l  a0,d2
  1081.     rts
  1082.  
  1083.  
  1084.     xdef    _Invert24To16
  1085.     xdef    _Invert24To16__r
  1086.     cnop    0,4
  1087. _Invert24To16:
  1088. _Invert24To16__r:
  1089.     move.l  4(sp),d0
  1090.     cmp.l   #256,d0
  1091.     blt.b   .1
  1092.     fmove.d #$4270000000000000,fp0
  1093.     fdiv.l  d0,fp0
  1094.     fadd.d  #0.5,fp0
  1095.     fmove.l fp0,d0
  1096.     rts
  1097. .1:     moveq   #-1,d0
  1098.     rts
  1099.