// // sub_180005520 from 0x180005520 to 0x180005e7e (2398 bytes) // // 5 xrefs: // > sub_180003D30 @ 0x180003e52 // > @ 0x18017d730 // > @ 0x18017d75c // > @ 0x18017d76c // > @ 0x1801f62dc // // 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_180005520( __int64 a1, float *a2, __int64 a3, _OWORD *a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11) { int v20; // esi __int64 v22; // r9 __int64 v23; // r10 __int64 result; // rax char v26; // r14 int v27; // eax int v28; // r15d int v29; // r8d __int64 v30; // rdx __int64 v31; // r15 int v32; // r14d int i; // r14d int v54; // r8d int *v55; // rdx int v56; // eax char v57; // r13 int v58; // r12d int v59; // edx __int64 v60; // rax int v63; // r15d __int64 v65; // rdi __int64 v66; // rsi __int64 v69; // r13 int j; // r13d int v96; // r8d __int64 v97; // rax __int64 v98; // rdx char v101; // r14 int v103; // r8d __int64 v104; // rdx int v107; // r15d __int64 v108; // r8 __int64 v111; // r14 int v136; // r14d __int64 v138; // r9 int v140; // r8d char *v142; // rdx int v145; // r15d int v147; // edx int v148; // r8d __int64 v150; // rdx int v171; // r14d int v173; // ecx __int64 v176; // [rsp+20h] [rbp-B8h] __int64 v177; // [rsp+28h] [rbp-B0h] __int64 v178; // [rsp+30h] [rbp-A8h] __int64 v179; // [rsp+60h] [rbp-78h] __int64 v180; // [rsp+60h] [rbp-78h] __int64 v181; // [rsp+68h] [rbp-70h] __int64 v182; // [rsp+70h] [rbp-68h] int v186; // [rsp+E0h] [rbp+8h] int v187; // [rsp+E0h] [rbp+8h] __int64 v188; // [rsp+F0h] [rbp+18h] int v189; // [rsp+100h] [rbp+28h] int v190; // [rsp+100h] [rbp+28h] int v191; // [rsp+100h] [rbp+28h] int v192; // [rsp+108h] [rbp+30h] _R11 = a2; _RBX = a4; v20 = a7; _RDI = a3; v22 = *(_QWORD *)(a1 + 16) + 4LL * a5; v23 = *(_QWORD *)(a1 + 8) + 4LL * a6; v179 = v23; if ( a7 == 1 ) { result = sub_180005E80((_DWORD)a2, a3, (_DWORD)_RBX, v22, v23, a8, a9, a10, a11); __asm { vzeroupper } } else if ( a7 == 2 ) { result = sub_180006070((_DWORD)a2, a3, (_DWORD)_RBX, v22, v22 + 2048, v23, v23 + 4096, a8, a9, a10, a11); __asm { vzeroupper } } else if ( (a7 & 3) != 0 || (((unsigned __int8)(*(_BYTE *)(a1 + 16) + 4 * a5) | (unsigned __int8)v23) & 0x1F) != 0 ) { LODWORD(v178) = a7; LODWORD(v177) = a6; LODWORD(v176) = a5; result = sub_180004520(a1, a2, a3, _RBX, v176, v177, v178, a8, a9, a10, a11); __asm { vzeroupper } } else { _RCX = a7; v26 = a8; v27 = a8 >> 3; v28 = 8 * a7; __asm { vmovaps [rsp+0D8h+var_38], xmm6 } v189 = a8 >> 3; v192 = 8 * a7; if ( a8 >> 3 ) { v29 = a7 >> 2; v30 = 4LL * v28; v181 = v30; do { v22 -= 32; v31 = 0; v32 = v29; if ( v29 ) { _RDX = &_R11[3 * a7]; _R12 = -(__int64)a7; _R8 = v22 + 4096; _R13 = 2LL * a7; _RSI = 3LL * a7; _R10 = -12LL * a7; do { _RAX = v31 + a7; _RDX += 4; v31 += 4; __asm { vmovups ymm0, ymmword ptr [r8-800h] vmovups ymm4, ymmword ptr [r8] vmovups ymm3, ymmword ptr [r8+800h] vmovups ymm1, ymmword ptr [r8-1000h] } _R8 += 0x2000; __asm { vshufps ymm5, ymm1, ymm0, 44h ; 'D' vshufps ymm1, ymm1, ymm0, 0EEh vshufps ymm2, ymm4, ymm3, 44h ; 'D' vshufps ymm0, ymm4, ymm3, 0EEh vshufps ymm6, ymm5, ymm2, 88h vshufps ymm4, ymm5, ymm2, 0DDh vshufps ymm2, ymm1, ymm0, 0DDh vextractf128 xmmword ptr [r10+rdx-10h], ymm2, 1 vshufps ymm3, ymm1, ymm0, 88h vextractf128 xmm1, ymm3, 1 vmovups xmmword ptr [r11+rax*4], xmm1 vextractf128 xmmword ptr [rdx+r12*4-10h], ymm4, 1 vextractf128 xmmword ptr [rdx-10h], ymm6, 1 vmovups xmmword ptr [rdx+rcx*4-10h], xmm2 vmovups xmmword ptr [rdx+rcx*8-10h], xmm3 vmovups xmmword ptr [rdx+rsi*4-10h], xmm4 vmovups xmmword ptr [rdx+r13*8-10h], xmm6 } --v32; } while ( v32 ); v27 = v189; v30 = v181; v29 = a7 >> 2; } _R11 = (float *)((char *)_R11 + v30); v189 = --v27; } while ( v27 ); v23 = v179; v20 = a7; v26 = a8; v28 = 8 * a7; } for ( i = v26 & 7; i; --i ) { v22 -= 4; v54 = v20; if ( v20 ) { v55 = (int *)v22; do { v56 = *v55; v55 += 512; *(_DWORD *)_R11++ = v56; --v54; } while ( v54 ); } } v57 = a9; v58 = a9 >> 3; __asm { vmovaps [rsp+0D8h+var_48], xmm7 vmovaps [rsp+0D8h+var_58], xmm8 } v190 = a9 >> 3; if ( a9 >> 3 ) { v59 = v20 >> 2; v60 = 4LL * v28; v182 = v60; v186 = v20 >> 2; do { __asm { vmovups ymm6, ymmword ptr [rdi-20h] vmovups ymm7, ymmword ptr [rbx] } _RDI -= 32; v22 -= 32; v188 = _RDI; v63 = v59; if ( v59 ) { __asm { vmovdqu ymm8, cs:ymmword_1801446A0 } v65 = 0; v66 = v23 + 0x2000; _RDX = &_R11[3 * a7]; _R8 = -(__int64)a7; v69 = v22 + 4096; _R14 = 2LL * a7; _R10 = 3LL * a7; _R12 = -12LL * a7; do { _RAX = v65 + a7; _RDX += 4; v65 += 4; __asm { vmulps ymm0, ymm6, ymmword ptr [r13-1000h] } v69 += 0x2000; v66 += 0x4000; __asm { vpermps ymm5, ymm8, ymm0 vfmadd231ps ymm5, ymm7, ymmword ptr [rsi-6000h] vmulps ymm0, ymm6, ymmword ptr [r13-2800h] vpermps ymm3, ymm8, ymm0 vfmadd231ps ymm3, ymm7, ymmword ptr [rsi-5000h] vmulps ymm0, ymm6, ymmword ptr [r13-2000h] vshufps ymm2, ymm5, ymm3, 44h ; 'D' vpermps ymm4, ymm8, ymm0 vfmadd231ps ymm4, ymm7, ymmword ptr [rsi-4000h] vmulps ymm0, ymm6, ymmword ptr [r13-1800h] vshufps ymm3, ymm5, ymm3, 0EEh vpermps ymm1, ymm8, ymm0 vfmadd231ps ymm1, ymm7, ymmword ptr [rsi-3000h] vshufps ymm0, ymm4, ymm1, 44h ; 'D' vshufps ymm5, ymm2, ymm0, 88h vmovups xmmword ptr [rdx+r12-10h], xmm5 vshufps ymm1, ymm4, ymm1, 0EEh vshufps ymm4, ymm2, ymm0, 0DDh vmovups xmmword ptr [r11+rax*4], xmm4 vshufps ymm2, ymm3, ymm1, 88h vmovups xmmword ptr [rdx+r8*4-10h], xmm2 vshufps ymm3, ymm3, ymm1, 0DDh vmovups xmmword ptr [rdx-10h], xmm3 vextractf128 xmmword ptr [rdx+rcx*4-10h], ymm5, 1 vextractf128 xmmword ptr [rdx+rcx*8-10h], ymm4, 1 vextractf128 xmmword ptr [rdx+r10*4-10h], ymm2, 1 vextractf128 xmmword ptr [rdx+r14*8-10h], ymm3, 1 } --v63; } while ( v63 ); v23 = v179; _RDI = v188; v58 = v190; v60 = v182; v59 = v186; } v23 += 32; _R11 = (float *)((char *)_R11 + v60); _RBX += 2; v179 = v23; v190 = --v58; } while ( v58 ); v20 = a7; v57 = a9; } for ( j = v57 & 7; j; --j ) { __asm { vmovss xmm1, dword ptr [rdi-4] vmovss xmm2, dword ptr [rbx] } _RDI -= 4; v22 -= 4; v96 = v20; if ( v20 ) { v97 = v22; v98 = v23; do { __asm { vmulss xmm0, xmm1, dword ptr [rax] vfmadd231ss xmm0, xmm2, dword ptr [rdx] vmovss dword ptr [r11], xmm0 } ++_R11; v98 += 4096; v97 += 2048; --v96; } while ( v96 ); } v23 += 4; _RBX = (_OWORD *)((char *)_RBX + 4); } v101 = a10; result = (unsigned int)(a10 >> 3); v191 = result; if ( (_DWORD)result ) { __asm { vmovdqu ymm6, cs:ymmword_1801446A0 } v103 = v20 >> 2; v104 = 4LL * v192; v187 = v20 >> 2; do { __asm { vpermps ymm7, ymm6, ymmword ptr [rdi-20h] vmovups ymm8, ymmword ptr [rbx] } _RDI -= 32; v23 -= 32; v180 = v23; v107 = v103; if ( v103 ) { v108 = v23 + 0x2000; _RAX = &_R11[2 * a7]; _RDX = -(__int64)a7; v111 = v22 + 4096; _R12 = 2LL * a7; _RSI = 3LL * a7; _R10 = 5LL * a7; _R13 = _RDX; do { _RAX += 4; v111 += 0x2000; __asm { vpermps ymm0, ymm6, ymmword ptr [r8-2000h] } v108 += 0x4000; __asm { vmulps ymm5, ymm0, ymm8 vfmsub231ps ymm5, ymm7, ymmword ptr [r14-3000h] vpermps ymm0, ymm6, ymmword ptr [r8-5000h] vmulps ymm3, ymm0, ymm8 vfmsub231ps ymm3, ymm7, ymmword ptr [r14-2800h] vpermps ymm0, ymm6, ymmword ptr [r8-4000h] vshufps ymm2, ymm5, ymm3, 44h ; 'D' vmulps ymm4, ymm0, ymm8 vfmsub231ps ymm4, ymm7, ymmword ptr [r14-2000h] vpermps ymm0, ymm6, ymmword ptr [r8-3000h] vshufps ymm3, ymm5, ymm3, 0EEh vmulps ymm1, ymm0, ymm8 vfmsub231ps ymm1, ymm7, ymmword ptr [r14-1800h] vshufps ymm0, ymm4, ymm1, 44h ; 'D' vshufps ymm5, ymm2, ymm0, 88h vmovups xmmword ptr [rax+r13*8-10h], xmm5 vshufps ymm1, ymm4, ymm1, 0EEh vshufps ymm4, ymm2, ymm0, 0DDh vmovups xmmword ptr [rax+rdx*4-10h], xmm4 vshufps ymm2, ymm3, ymm1, 88h vmovups xmmword ptr [rax-10h], xmm2 vshufps ymm3, ymm3, ymm1, 0DDh vmovups xmmword ptr [rax+rcx*4-10h], xmm3 vextractf128 xmmword ptr [rax+rcx*8-10h], ymm5, 1 vextractf128 xmmword ptr [rax+rsi*4-10h], ymm4, 1 vextractf128 xmmword ptr [rax+r12*8-10h], ymm2, 1 vextractf128 xmmword ptr [rax+r10*4-10h], ymm3, 1 } --v107; } while ( v107 ); v23 = v180; LODWORD(result) = v191; v104 = 4LL * v192; v103 = v187; } _R11 = (float *)((char *)_R11 + v104); v22 += 32; _RBX += 2; result = (unsigned int)(result - 1); v191 = result; } while ( (_DWORD)result ); v20 = a7; v101 = a10; } v136 = v101 & 7; if ( v136 ) { _RDI = _RDI - v23; v138 = v22 - (_QWORD)_RBX; do { __asm { vmovss xmm2, dword ptr [rbx] } result = v23; v140 = v20; v23 -= 4; __asm { vmovss xmm1, dword ptr [rax+rdi-4] } if ( v20 ) { result = v23; v142 = (char *)_RBX + v138; do { __asm { vmulss xmm0, xmm2, dword ptr [rax] vfmsub231ss xmm0, xmm1, dword ptr [rdx] vmovss dword ptr [r11], xmm0 } ++_R11; v142 += 2048; result += 4096; --v140; } while ( v140 ); } _RBX = (_OWORD *)((char *)_RBX + 4); --v136; } while ( v136 ); } v145 = a11 >> 3; if ( a11 >> 3 ) { __asm { vmovups ymm8, cs:ymmword_1801446E0 } v147 = v20 >> 2; result = 32LL * v20; do { v23 -= 32; v148 = v147; if ( v147 ) { _RAX = &_R11[2 * a7]; v150 = v23 + 0x2000; _R9 = -(__int64)a7; _R12 = 3LL * a7; _RBX = 2LL * a7; _R13 = 5LL * a7; _RDI = _R9; do { _RAX += 4; __asm { vmulps ymm4, ymm8, ymmword ptr [rdx-2000h] vmulps ymm0, ymm8, ymmword ptr [rdx-1000h] vmulps ymm2, ymm8, ymmword ptr [rdx] vmulps ymm1, ymm8, ymmword ptr [rdx+1000h] } v150 += 0x4000; __asm { vshufps ymm3, ymm4, ymm0, 44h ; 'D' vshufps ymm5, ymm4, ymm0, 0EEh vshufps ymm0, ymm2, ymm1, 44h ; 'D' vshufps ymm7, ymm3, ymm0, 88h vshufps ymm6, ymm3, ymm0, 0DDh vshufps ymm2, ymm2, ymm1, 0EEh vshufps ymm3, ymm5, ymm2, 0DDh vextractf128 xmmword ptr [rax+rdi*8-10h], ymm3, 1 vshufps ymm4, ymm5, ymm2, 88h vextractf128 xmmword ptr [rax+r9*4-10h], ymm4, 1 vextractf128 xmmword ptr [rax-10h], ymm6, 1 vextractf128 xmmword ptr [rax+rcx*4-10h], ymm7, 1 vmovups xmmword ptr [rax+rcx*8-10h], xmm3 vmovups xmmword ptr [rax+r12*4-10h], xmm4 vmovups xmmword ptr [rax+rbx*8-10h], xmm6 vmovups xmmword ptr [rax+r13*4-10h], xmm7 } --v148; } while ( v148 ); result = 32LL * v20; v147 = v20 >> 2; } _R11 = (float *)((char *)_R11 + result); --v145; } while ( v145 ); } __asm { vmovaps xmm8, [rsp+0D8h+var_58] vmovaps xmm7, [rsp+0D8h+var_48] vmovaps xmm6, [rsp+0D8h+var_38] } v171 = a11 & 7; if ( (a11 & 7) != 0 ) { __asm { vmovss xmm2, dword ptr cs:xmmword_180144610 } do { v23 -= 4; v173 = v20; if ( v20 ) { result = v23; do { __asm { vmovss xmm0, dword ptr [rax] vxorps xmm1, xmm0, xmm2 vmovss dword ptr [r11], xmm1 } ++_R11; result += 4096; --v173; } while ( v173 ); } --v171; } while ( v171 ); } __asm { vzeroupper } } return result; }