home *** CD-ROM | disk | FTP | other *** search
- #
- # Copyright (C) 1996-1997 Id Software, Inc.
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License
- # as published by the Free Software Foundation; either version 2
- # of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- #
- # See the GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- #
-
- #
- # Quake for AMIGA
- #
- # mathlibPPC.s
- #
- # Define WOS for PowerOpen ABI, otherwise SVR4-ABI is used.
- #
-
- .include "macrosPPC.i"
-
- #
- # external references
- #
-
- xrefv c0
- xrefv c0_5
- xrefv INT2DBL_0
-
- xrefv sin
- xrefv cos
-
-
- #
- # defines
- #
-
- .set MPLANE_NORMAL,0
- .set MPLANE_DIST,12
- .set MPLANE_TYPE,16
- .set MPLANE_SIGNBITS,17
- .set MPLANE_SIZEOF,20
-
- .set PITCH,0
- .set YAW,1
- .set ROLL,2
-
-
-
-
-
- ###########################################################################
- #
- # float anglemod(float a)
- #
- ###########################################################################
-
- funcdef anglemod
-
- # a = (360.0/65536) * ((int)(a*(65536/360.0)) & 65535);
- stwu r1,-32(r1)
- lf f2,c64kDIV360 # must be a double precision constant!
- fmul f1,f1,f2
- fctiwz f0,f1
- stfd f0,24(r1)
- lhz r3,30(r1)
- lis r11,0x43300000@h
- stw r11,24(r1)
- xoris r11,r3,0x80000000@h
- stw r11,28(r1)
- lfd f1,24(r1)
- lf f2,INT2DBL_0
- fsub f1,f1,f2
- ls f2,c360DIV64k
- fmul f1,f1,f2
- addi r1,r1,32
- blr
-
- funcend anglemod
-
-
-
-
- ###########################################################################
- #
- # int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, mplane_t *p)
- #
- ###########################################################################
-
- funcdef BoxOnPlaneSide
-
- lbz r0,MPLANE_SIGNBITS(r5)
- lfs f1,0(r5) #f1 = p->normal[0]
- lfs f2,4(r5) #f2 = p->normal[1]
- cmplwi r0,3
- lfs f3,8(r5) #f3 = p->normal[2]
- lfs f4,0(r3) #f4 = emins[0]
- cmplwi cr1,r0,5
- lfs f5,0(r4) #f5 = emaxs[0]
- lfs f6,4(r3) #f6 = emins[1]
- cmplwi cr2,r0,7
- lfs f7,4(r4) #f7 = emaxs[1]
- lfs f8,8(r3) #f8 = emins[2]
- cmplwi cr3,r0,1
- lfs f9,8(r4) #f9 = emaxs[2]
- ble .lower
- .upper:
- blt cr1,.c4
- beq cr1,.c5
- blt cr2,.c6
- beq cr2,.c7
- trap
- .lower:
- beq .c3
- bgt cr3,.c2
- beq cr3,.c1
- .c0:
- fmuls f10,f5,f1 #f10 = p->normal[0]*emaxs[0]
- fmuls f11,f4,f1 #f11 = p->normal[0]*emins[0]
- fmadd f10,f2,f7,f10 #f10+= p->normal[1]*emaxs[1]
- fmadd f11,f2,f6,f11 #f11+= p->normal[1]*emins[1]
- fmadd f10,f3,f9,f10 #f10+= p->normal[2]*emaxs[2]
- fmadd f11,f3,f8,f11 #f11+= p->normal[2]*emins[2]
- b .cont
- .c1:
- fmuls f10,f4,f1 #f10 = p->normal[0]*emins[0]
- fmuls f11,f5,f1 #f11 = p->normal[0]*emaxs[0]
- fmadd f10,f2,f7,f10 #f10+= p->normal[1]*emaxs[1]
- fmadd f11,f2,f6,f11 #f11+= p->normal[1]*emins[1]
- fmadd f10,f3,f9,f10 #f10+= p->normal[2]*emaxs[2]
- fmadd f11,f3,f8,f11 #f11+= p->normal[2]*emins[2]
- b .cont
- .c2:
- fmuls f10,f5,f1 #f10 = p->normal[0]*emaxs[0]
- fmuls f11,f4,f1 #f11 = p->normal[0]*emins[0]
- fmadd f10,f2,f6,f10 #f10+= p->normal[1]*emins[1]
- fmadd f11,f2,f7,f11 #f11+= p->normal[1]*emaxs[1]
- fmadd f10,f3,f9,f10 #f10+= p->normal[2]*emaxs[2]
- fmadd f11,f3,f8,f11 #f11+= p->normal[2]*emins[2]
- b .cont
- .c3:
- fmuls f10,f4,f1 #f10 = p->normal[0]*emins[0]
- fmuls f11,f5,f1 #f11 = p->normal[0]*emaxs[0]
- fmadd f10,f2,f6,f10 #f10+= p->normal[1]*emins[1]
- fmadd f11,f2,f7,f11 #f11+= p->normal[1]*emaxs[1]
- fmadd f10,f3,f9,f10 #f10+= p->normal[2]*emaxs[2]
- fmadd f11,f3,f8,f11 #f11+= p->normal[2]*emins[2]
- b .cont
- .c4:
- fmuls f10,f5,f1 #f10 = p->normal[0]*emaxs[0]
- fmuls f11,f4,f1 #f11 = p->normal[0]*emins[0]
- fmadd f10,f2,f7,f10 #f10+= p->normal[1]*emaxs[1]
- fmadd f11,f2,f6,f11 #f11+= p->normal[1]*emins[1]
- fmadd f10,f3,f8,f10 #f10+= p->normal[2]*emins[2]
- fmadd f11,f3,f9,f11 #f11+= p->normal[2]*emaxs[2]
- b .cont
- .c5:
- fmuls f10,f4,f1 #f10 = p->normal[0]*emins[0]
- fmuls f11,f5,f1 #f11 = p->normal[0]*emaxs[0]
- fmadd f10,f2,f7,f10 #f10+= p->normal[1]*emaxs[1]
- fmadd f11,f2,f6,f11 #f11+= p->normal[1]*emins[1]
- fmadd f10,f3,f8,f10 #f10+= p->normal[2]*emins[2]
- fmadd f11,f3,f9,f11 #f11+= p->normal[2]*emaxs[2]
- b .cont
- .c6:
- fmuls f10,f5,f1 #f10 = p->normal[0]*emaxs[0]
- fmuls f11,f4,f1 #f11 = p->normal[0]*emins[0]
- fmadd f10,f2,f6,f10 #f10+= p->normal[1]*eminx[1]
- fmadd f11,f2,f7,f11 #f11+= p->normal[1]*emaxs[1]
- fmadd f10,f3,f8,f10 #f10+= p->normal[2]*emins[2]
- fmadd f11,f3,f9,f11 #f11+= p->normal[2]*emaxs[2]
- b .cont
- .c7:
- fmuls f10,f4,f1 #f10 = p->normal[0]*emins[0]
- fmuls f11,f5,f1 #f11 = p->normal[0]*emaxs[0]
- fmadd f10,f2,f6,f10 #f10+= p->normal[1]*eminx[1]
- fmadd f11,f2,f7,f11 #f11+= p->normal[1]*emaxs[1]
- fmadd f10,f3,f8,f10 #f10+= p->normal[2]*emins[2]
- fmadd f11,f3,f9,f11 #f11+= p->normal[2]*emaxs[2]
- .cont:
- lfs f0,MPLANE_DIST(r5)
- fcmpo cr0,f10,f0
- blt .cont2
- li r3,1
- .cont2:
- fcmpo cr0,f11,f0
- bge .cont3
- ori r3,r3,2
- .cont3:
- blr
-
- funcend BoxOnPlaneSide
-
-
-
-
- ###########################################################################
- #
- # void AngleVectors (vec3_t angles, vec3_t forward, vec3_t right,
- # vec3_t up)
- #
- ###########################################################################
-
- funcdef AngleVectors
-
- init 0,128,4,6
- stmw r28,gb(r1)
- stfd f14,fb+0*8(r1)
- stfd f15,fb+1*8(r1)
- stfd f16,fb+2*8(r1)
- stfd f17,fb+3*8(r1)
- stfd f18,fb+4*8(r1)
- stfd f19,fb+5*8(r1)
-
- mr r31,r3
- mr r30,r4
- mr r29,r5
- mr r28,r6
- ls f19,c1DEGREE
- lfs f14,YAW*4(r31)
- fmuls f14,f14,f19
- fmr f1,f14
- call sin
- fmr f15,f1 #f15 = sy
- fmr f1,f14
- call cos
- fmr f16,f1 #f16 = cy
- lfs f14,PITCH*4(r31)
- fmuls f14,f14,f19
- fmr f1,f14
- call sin
- fmr f17,f1 #f17 = sp
- fmr f1,f14
- call cos
- fmr f18,f1 #f18 = cp
- lfs f14,ROLL*4(r31)
- fmuls f14,f14,f19
- fmr f1,f14
- call sin
- fmr f19,f1 #f19 = sr
- fmr f1,f14
- call cos
- fmr f14,f1 #f14 = cr
- fmuls f0,f18,f16
- stfs f0,0(r30)
- fmuls f1,f18,f15
- stfs f1,4(r30)
- fneg f2,f17 #f2 = -sp
- stfs f2,8(r30)
- fmuls f3,f19,f16 #f3 = sr * cy
- fmuls f4,f19,f15 #f4 = sr * sy
- fmuls f5,f14,f15 #f5 = cr * sy
- fmuls f6,f14,f16 #f6 = cr * cy
- fmadds f7,f3,f2,f5
- stfs f7,0(r29)
- fmsubs f8,f4,f2,f6
- stfs f8,4(r29)
- fmuls f9,f18,f19
- fneg f9,f9
- stfs f9,8(r29)
- fmadds f7,f6,f17,f4
- stfs f7,0(r28)
- fmsubs f8,f5,f17,f3
- stfs f8,4(r28)
- fmuls f9,f14,f18
- stfs f9,8(r28)
-
- lfd f14,fb+0*8(r1)
- lfd f15,fb+1*8(r1)
- lfd f16,fb+2*8(r1)
- lfd f17,fb+3*8(r1)
- lfd f18,fb+4*8(r1)
- lfd f19,fb+5*8(r1)
- lmw r28,gb(r1)
- exit
-
- funcend AngleVectors
-
-
-
-
- ###########################################################################
- #
- # void VectorMA (vec3_t veca, float scale, vec3_t vecb, vec3_t vecc)
- #
- ###########################################################################
-
- funcdef VectorMA
-
- lfs f3,0(r3)
- lfs f2,0(r4)
- fmadds f0,f1,f2,f3
- stfs f0,0(r5)
- lfs f3,4(r3)
- lfs f2,4(r4)
- fmadds f0,f1,f2,f3
- stfs f0,4(r5)
- lfs f3,8(r3)
- lfs f2,8(r4)
- fmadds f0,f1,f2,f3
- stfs f0,8(r5)
- blr
-
- funcend VectorMA
-
-
-
-
- ###########################################################################
- #
- # vec_t _DotProduct (vec3_t v1, vec3_t v2)
- #
- ###########################################################################
-
- funcdef DotProduct
-
- lfs f1,0(r3)
- lfs f2,0(r4)
- fmuls f3,f1,f2
- lfs f4,4(r3)
- lfs f5,4(r4)
- fmadd f6,f4,f5,f3
- lfs f7,8(r3)
- lfs f8,8(r4)
- fmadd f1,f7,f8,f6
- blr
-
- funcend DotProduct
-
-
-
-
- ###########################################################################
- #
- # void VectorSubtract (vec3_t veca, vec3_t vecb, vec3_t out)
- #
- ###########################################################################
-
- funcdef VectorSubtract
-
- lfs f1,0(r3)
- lfs f2,0(r4)
- fsubs f3,f1,f2
- stfs f3,0(r5)
- lfs f4,4(r3)
- lfs f5,4(r4)
- fsubs f6,f4,f5
- stfs f6,4(r5)
- lfs f7,8(r3)
- lfs f8,8(r4)
- fsubs f9,f7,f8
- stfs f9,8(r5)
- blr
-
- funcend VectorSubtract
-
-
-
-
- ###########################################################################
- #
- # void VectorAdd (vec3_t veca, vec3_t vecb, vec3_t out)
- #
- ###########################################################################
-
- funcdef VectorAdd
-
- lfs f1,0(r3)
- lfs f2,0(r4)
- fadds f3,f1,f2
- stfs f3,0(r5)
- lfs f4,4(r3)
- lfs f5,4(r4)
- fadds f6,f4,f5
- stfs f6,4(r5)
- lfs f7,8(r3)
- lfs f8,8(r4)
- fadds f9,f7,f8
- stfs f9,8(r5)
- blr
-
- funcend VectorAdd
-
-
-
-
- ###########################################################################
- #
- # void VectorCopy (vec3_t in, vec3_t out)
- #
- ###########################################################################
-
- funcdef VectorCopy
-
- lfs f1,0(r3)
- lwz r5,4(r3)
- lfs f3,8(r3)
- stfs f1,0(r4)
- stw r5,4(r4)
- stfs f3,8(r4)
- blr
-
- funcend VectorCopy
-
-
-
-
- ###########################################################################
- #
- # void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross)
- #
- ###########################################################################
-
- funcdef CrossProduct
-
- lfs f4,8(r3)
- lfs f5,4(r4)
- fmuls f6,f4,f5
- lfs f1,4(r3)
- lfs f2,8(r4)
- fmsubs f3,f1,f2,f6
- stfs f3,0(r5)
- lfs f7,0(r3)
- fmuls f8,f7,f2
- lfs f9,0(r4)
- fmsubs f10,f4,f9,f8
- stfs f10,4(r5)
- fmuls f11,f1,f9
- fmsubs f12,f7,f5,f11
- stfs f12,8(r5)
- blr
-
- funcend CrossProduct
-
-
-
-
- ###########################################################################
- #
- # vec3_t Length (vec3_t v)
- #
- ###########################################################################
-
- funcdef Length
-
- ls f3,c0
- lfs f0,0(r3)
- fmuls f0,f0,f0
- lfs f1,4(r3)
- fmadds f0,f1,f1,f0
- lfs f2,8(r3)
- fmadds f1,f2,f2,f0
- fcmpo cr0,f1,f3
- beqlr
- frsqrte f0,f1
- fres f1,f0
- blr
-
- funcend Length
-
-
-
-
- ###########################################################################
- #
- # float VectorNormalize (vec3_t v)
- #
- ###########################################################################
-
- funcdef VectorNormalize
-
- ls f3,c0
- ls f7,c0_5
- lfs f0,0(r3)
- fmuls f4,f0,f0
- lfs f6,4(r3)
- fmadds f5,f6,f6,f4
- lfs f2,8(r3)
- fmadds f1,f2,f2,f5
- fcmpo cr0,f1,f3
- beqlr
- frsqrte f10,f1
- fres f8,f10
- fdivs f9,f1,f8
- fadd f8,f9,f8
- fmul f1,f8,f7
- fres f3,f1
- fmuls f0,f0,f3
- stfs f0,0(r3)
- fmuls f6,f6,f3
- stfs f6,4(r3)
- fmuls f2,f2,f3
- stfs f2,8(r3)
- blr
-
- funcend VectorNormalize
-
-
-
-
- ###########################################################################
- #
- # void VectorInverse (vec3_t v)
- #
- ###########################################################################
-
- funcdef VectorInverse
-
- lfs f1,0(r3)
- fneg f0,f1
- stfs f0,0(r3)
- lfs f3,4(r3)
- fneg f2,f3
- stfs f2,4(r3)
- lfs f5,8(r3)
- fneg f4,f5
- stfs f4,8(r3)
- blr
-
- funcend VectorInverse
-
-
-
-
- ###########################################################################
- #
- # void VectorScale (vec3_t in, vec3_t scale, vec3_t out)
- #
- ###########################################################################
-
- funcdef VectorScale
-
- lfs f2,0(r3)
- fmuls f3,f2,f1
- stfs f3,0(r4)
- lfs f4,4(r3)
- fmuls f5,f4,f1
- stfs f5,4(r4)
- lfs f6,8(r3)
- fmuls f7,f6,f1
- stfs f7,8(r4)
- blr
-
- funcend VectorScale
-
-
-
-
- ###########################################################################
- #
- # void FloorDivMod (double numer, double denom, int *quotient,
- # int *rem)
- #
- ###########################################################################
-
- funcdef FloorDivMod
-
- fctiwz f0,f1
- stfd f0,-8(r1)
- lwz r5,-4(r1)
- mr. r5,r5
- fctiwz f0,f2
- stfd f0,-8(r1)
- lwz r6,-4(r1)
- divw r7,r5,r6
- mullw r8,r7,r6
- subf r8,r8,r5
- bge .fdm_exit
- subi r7,r7,1
- add r8,r8,r6
- .fdm_exit:
- stw r7,0(r3)
- stw r8,0(r4)
- blr
-
- funcend FloorDivMod
-
-
-
-
- ###########################################################################
-
-
- .ifdef WOS
- .tocd
- .else
- .data
- .endif
-
- lab c1DEGREE
- .float 0.01745329252
- lab c64kDIV360
- .long 0x4066c16c,0x16c16c17 # (double)182.0444444...
- lab c360DIV64k
- .float 0.0054931641
-