// // sub_180004520 from 0x180004520 to 0x180004fb9 (2713 bytes) // // 5 xrefs: // > sub_180003D30 @ 0x180003ea2 // > sub_180005520 @ 0x180005e6b // > @ 0x18017d694 // > @ 0x18017d6f0 // > @ 0x1801f627c // // 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 // __int64 __fastcall sub_180004520( __int64 a1, float *a2, __int64 a3, _OWORD *a4, __int64 a5, __int64 a6, __int64 a7, int a8, int a9, int a10, int a11) { _OWORD *v11; // rbp __int64 v12; // r12 int v13; // r15d float *v14; // r11 __int64 v15; // rbx __int64 result; // rax __int64 v17; // r10 char v18; // r9 int v19; // r13d int v20; // ecx __int64 v21; // r8 int v22; // edi __m128 *v23; // r9 __m128 *v24; // rcx __m128 v25; // xmm0 __int64 v26; // rax __m128 v27; // xmm1 __m128 v28; // xmm4 __m128 v29; // xmm2 __m128 v30; // xmm3 __m128 v31; // xmm4 __m128 v32; // xmm3 __m128 v33; // xmm0 __m128 v34; // xmm2 int v35; // esi __m128i *v36; // rdi float *v37; // r9 __int64 v38; // rax __m128i v39; // xmm2 int i; // r9d int v41; // r8d unsigned int *v42; // rcx char v43; // r9 int v44; // ecx int v45; // r8d int v46; // r13d __int64 v47; // r15 __m128 v48; // xmm6 __m128 v49; // xmm7 __int64 v50; // rsi __m128 *v51; // r14 __m128 *v52; // r9 __m128 *v53; // rdi __m128 v54; // xmm0 __m128 v55; // xmm1 __m128 v56; // xmm5 __m128 v57; // xmm2 __m128 v58; // xmm1 __m128 v59; // xmm0 __m128 v60; // xmm2 __m128 v61; // xmm5 __m128 v62; // xmm4 __m128 v63; // xmm3 __m128 v64; // xmm5 __m128 v65; // xmm1 __m128 v66; // xmm1 __m128 v67; // xmm2 __m128 v68; // xmm4 __m128 v69; // xmm0 __m128 v70; // xmm5 int v71; // r14d __m128 *v72; // r9 __m128 *v73; // rdi float *v74; // r8 __m128 v75; // xmm0 __m128 v76; // xmm2 __m128 v77; // xmm0 __m128i v78; // xmm2 int j; // r9d float v80; // xmm2_4 float v81; // xmm3_4 int v82; // r8d float *v83; // rcx float v84; // xmm1_4 float v85; // xmm0_4 char v86; // r9 int v87; // r8d int v88; // r13d int v89; // eax __int64 v90; // r15 __m128 v91; // xmm7 __m128 v92; // xmm8 __int64 v93; // r9 int v94; // ecx __m128 v95; // xmm7 __m128 *v96; // r8 __m128 *v97; // rdi __m128 *v98; // rsi __m128 v99; // xmm0 __m128 v100; // xmm1 __m128 v101; // xmm2 __m128 v102; // xmm5 __m128 v103; // xmm6 __m128 v104; // xmm0 __m128 v105; // xmm3 __m128 v106; // xmm1 __m128 v107; // xmm4 __m128 v108; // xmm2 __m128 v109; // xmm1 __m128 v110; // xmm6 __m128 v111; // xmm0 __m128 v112; // xmm4 int v113; // r14d __m128 *v114; // rdi __m128 *v115; // rsi float *v116; // r8 __m128 v117; // xmm0 __int64 v118; // rax __m128 v119; // xmm1 __m128i v120; // xmm2 int v121; // r9d __int64 v122; // r12 __int64 v123; // rbx float v124; // xmm3_4 int v125; // r8d float v126; // xmm2_4 float *v127; // rcx float v128; // xmm1_4 float v129; // xmm0_4 int v130; // ebp unsigned int v131; // r13d __int64 v132; // r12 int v133; // r8d __int64 v134; // rdi __m128 *v135; // rcx __m128 v136; // xmm4 __m128 v137; // xmm0 __m128 v138; // xmm3 __m128 v139; // xmm1 __m128 v140; // xmm3 __m128 v141; // xmm2 __m128 v142; // xmm4 __m128 v143; // xmm1 __m128 v144; // xmm0 __m128 v145; // xmm3 int v146; // ebx float *v147; // r8 __m128 *v148; // r9 __m128 v149; // xmm2 __m128i v150; // xmm2 int v151; // esi int v152; // ecx float v153; // xmm0_4 __int64 v154; // [rsp+60h] [rbp-68h] __int64 v155; // [rsp+60h] [rbp-68h] int v156; // [rsp+D0h] [rbp+8h] int v157; // [rsp+D0h] [rbp+8h] int v158; // [rsp+F0h] [rbp+28h] int v159; // [rsp+F0h] [rbp+28h] int v160; // [rsp+F8h] [rbp+30h] v11 = a4; v12 = a3; v13 = a7; v14 = a2; v15 = *(_QWORD *)(a1 + 16) + 4LL * (int)a5; result = *(_QWORD *)(a1 + 8); v17 = result + 4LL * (int)a6; if ( (_DWORD)a7 == 1 ) return sub_180004FC0((_DWORD)a2, a3, (_DWORD)a4, v15, v17, a8, a9, a10, a11); if ( (_DWORD)a7 == 2 ) return sub_180005220( (_DWORD)a2, a3, (_DWORD)a4, *(_DWORD *)(a1 + 16) + 4 * (int)a5, v15 + 2048, result + 4LL * (int)a6, v17 + 4096, a8, a9, a10, a11); v18 = a8; v19 = a8 >> 2; if ( a8 >> 2 ) { v20 = a7 & 3; result = 16LL * (_DWORD)a7; do { v15 -= 16; v21 = 0; v22 = (int)a7 >> 2; if ( (int)a7 >> 2 ) { v23 = (__m128 *)&v14[3 * (int)a7]; v24 = (__m128 *)(v15 + 4096); do { v25 = v24[-128]; v26 = v21 + (int)a7; v21 += 4; ++v23; v27 = v24[128]; v28 = v24[-256]; v29 = *v24; v24 += 512; v30 = v28; v31 = _mm_shuffle_ps(v28, v25, 238); v32 = _mm_shuffle_ps(v30, v25, 68); v33 = _mm_shuffle_ps(v29, v27, 68); v34 = _mm_shuffle_ps(v29, v27, 238); *(__m128 *)((char *)v23 - 12 * (int)a7 - 16) = _mm_shuffle_ps(v31, v34, 221); *(__m128 *)&v14[v26] = _mm_shuffle_ps(v31, v34, 136); *(__m128 *)((char *)v23 - 4 * (int)a7 - 16) = _mm_shuffle_ps(v32, v33, 221); v23[-1] = _mm_shuffle_ps(v32, v33, 136); --v22; } while ( v22 ); v20 = a7 & 3; result = 16LL * (_DWORD)a7; } v35 = v20; if ( v20 ) { v36 = (__m128i *)(v15 + (v21 << 11)); v37 = &v14[2 * (int)a7 + (int)a7 + v21]; do { v38 = v21 + (int)a7; ++v37; ++v21; v39 = *v36; v36 += 128; LODWORD(v37[-3 * (int)a7 - 1]) = _mm_srli_si128(v39, 12).m128i_u32[0]; LODWORD(v14[v38]) = _mm_srli_si128(v39, 8).m128i_u32[0]; LODWORD(v37[-(int)a7 - 1]) = _mm_srli_si128(v39, 4).m128i_u32[0]; *((_DWORD *)v37 - 1) = _mm_srli_si128(v39, 0).m128i_u32[0]; --v35; } while ( v35 ); v20 = a7 & 3; result = 16LL * (_DWORD)a7; } v14 = (float *)((char *)v14 + result); --v19; } while ( v19 ); v13 = a7; v18 = a8; } for ( i = v18 & 3; i; --i ) { v15 -= 4; v41 = v13; if ( v13 ) { v42 = (unsigned int *)v15; do { result = *v42; v42 += 512; *(_DWORD *)v14++ = result; --v41; } while ( v41 ); } } v43 = a9; v44 = a9 >> 2; v158 = a9 >> 2; if ( a9 >> 2 ) { result = (unsigned int)(4 * v13); v45 = v13 >> 2; v46 = v13 & 3; v47 = 4LL * (int)result; v154 = v47; v156 = v45; v160 = v46; do { v48 = *(__m128 *)(v12 - 16); v12 -= 16; v15 -= 16; v49 = *(__m128 *)v11; v50 = 0; if ( v45 ) { v51 = (__m128 *)&v14[3 * (int)a7]; v52 = (__m128 *)(v17 + 0x2000); v53 = (__m128 *)(v15 + 4096); do { v54 = v53[-256]; result = v50 + (int)a7; v50 += 4; v55 = v53[-128]; v56 = *v53; v57 = v53[128]; v53 += 512; v58 = _mm_mul_ps(v55, v48); v59 = _mm_mul_ps(v54, v48); v60 = _mm_mul_ps(v57, v48); v61 = _mm_mul_ps(v56, v48); v62 = _mm_add_ps(_mm_mul_ps(v52[-512], v49), _mm_shuffle_ps(v59, v59, 27)); v63 = _mm_add_ps(_mm_mul_ps(v52[-256], v49), _mm_shuffle_ps(v58, v58, 27)); v64 = _mm_add_ps(_mm_shuffle_ps(v61, v61, 27), _mm_mul_ps(v49, *v52)); v65 = v52[256]; v52 += 1024; v66 = _mm_add_ps(_mm_mul_ps(v65, v49), _mm_shuffle_ps(v60, v60, 27)); v67 = _mm_shuffle_ps(v62, v63, 68); v68 = _mm_shuffle_ps(v62, v63, 238); v69 = _mm_shuffle_ps(v64, v66, 68); v70 = _mm_shuffle_ps(v64, v66, 238); *(__m128 *)((char *)v51 - 12 * (int)a7) = _mm_shuffle_ps(v67, v69, 136); *(__m128 *)&v14[result] = _mm_shuffle_ps(v67, v69, 221); *(__m128 *)((char *)v51 - 4 * (int)a7) = _mm_shuffle_ps(v68, v70, 136); *v51++ = _mm_shuffle_ps(v68, v70, 221); --v45; } while ( v45 ); v44 = v158; v47 = v154; } v71 = v46; if ( v46 ) { v72 = (__m128 *)(v17 + (v50 << 12)); v73 = (__m128 *)(v15 + (v50 << 11)); v74 = &v14[2 * (int)a7 + (int)a7 + v50]; do { v75 = *v73; result = v50 + (int)a7; ++v50; v73 += 128; v76 = _mm_mul_ps(v48, v75); v77 = *v72; v72 += 256; v78 = (__m128i)_mm_add_ps(_mm_shuffle_ps(v76, v76, 27), _mm_mul_ps(v77, v49)); LODWORD(v74[-3 * (int)a7]) = _mm_srli_si128(v78, 0).m128i_u32[0]; LODWORD(v14[result]) = _mm_srli_si128(v78, 4).m128i_u32[0]; LODWORD(v74[-(int)a7]) = _mm_srli_si128(v78, 8).m128i_u32[0]; *(_DWORD *)v74++ = _mm_srli_si128(v78, 12).m128i_u32[0]; --v71; } while ( v71 ); v44 = v158; v46 = v160; } v45 = v156; v14 = (float *)((char *)v14 + v47); v17 += 16; ++v11; v158 = --v44; } while ( v44 ); v13 = a7; v43 = a9; } for ( j = v43 & 3; j; --j ) { v80 = *(float *)(v12 - 4); v12 -= 4; v81 = *(float *)v11; v15 -= 4; v82 = v13; if ( v13 ) { result = v17; v83 = (float *)v15; do { v84 = v81 * *(float *)result; result += 4096; v85 = v80 * *v83; v83 += 512; *v14++ = v84 + v85; --v82; } while ( v82 ); } v17 += 4; v11 = (_OWORD *)((char *)v11 + 4); } v86 = a10; v87 = a10 >> 2; v159 = a10 >> 2; if ( a10 >> 2 ) { v88 = v13 & 3; v89 = 4 * v13; v157 = v88; v90 = (unsigned int)(v13 >> 2); result = 4LL * v89; v155 = result; do { v91 = *(__m128 *)(v12 - 16); v12 -= 16; v17 -= 16; v92 = *(__m128 *)v11; v93 = 0; v94 = v90; v95 = _mm_shuffle_ps(v91, v91, 27); if ( (_DWORD)v90 ) { v96 = (__m128 *)&v14[2 * (int)a7]; v97 = (__m128 *)(v17 + 0x2000); v98 = (__m128 *)(v15 + 4096); v93 = 4 * v90; do { v99 = v97[-512]; v100 = v97[-256]; v101 = *v97; v102 = v97[256]; v97 += 1024; v103 = _mm_sub_ps(_mm_mul_ps(v98[-256], v95), _mm_mul_ps(_mm_shuffle_ps(v99, v99, 27), v92)); v104 = *v98; v105 = _mm_sub_ps(_mm_mul_ps(v98[-128], v95), _mm_mul_ps(_mm_shuffle_ps(v100, v100, 27), v92)); v106 = v98[128]; v98 += 512; v107 = _mm_sub_ps(_mm_mul_ps(v95, v104), _mm_mul_ps(_mm_shuffle_ps(v101, v101, 27), v92)); v108 = _mm_shuffle_ps(v103, v105, 68); v109 = _mm_sub_ps(_mm_mul_ps(v106, v95), _mm_mul_ps(_mm_shuffle_ps(v102, v102, 27), v92)); v110 = _mm_shuffle_ps(v103, v105, 238); v111 = _mm_shuffle_ps(v107, v109, 68); v112 = _mm_shuffle_ps(v107, v109, 238); *(__m128 *)((char *)v96 - 8 * (int)a7) = _mm_shuffle_ps(v108, v111, 136); *(__m128 *)((char *)v96 - 4 * (int)a7) = _mm_shuffle_ps(v108, v111, 221); *v96 = _mm_shuffle_ps(v110, v112, 136); *(__m128 *)((char *)v96++ + 4 * (int)a7) = _mm_shuffle_ps(v110, v112, 221); --v94; } while ( v94 ); v87 = v159; result = v155; } v113 = v88; if ( v88 ) { v114 = (__m128 *)(v17 + (v93 << 12)); v115 = (__m128 *)(v15 + (v93 << 11)); v116 = &v14[2 * (int)a7 + (int)a7 + v93]; do { v117 = *v115; v118 = v93 + (int)a7; ++v93; v119 = *v114; v115 += 128; v114 += 256; v120 = (__m128i)_mm_sub_ps(_mm_mul_ps(v95, v117), _mm_mul_ps(_mm_shuffle_ps(v119, v119, 27), v92)); LODWORD(v116[-3 * (int)a7]) = _mm_srli_si128(v120, 0).m128i_u32[0]; LODWORD(v14[v118]) = _mm_srli_si128(v120, 4).m128i_u32[0]; LODWORD(v116[-(int)a7]) = _mm_srli_si128(v120, 8).m128i_u32[0]; *(_DWORD *)v116++ = _mm_srli_si128(v120, 12).m128i_u32[0]; --v113; } while ( v113 ); v87 = v159; v88 = v157; result = v155; } v14 = (float *)((char *)v14 + result); v15 += 16; ++v11; v159 = --v87; } while ( v87 ); v13 = a7; v86 = a10; } v121 = v86 & 3; if ( v121 ) { v122 = v12 - v17; v123 = v15 - (_QWORD)v11; do { v124 = *(float *)v11; result = v17; v17 -= 4; v125 = v13; v126 = *(float *)(result + v122 - 4); if ( v13 ) { result = v17; v127 = (float *)((char *)v11 + v123); do { v128 = v126 * *v127; v127 += 512; v129 = v124 * *(float *)result; result += 4096; *v14++ = v128 - v129; --v125; } while ( v125 ); } v11 = (_OWORD *)((char *)v11 + 4); --v121; } while ( v121 ); } v130 = a11 >> 2; if ( a11 >> 2 ) { result = (unsigned int)(4 * v13); v131 = v13 >> 2; v132 = 4LL * (int)result; do { v17 -= 16; v133 = v13 >> 2; v134 = 0; if ( v131 ) { result = (__int64)&v14[2 * (int)a7]; v135 = (__m128 *)(v17 + 0x2000); v134 = 4LL * v131; do { result += 16; v136 = _mm_mul_ps(v135[-512], (__m128)xmmword_180144650); v137 = _mm_mul_ps(v135[-256], (__m128)xmmword_180144650); v138 = *v135; v139 = v135[256]; v135 += 1024; v140 = _mm_mul_ps(v138, (__m128)xmmword_180144650); v141 = _mm_shuffle_ps(v136, v137, 68); v142 = _mm_shuffle_ps(v136, v137, 238); v143 = _mm_mul_ps(v139, (__m128)xmmword_180144650); v144 = _mm_shuffle_ps(v140, v143, 68); v145 = _mm_shuffle_ps(v140, v143, 238); *(__m128 *)(result - 8LL * (int)a7 - 16) = _mm_shuffle_ps(v142, v145, 221); *(__m128 *)(result - 4LL * (int)a7 - 16) = _mm_shuffle_ps(v142, v145, 136); *(__m128 *)(result - 16) = _mm_shuffle_ps(v141, v144, 221); *(__m128 *)(result + 4LL * (int)a7 - 16) = _mm_shuffle_ps(v141, v144, 136); --v133; } while ( v133 ); } v146 = v13 & 3; if ( (v13 & 3) != 0 ) { v147 = &v14[2 * (int)a7 + v134]; v148 = (__m128 *)(v17 + (v134 << 12)); result = -(__int64)(int)a7; do { ++v147; v149 = *v148; v148 += 256; v150 = (__m128i)_mm_mul_ps(v149, (__m128)xmmword_180144650); LODWORD(v147[-2 * (int)a7 - 1]) = _mm_srli_si128(v150, 12).m128i_u32[0]; LODWORD(v147[-(int)a7 - 1]) = _mm_srli_si128(v150, 8).m128i_u32[0]; *((_DWORD *)v147 - 1) = _mm_srli_si128(v150, 4).m128i_u32[0]; LODWORD(v147[(int)a7 - 1]) = _mm_srli_si128(v150, 0).m128i_u32[0]; --v146; } while ( v146 ); } v14 = (float *)((char *)v14 + v132); --v130; } while ( v130 ); } v151 = a11 & 3; if ( (a11 & 3) != 0 ) { do { v17 -= 4; v152 = v13; if ( v13 ) { result = v17; do { v153 = *(float *)result; result += 4096; *v14++ = -v153; --v152; } while ( v152 ); } --v151; } while ( v151 ); } return result; }