// // sub_180004FC0 from 0x180004fc0 to 0x18000521b (603 bytes) // // 1 xrefs: // > sub_180004520 @ 0x1800045a2 // // 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_180004FC0( __m128 *a1, __m128 *a2, __m128 *a3, __m128 *a4, __m128 *a5, int a6, int a7, int a8, int a9) { int i; // eax __m128 v10; // xmm1 __m128 v11; // xmm0 int v12; // r10d __int32 v13; // eax __m128 *result; // rax int j; // r11d __m128 v16; // xmm1 __m128 v17; // xmm0 __m128 v18; // xmm4 __m128 v19; // xmm3 __m128 v20; // xmm1 int v21; // r10d float v22; // xmm0_4 int k; // r11d __m128 v24; // xmm4 __m128 v25; // xmm0 __m128 v26; // xmm3 __m128 v27; // xmm4 __m128 v28; // xmm0 __m128 v29; // xmm2 int v30; // r10d signed __int64 v31; // r9 signed __int64 v32; // rdx signed __int64 v33; // r8 int m; // r8d __m128i si128; // xmm0 __m128i v36; // xmm2 int v37; // edx float v38; // xmm0_4 for ( i = a6 >> 3; i; --i ) { v10 = a4[-2]; a4 -= 2; v11 = a4[1]; a1[1] = _mm_shuffle_ps(v10, v10, 27); *a1 = _mm_shuffle_ps(v11, v11, 27); a1 += 2; } v12 = a6 & 7; if ( (a6 & 7) != 0 ) { do { v13 = a4[-1].m128_i32[3]; a4 = (__m128 *)((char *)a4 - 4); a1->m128_i32[0] = v13; a1 = (__m128 *)((char *)a1 + 4); --v12; } while ( v12 ); } result = a5; for ( j = a7 >> 3; j; --j ) { a2 -= 2; a4 -= 2; v16 = _mm_mul_ps(a3[1], result[1]); v17 = *result; result += 2; v18 = _mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(*a2, *a2, 27), _mm_shuffle_ps(*a4, *a4, 27)), v16); v19 = _mm_mul_ps(_mm_shuffle_ps(a2[1], a2[1], 27), _mm_shuffle_ps(a4[1], a4[1], 27)); v20 = *a3; a3 += 2; a1[1] = v18; *a1 = _mm_add_ps(v19, _mm_mul_ps(v20, v17)); a1 += 2; } v21 = a7 & 7; if ( (a7 & 7) != 0 ) { do { a4 = (__m128 *)((char *)a4 - 4); v22 = a3->m128_f32[0] * result->m128_f32[0]; a2 = (__m128 *)((char *)a2 - 4); a3 = (__m128 *)((char *)a3 + 4); result = (__m128 *)((char *)result + 4); a1->m128_f32[0] = (float)(a4->m128_f32[0] * a2->m128_f32[0]) + v22; a1 = (__m128 *)((char *)a1 + 4); --v21; } while ( v21 ); } for ( k = a8 >> 3; k; --k ) { result -= 2; a2 -= 2; v24 = _mm_mul_ps(_mm_shuffle_ps(*a2, *a2, 27), a4[1]); v25 = *a4; a4 += 2; v26 = _mm_mul_ps(_mm_shuffle_ps(a2[1], a2[1], 27), v25); v27 = _mm_sub_ps(v24, _mm_mul_ps(_mm_shuffle_ps(*result, *result, 27), a3[1])); v28 = *a3; a3 += 2; v29 = _mm_mul_ps(_mm_shuffle_ps(result[1], result[1], 27), v28); a1[1] = v27; *a1 = _mm_sub_ps(v26, v29); a1 += 2; } v30 = a8 & 7; if ( (a8 & 7) != 0 ) { v31 = (char *)a4 - (char *)a1; v32 = (char *)a2 - (char *)result; v33 = (char *)a3 - (char *)a1; do { result = (__m128 *)((char *)result - 4); a1->m128_f32[0] = (float)(*(float *)((char *)result->m128_f32 + v32) * *(float *)((char *)a1->m128_f32 + v31)) - (float)(*(float *)((char *)a1->m128_f32 + v33) * result->m128_f32[0]); a1 = (__m128 *)((char *)a1 + 4); --v30; } while ( v30 ); } for ( m = a9 >> 3; m; --m ) { result -= 2; si128 = _mm_load_si128(xmmword_180144630); v36 = _mm_xor_si128(si128, (__m128i)_mm_shuffle_ps(*result, *result, 27)); *(__m128i *)a1 = _mm_xor_si128(si128, (__m128i)_mm_shuffle_ps(result[1], result[1], 27)); a1[1] = (__m128)v36; a1 += 2; } v37 = a9 & 7; if ( (a9 & 7) != 0 ) { do { v38 = result[-1].m128_f32[3]; result = (__m128 *)((char *)result - 4); a1 = (__m128 *)((char *)a1 + 4); a1[-1].m128_f32[3] = -v38; --v37; } while ( v37 ); } return result; }