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 "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#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 az;
201 __REGISTER f32 sumz;
202 __REGISTER f32 bz;
203 asm {
204 psq_l axy, 0(a), 0, 0
205 psq_l bxy, 0(b), 0, 0
206 ps_add bxy, axy, bxy
207 psq_st bxy, 0(ab), 0, 0
208 psq_l az, 8(a), 1, 0
209 psq_l bz, 8(b), 1, 0
210 ps_add sumz, az, bz
211 psq_st sumz, 8(ab), 1, 0
212 }
213 #endif
214 }
215
216 inline void C_VECSubtract(__REGISTER const Vec* a, __REGISTER const Vec* b, __REGISTER Vec* ab) {
217 #ifdef __MWERKS__
218 __REGISTER f32 axy;
219 __REGISTER f32 bxy;
220 __REGISTER f32 az;
221 __REGISTER f32 subz;
222 __REGISTER f32 bz;
223 asm {
224 psq_l axy, 0(a), 0, 0
225 psq_l bxy, 0(b), 0, 0
226 ps_sub bxy, axy, bxy
227 psq_st bxy, 0(ab), 0, 0
228 psq_l az, 8(a), 1, 0
229 psq_l bz, 8(b), 1, 0
230 ps_sub subz, az, bz
231 psq_st subz, 8(ab), 1, 0
232 }
233 #endif
234 }
235
236 inline f32 C_VECSquareMag(__REGISTER const Vec* v) {
237 #ifdef __MWERKS__
238 __REGISTER f32 x_y;
239 __REGISTER f32 z;
240 __REGISTER f32 res;
241
242 asm {
243 psq_l x_y, 0(v), 0, 0
244 ps_mul x_y, x_y, x_y
245 lfs z, 8(v)
246 ps_madd res, z, z, x_y
247 ps_sum0 res, res, x_y, x_y
248 }
249 return res;
250 #endif
251 }
252
253 inline f32 C_VECDotProduct(__REGISTER const Vec *a, __REGISTER const Vec *b) {
254 #ifdef __MWERKS__
255 __REGISTER f32 res;
256 __REGISTER f32 thisyz;
257 __REGISTER f32 otheryz;
258 __REGISTER f32 otherxy;
259 __REGISTER f32 thisxy;
260 asm {
261 psq_l thisyz, 4(a), 0, 0
262 psq_l otheryz, 4(b), 0, 0
263 ps_mul thisyz, thisyz, otheryz
264 psq_l thisxy, 0(a), 0, 0
265 psq_l otherxy, 0(b), 0, 0
266 ps_madd otheryz, thisxy, otherxy, thisyz
267 ps_sum0 res, otheryz, thisyz, thisyz
268 };
269 return res;
270 #endif
271 }
272};
273
274template<typename T>
275inline T JMAMax(T param_0, T param_1) {
276 T ret;
277 if (param_0 > param_1) {
278 ret = param_0;
279 } else {
280 ret = param_1;
281 }
282 return ret;
283}
284
285#endif /* JMATH_H */
void JMAFastVECNormalize(__REGISTER const Vec *src, __REGISTER Vec *dst)
Definition JMath.cpp:55
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:73
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:55
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:275
f32 Mtx[3][4]
Definition mtx.h:25
const void * src
Definition __os.h:116
signed short int s16
Definition types.h:9
float f32
Definition types.h:25
double x double x
Definition e_atan2.c:58
double v
Definition e_pow.c:163
z
Definition e_pow.c:390
int __abs(int)
a
Definition k_cos.c:89
float __fabsf(float)
float __fres(float)
Definition JMath.h:195
void C_VECSubtract(__REGISTER const Vec *a, __REGISTER const Vec *b, __REGISTER Vec *ab)
Definition JMath.h:216
f32 C_VECDotProduct(__REGISTER const Vec *a, __REGISTER const Vec *b)
Definition JMath.h:253
f32 C_VECSquareMag(__REGISTER const Vec *v)
Definition JMath.h:236
void C_VECAdd(__REGISTER const Vec *a, __REGISTER const Vec *b, __REGISTER Vec *ab)
Definition JMath.h:196
Definition JMATrigonometric.cpp:71
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