// // sub_180005220 from 0x180005220 to 0x180005515 (757 bytes) // // 2 xrefs: // > sub_180004520 @ 0x1800045fa // > @ 0x1801f62d0 // // 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 // __m128 *__fastcall sub_180005220( __m128 *a1, __m128 *a2, _OWORD *a3, __m128 *a4, __m128 *a5, __m128 *a6, __m128 *a7, int a8, int a9, int a10, int a11) { int i; // eax __m128 v14; // xmm2 __m128 v15; // xmm2 __m128 v16; // xmm1 int v17; // edx __int32 v18; // eax __m128 *result; // rax int j; // edi __m128 v22; // xmm1 __m128 v23; // xmm0 __m128 v24; // xmm2 __m128 v25; // xmm4 __m128 v26; // xmm0 __m128 v27; // xmm3 int v28; // ebx float v29; // xmm0_4 float v30; // xmm2_4 float v31; // xmm2_4 int k; // edi __m128 v33; // xmm2 __m128 v34; // xmm0 __m128 v35; // xmm5 __m128 v36; // xmm4 __m128 v37; // xmm1 __m128 v38; // xmm1 int v39; // ebx signed __int64 v40; // r9 signed __int64 v41; // r10 float v42; // xmm0_4 float v43; // xmm2_4 float v44; // xmm0_4 int m; // r9d __m128 v46; // xmm2 __m128 v47; // xmm2 __m128 v48; // xmm1 int v49; // r8d signed __int64 v50; // rdx float v51; // xmm0_4 for ( i = a8 >> 2; i; --i ) { v14 = a4[-1]; --a4; --a5; v15 = _mm_shuffle_ps(v14, v14, 27); v16 = _mm_shuffle_ps(*a5, *a5, 27); *a1 = _mm_unpacklo_ps(v15, v16); a1[1] = _mm_unpackhi_ps(v15, v16); a1 += 2; } v17 = a8 & 3; if ( (a8 & 3) != 0 ) { do { v18 = a4[-1].m128_i32[3]; a4 = (__m128 *)((char *)a4 - 4); a5 = (__m128 *)((char *)a5 - 4); a1->m128_i32[0] = v18; a1->m128_i32[1] = a5->m128_i32[0]; a1 = (__m128 *)((char *)a1 + 8); --v17; } while ( v17 ); } result = a7; for ( j = a9 >> 2; j; --j ) { v22 = *(__m128 *)a3; --a4; --a2; v23 = *a6; --a5; ++a3; ++a6; v24 = _mm_shuffle_ps(*a2, *a2, 27); v25 = _mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(*a4, *a4, 27), v24), _mm_mul_ps(v23, v22)); v26 = *result++; v27 = _mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(*a5, *a5, 27), v24), _mm_mul_ps(v26, v22)); *a1 = _mm_unpacklo_ps(v25, v27); a1[1] = _mm_unpackhi_ps(v25, v27); a1 += 2; } v28 = a9 & 3; if ( (a9 & 3) != 0 ) { do { a2 = (__m128 *)((char *)a2 - 4); v29 = a6->m128_f32[0] * *(float *)a3; a4 = (__m128 *)((char *)a4 - 4); a5 = (__m128 *)((char *)a5 - 4); a6 = (__m128 *)((char *)a6 + 4); a1->m128_f32[0] = (float)(a2->m128_f32[0] * a4->m128_f32[0]) + v29; v30 = result->m128_f32[0]; result = (__m128 *)((char *)result + 4); v31 = v30 * *(float *)a3; a3 = (_OWORD *)((char *)a3 + 4); a1->m128_f32[1] = v31 + (float)(a5->m128_f32[0] * a2->m128_f32[0]); a1 = (__m128 *)((char *)a1 + 8); --v28; } while ( v28 ); } for ( k = a10 >> 2; k; --k ) { v33 = *(__m128 *)a3; --a2; --a6; v34 = *a4; --result; ++a3; ++a4; v35 = _mm_shuffle_ps(*a2, *a2, 27); v36 = _mm_sub_ps(_mm_mul_ps(v35, v34), _mm_mul_ps(_mm_shuffle_ps(*a6, *a6, 27), v33)); v37 = *a5++; v38 = _mm_sub_ps(_mm_mul_ps(v37, v35), _mm_mul_ps(_mm_shuffle_ps(*result, *result, 27), v33)); *a1 = _mm_unpacklo_ps(v36, v38); a1[1] = _mm_unpackhi_ps(v36, v38); a1 += 2; } v39 = a10 & 3; if ( (a10 & 3) != 0 ) { v40 = (char *)a4 - (char *)a3; v41 = (char *)a5 - (char *)a3; do { a2 = (__m128 *)((char *)a2 - 4); v42 = a6[-1].m128_f32[3] * *(float *)a3; a6 = (__m128 *)((char *)a6 - 4); result = (__m128 *)((char *)result - 4); a1->m128_f32[0] = (float)(*(float *)((char *)a3 + v40) * a2->m128_f32[0]) - v42; v43 = *(float *)((char *)a3 + v41); v44 = result->m128_f32[0] * *(float *)a3; a3 = (_OWORD *)((char *)a3 + 4); a1->m128_f32[1] = (float)(v43 * a2->m128_f32[0]) - v44; a1 = (__m128 *)((char *)a1 + 8); --v39; } while ( v39 ); } for ( m = a11 >> 2; m; --m ) { v46 = a6[-1]; --a6; --result; v47 = (__m128)_mm_xor_si128((__m128i)_mm_shuffle_ps(v46, v46, 27), xmmword_180144630[0]); v48 = (__m128)_mm_xor_si128((__m128i)_mm_shuffle_ps(*result, *result, 27), xmmword_180144630[0]); *a1 = _mm_unpacklo_ps(v47, v48); a1[1] = _mm_unpackhi_ps(v47, v48); a1 += 2; } v49 = a11 & 3; if ( (a11 & 3) != 0 ) { v50 = (char *)a6 - (char *)result; do { v51 = *(float *)((char *)&result->m128_f32[-1] + v50); result = (__m128 *)((char *)result - 4); a1 = (__m128 *)((char *)a1 + 8); a1[-1].m128_f32[2] = -v51; a1[-1].m128_f32[3] = -result->m128_f32[0]; --v49; } while ( v49 ); } return result; }