Loading [MathJax]/extensions/MathMenu.js
Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
JMath.h
Go to the documentation of this file.
1#ifndef JMATH_H
2#define JMATH_H
3
4#include "dolphin/mtx.h"
5#include "math.h"
6
7void JMAMTXApplyScale(const Mtx, Mtx, f32, f32, f32);
8void JMAEulerToQuat(s16 param_0, s16 param_1, s16 param_2, Quaternion* param_3);
10void JMAFastVECNormalize(register const Vec* src, register Vec* dst);
11void JMAVECScaleAdd(register const Vec* vec1, register const Vec* vec2, register Vec* dst,
12 register f32 scale);
13
14inline int JMAAbs(int value) {
15 return value > 0 ? value : -value;
16}
17
18inline f32 JMAFastReciprocal(f32 value) {
19 return __fres(value);
20}
21
22inline float __frsqrtes(register double f) {
23 register float out;
24 // clang-format off
25#ifdef __MWERKS__
26 asm {
27 frsqrte out, f
28 }
29#endif
30 // clang-format on
31 return out;
32}
33
34inline f32 JMAFastSqrt(register f32 input) {
35 if (input > 0.0f) {
36 register f32 out;
37#ifdef __MWERKS__
38 asm {
39 frsqrte out, input
40 }
41#endif
42 return out * input;
43 } else {
44 return input;
45 }
46}
47
48inline f32 JMAHermiteInterpolation(register f32 p1, register f32 p2, register f32 p3,
49 register f32 p4, register f32 p5, register f32 p6,
50 register f32 p7) {
51 register f32 ff25;
52 register f32 ff31;
53 register f32 ff30;
54 register f32 ff29;
55 register f32 ff28;
56 register f32 ff27;
57 register f32 ff26;
58 // clang-format off
59#ifdef __MWERKS__
60 asm {
61 fsubs ff31, p1, p2
62 fsubs ff30, p5, p2
63 fdivs ff29, ff31, ff30
64 fmuls ff28,ff29,ff29
65 fadds ff25,ff29,ff29
66 fsubs ff27,ff28,ff29
67 fsubs ff30, p3, p6
68 fmsubs ff26,ff25,ff27,ff28
69 fmadds ff25,p4,ff27,p4
70 fmadds ff26,ff26,ff30,p3
71 fmadds ff25,p7,ff27,ff25
72 fmsubs ff25,ff29,p4,ff25
73 fnmsubs ff25,ff31,ff25,ff26
74
75 }
76#endif
77 // clang-format on
78 return ff25;
79}
80
81namespace JMath {
82
83inline f32 fastReciprocal(f32 value) {
84 return JMAFastReciprocal(value);
85}
86
87inline void gekko_ps_copy3(register void* dst, register const void* src) {
88 register f32 src0;
89 register f32 src1;
90#ifdef __MWERKS__
91 asm {
92 psq_l src0, 0(src), 0, 0
93 lfs src1, 8(src)
94 psq_st src0, 0(dst), 0, 0
95 stfs src1, 8(dst)
96 };
97#endif
98}
99
100inline void gekko_ps_copy6(register void* dst, register const void* src) {
101 register f32 src0;
102 register f32 src1;
103 register f32 src2;
104#ifdef __MWERKS__
105 asm {
106 psq_l src0, 0(src), 0, 0
107 psq_l src1, 8(src), 0, 0
108 psq_l src2, 16(src), 0, 0
109 psq_st src0, 0(dst), 0, 0
110 psq_st src1, 8(dst), 0, 0
111 psq_st src2, 16(dst), 0, 0
112 };
113#endif
114}
115
116inline void gekko_ps_copy12(register void* dst, register const void* src) {
117 register f32 src0;
118 register f32 src1;
119 register f32 src2;
120 register f32 src3;
121 register f32 src4;
122 register f32 src5;
123#ifdef __MWERKS__
124 asm {
125 psq_l src0, 0(src), 0, 0
126 psq_l src1, 8(src), 0, 0
127 psq_l src2, 16(src), 0, 0
128 psq_l src3, 24(src), 0, 0
129 psq_l src4, 32(src), 0, 0
130 psq_l src5, 40(src), 0, 0
131 psq_st src0, 0(dst), 0, 0
132 psq_st src1, 8(dst), 0, 0
133 psq_st src2, 16(dst), 0, 0
134 psq_st src3, 24(dst), 0, 0
135 psq_st src4, 32(dst), 0, 0
136 psq_st src5, 40(dst), 0, 0
137 };
138#endif
139}
140
141inline void gekko_ps_copy16(register void* dst, register const void* src) {
142 register f32 src0;
143 register f32 src1;
144 register f32 src2;
145 register f32 src3;
146 register f32 src4;
147 register f32 src5;
148 register f32 src6;
149 register f32 src7;
150#ifdef __MWERKS__
151 asm {
152 psq_l src0, 0(src), 0, 0
153 psq_l src1, 8(src), 0, 0
154 psq_l src2, 16(src), 0, 0
155 psq_l src3, 24(src), 0, 0
156 psq_l src4, 32(src), 0, 0
157 psq_l src5, 40(src), 0, 0
158 psq_l src6, 48(src), 0, 0
159 psq_l src7, 56(src), 0, 0
160 psq_st src0, 0(dst), 0, 0
161 psq_st src1, 8(dst), 0, 0
162 psq_st src2, 16(dst), 0, 0
163 psq_st src3, 24(dst), 0, 0
164 psq_st src4, 32(dst), 0, 0
165 psq_st src5, 40(dst), 0, 0
166 psq_st src6, 48(dst), 0, 0
167 psq_st src7, 56(dst), 0, 0
168 };
169#endif
170}
171
172}; // namespace JMath
173
174namespace JMathInlineVEC {
175 inline void C_VECAdd(register const Vec* a, register const Vec* b, register Vec* ab) {
176 register f32 axy;
177 register f32 bxy;
178 register f32 az;
179 register f32 sumz;
180 register f32 bz;
181 #ifdef __MWERKS__
182 asm {
183 psq_l axy, 0(a), 0, 0
184 psq_l bxy, 0(b), 0, 0
185 ps_add bxy, axy, bxy
186 psq_st bxy, 0(ab), 0, 0
187 psq_l az, 8(a), 1, 0
188 psq_l bz, 8(b), 1, 0
189 ps_add sumz, az, bz
190 psq_st sumz, 8(ab), 1, 0
191 }
192 #endif
193 }
194
195 inline void C_VECSubtract(register const Vec* a, register const Vec* b, register Vec* ab) {
196 register f32 axy;
197 register f32 bxy;
198 register f32 az;
199 register f32 subz;
200 register f32 bz;
201 #ifdef __MWERKS__
202 asm {
203 psq_l axy, 0(a), 0, 0
204 psq_l bxy, 0(b), 0, 0
205 ps_sub bxy, axy, bxy
206 psq_st bxy, 0(ab), 0, 0
207 psq_l az, 8(a), 1, 0
208 psq_l bz, 8(b), 1, 0
209 ps_sub subz, az, bz
210 psq_st subz, 8(ab), 1, 0
211 }
212 #endif
213 }
214
215 inline f32 C_VECSquareMag(register const Vec* v) {
216 register f32 x_y;
217 register f32 z;
218 register f32 res;
219 #ifdef __MWERKS__
220 asm {
221 psq_l x_y, 0(v), 0, 0
222 ps_mul x_y, x_y, x_y
223 lfs z, 8(v)
224 ps_madd res, z, z, x_y
225 ps_sum0 res, res, x_y, x_y
226 }
227 #endif
228 return res;
229 }
230};
231
232#endif /* JMATH_H */
f32 JMAFastSqrt(register f32 input)
Definition JMath.h:34
float __frsqrtes(register double f)
Definition JMath.h:22
void JMAEulerToQuat(s16 param_0, s16 param_1, s16 param_2, Quaternion *param_3)
Definition JMath.cpp:11
f32 JMAFastReciprocal(f32 value)
Definition JMath.h:18
void JMAVECScaleAdd(register const Vec *vec1, register const Vec *vec2, register Vec *dst, register f32 scale)
Definition JMath.cpp:84
void JMAQuatLerp(const Quaternion *, const Quaternion *, f32, Quaternion *)
int JMAAbs(int value)
Definition JMath.h:14
f32 JMAHermiteInterpolation(register f32 p1, register f32 p2, register f32 p3, register f32 p4, register f32 p5, register f32 p6, register f32 p7)
Definition JMath.h:48
void JMAFastVECNormalize(register const Vec *src, register Vec *dst)
Definition JMath.cpp:64
void JMAMTXApplyScale(const Mtx, Mtx, f32, f32, f32)
const void * src
Definition __os.h:116
static SECTION_DATA u8 az[16]
Definition d_a_mg_rod.cpp:618
double v
Definition e_pow.c:163
z
Definition e_pow.c:390
a
Definition k_cos.c:89
float __fres(float)
f32 Mtx[3][4]
Definition mtx.h:22
Definition JMath.h:174
f32 C_VECSquareMag(register const Vec *v)
Definition JMath.h:215
void C_VECAdd(register const Vec *a, register const Vec *b, register Vec *ab)
Definition JMath.h:175
void C_VECSubtract(register const Vec *a, register const Vec *b, register Vec *ab)
Definition JMath.h:195
Definition JMATrigonometric.cpp:79
void gekko_ps_copy3(register void *dst, register const void *src)
Definition JMath.h:87
f32 fastReciprocal(f32 value)
Definition JMath.h:83
void gekko_ps_copy6(register void *dst, register const void *src)
Definition JMath.h:100
void gekko_ps_copy12(register void *dst, register const void *src)
Definition JMath.h:116
void gekko_ps_copy16(register void *dst, register const void *src)
Definition JMath.h:141
Definition d_a_hozelda.cpp:16
Definition d_a_hozelda.cpp:18
signed short int s16
Definition types.h:6
float f32
Definition types.h:22