// // _sse2_powf4 from 0x180122fc0 to 0x180123ad1 (2833 bytes) // // 2 xrefs: // > _sse2_powf4 @ 0x1801202e0 // > @ 0x1802025dc // // 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 __fastcall _sse2_powf4(double a1, double a2) { __m128i si128; // xmm5 __m128 v3; // xmm7 __m128i v4; // xmm4 __m128i v5; // xmm6 __m128i v6; // xmm2 __m128i v7; // xmm3 __m128i v8; // xmm1 __m128i v9; // xmm2 __m128 v10; // xmm4 int v11; // eax __m128 v12; // xmm7 int v13; // edx __m128 v14; // xmm5 __m128i v15; // xmm6 __m128i v16; // xmm1 int v17; // ecx __m128 v18; // xmm5 __m128i v19; // xmm2 __m128d v20; // xmm0 __m128d v21; // xmm7 __m128d v22; // xmm2 __m128d v23; // xmm5 __m128d v24; // xmm4 __m128d v25; // xmm0 __m128d v26; // xmm6 __m128d v27; // xmm3 __m128d v28; // xmm7 __m128d v29; // xmm2 __m128d v30; // xmm4 __m128d v31; // xmm6 __m128d v32; // xmm3 __m128d v33; // xmm5 __m128i v34; // xmm2 __m128d v35; // xmm0 __m128i v36; // xmm7 __m128d v37; // xmm3 __m128d v38; // xmm1 __m128d v39; // xmm5 __m128i v40; // xmm0 __m128i v41; // xmm4 __m128i v42; // xmm7 __m128i v43; // xmm6 __m128i v44; // xmm4 __m128i v45; // xmm2 __m128i v46; // xmm3 __m128i v47; // xmm2 __m128i v48; // xmm3 __m128i v49; // xmm0 __m128i v50; // xmm3 __m128 v51; // xmm1 __m128i v52; // xmm6 __m128i v53; // xmm4 __m128i v54; // xmm2 __m128i v55; // xmm1 int v56; // r12d __m128 *v57; // rdi __int64 v58; // rsi __int32 v59; // r13d unsigned __int32 v60; // ebx unsigned int v61; // r14d unsigned int v62; // r15d int v63; // eax unsigned int v64; // edx unsigned int v65; // eax __m128i v66; // xmm0 __m128 v67; // xmm1 __m128 v68; // xmm2 int v69; // eax int v70; // edx unsigned int v71; // eax __m128i v72; // xmm2 __m128d v73; // xmm0 __m128d v74; // xmm3 __m128i v75; // xmm0 __m128i v76; // xmm3 __m128i v77; // xmm7 __m128i v78; // xmm6 __m128i v79; // xmm3 unsigned int v80; // edx unsigned int v81; // eax __m128i v82; // xmm0 __m128 v83; // xmm1 __m128 v84; // xmm2 int v85; // eax unsigned int v86; // r8d unsigned int v87; // edx unsigned int v88; // eax __m128i v89; // xmm0 __m128 v90; // xmm1 __m128 v91; // xmm2 int v92; // eax unsigned int v93; // edx int v94; // edx __m128i v96; // [rsp+20h] [rbp-108h] __m128d v97; // [rsp+40h] [rbp-E8h] __m128 v98; // [rsp+90h] [rbp-98h] BYREF __m128 v99; // [rsp+A0h] [rbp-88h] __m128i v100; // [rsp+D0h] [rbp-58h] __m128i v101; // [rsp+E0h] [rbp-48h] BYREF si128 = _mm_load_si128((const __m128i *)&xmmword_1802042A0); v100 = *(__m128i *)&a2; v3 = (__m128)_mm_and_si128(_mm_load_si128((const __m128i *)&xmmword_180204200), *(__m128i *)&a2); v4 = _mm_and_si128(_mm_load_si128((const __m128i *)&xmmword_180204240), *(__m128i *)&a1); v5 = _mm_and_si128( _mm_cmpeq_epi32((__m128i)0LL, *(__m128i *)&a1), _mm_andnot_si128( _mm_cmpgt_epi32(*(__m128i *)&a2, (__m128i)xmmword_180204220), _mm_cmpgt_epi32(*(__m128i *)&a2, (__m128i)0LL))); v6 = _mm_and_si128(_mm_add_epi32(_mm_load_si128((const __m128i *)&xmmword_180204250), v4), (__m128i)xmmword_180204260); v7 = _mm_cmpgt_epi32(_mm_load_si128((const __m128i *)&xmmword_180204210), *(__m128i *)&a1); v8 = _mm_xor_si128(si128, v6); v9 = _mm_srli_epi32(v6, 0x17u); v10 = (__m128)_mm_or_si128(v4, v8); v11 = _mm_movemask_epi8((__m128i)_mm_cmpnlt_ps(v3, (__m128)xmmword_180204200)); v12 = 0; v96 = _mm_xor_si128(v5, (__m128i)xmmword_1802043B0); v13 = _mm_movemask_epi8(v5) ^ 0xFFFF; if ( !v13 ) { v40.m128i_i64[0] = 0; return *(double *)v40.m128i_i64; } v101 = *(__m128i *)&a1; v14 = _mm_add_ps((__m128)si128, v10); v15 = (__m128i)_mm_unpacklo_ps((__m128)0LL, v10); v16 = _mm_add_epi32( _mm_and_si128( _mm_sub_epi32(_mm_srli_epi32(_mm_slli_epi32(*(__m128i *)&a1, 1u), 0x18u), (__m128i)xmmword_180204230), v96), v9); v17 = v13 & _mm_movemask_epi8(_mm_or_si128(_mm_cmpgt_epi32(*(__m128i *)&a1, (__m128i)xmmword_180204220), v7)); if ( v17 ) { v45 = _mm_andnot_si128(v96, (__m128i)xmmword_1802042A0); v46 = _mm_or_si128(_mm_and_si128(v96, v100), v45); v47 = _mm_or_si128(v45, _mm_and_si128(v96, v101)); v100 = v46; v48 = _mm_cmpgt_epi32(_mm_load_si128((const __m128i *)&xmmword_180204210), v47); v101 = v47; v49 = _mm_or_si128(_mm_cmpgt_epi32(v47, (__m128i)xmmword_180204220), v48); v12 = 0; v50 = _mm_and_si128( v48, _mm_cmpgt_epi32((__m128i)xmmword_180204210, _mm_and_si128(v47, (__m128i)xmmword_180204290))); if ( _mm_movemask_epi8(v50) ) { v51 = (__m128)_mm_and_si128((__m128i)xmmword_1802042A0, v50); v52 = (__m128i)_mm_sub_ps( (__m128)_mm_or_si128(_mm_and_si128(v101, (__m128i)xmmword_180204290), (__m128i)v51), v51); v53 = _mm_and_si128(v52, (__m128i)xmmword_180204240); v54 = _mm_and_si128(_mm_add_epi32((__m128i)xmmword_180204250, v53), (__m128i)xmmword_180204260); v10 = (__m128)_mm_or_si128(v53, _mm_xor_si128((__m128i)xmmword_1802042A0, v54)); v17 = _mm_movemask_epi8( _mm_or_si128( _mm_xor_si128(_mm_cmpgt_epi32(_mm_load_si128(&v101), (__m128i)0LL), (__m128i)xmmword_1802043B0), _mm_cmpgt_epi32(_mm_load_si128(&v101), (__m128i)xmmword_180204220))); v14 = _mm_add_ps((__m128)xmmword_1802042A0, v10); v55 = _mm_sub_epi32( _mm_srli_epi32(_mm_slli_epi32(v52, 1u), 0x18u), _mm_srli_epi32( _mm_add_epi32(_mm_and_si128(v50, (__m128i)xmmword_180204280), (__m128i)xmmword_1802042A0), 0x17u)); v15 = (__m128i)_mm_unpacklo_ps((__m128)0LL, v10); v16 = _mm_add_epi32(v55, _mm_srli_epi32(v54, 0x17u)); } else { v17 = _mm_movemask_epi8(v49); v15 = (__m128i)_mm_unpacklo_ps((__m128)0LL, v10); } } v18 = _mm_rcp_ps(v14); v19 = _mm_load_si128((const __m128i *)&xmmword_180204270); v20 = _mm_cvtps_pd(v18); v21 = (__m128d)_mm_add_epi32(_mm_srli_epi64((__m128i)_mm_unpackhi_ps(v12, v10), 4u), v19); v22 = (__m128d)_mm_add_epi32(_mm_srli_epi64(v15, 4u), v19); v23 = _mm_cvtps_pd(_mm_shuffle_ps(v18, v18, 238)); v24 = _mm_sub_pd((__m128d)xmmword_1802042B0, v21); v25 = _mm_mul_pd(v20, _mm_sub_pd(_mm_mul_pd(v22, v20), (__m128d)xmmword_1802042B0)); v26 = v21; v27 = _mm_mul_pd( _mm_add_pd(_mm_mul_pd(v22, v25), (__m128d)xmmword_1802042B0), _mm_mul_pd(_mm_sub_pd((__m128d)xmmword_1802042B0, v22), v25)); v28 = _mm_mul_pd(_mm_sub_pd(_mm_mul_pd(v21, v23), (__m128d)xmmword_1802042B0), v23); v29 = _mm_mul_pd(v27, v27); v30 = _mm_mul_pd(_mm_add_pd(_mm_mul_pd(v26, v28), (__m128d)xmmword_1802042B0), _mm_mul_pd(v24, v28)); v31 = _mm_mul_pd(v30, v30); v32 = _mm_mul_pd( _mm_add_pd( _mm_mul_pd( _mm_mul_pd(v27, (__m128d)xmmword_180204300), _mm_add_pd( _mm_mul_pd( _mm_add_pd( _mm_mul_pd( _mm_add_pd( _mm_mul_pd( _mm_add_pd(_mm_mul_pd((__m128d)xmmword_1802042F0, v29), (__m128d)xmmword_1802042E0), v29), (__m128d)xmmword_1802042D0), v29), (__m128d)xmmword_1802042C0), v29), (__m128d)xmmword_1802042B0)), _mm_cvtepi32_pd(v16)), _mm_cvtps_pd((__m64)v100.m128i_u64[0])); v33 = _mm_mul_pd( _mm_add_pd( _mm_mul_pd( _mm_add_pd( _mm_mul_pd( _mm_add_pd( _mm_mul_pd( _mm_add_pd( _mm_mul_pd( _mm_add_pd(_mm_mul_pd((__m128d)xmmword_1802042F0, v31), (__m128d)xmmword_1802042E0), v31), (__m128d)xmmword_1802042D0), v31), (__m128d)xmmword_1802042C0), v31), (__m128d)xmmword_1802042B0), _mm_mul_pd(v30, (__m128d)xmmword_180204300)), _mm_cvtepi32_pd(_mm_shuffle_epi32(v16, 238))), _mm_cvtps_pd((__m64)v100.m128i_u64[1])); v98 = (__m128)v32; v99 = (__m128)v33; if ( v17 | v11 ) { v98 = (__m128)v32; v99 = (__m128)v33; v56 = v17; v57 = &v98; v58 = 0; while ( 1 ) { v59 = v101.m128i_i32[v58]; v60 = v100.m128i_u32[v58]; v61 = v59 & 0x7FFFFFFF; v62 = v60 & 0x7FFFFFFF; if ( (v60 & 0x7FFFFFFF) != 0 ) { if ( v61 <= 0x7F800000 && v62 <= 0x7F800000 ) { if ( (v56 & 1) == 0 ) goto LABEL_56; if ( v61 ) { if ( v61 != 2139095040 ) { v64 = v60 & 0x7F800000; v65 = v60 & 0x7FFFFFFF; if ( (v60 & 0x7F800000) > 0x4A800000 ) { if ( v64 >= 0x7F800000 ) { _2TAG_PACKET_2_0_1_15: v69 = 0; } else { if ( v64 == 1258291200 ) goto _2TAG_PACKET_1_0_1_15; v69 = 0x40000000; } } else { v66 = _mm_cvtsi32_si128(v65); v67 = (__m128)_mm_cvtsi32_si128(0x4B000000u); v68.m128_f32[0] = 0.0 - *(float *)v66.m128i_i32; *(float *)v66.m128i_i32 = *(float *)v66.m128i_i32 + v67.m128_f32[0]; LOBYTE(v65) = _mm_cvtsi128_si32(v66); v67.m128_f32[0] = v67.m128_f32[0] - *(float *)v66.m128i_i32; if ( (_mm_movemask_ps(_mm_cmpeq_ss(v67, v68)) & 1) == 0 ) goto _2TAG_PACKET_2_0_1_15; _2TAG_PACKET_1_0_1_15: v69 = ((v65 & 1) + 1) << 30; } v70 = v69; if ( v69 ) { if ( (v57->m128_i32[1] & 0x7FFFFFFFu) < 0x40862000 ) { v97 = _mm_unpacklo_pd((__m128d)v57->m128_u64[0], (__m128d)v57->m128_u64[0]); v72 = _mm_load_si128((const __m128i *)&xmmword_180204330); v73 = _mm_add_pd((__m128d)xmmword_180204310, v97); v74 = _mm_add_pd(v97, _mm_sub_pd((__m128d)xmmword_180204310, v73)); v75 = (__m128i)_mm_shuffle_ps( _mm_cvtpd_ps( _mm_mul_pd( (__m128d)_mm_or_si128( _mm_slli_epi64(_mm_add_epi32((__m128i)v73, v72), 0x34u), (__m128i)xmmword_1802043A0), _mm_mul_pd( _mm_mul_pd( _mm_add_pd( _mm_mul_pd(_mm_add_pd((__m128d)xmmword_180204340, v74), v74), (__m128d)xmmword_180204360), _mm_add_pd( _mm_mul_pd(_mm_add_pd((__m128d)xmmword_180204350, v74), v74), (__m128d)xmmword_180204370)), _mm_add_pd( _mm_mul_pd(_mm_add_pd(v74, (__m128d)xmmword_180204380), v74), (__m128d)xmmword_180204390)))), _mm_cvtpd_ps( _mm_mul_pd( _mm_mul_pd( _mm_mul_pd( _mm_add_pd( _mm_mul_pd(_mm_add_pd(v74, (__m128d)xmmword_180204350), v74), (__m128d)xmmword_180204370), _mm_add_pd( _mm_mul_pd(_mm_add_pd(v74, (__m128d)xmmword_180204340), v74), (__m128d)xmmword_180204360)), _mm_add_pd( _mm_mul_pd(_mm_add_pd((__m128d)xmmword_180204380, v74), v74), (__m128d)xmmword_180204390)), (__m128d)_mm_or_si128( _mm_load_si128((const __m128i *)&xmmword_1802043A0), _mm_slli_epi64(_mm_add_epi32((__m128i)v73, v72), 0x34u)))), 68); if ( _mm_movemask_epi8( _mm_cmpgt_epi32( _mm_and_si128( (__m128i)_mm_shuffle_ps((__m128)v97, (__m128)v97, 221), (__m128i)xmmword_180204290), (__m128i)xmmword_180204320)) ) { v76 = (__m128i)_mm_shuffle_ps((__m128)v97, (__m128)v97, 221); v77 = _mm_cmpeq_epi32(_mm_load_si128((const __m128i *)&xmmword_1802043B0), v76); v78 = _mm_cmpgt_epi32((__m128i)0LL, v76); v79 = _mm_cmpgt_epi32( _mm_and_si128(v76, (__m128i)xmmword_180204290), _mm_load_si128((const __m128i *)&xmmword_180204320)); v75.m128i_i32[0] = _mm_or_si128( _mm_and_si128( _mm_load_si128((const __m128i *)&xmmword_180204200), _mm_andnot_si128(v78, _mm_xor_si128(v77, v79))), _mm_or_si128( _mm_and_si128((__m128i)_mm_shuffle_ps((__m128)v97, (__m128)v97, 136), v77), _mm_andnot_si128(v79, v75))).m128i_u32[0]; } v57->m128_i32[0] = v75.m128i_i32[0]; v71 = v57->m128_i32[0]; } else { v71 = (0x80000000 >> ((v57->m128_i32[1] & 0x80000000) >> 28)) - 0x800000; } v57->m128_i32[0] = v70 & 0x80000000 | v71; } else if ( v62 < 0x7F800000 ) { v57->m128_i32[0] = 0x7FFFFFFF; raise_invalid(); } LABEL_55: v57->m128_i32[1] = -1; LABEL_56: if ( v59 == 1065353216 ) { v57->m128_i32[1] = -1; v57->m128_i32[0] = 1065353216; } else if ( v62 == 2139095040 ) { v57->m128_i32[1] = -1; if ( v61 == 1065353216 ) { v57->m128_i32[0] = 1065353216; } else if ( v61 < 0x7F800000 ) { v94 = 0; if ( v60 >> 31 != v61 > 0x3F800000 ) v94 = 2139095040; v57->m128_i32[0] = v94; } } goto LABEL_65; } v80 = v60 & 0x7F800000; v81 = v60 & 0x7FFFFFFF; if ( (v60 & 0x7F800000) > 0x4A800000 ) { if ( v80 >= 0x7F800000 ) { _2TAG_PACKET_2_0_1_13: v85 = 0; } else { if ( v80 == 1258291200 ) goto _2TAG_PACKET_1_0_1_13; v85 = 0x40000000; } } else { v82 = _mm_cvtsi32_si128(v81); v83 = (__m128)_mm_cvtsi32_si128(0x4B000000u); v84.m128_f32[0] = 0.0 - *(float *)v82.m128i_i32; *(float *)v82.m128i_i32 = *(float *)v82.m128i_i32 + v83.m128_f32[0]; LOBYTE(v81) = _mm_cvtsi128_si32(v82); v83.m128_f32[0] = v83.m128_f32[0] - *(float *)v82.m128i_i32; if ( (_mm_movemask_ps(_mm_cmpeq_ss(v83, v84)) & 1) == 0 ) goto _2TAG_PACKET_2_0_1_13; _2TAG_PACKET_1_0_1_13: v85 = ((v81 & 1) + 1) << 30; } v57->m128_i32[0] = ((0x80000000 >> ((v60 & 0x80000000) >> 28)) - 0x800000) | v59 & v85 & 0x80000000; goto LABEL_55; } v86 = v60 & 0x80000000; v87 = v60 & 0x7F800000; v88 = v60 & 0x7FFFFFFF; if ( (v60 & 0x7F800000) > 0x4A800000 ) { if ( v87 >= 0x7F800000 ) { _2TAG_PACKET_2_0_1_12: v92 = 0; } else { if ( v87 == 1258291200 ) goto _2TAG_PACKET_1_0_1_12; v92 = 0x40000000; } } else { v89 = _mm_cvtsi32_si128(v88); v90 = (__m128)_mm_cvtsi32_si128(0x4B000000u); v91.m128_f32[0] = 0.0 - *(float *)v89.m128i_i32; *(float *)v89.m128i_i32 = *(float *)v89.m128i_i32 + v90.m128_f32[0]; LOBYTE(v88) = _mm_cvtsi128_si32(v89); v90.m128_f32[0] = v90.m128_f32[0] - *(float *)v89.m128i_i32; if ( (_mm_movemask_ps(_mm_cmpeq_ss(v90, v91)) & 1) == 0 ) goto _2TAG_PACKET_2_0_1_12; _2TAG_PACKET_1_0_1_12: v92 = ((v88 & 1) + 1) << 30; } v93 = 0; if ( v92 < 0 ) v93 = v59 & 0x80000000; v57->m128_i32[0] = v93 | ((0x800000 << (v86 >> 28)) - 0x800000); if ( v86 ) raise_zerodivide(); goto LABEL_55; } v63 = 0x7FFFFFFF; v57->m128_i32[1] = -1; if ( v59 == 1065353216 ) v63 = 1065353216; v57->m128_i32[0] = v63; } else { v57->m128_i32[1] = -1; v57->m128_i32[0] = 1065353216; } LABEL_65: ++v58; v57 = (__m128 *)((char *)v57 + 8); v56 >>= 4; if ( v58 >= 4 ) { v32 = (__m128d)v98; v33 = (__m128d)v99; break; } } } v34 = _mm_load_si128((const __m128i *)&xmmword_180204330); v35 = _mm_add_pd((__m128d)xmmword_180204310, v32); v36 = (__m128i)_mm_shuffle_ps((__m128)v32, (__m128)v33, 221); v37 = _mm_add_pd(v32, _mm_sub_pd((__m128d)xmmword_180204310, v35)); v38 = _mm_add_pd((__m128d)xmmword_180204310, v33); v39 = _mm_add_pd(v33, _mm_sub_pd((__m128d)xmmword_180204310, v38)); v40 = _mm_and_si128( (__m128i)_mm_shuffle_ps( _mm_cvtpd_ps( _mm_mul_pd( (__m128d)_mm_or_si128( _mm_slli_epi64(_mm_add_epi32((__m128i)v35, v34), 0x34u), (__m128i)xmmword_1802043A0), _mm_mul_pd( _mm_mul_pd( _mm_add_pd( _mm_mul_pd(_mm_add_pd((__m128d)xmmword_180204340, v37), v37), (__m128d)xmmword_180204360), _mm_add_pd( _mm_mul_pd(_mm_add_pd((__m128d)xmmword_180204350, v37), v37), (__m128d)xmmword_180204370)), _mm_add_pd( _mm_mul_pd(_mm_add_pd(v37, (__m128d)xmmword_180204380), v37), (__m128d)xmmword_180204390)))), _mm_cvtpd_ps( _mm_mul_pd( _mm_mul_pd( _mm_mul_pd( _mm_add_pd( _mm_mul_pd(_mm_add_pd(v39, (__m128d)xmmword_180204350), v39), (__m128d)xmmword_180204370), _mm_add_pd( _mm_mul_pd(_mm_add_pd(v39, (__m128d)xmmword_180204340), v39), (__m128d)xmmword_180204360)), _mm_add_pd( _mm_mul_pd(_mm_add_pd((__m128d)xmmword_180204380, v39), v39), (__m128d)xmmword_180204390)), (__m128d)_mm_or_si128( _mm_load_si128((const __m128i *)&xmmword_1802043A0), _mm_slli_epi64(_mm_add_epi32((__m128i)v38, v34), 0x34u)))), 68), v96); if ( _mm_movemask_epi8(_mm_cmpgt_epi32(_mm_and_si128(v36, (__m128i)xmmword_180204290), (__m128i)xmmword_180204320)) ) { v41 = (__m128i)_mm_shuffle_ps(v98, v99, 221); v42 = _mm_cmpeq_epi32(_mm_load_si128((const __m128i *)&xmmword_1802043B0), v41); v43 = _mm_cmpgt_epi32((__m128i)0LL, v41); v44 = _mm_cmpgt_epi32( _mm_and_si128(v41, (__m128i)xmmword_180204290), _mm_load_si128((const __m128i *)&xmmword_180204320)); v40.m128i_i64[0] = _mm_and_si128( _mm_or_si128( _mm_and_si128( _mm_load_si128((const __m128i *)&xmmword_180204200), _mm_andnot_si128(v43, _mm_xor_si128(v42, v44))), _mm_or_si128( _mm_and_si128((__m128i)_mm_shuffle_ps(v98, v99, 136), v42), _mm_andnot_si128(v44, v40))), v96).m128i_u64[0]; } return *(double *)v40.m128i_i64; }