// // ldexp from 0x1801274e0 to 0x18012764e (366 bytes) // // 7 xrefs: // > sub_180001A10 @ 0x180001bee // > sub_180001A10 @ 0x180001c2d // > sub_180012FF0 @ 0x18001309f // > sub_180012FF0 @ 0x1800130c9 // > sub_1800501A0 @ 0x18005020c // > sub_1800501A0 @ 0x180050242 // > @ 0x1802029f0 // // 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 // double __cdecl ldexp(double X, int Y) { double v3; // xmm6_8 __int64 v4; // rax __int64 v5; // rcx __int64 v6; // rdi int v7; // eax int v8; // r8d int v9; // r9d int v11; // ecx int v12; // edx int v13; // [rsp+60h] [rbp+18h] BYREF v3 = X; v4 = ctrlfp(8064, 65472); v5 = HIWORD(X); v6 = v4; if ( (HIWORD(X) & 0x7FF0) != 0x7FF0 ) { if ( X == 0.0 ) goto LABEL_7; LOWORD(v5) = HIWORD(X) & 0x7FF0; decomp(v5, &v13); if ( Y >= 0 ) { if ( v13 > 0x7FFFFFFF - Y ) goto LABEL_23; } else if ( v13 < (int)(0x80000000 - Y) ) { goto LABEL_18; } v12 = v13 + Y; if ( v13 + Y <= 2560 ) { if ( v12 > 1024 ) { set_exp((unsigned int)v13, (unsigned int)(v12 - 1536)); LABEL_24: v11 = 17; return except2(v11, 25, v8, v9, *(__int64 *)&X, v6); } if ( v12 >= -2557 ) { if ( v12 >= -1021 ) { ((void (*)(void))set_exp)(); goto LABEL_6; } set_exp((unsigned int)v13, (unsigned int)(v12 + 1536)); goto LABEL_19; } LABEL_18: X = X * 0.0; LABEL_19: v11 = 18; return except2(v11, 25, v8, v9, *(__int64 *)&X, v6); } LABEL_23: X = copysign(INFINITY, X); goto LABEL_24; } v7 = sptype(); if ( v7 > 0 ) { if ( v7 <= 2 ) { LABEL_7: ctrlfp(v6, 65472); return v3; } if ( v7 == 3 ) { X = handle_qnan2(); LABEL_6: v3 = X; goto LABEL_7; } } v11 = 8; X = X + 1.0; return except2(v11, 25, v8, v9, *(__int64 *)&X, v6); }