// // log10 from 0x180141610 to 0x180141bbb (1451 bytes) // // 2 xrefs: // > __acrt_fltout @ 0x18013e397 // > @ 0x180203cd4 // // 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 // // local variable allocation has failed, the output may be wrong! double __cdecl log10(double X) { int v1; // edx int v2; // ecx double v3; // rax __m128i v4; // xmm3 double v5; // xmm6_8 __m128i v6; // xmm5 __m128i v7; // xmm2 unsigned __int64 v8; // rax __m128i v9; // xmm1 unsigned __int64 v10; // rax double v11; // xmm2_8 __m128i v12; // xmm0 double v13; // xmm1_8 double v14; // xmm6_8 double v15; // xmm1_8 double v16; // xmm4_8 double v17; // xmm3_8 __m128i v18; // xmm2 if ( !dword_1801F4D54 ) { v3 = X; v4 = _mm_sub_epi64(_mm_srli_epi64(*(__m128i *)&X, 0x34u), (__m128i)xmmword_18017B0A0); if ( COERCE_DOUBLE(*(_QWORD *)&X & 0x7FF0000000000000LL) == INFINITY ) { if ( X == INFINITY ) return X; if ( X != -INFINITY ) { *(_QWORD *)&X |= 0x8000000000000uLL; return X; } } else { v5 = _mm_cvtepi32_pd(v4).m128d_f64[0]; v6 = 0; if ( X > 0.0 ) { v7 = _mm_and_si128(*(__m128i *)&X, (__m128i)xmmword_18017B0C0); if ( v5 == -1023.0 ) { v18 = _mm_or_si128(v7, (__m128i)xmmword_18017B150); *(double *)v18.m128i_i64 = *(double *)v18.m128i_i64 - 1.0; v6.m128i_i64[0] = v18.m128i_i64[0]; v7 = _mm_and_si128(v18, (__m128i)xmmword_18017B0C0); v3 = *(double *)v7.m128i_i64; v5 = _mm_cvtepi32_pd(_mm_sub_epi32(_mm_srli_epi64(v6, 0x34u), (__m128i)xmmword_18017B1F0)).m128d_f64[0]; } v8 = 2 * (*(_QWORD *)&v3 & 0x80000000000LL) + (*(_QWORD *)&v3 & 0xFF00000000000LL); v9 = (__m128i)v8; if ( fabs(X - 1.0) < 0.0625 ) { *(double *)v12.m128i_i64 = X - 1.0; v13 = *(double *)v12.m128i_i64 / (*(double *)v12.m128i_i64 + 2.0); v14 = *(double *)v12.m128i_i64 * v13; v15 = v13 + v13; v16 = (0.01250000000377175 * (v15 * v15) + 0.08333333333333179) * (v15 * v15 * v15) + (0.0004348877777076146 * (v15 * v15) + 0.002232139987919448) * (v15 * v15 * v15 * (v15 * v15 * v15) * v15) - v14; v17 = *(double *)_mm_and_si128(v12, (__m128i)xmmword_18017B290).m128i_i64; return v17 * 0.0000007349550096401511 + (v16 + *(double *)v12.m128i_i64 - v17) * 0.0000007349550096401511 + (v16 + *(double *)v12.m128i_i64 - v17) * 0.4342937469482422 + v17 * 0.4342937469482422; } else { v10 = v8 >> 44; v11 = (*(double *)_mm_or_si128(v9, (__m128i)xmmword_18017B160).m128i_i64 - *(double *)_mm_or_si128(v7, (__m128i)xmmword_18017B160).m128i_i64) * dbl_180173C60[v10]; return dbl_18017B2B0[v10] + 0.3010299950838089 * v5 + dbl_18017BAC0[v10] + 5.801722962879576e-10 * v5 - ((0.3333333333333333 * v11 + 0.5) * (v11 * v11) + v11 + ((0.1666666666666667 * v11 + 0.2) * v11 + 0.25) * (v11 * v11 * (v11 * v11))) * 0.4342944819032518; } } if ( X == 0.0 ) { log10_special(v2, v1, 1); return X; } } log10_special(v2, v1, 2); return X; } __asm { vpsrlq xmm3, xmm0, 34h ; '4' vmovq rax, xmm0 vpsubq xmm3, xmm3, cs:xmmword_18017B0A0 vcvtdq2pd xmm6, xmm3 vpand xmm5, xmm0, cs:xmmword_18017B070 vcomisd xmm5, qword ptr cs:xmmword_18017B070 } if ( _RAX != 0x7FF0000000000000LL ) { if ( _RAX == 0xFFF0000000000000uLL ) { __asm { vmovsd xmm1, cs:qword_18017B080 } log10_special(v2, v1, 2); __asm { vmovdqa xmm6, [rsp+58h+var_38] } return X; } log10_special(v2, v1, 3); } __asm { vmovdqa xmm6, [rsp+58h+var_38] } return X; }