Match one function, update mips_to_c of 2 others (#164)

There's a function that appears to use continued fractions
 to approximate the value of tanh(x/2), which is super weird.

Signed-off-by: Taggerung <tyler.taggerung@gmail.com>
This commit is contained in:
Tyler McGavran
2022-02-15 01:40:33 -05:00
committed by GitHub
parent 3403482de3
commit a4e6192030
3 changed files with 44 additions and 83 deletions
@@ -1,27 +0,0 @@
glabel func_80091A6C
/* 09266C 80091A6C 04C00006 */ bltz $a2, .L80091A88
/* 092670 80091A70 3C013FE0 */ li $at, 0x3FE00000 # 1.750000
/* 092674 80091A74 3C014000 */ li $at, 0x40000000 # 2.000000
/* 092678 80091A78 44810800 */ mtc1 $at, $f1
/* 09267C 80091A7C 44800000 */ mtc1 $zero, $f0
/* 092680 80091A80 10000004 */ b .L80091A94
/* 092684 80091A84 00000000 */ nop
.L80091A88:
/* 092688 80091A88 44810800 */ mtc1 $at, $f1
/* 09268C 80091A8C 44800000 */ mtc1 $zero, $f0
/* 092690 80091A90 00063023 */ negu $a2, $a2
.L80091A94:
/* 092694 80091A94 10C00008 */ beqz $a2, .L80091AB8
.L80091A98:
/* 092698 80091A98 30CE0001 */ andi $t6, $a2, 1
/* 09269C 80091A9C 11C00003 */ beqz $t6, .L80091AAC
/* 0926A0 80091AA0 00067843 */ sra $t7, $a2, 1
/* 0926A4 80091AA4 46206302 */ mul.d $f12, $f12, $f0
/* 0926A8 80091AA8 00000000 */ nop
.L80091AAC:
/* 0926AC 80091AAC 46200002 */ mul.d $f0, $f0, $f0
/* 0926B0 80091AB0 15E0FFF9 */ bnez $t7, .L80091A98
/* 0926B4 80091AB4 01E03025 */ move $a2, $t7
.L80091AB8:
/* 0926B8 80091AB8 03E00008 */ jr $ra
/* 0926BC 80091ABC 46206006 */ mov.d $f0, $f12
+43 -56
View File
@@ -37,24 +37,21 @@ f64 exponent_by_squaring(f64 base, s32 exponent) {
}
#ifdef MIPS_TO_C
//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307
f64 exponent_by_squaring(s32); // extern
f64 func_8009186C(f64); // extern
f64 func_8009195C(f64, f64); // extern
extern f64 D_800F0CB0;
extern f64 D_800F0CB8;
//generated by mips_to_c commit 06ada559d7a32fdab49fa2d619cdfa027615bcda
f64 func_8009186C(); /* extern */
f64 func_8009195C(f64, f64); /* extern */
f64 func_800917B0(f64 arg0, f64 arg1, f64 arg2) {
f64 func_800917B0(f64 arg0, ? arg0_lo, f64 arg1, ? arg1_lo, ? arg2_unk0, ? arg2_unk4) {
s32 temp_f8;
f64 phi_a2;
phi_a2 = arg2;
if ((arg1 <= D_800F0CB0) && (D_800F0CB8 <= arg1) && (temp_f8 = arg1, phi_a2 = (bitwise f64) temp_f8, (arg1 == temp_f8))) {
return exponent_by_squaring(temp_f8);
if ((arg1 <= D_800F0CB0) && (arg1 >= D_800F0CB8)) {
temp_f8 = (s32) arg1;
if (arg1 == (f64) temp_f8) {
return exponent_by_squaring(arg0, temp_f8);
}
}
if (arg0 > 0.0) {
arg2 = arg1;
return func_8009195C(func_8009186C(phi_a2) * arg2, arg2);
return func_8009195C(func_8009186C() * arg1, arg1);
}
return 0.0;
}
@@ -107,70 +104,60 @@ GLOBAL_ASM("asm/non_matchings/code_80091750/func_8009186C.s")
#endif
#ifdef MIPS_TO_C
//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307
? func_80091A6C(f64, f64, s32); // extern
//generated by mips_to_c commit 06ada559d7a32fdab49fa2d619cdfa027615bcda
// This is an f64 approximation of ln(2)
extern f64 D_800F0CD0;
void func_8009195C(f64 arg0) {
f64 func_8009195C(f64 arg0) {
f64 temp_f14;
f64 temp_f18;
f64 temp_f2;
f64 temp_f2_2;
s32 temp_f10;
f64 thing;
if (arg0 >= 0.0) {
thing = 0.5
} else {
thing = -0.5
}
temp_f18 = D_800F0CD0;
temp_f10 = 0.0 + (arg0 / temp_f18);
temp_f14 = arg0 - (temp_f10 * temp_f18);
temp_f10 = (s32) (thing + (arg0 / D_800F0CD0));
temp_f14 = arg0 - ((f64) temp_f10 * D_800F0CD0);
temp_f2 = temp_f14 * temp_f14;
temp_f2_2 = 2.0 + (temp_f2 / (6 + (temp_f2 / (0xA + (temp_f2 / (0xE + (temp_f2 / (0x12 + (temp_f2 / 22.0)))))))));
func_80091A6C((temp_f2_2 + temp_f14) / (temp_f2_2 - temp_f14), temp_f14, temp_f10);
/**
* This is the denominator part a tanh(x/2) continued fraction, where temp_f14 is x
* The best reference to this I can find is: https://math.stackexchange.com/questions/3241906/continued-fraction-02-6-10-14-22n-1-frace-1e1
**/
temp_f2_2 = 2.0 + (temp_f2 / ((f64) 6 + (temp_f2 / ((f64) 0xA + (temp_f2 / ((f64) 0xE + (temp_f2 / ((f64) 0x12 + (temp_f2 / 22.0)))))))));
return func_80091A6C((temp_f2_2 + temp_f14) / (temp_f2_2 - temp_f14), temp_f10);
}
#else
GLOBAL_ASM("asm/non_matchings/code_80091750/func_8009195C.s")
#endif
#ifdef MIPS_TO_C
//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307
f64 func_80091A6C(f64 arg0, s32 arg2) {
s32 temp_t7;
s32 phi_a2;
s32 phi_a2_2;
f64 phi_f12;
f64 phi_f12_2;
f64 phi_f12_3;
f64 phi_f0;
phi_a2 = arg2;
phi_f12 = arg0;
phi_f12_3 = arg0;
if (arg2 >= 0) {
/**
* This function appears to multiply some `value`
* by 2 ^ `exponent`, even if that exponent is negative
**/
f64 func_80091A6C(f64 value, s32 exponent) {
f64 base;
if (exponent >= 0) {
base = 2.0;
} else {
phi_a2 = -arg2;
exponent = -exponent;
base = 0.5;
}
phi_a2_2 = phi_a2;
phi_f0 = 0.0;
if (phi_a2 != 0) {
if (exponent != 0) {
do {
temp_t7 = phi_a2_2 >> 1;
phi_f12_2 = phi_f12_3;
if ((phi_a2_2 & 1) != 0) {
phi_f12_2 = phi_f12_3 * phi_f0;
if ((exponent & 1) != 0) {
value *= base;
}
phi_a2_2 = temp_t7;
phi_f12 = phi_f12_2;
phi_f12_3 = phi_f12_2;
phi_f0 *= phi_f0;
} while (temp_t7 != 0);
exponent >>= 1;
base *= base;
} while (exponent != 0);
}
return phi_f12;
return value;
}
#else
GLOBAL_ASM("asm/non_matchings/code_80091750/func_80091A6C.s")
#endif
#ifdef MIPS_TO_C
//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307
+1
View File
@@ -47,6 +47,7 @@ typedef struct {
/* Function Prototypes */
f64 exponent_by_squaring(f64, s32);
f64 func_80091A6C(f64, s32);
void swap_values(s32*, s32*);
void func_80092148();
void func_800921B4();