// // atan2f from 0x1801304e4 to 0x1801308d4 (1008 bytes) // // 18 xrefs: // > sub_18007AC90 @ 0x18007b10f // > sub_18007AC90 @ 0x18007b12f // > sub_18007AC90 @ 0x18007b184 // > sub_18007AC90 @ 0x18007b1bb // > sub_1800E9310 @ 0x1800e93a5 // > sub_1800E9310 @ 0x1800e93ea // > sub_1800E9310 @ 0x1800e9564 // > sub_1800E9310 @ 0x1800e95ad // > sub_1801009B0 @ 0x180100b21 // > sub_1801009B0 @ 0x180100c15 // > sub_1801009B0 @ 0x180100d0d // > sub_1801009B0 @ 0x180100e05 // > sub_180101160 @ 0x180101351 // > sub_180101160 @ 0x1801013dc // > sub_18010A910 @ 0x18010aa22 // > sub_18010A910 @ 0x18010aa4d // > sub_18010BC70 @ 0x18010be8f // > @ 0x180202e1c // // This function is hookable on this platform! // // Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA // Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings // float __cdecl atan2f(float Y, float X) { double v2; // xmm7_8 double v3; // xmm6_8 double v4; // rbp double v5; // rdi int v6; // esi double v7; // r15 double v8; // r14 unsigned __int64 v10; // rbx float v11; // xmm6_4 __int64 v12; // rcx double v13; // rax unsigned __int64 v14; // r8 __int64 v15; // rdx unsigned __int64 v16; // rax int v17; // edx double v18; // xmm0_8 double v19; // xmm4_8 int v20; // eax double v21; // xmm3_8 double v22; // xmm0_8 float v23; // [rsp+80h] [rbp+8h] v2 = X; v3 = Y; v4 = X; v5 = Y; v6 = ((COERCE_UNSIGNED_INT64(Y) >> 52) & 0x7FF) - ((COERCE_UNSIGNED_INT64(X) >> 52) & 0x7FF); v7 = fabs(X); v8 = fabs(Y); if ( *(_QWORD *)&v7 > 0x7FF0000000000000uLL ) { v23 = X; return handle_nanf(LODWORD(v23), 0x7FFFFFFFFFFFFFFFLL); } if ( *(_QWORD *)&v8 > 0x7FF0000000000000uLL ) { v23 = Y; return handle_nanf(LODWORD(v23), 0x7FFFFFFFFFFFFFFFLL); } v10 = 0; if ( v8 == 0.0 ) { if ( v4 >= 0.0 ) return v3; LABEL_35: if ( v5 >= 0.0 ) v11 = 3.1415927; else v11 = -3.1415927; goto LABEL_16; } if ( v7 == 0.0 ) { if ( v5 < 0.0 ) goto LABEL_14; set_statfp(32); } if ( v6 > 26 ) { if ( v5 >= 0.0 ) { v11 = 1.5707964; goto LABEL_16; } LABEL_14: v11 = -1.5707964; LABEL_16: v12 = 32; goto LABEL_17; } if ( v6 < -13 && v4 >= 0.0 ) { if ( v6 >= -150 ) { if ( v6 >= -126 ) return v3 / v2; v13 = fabs(1.267650600228229e30 * v3 / v2); v14 = COERCE_UNSIGNED_INT64(1.267650600228229e30 * v3 / v2) & 0x8000000000000000uLL; v15 = *(_QWORD *)&v13 >> 52; if ( (unsigned int)(*(_QWORD *)&v13 >> 52) <= 0x64 ) { v16 = *(_QWORD *)&v13 & 0x800FFFFFFFFFFFFFuLL | 0x10000000000000LL; if ( 101 - (int)v15 <= 54 ) v10 = ((v16 >> (101 - (unsigned __int8)v15 - 1)) & 1) + (v16 >> (101 - (unsigned __int8)v15 - 1) >> 1); } else { v10 = *(_QWORD *)&v13 & 0x800FFFFFFFFFFFFFuLL | ((v15 - 100) << 52); } v11 = COERCE_DOUBLE(v14 | v10); if ( ((v14 | v10) & 0x7FF0000000000000LL) != 0 ) return v11; } else if ( v5 >= 0.0 ) { v11 = 0.0; } else { v11 = -0.0; } v12 = 48; LABEL_17: set_statfp(v12); return v11; } if ( v6 < -26 && v4 < 0.0 ) goto LABEL_35; if ( v8 == INFINITY && v7 == INFINITY ) { if ( v4 >= 0.0 ) { if ( v5 >= 0.0 ) v11 = 0.78539819; else v11 = -0.78539819; } else if ( v5 >= 0.0 ) { v11 = 2.3561945; } else { v11 = -2.3561945; } goto LABEL_16; } if ( v4 < 0.0 ) v2 = -v2; if ( v5 < 0.0 ) v3 = -v3; v17 = 0; LOBYTE(v17) = v3 > v2; if ( v3 > v2 ) { v18 = v2; v2 = v3; v3 = v18; } v19 = v3 / v2; if ( v3 / v2 > 0.0625 ) { v20 = (int)(v19 * 256.0 + 0.5); v21 = (v3 * 256.0 - (double)v20 * v2) / ((double)v20 * v3 + v2 * 256.0); v19 = v21 + dbl_1801724A0[v20 - 16]; v22 = v21 * v21 * v21 * 0.333333333332241; LABEL_57: v19 = v19 - v22; goto LABEL_58; } if ( v19 >= 0.0001 ) { v22 = (0.3333333333333317 - (0.1999999999939322 - v19 * v19 * 0.1428571356180717) * (v19 * v19)) * (v19 * v19 * v19); goto LABEL_57; } LABEL_58: if ( v17 ) v19 = 1.570796326794897 - v19; if ( v4 < 0.0 ) v19 = 3.141592653589793 - v19; if ( v5 < 0.0 ) return -v19; return v19; }