Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
Loading...
Searching...
No Matches
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 <cmath>
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#ifdef __MWERKS__
16 return __abs(value);
17#endif
18}
19
20inline f32 JMAAbs(f32 x) {
21#ifdef __MWERKS__
22 return __fabsf(x);
23#endif
24}
25
26inline f32 JMAFastReciprocal(f32 value) {
27#ifdef __MWERKS__
28 return __fres(value);
29#endif
30}
31
32inline float __frsqrtes(__REGISTER double f) {
33#ifdef __MWERKS__
34 __REGISTER float out;
35 // clang-format off
36
37 asm {
38 frsqrte out, f
39 }
40
41 // clang-format on
42 return out;
43#endif
44}
45
46inline f32 JMAFastSqrt(__REGISTER const f32 input) {
47#ifdef __MWERKS__
48 if (input > 0.0f) {
49 __REGISTER f32 out;
50 asm {
51 frsqrte out, input
52 }
53 return out * input;
54 } else {
55 return input;
56 }
57#endif
58}
59
60inline f32 JMAHermiteInterpolation(__REGISTER f32 p1, __REGISTER f32 p2, __REGISTER f32 p3,
61 __REGISTER f32 p4, __REGISTER f32 p5, __REGISTER f32 p6,
62 __REGISTER f32 p7) {
63#ifdef __MWERKS__
64 __REGISTER f32 ff25;
65 __REGISTER f32 ff31;
66 __REGISTER f32 ff30;
67 __REGISTER f32 ff29;
68 __REGISTER f32 ff28;
69 __REGISTER f32 ff27;
70 __REGISTER f32 ff26;
71 // clang-format off
72 asm {
73 fsubs ff31, p1, p2
74 fsubs ff30, p5, p2
75 fdivs ff29, ff31, ff30
76 fmuls ff28,ff29,ff29
77 fadds ff25,ff29,ff29
78 fsubs ff27,ff28,ff29
79 fsubs ff30, p3, p6
80 fmsubs ff26,ff25,ff27,ff28
81 fmadds ff25,p4,ff27,p4
82 fmadds ff26,ff26,ff30,p3
83 fmadds ff25,p7,ff27,ff25
84 fmsubs ff25,ff29,p4,ff25
85 fnmsubs ff25,ff31,ff25,ff26
86
87 }
88 // clang-format on
89 return ff25;
90#endif
91}
92
93namespace JMath {
94
95template <typename T>
96inline T fastSqrt(T value) {
97 return JMAFastSqrt(value);
98}
99
100inline f32 fastReciprocal(f32 value) {
101 return JMAFastReciprocal(value);
102}
103
104inline void fastVECNormalize(const Vec* src, Vec* dst) {
105 return JMAFastVECNormalize(src, dst);
106}
107
108inline void gekko_ps_copy3(__REGISTER void* dst, __REGISTER const void* src) {
109#ifdef __MWERKS__
110 __REGISTER f32 src0;
111 __REGISTER f32 src1;
112 asm {
113 psq_l src0, 0(src), 0, 0
114 lfs src1, 8(src)
115 psq_st src0, 0(dst), 0, 0
116 stfs src1, 8(dst)
117 };
118#endif
119}
120
121inline void gekko_ps_copy6(__REGISTER void* dst, __REGISTER const void* src) {
122#ifdef __MWERKS__
123 __REGISTER f32 src0;
124 __REGISTER f32 src1;
125 __REGISTER f32 src2;
126 asm {
127 psq_l src0, 0(src), 0, 0
128 psq_l src1, 8(src), 0, 0
129 psq_l src2, 16(src), 0, 0
130 psq_st src0, 0(dst), 0, 0
131 psq_st src1, 8(dst), 0, 0
132 psq_st src2, 16(dst), 0, 0
133 };
134#endif
135}
136
137inline void gekko_ps_copy12(__REGISTER void* dst, __REGISTER const void* src) {
138#ifdef __MWERKS__
139 __REGISTER f32 src0;
140 __REGISTER f32 src1;
141 __REGISTER f32 src2;
142 __REGISTER f32 src3;
143 __REGISTER f32 src4;
144 __REGISTER f32 src5;
145 asm {
146 psq_l src0, 0(src), 0, 0
147 psq_l src1, 8(src), 0, 0
148 psq_l src2, 16(src), 0, 0
149 psq_l src3, 24(src), 0, 0
150 psq_l src4, 32(src), 0, 0
151 psq_l src5, 40(src), 0, 0
152 psq_st src0, 0(dst), 0, 0
153 psq_st src1, 8(dst), 0, 0
154 psq_st src2, 16(dst), 0, 0
155 psq_st src3, 24(dst), 0, 0
156 psq_st src4, 32(dst), 0, 0
157 psq_st src5, 40(dst), 0, 0
158 };
159#endif
160}
161
162inline void gekko_ps_copy16(__REGISTER void* dst, __REGISTER const void* src) {
163#ifdef __MWERKS__
164 __REGISTER f32 src0;
165 __REGISTER f32 src1;
166 __REGISTER f32 src2;
167 __REGISTER f32 src3;
168 __REGISTER f32 src4;
169 __REGISTER f32 src5;
170 __REGISTER f32 src6;
171 __REGISTER f32 src7;
172 asm {
173 psq_l src0, 0(src), 0, 0
174 psq_l src1, 8(src), 0, 0
175 psq_l src2, 16(src), 0, 0
176 psq_l src3, 24(src), 0, 0
177 psq_l src4, 32(src), 0, 0
178 psq_l src5, 40(src), 0, 0
179 psq_l src6, 48(src), 0, 0
180 psq_l src7, 56(src), 0, 0
181 psq_st src0, 0(dst), 0, 0
182 psq_st src1, 8(dst), 0, 0
183 psq_st src2, 16(dst), 0, 0
184 psq_st src3, 24(dst), 0, 0
185 psq_st src4, 32(dst), 0, 0
186 psq_st src5, 40(dst), 0, 0
187 psq_st src6, 48(dst), 0, 0
188 psq_st src7, 56(dst), 0, 0
189 };
190#endif
191}
192
193}; // namespace JMath
194
195namespace JMathInlineVEC {
196 inline void C_VECAdd(__REGISTER const Vec* a, __REGISTER const Vec* b, __REGISTER Vec* ab) {
197 #ifdef __MWERKS__
198 __REGISTER f32 axy;
199 __REGISTER f32 bxy;
200 __REGISTER f32 sumab;
201 __REGISTER f32 az;
202 __REGISTER f32 bz;
203 __REGISTER f32 sumz;
204 asm {
205 psq_l axy, 0(a), 0, 0
206 psq_l bxy, 0(b), 0, 0
207 ps_add sumab, axy, bxy
208 psq_st sumab, 0(ab), 0, 0
209 psq_l az, 8(a), 1, 0
210 psq_l bz, 8(b), 1, 0
211 ps_add sumz, az, bz
212 psq_st sumz, 8(ab), 1, 0
213 }
214 #endif
215 }
216
217 inline void C_VECSubtract(__REGISTER const Vec* a, __REGISTER const Vec* b, __REGISTER Vec* ab) {
218 #ifdef __MWERKS__
219 __REGISTER f32 axy;
220 __REGISTER f32 bxy;
221 __REGISTER f32 az;
222 __REGISTER f32 subz;
223 __REGISTER f32 bz;
224 asm {
225 psq_l axy, 0(a), 0, 0
226 psq_l bxy, 0(b), 0, 0
227 ps_sub bxy, axy, bxy
228 psq_st bxy, 0(ab), 0, 0
229 psq_l az, 8(a), 1, 0
230 psq_l bz, 8(b), 1, 0
231 ps_sub subz, az, bz
232 psq_st subz, 8(ab), 1, 0
233 }
234 #endif
235 }
236
237 inline f32 C_VECSquareMag(__REGISTER const Vec* v) {
238 #ifdef __MWERKS__
239 __REGISTER f32 x_y;
240 __REGISTER f32 z;
241 __REGISTER f32 res;
242
243 asm {
244 psq_l x_y, 0(v), 0, 0
245 ps_mul x_y, x_y, x_y
246 lfs z, 8(v)
247 ps_madd res, z, z, x_y
248 ps_sum0 res, res, x_y, x_y
249 }
250 return res;
251 #endif
252 }
253
254 inline f32 C_VECDotProduct(__REGISTER const Vec *a, __REGISTER const Vec *b) {
255 #ifdef __MWERKS__
256 __REGISTER f32 res;
257 __REGISTER f32 thisyz;
258 __REGISTER f32 otheryz;
259 __REGISTER f32 otherxy;
260 __REGISTER f32 thisxy;
261 asm {
262 psq_l thisyz, 4(a), 0, 0
263 psq_l otheryz, 4(b), 0, 0
264 ps_mul thisyz, thisyz, otheryz
265 psq_l thisxy, 0(a), 0, 0
266 psq_l otherxy, 0(b), 0, 0
267 ps_madd otheryz, thisxy, otherxy, thisyz
268 ps_sum0 res, otheryz, thisyz, thisyz
269 };
270 return res;
271 #endif
272 }
273};
274
275template<typename T>
276inline T JMAMax(T param_0, T param_1) {
277 T ret;
278 if (param_0 > param_1) {
279 ret = param_0;
280 } else {
281 ret = param_1;
282 }
283 return ret;
284}
285
286#endif /* JMATH_H */
void JMAFastVECNormalize(__REGISTER const Vec *src, __REGISTER Vec *dst)
Definition JMath.cpp:56
float __frsqrtes(__REGISTER double f)
Definition JMath.h:32
void JMAVECScaleAdd(__REGISTER const Vec *vec1, __REGISTER const Vec *vec2, __REGISTER Vec *dst, __REGISTER f32 scale)
Definition JMath.cpp:74
void JMAEulerToQuat(s16 param_0, s16 param_1, s16 param_2, Quaternion *param_3)
Definition JMath.cpp:6
f32 JMAFastReciprocal(f32 value)
Definition JMath.h:26
void JMAQuatLerp(const Quaternion *, const Quaternion *, f32, Quaternion *)
void JMAFastVECNormalize(__REGISTER const Vec *src, __REGISTER Vec *dst)
Definition JMath.cpp:56
f32 JMAFastSqrt(__REGISTER const f32 input)
Definition JMath.h:46
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:60
void JMAMTXApplyScale(const Mtx, Mtx, f32, f32, f32)
T JMAMax(T param_0, T param_1)
Definition JMath.h:276
f32 Mtx[3][4]
Definition mtx.h:25
const void * src
Definition __os.h:116
double x double x
Definition e_atan2.c:58
f
Definition e_log.c:119
z
Definition e_log.c:139
double v
Definition e_pow.c:114
int __abs(int)
signed short int s16
Definition types.h:9
float f32
Definition types.h:25
a
Definition k_cos.c:89
Definition JMath.h:195
void C_VECSubtract(__REGISTER const Vec *a, __REGISTER const Vec *b, __REGISTER Vec *ab)
Definition JMath.h:217
f32 C_VECDotProduct(__REGISTER const Vec *a, __REGISTER const Vec *b)
Definition JMath.h:254
f32 C_VECSquareMag(__REGISTER const Vec *v)
Definition JMath.h:237
void C_VECAdd(__REGISTER const Vec *a, __REGISTER const Vec *b, __REGISTER Vec *ab)
Definition JMath.h:196
Definition JMATrigonometric.cpp:11
T fastSqrt(T value)
Definition JMath.h:96
void gekko_ps_copy6(__REGISTER void *dst, __REGISTER const void *src)
Definition JMath.h:121
f32 fastReciprocal(f32 value)
Definition JMath.h:100
void gekko_ps_copy16(__REGISTER void *dst, __REGISTER const void *src)
Definition JMath.h:162
void fastVECNormalize(const Vec *src, Vec *dst)
Definition JMath.h:104
void gekko_ps_copy3(__REGISTER void *dst, __REGISTER const void *src)
Definition JMath.h:108
void gekko_ps_copy12(__REGISTER void *dst, __REGISTER const void *src)
Definition JMath.h:137
Definition mtx.h:21
Definition mtx.h:13