home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quakeworld_src / client / mathlibppc.s < prev    next >
Encoding:
Text File  |  2000-06-17  |  13.1 KB  |  604 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. # Quake for AMIGA
  16. #
  17. # mathlibPPC.s
  18. #
  19. # Define WOS for PowerOpen ABI, otherwise SVR4-ABI is used.
  20. #
  21.  
  22. .include        "macrosPPC.i"
  23.  
  24. #
  25. # external references
  26. #
  27.  
  28.     xrefv    c0
  29.     xrefv    c0_5
  30.     xrefv    INT2DBL_0
  31.  
  32.     xrefv    sin
  33.     xrefv    cos
  34.  
  35.  
  36. #
  37. # defines
  38. #
  39.  
  40. .set MPLANE_NORMAL,0
  41. .set MPLANE_DIST,12
  42. .set MPLANE_TYPE,16
  43. .set MPLANE_SIGNBITS,17
  44. .set MPLANE_SIZEOF,20
  45.  
  46. .set PITCH,0
  47. .set YAW,1
  48. .set ROLL,2
  49.  
  50.  
  51.  
  52.  
  53.  
  54. ###########################################################################
  55. #
  56. #       float anglemod(float a)
  57. #
  58. ###########################################################################
  59.  
  60.     funcdef    anglemod
  61.  
  62. # a = (360.0/65536) * ((int)(a*(65536/360.0)) & 65535);
  63.     stwu    r1,-32(r1)
  64.     lf    f2,c64kDIV360    # must be a double precision constant!
  65.     fmul    f1,f1,f2
  66.     fctiwz    f0,f1
  67.     stfd    f0,24(r1)
  68.     lhz    r3,30(r1)
  69.     lis    r11,0x43300000@h
  70.     stw    r11,24(r1)
  71.     xoris    r11,r3,0x80000000@h
  72.     stw    r11,28(r1)
  73.     lfd    f1,24(r1)
  74.     lf    f2,INT2DBL_0
  75.     fsub    f1,f1,f2
  76.     ls    f2,c360DIV64k
  77.     fmul    f1,f1,f2
  78.     addi    r1,r1,32
  79.     blr
  80.  
  81.     funcend    anglemod
  82.  
  83.  
  84.  
  85.  
  86. ###########################################################################
  87. #
  88. #       int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, mplane_t *p)
  89. #
  90. ###########################################################################
  91.  
  92.     funcdef    BoxOnPlaneSide
  93.  
  94.     lbz     r0,MPLANE_SIGNBITS(r5)
  95.     lfs     f1,0(r5)                #f1 = p->normal[0]
  96.     lfs     f2,4(r5)                #f2 = p->normal[1]
  97.     cmplwi  r0,3
  98.     lfs     f3,8(r5)                #f3 = p->normal[2]
  99.     lfs     f4,0(r3)                #f4 = emins[0]
  100.     cmplwi  cr1,r0,5
  101.     lfs     f5,0(r4)                #f5 = emaxs[0]
  102.     lfs     f6,4(r3)                #f6 = emins[1]
  103.     cmplwi  cr2,r0,7
  104.     lfs     f7,4(r4)                #f7 = emaxs[1]
  105.     lfs     f8,8(r3)                #f8 = emins[2]
  106.     cmplwi  cr3,r0,1
  107.     lfs     f9,8(r4)                #f9 = emaxs[2]
  108.     ble     .lower
  109. .upper:
  110.     blt     cr1,.c4
  111.     beq     cr1,.c5
  112.     blt     cr2,.c6
  113.     beq     cr2,.c7
  114.     trap
  115. .lower:
  116.     beq     .c3
  117.     bgt     cr3,.c2
  118.     beq     cr3,.c1
  119. .c0:
  120.     fmuls   f10,f5,f1               #f10 = p->normal[0]*emaxs[0]
  121.     fmuls   f11,f4,f1               #f11 = p->normal[0]*emins[0]
  122.     fmadd   f10,f2,f7,f10           #f10+= p->normal[1]*emaxs[1]
  123.     fmadd   f11,f2,f6,f11           #f11+= p->normal[1]*emins[1]
  124.     fmadd   f10,f3,f9,f10           #f10+= p->normal[2]*emaxs[2]
  125.     fmadd   f11,f3,f8,f11           #f11+= p->normal[2]*emins[2]
  126.     b       .cont
  127. .c1:
  128.     fmuls   f10,f4,f1               #f10 = p->normal[0]*emins[0]
  129.     fmuls   f11,f5,f1               #f11 = p->normal[0]*emaxs[0]
  130.     fmadd   f10,f2,f7,f10           #f10+= p->normal[1]*emaxs[1]
  131.     fmadd   f11,f2,f6,f11           #f11+= p->normal[1]*emins[1]
  132.     fmadd   f10,f3,f9,f10           #f10+= p->normal[2]*emaxs[2]
  133.     fmadd   f11,f3,f8,f11           #f11+= p->normal[2]*emins[2]
  134.     b       .cont
  135. .c2:
  136.     fmuls   f10,f5,f1               #f10 = p->normal[0]*emaxs[0]
  137.     fmuls   f11,f4,f1               #f11 = p->normal[0]*emins[0]
  138.     fmadd   f10,f2,f6,f10           #f10+= p->normal[1]*emins[1]
  139.     fmadd   f11,f2,f7,f11           #f11+= p->normal[1]*emaxs[1]
  140.     fmadd   f10,f3,f9,f10           #f10+= p->normal[2]*emaxs[2]
  141.     fmadd   f11,f3,f8,f11           #f11+= p->normal[2]*emins[2]
  142.     b       .cont
  143. .c3:
  144.     fmuls   f10,f4,f1               #f10 = p->normal[0]*emins[0]
  145.     fmuls   f11,f5,f1               #f11 = p->normal[0]*emaxs[0]
  146.     fmadd   f10,f2,f6,f10           #f10+= p->normal[1]*emins[1]
  147.     fmadd   f11,f2,f7,f11           #f11+= p->normal[1]*emaxs[1]
  148.     fmadd   f10,f3,f9,f10           #f10+= p->normal[2]*emaxs[2]
  149.     fmadd   f11,f3,f8,f11           #f11+= p->normal[2]*emins[2]
  150.     b       .cont
  151. .c4:
  152.     fmuls   f10,f5,f1               #f10 = p->normal[0]*emaxs[0]
  153.     fmuls   f11,f4,f1               #f11 = p->normal[0]*emins[0]
  154.     fmadd   f10,f2,f7,f10           #f10+= p->normal[1]*emaxs[1]
  155.     fmadd   f11,f2,f6,f11           #f11+= p->normal[1]*emins[1]
  156.     fmadd   f10,f3,f8,f10           #f10+= p->normal[2]*emins[2]
  157.     fmadd   f11,f3,f9,f11           #f11+= p->normal[2]*emaxs[2]
  158.     b       .cont
  159. .c5:
  160.     fmuls   f10,f4,f1               #f10 = p->normal[0]*emins[0]
  161.     fmuls   f11,f5,f1               #f11 = p->normal[0]*emaxs[0]
  162.     fmadd   f10,f2,f7,f10           #f10+= p->normal[1]*emaxs[1]
  163.     fmadd   f11,f2,f6,f11           #f11+= p->normal[1]*emins[1]
  164.     fmadd   f10,f3,f8,f10           #f10+= p->normal[2]*emins[2]
  165.     fmadd   f11,f3,f9,f11           #f11+= p->normal[2]*emaxs[2]
  166.     b       .cont
  167. .c6:
  168.     fmuls   f10,f5,f1               #f10 = p->normal[0]*emaxs[0]
  169.     fmuls   f11,f4,f1               #f11 = p->normal[0]*emins[0]
  170.     fmadd   f10,f2,f6,f10           #f10+= p->normal[1]*eminx[1]
  171.     fmadd   f11,f2,f7,f11           #f11+= p->normal[1]*emaxs[1]
  172.     fmadd   f10,f3,f8,f10           #f10+= p->normal[2]*emins[2]
  173.     fmadd   f11,f3,f9,f11           #f11+= p->normal[2]*emaxs[2]
  174.     b       .cont
  175. .c7:
  176.     fmuls   f10,f4,f1               #f10 = p->normal[0]*emins[0]
  177.     fmuls   f11,f5,f1               #f11 = p->normal[0]*emaxs[0]
  178.     fmadd   f10,f2,f6,f10           #f10+= p->normal[1]*eminx[1]
  179.     fmadd   f11,f2,f7,f11           #f11+= p->normal[1]*emaxs[1]
  180.     fmadd   f10,f3,f8,f10           #f10+= p->normal[2]*emins[2]
  181.     fmadd   f11,f3,f9,f11           #f11+= p->normal[2]*emaxs[2]
  182. .cont:
  183.     lfs     f0,MPLANE_DIST(r5)
  184.     fcmpo   cr0,f10,f0
  185.     blt     .cont2
  186.     li      r3,1
  187. .cont2:
  188.     fcmpo   cr0,f11,f0
  189.     bge     .cont3
  190.     ori     r3,r3,2
  191. .cont3:
  192.     blr
  193.  
  194.     funcend    BoxOnPlaneSide
  195.  
  196.  
  197.  
  198.  
  199. ###########################################################################
  200. #
  201. #       void AngleVectors (vec3_t angles, vec3_t forward, vec3_t right,
  202. #                           vec3_t up)
  203. #
  204. ###########################################################################
  205.  
  206.     funcdef    AngleVectors
  207.  
  208.     init    0,128,4,6
  209.     stmw    r28,gb(r1)
  210.     stfd    f14,fb+0*8(r1)
  211.     stfd    f15,fb+1*8(r1)
  212.     stfd    f16,fb+2*8(r1)
  213.     stfd    f17,fb+3*8(r1)
  214.     stfd    f18,fb+4*8(r1)
  215.     stfd    f19,fb+5*8(r1)
  216.  
  217.     mr      r31,r3
  218.     mr      r30,r4
  219.     mr      r29,r5
  220.     mr      r28,r6
  221.     ls    f19,c1DEGREE
  222.     lfs     f14,YAW*4(r31)
  223.     fmuls   f14,f14,f19
  224.     fmr     f1,f14
  225.     call    sin
  226.     fmr     f15,f1                  #f15 = sy
  227.     fmr     f1,f14
  228.     call    cos
  229.     fmr     f16,f1                  #f16 = cy
  230.     lfs     f14,PITCH*4(r31)
  231.     fmuls   f14,f14,f19
  232.     fmr     f1,f14
  233.     call    sin
  234.     fmr     f17,f1                  #f17 = sp
  235.     fmr     f1,f14
  236.     call    cos
  237.     fmr     f18,f1                  #f18 = cp
  238.     lfs     f14,ROLL*4(r31)
  239.     fmuls   f14,f14,f19
  240.     fmr     f1,f14
  241.     call    sin
  242.     fmr     f19,f1                  #f19 = sr
  243.     fmr     f1,f14
  244.     call    cos
  245.     fmr     f14,f1                  #f14 = cr
  246.     fmuls   f0,f18,f16
  247.     stfs    f0,0(r30)
  248.     fmuls   f1,f18,f15
  249.     stfs    f1,4(r30)
  250.     fneg    f2,f17                  #f2 = -sp
  251.     stfs    f2,8(r30)
  252.     fmuls   f3,f19,f16              #f3 = sr * cy
  253.     fmuls   f4,f19,f15              #f4 = sr * sy
  254.     fmuls   f5,f14,f15              #f5 = cr * sy
  255.     fmuls   f6,f14,f16              #f6 = cr * cy
  256.     fmadds  f7,f3,f2,f5
  257.     stfs    f7,0(r29)
  258.     fmsubs  f8,f4,f2,f6
  259.     stfs    f8,4(r29)
  260.     fmuls   f9,f18,f19
  261.     fneg    f9,f9
  262.     stfs    f9,8(r29)
  263.     fmadds  f7,f6,f17,f4
  264.     stfs    f7,0(r28)
  265.     fmsubs  f8,f5,f17,f3
  266.     stfs    f8,4(r28)
  267.     fmuls   f9,f14,f18
  268.     stfs    f9,8(r28)
  269.  
  270.     lfd    f14,fb+0*8(r1)
  271.     lfd    f15,fb+1*8(r1)
  272.     lfd    f16,fb+2*8(r1)
  273.     lfd    f17,fb+3*8(r1)
  274.     lfd    f18,fb+4*8(r1)
  275.     lfd    f19,fb+5*8(r1)
  276.     lmw    r28,gb(r1)
  277.     exit
  278.  
  279.     funcend    AngleVectors
  280.  
  281.  
  282.  
  283.  
  284. ###########################################################################
  285. #
  286. #       void VectorMA (vec3_t veca, float scale, vec3_t vecb, vec3_t vecc)
  287. #
  288. ###########################################################################
  289.  
  290.     funcdef    VectorMA
  291.  
  292.     lfs     f3,0(r3)
  293.     lfs     f2,0(r4)
  294.     fmadds  f0,f1,f2,f3
  295.     stfs    f0,0(r5)
  296.     lfs     f3,4(r3)
  297.     lfs     f2,4(r4)
  298.     fmadds  f0,f1,f2,f3
  299.     stfs    f0,4(r5)
  300.     lfs     f3,8(r3)
  301.     lfs     f2,8(r4)
  302.     fmadds  f0,f1,f2,f3
  303.     stfs    f0,8(r5)
  304.     blr
  305.  
  306.     funcend    VectorMA
  307.  
  308.  
  309.  
  310.  
  311. ###########################################################################
  312. #
  313. #       vec_t _DotProduct (vec3_t v1, vec3_t v2)
  314. #
  315. ###########################################################################
  316.  
  317.     funcdef    DotProduct
  318.  
  319.     lfs     f1,0(r3)
  320.     lfs     f2,0(r4)
  321.     fmuls   f3,f1,f2
  322.     lfs     f4,4(r3)
  323.     lfs     f5,4(r4)
  324.     fmadd   f6,f4,f5,f3
  325.     lfs     f7,8(r3)
  326.     lfs     f8,8(r4)
  327.     fmadd   f1,f7,f8,f6
  328.     blr
  329.  
  330.     funcend    DotProduct
  331.  
  332.  
  333.  
  334.  
  335. ###########################################################################
  336. #
  337. #      void VectorSubtract (vec3_t veca, vec3_t vecb, vec3_t out)
  338. #
  339. ###########################################################################
  340.  
  341.     funcdef    VectorSubtract
  342.  
  343.     lfs     f1,0(r3)
  344.     lfs     f2,0(r4)
  345.     fsubs   f3,f1,f2
  346.     stfs    f3,0(r5)
  347.     lfs     f4,4(r3)
  348.     lfs     f5,4(r4)
  349.     fsubs   f6,f4,f5
  350.     stfs    f6,4(r5)
  351.     lfs     f7,8(r3)
  352.     lfs     f8,8(r4)
  353.     fsubs   f9,f7,f8
  354.     stfs    f9,8(r5)
  355.     blr
  356.  
  357.     funcend    VectorSubtract
  358.  
  359.  
  360.  
  361.  
  362. ###########################################################################
  363. #
  364. #       void VectorAdd (vec3_t veca, vec3_t vecb, vec3_t out)
  365. #
  366. ###########################################################################
  367.  
  368.     funcdef    VectorAdd
  369.  
  370.     lfs     f1,0(r3)
  371.     lfs     f2,0(r4)
  372.     fadds   f3,f1,f2
  373.     stfs    f3,0(r5)
  374.     lfs     f4,4(r3)
  375.     lfs     f5,4(r4)
  376.     fadds   f6,f4,f5
  377.     stfs    f6,4(r5)
  378.     lfs     f7,8(r3)
  379.     lfs     f8,8(r4)
  380.     fadds   f9,f7,f8
  381.     stfs    f9,8(r5)
  382.     blr
  383.  
  384.     funcend    VectorAdd
  385.  
  386.  
  387.  
  388.  
  389. ###########################################################################
  390. #
  391. #       void VectorCopy (vec3_t in, vec3_t out)
  392. #
  393. ###########################################################################
  394.  
  395.     funcdef    VectorCopy
  396.  
  397.     lfs     f1,0(r3)
  398.     lwz     r5,4(r3)
  399.     lfs     f3,8(r3)
  400.     stfs    f1,0(r4)
  401.     stw     r5,4(r4)
  402.     stfs    f3,8(r4)
  403.     blr
  404.  
  405.     funcend    VectorCopy
  406.  
  407.  
  408.  
  409.  
  410. ###########################################################################
  411. #
  412. #       void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross)
  413. #
  414. ###########################################################################
  415.  
  416.     funcdef    CrossProduct
  417.  
  418.     lfs     f4,8(r3)
  419.     lfs     f5,4(r4)
  420.     fmuls   f6,f4,f5
  421.     lfs     f1,4(r3)
  422.     lfs     f2,8(r4)
  423.     fmsubs  f3,f1,f2,f6
  424.     stfs    f3,0(r5)
  425.     lfs     f7,0(r3)
  426.     fmuls   f8,f7,f2
  427.     lfs     f9,0(r4)
  428.     fmsubs  f10,f4,f9,f8
  429.     stfs    f10,4(r5)
  430.     fmuls   f11,f1,f9
  431.     fmsubs  f12,f7,f5,f11
  432.     stfs    f12,8(r5)
  433.     blr
  434.  
  435.     funcend    CrossProduct
  436.  
  437.  
  438.  
  439.  
  440. ###########################################################################
  441. #
  442. #       vec3_t Length (vec3_t v)
  443. #
  444. ###########################################################################
  445.  
  446.     funcdef    Length
  447.  
  448.     ls    f3,c0
  449.     lfs     f0,0(r3)
  450.     fmuls   f0,f0,f0
  451.     lfs     f1,4(r3)
  452.     fmadds  f0,f1,f1,f0
  453.     lfs     f2,8(r3)
  454.     fmadds  f1,f2,f2,f0
  455.     fcmpo   cr0,f1,f3
  456.     beqlr
  457.     frsqrte f0,f1
  458.     fres    f1,f0
  459.     blr
  460.  
  461.     funcend    Length
  462.  
  463.  
  464.  
  465.  
  466. ###########################################################################
  467. #
  468. #       float VectorNormalize (vec3_t v)
  469. #
  470. ###########################################################################
  471.  
  472.     funcdef    VectorNormalize
  473.  
  474.     ls    f3,c0
  475.     ls    f7,c0_5
  476.     lfs     f0,0(r3)
  477.     fmuls   f4,f0,f0
  478.     lfs     f6,4(r3)
  479.     fmadds  f5,f6,f6,f4
  480.     lfs     f2,8(r3)
  481.     fmadds  f1,f2,f2,f5
  482.     fcmpo   cr0,f1,f3
  483.     beqlr
  484.     frsqrte f10,f1
  485.     fres    f8,f10
  486.     fdivs   f9,f1,f8
  487.     fadd    f8,f9,f8
  488.     fmul    f1,f8,f7
  489.     fres    f3,f1
  490.     fmuls   f0,f0,f3
  491.     stfs    f0,0(r3)
  492.     fmuls   f6,f6,f3
  493.     stfs    f6,4(r3)
  494.     fmuls   f2,f2,f3
  495.     stfs    f2,8(r3)
  496.     blr
  497.  
  498.     funcend    VectorNormalize
  499.  
  500.  
  501.  
  502.  
  503. ###########################################################################
  504. #
  505. #       void VectorInverse (vec3_t v)
  506. #
  507. ###########################################################################
  508.  
  509.     funcdef    VectorInverse
  510.  
  511.     lfs     f1,0(r3)
  512.     fneg    f0,f1
  513.     stfs    f0,0(r3)
  514.     lfs     f3,4(r3)
  515.     fneg    f2,f3
  516.     stfs    f2,4(r3)
  517.     lfs     f5,8(r3)
  518.     fneg    f4,f5
  519.     stfs    f4,8(r3)
  520.     blr
  521.  
  522.     funcend    VectorInverse
  523.  
  524.  
  525.  
  526.  
  527. ###########################################################################
  528. #
  529. #       void VectorScale (vec3_t in, vec3_t scale, vec3_t out)
  530. #
  531. ###########################################################################
  532.  
  533.     funcdef    VectorScale
  534.  
  535.     lfs     f2,0(r3)
  536.     fmuls   f3,f2,f1
  537.     stfs    f3,0(r4)
  538.     lfs     f4,4(r3)
  539.     fmuls   f5,f4,f1
  540.     stfs    f5,4(r4)
  541.     lfs     f6,8(r3)
  542.     fmuls   f7,f6,f1
  543.     stfs    f7,8(r4)
  544.     blr
  545.  
  546.     funcend    VectorScale
  547.  
  548.  
  549.  
  550.  
  551. ###########################################################################
  552. #
  553. #       void FloorDivMod (double numer, double denom, int *quotient,
  554. #                          int *rem)
  555. #
  556. ###########################################################################
  557.  
  558.     funcdef    FloorDivMod
  559.  
  560.     fctiwz  f0,f1
  561.     stfd    f0,-8(r1)
  562.     lwz     r5,-4(r1)
  563.     mr.    r5,r5
  564.     fctiwz  f0,f2
  565.     stfd    f0,-8(r1)
  566.     lwz     r6,-4(r1)
  567.     divw    r7,r5,r6
  568.     mullw   r8,r7,r6
  569.     subf    r8,r8,r5
  570.     bge     .fdm_exit
  571.     subi    r7,r7,1
  572.     add     r8,r8,r6
  573. .fdm_exit:
  574.     stw     r7,0(r3)
  575.     stw     r8,0(r4)
  576.     blr
  577.  
  578.     funcend    FloorDivMod
  579.  
  580.  
  581.  
  582.  
  583. ###########################################################################
  584.  
  585.  
  586. .ifdef WOS
  587.     .tocd
  588. .else
  589.     .data
  590. .endif
  591.  
  592. lab c1DEGREE
  593.     .float  0.01745329252
  594. lab c64kDIV360
  595.     .long    0x4066c16c,0x16c16c17    # (double)182.0444444...
  596. lab c360DIV64k
  597.     .float    0.0054931641
  598.