pikmin2/include/sqrt.h
2023-12-20 21:23:29 -05:00

65 lines
1.2 KiB
C

#ifndef _SQRT_H
#define _SQRT_H
#include "types.h"
#define FRSQRTE(input, output) \
{ \
register f32 __frsqrte_v = input; \
asm { frsqrte __frsqrte_v, __frsqrte_v } \
*output = __frsqrte_v; \
}
inline f32 sqrtf(f32& __sqrtf_g)
{
if ((__sqrtf_g > 0.0f)) {
f32 __sqrtf_h;
#ifdef __MWERKS__ // clang-format off
FRSQRTE(__sqrtf_g, &__sqrtf_h);
#endif // clang-format on
__sqrtf_g = __sqrtf_h * __sqrtf_g;
}
return __sqrtf_g;
}
inline f32 sqrtf2(f32& __sqrtf_g)
{
if ((__sqrtf_g > 0.0f)) {
f32 __sqrtf_h;
#ifdef __MWERKS__ // clang-format off
FRSQRTE(__sqrtf_g, &__sqrtf_h);
#endif // clang-format on
__sqrtf_g = __sqrtf_h * __sqrtf_g;
return __sqrtf_g;
}
return __sqrtf_g;
}
inline f32 _sqrtf(f32 x) { return (x > 0.0f) ? sqrtf(x) : 0.0f; }
inline f32 _sqrtf2(f32 x)
{
if (x > 0.0f) {
return sqrtf2(x);
}
return 0.0f;
}
// used in pelplant's Obj::getShadowParam(ShadowParam&)
inline void __sqrtf(register f32 x, f32* val)
{
if (x > 0.0f) {
if (x > 0.0f) {
register f32 reg_f0;
#ifdef __MWERKS__ // clang-format off
asm { frsqrte reg_f0, x }
#endif // clang-format on
*val = reg_f0 * x;
}
} else {
*val = 0.0f;
}
}
#endif