{"type": "func", "start": 6442479904, "end": 6442480645, "name": "sub_180007120", "pseudocode": "// \n// sub_180007120 from 0x180007120 to 0x180007405 (741 bytes)\n// \n// 3 xrefs:\n// > <???> @ 0x1801a4240\n// > <???> @ 0x1801a4258\n// > <???> @ 0x1801f6354\n// \n// This function is hookable on this platform!\n// \n// Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA\n// Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings\n// \n\n__int64 __fastcall sub_180007120(int *a1, __int64 a2, _DWORD *a3, char *a4)\n{\n  int v9; // eax\n  int v10; // edx\n  int v11; // r10d\n  int v12; // r9d\n  int v13; // r14d\n  int v14; // r12d\n  __int64 v15; // r15\n  __int64 v16; // rcx\n  int v17; // ebx\n  int v18; // ebx\n  int v20; // ecx\n  int v21; // edi\n  int v33; // r8d\n  int v34; // r8d\n  int v38; // eax\n  int v43; // r8d\n  int v44; // edx\n  unsigned __int64 v49; // r8\n  __int64 result; // rax\n  int v61; // [rsp+40h] [rbp+0h] BYREF\n  _DWORD *v62; // [rsp+C0h] [rbp+80h]\n\n  v62 = a3;\n  _RBP = (int *)((unsigned __int64)&v61 & 0xFFFFFFFFFFFFFFE0uLL);\n  _RSI = a4;\n  v9 = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)a1 + 32LL) + 4LL * a1[10]) / 2;\n  v10 = v9;\n  *(_DWORD *)((unsigned __int64)&v61 & 0xFFFFFFFFFFFFFFE0uLL) = v9;\n  if ( a3 )\n  {\n    v11 = *a3 * *(_DWORD *)(a2 + 56);\n    v12 = 0;\n    v13 = 1;\n    v14 = 0;\n    if ( *(int *)(a2 + 52) > 1 )\n    {\n      v15 = 1;\n      do\n      {\n        v16 = *(char *)(*(_QWORD *)(a2 + 24) + v15);\n        v17 = a3[v16] & 0x7FFF;\n        if ( v17 == a3[v16] )\n        {\n          v18 = *(_DWORD *)(a2 + 56) * v17;\n          __asm { vpxor   xmm1, xmm1, xmm1 }\n          v20 = *(unsigned __int16 *)(*(_QWORD *)(a2 + 16) + 2 * v16);\n          *(_DWORD *)(((unsigned __int64)&v61 & 0xFFFFFFFFFFFFFFE0uLL) + 4) = v20;\n          v21 = ((v18 - v11) << 20) / (v20 - v14);\n          __asm { vpinsrd xmm1, xmm1, edi, 1 }\n          _R9D = 4 * v21;\n          _R11D = (v11 << 20) + (((v18 - v11) >> 31) & 0xFF800) + 1024;\n          __asm { vmovd   xmm0, r9d }\n          v12 = *(_DWORD *)(((unsigned __int64)&v61 & 0xFFFFFFFFFFFFFFE0uLL) + 4);\n          __asm\n          {\n            vpinsrd xmm0, xmm0, edx, 1\n            vpinsrd xmm0, xmm0, ecx, 2\n            vpinsrd xmm0, xmm0, eax, 3\n          }\n          _EAX = 8 * v21;\n          __asm\n          {\n            vmovd   xmm4, eax\n            vpinsrd xmm1, xmm1, r10d, 2\n            vpinsrd xmm1, xmm1, r8d, 3\n            vinsertf128 ymm2, ymm1, xmm0, 1\n          }\n          v33 = v12;\n          if ( *_RBP <= v12 )\n            v33 = *_RBP;\n          v34 = v33 - v14;\n          __asm { vmovd   xmm0, r11d }\n          _RCX = &_RSI[4 * v14];\n          __asm { vpbroadcastd ymm0, xmm0 }\n          v38 = v34 >> 3;\n          _R11 = &unk_180144700;\n          __asm\n          {\n            vpaddd  ymm3, ymm0, ymm2\n            vpbroadcastd ymm4, xmm4\n            vmovdqu [rbp+60h+var_40], ymm3\n          }\n          if ( v34 >> 3 )\n          {\n            do\n            {\n              __asm\n              {\n                vpsrad  ymm1, ymm3, 14h\n                vpcmpeqb ymm0, ymm0, ymm0\n                vpaddd  ymm3, ymm3, ymm4\n                vmovdqu [rbp+60h+var_40], ymm3\n                vgatherdps ymm2, dword ptr [r11+ymm1*4], ymm0\n                vmulps  ymm0, ymm2, ymmword ptr [rcx]\n                vmovups ymmword ptr [rcx], ymm0\n              }\n              _RCX += 32;\n              --v38;\n            }\n            while ( v38 );\n          }\n          v43 = v34 & 7;\n          if ( v43 )\n          {\n            v44 = *(_DWORD *)(((unsigned __int64)&v61 & 0xFFFFFFFFFFFFFFE0uLL) + 0x20);\n            do\n            {\n              _RCX += 4;\n              _RAX = (__int64)v44 >> 20;\n              v44 += v21;\n              __asm\n              {\n                vmovss  xmm0, dword ptr [r11+rax*4]\n                vmulss  xmm1, xmm0, dword ptr [rcx-4]\n                vmovss  dword ptr [rcx-4], xmm1\n              }\n              --v43;\n            }\n            while ( v43 );\n          }\n          a3 = v62;\n          v14 = v12;\n          v11 = v18;\n        }\n        ++v13;\n        ++v15;\n      }\n      while ( v13 < *(_DWORD *)(a2 + 52) );\n      v10 = *_RBP;\n    }\n    _RCX = v12;\n    if ( v12 < (__int64)v10 )\n    {\n      if ( v10 - (__int64)v12 < 4 )\n        goto LABEL_26;\n      _RAX = (__int64)&_RSI[4 * v12 + 8];\n      v49 = ((unsigned __int64)(v10 - (__int64)v12 - 4) >> 2) + 1;\n      _RCX = v12 + 4 * v49;\n      do\n      {\n        __asm\n        {\n          vmovss  xmm0, dword ptr [rax-8]\n          vmulss  xmm1, xmm0, dword ptr [r11+rdx*4]\n          vmovss  xmm0, dword ptr [rax-4]\n          vmovss  xmm2, dword ptr [rax]\n          vmovss  dword ptr [rax-8], xmm1\n        }\n        _RAX += 16;\n        __asm\n        {\n          vmulss  xmm1, xmm0, dword ptr [r11+rdx*4]\n          vmovss  dword ptr [rax-14h], xmm1\n          vmulss  xmm0, xmm2, dword ptr [r11+rdx*4]\n          vmovss  xmm1, dword ptr [rax-0Ch]\n          vmovss  dword ptr [rax-10h], xmm0\n          vmulss  xmm0, xmm1, dword ptr [r11+rdx*4]\n          vmovss  dword ptr [rax-0Ch], xmm0\n        }\n        --v49;\n      }\n      while ( v49 );\n      if ( _RCX < v10 )\n      {\nLABEL_26:\n        do\n        {\n          __asm\n          {\n            vmovss  xmm0, dword ptr [rsi+rcx*4]\n            vmulss  xmm1, xmm0, dword ptr [r11+rdx*4]\n            vmovss  dword ptr [rsi+rcx*4], xmm1\n          }\n          ++_RCX;\n        }\n        while ( _RCX < v10 );\n      }\n    }\n    result = 1;\n  }\n  else\n  {\n    memset(a4, 0, 4LL * v9);\n    result = 0;\n  }\n  __asm { vzeroupper }\n  return result;\n}", "assembly": "; \n; sub_180007120 from 0x180007120 to 0x180007405 (741 bytes)\n; \n; 3 xrefs:\n; > <???> @ 0x1801a4240\n; > <???> @ 0x1801a4258\n; > <???> @ 0x1801f6354\n; \n; This function is hookable on this platform!\n; \n; Using BromaIDA 8.0.0 @ https:;github.com/Stazzical/BromaIDA\n; Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https:;github.com/geode-sdk/bindings\n; \n\nmov     [rsp-8+arg_0], rbx                                             ; +0x0, 0x180007120\nmov     [rsp-8+arg_8], rsi                                             ; +0x5, 0x180007125\nmov     [rsp-8+arg_18], rdi                                            ; +0xa, 0x18000712a\nmov     [rsp-8+arg_10], r8                                             ; +0xf, 0x18000712f\npush    rbp                                                            ; +0x14, 0x180007134\npush    r12                                                            ; +0x15, 0x180007135\npush    r13                                                            ; +0x17, 0x180007137\npush    r14                                                            ; +0x19, 0x180007139\npush    r15                                                            ; +0x1b, 0x18000713b\nsub     rsp, 80h                                                       ; +0x1d, 0x18000713d\nlea     rbp, [rsp+40h]                                                 ; +0x24, 0x180007144\nand     rbp, 0FFFFFFFFFFFFFFE0h                                        ; +0x29, 0x180007149\nmovsxd  r10, dword ptr [rcx+28h]                                       ; +0x2d, 0x18000714d\nmov     r13, rdx                                                       ; +0x31, 0x180007151\nmov     rcx, [rcx]                                                     ; +0x34, 0x180007154\nmov     rsi, r9                                                        ; +0x37, 0x180007157\nmov     rax, [rcx+20h]                                                 ; +0x3a, 0x18000715a\nmov     eax, [rax+r10*4]                                               ; +0x3e, 0x18000715e\ncdq                                                                    ; +0x42, 0x180007162\nsub     eax, edx                                                       ; +0x43, 0x180007163\nsar     eax, 1                                                         ; +0x45, 0x180007165\nmovsxd  rdx, eax                                                       ; +0x47, 0x180007167\nmov     [rbp+60h+var_60], edx                                          ; +0x4a, 0x18000716a\ntest    r8, r8                                                         ; +0x4d, 0x18000716d\njz      loc_1800073CD                                                  ; +0x50, 0x180007170\nmov     r10d, [r13+38h]                                                ; +0x56, 0x180007176\nlea     r11, unk_180144700                                             ; +0x5a, 0x18000717a\nimul    r10d, [r8]                                                     ; +0x61, 0x180007181\nxor     r9d, r9d                                                       ; +0x65, 0x180007185\nmov     r14d, 1                                                        ; +0x68, 0x180007188\nmov     r12d, r9d                                                      ; +0x6e, 0x18000718e\ncmp     [r13+34h], r14d                                                ; +0x71, 0x180007191\njle     loc_180007316                                                  ; +0x75, 0x180007195\nmov     r15d, r14d                                                     ; +0x7b, 0x18000719b\nxchg    ax, ax                                                         ; +0x7e, 0x18000719e\nmov     rax, [r13+18h]                                                 ; +0x80, 0x1800071a0\nmovsx   rcx, byte ptr [rax+r15]                                        ; +0x84, 0x1800071a4\nmov     ebx, [r8+rcx*4]                                                ; +0x89, 0x1800071a9\nand     ebx, 7FFFh                                                     ; +0x8d, 0x1800071ad\ncmp     ebx, [r8+rcx*4]                                                ; +0x93, 0x1800071b3\njnz     loc_180007303                                                  ; +0x97, 0x1800071b7\nimul    ebx, [r13+38h]                                                 ; +0x9d, 0x1800071bd\nmov     rax, [r13+10h]                                                 ; +0xa2, 0x1800071c2\nvpxor   xmm1, xmm1, xmm1                                               ; +0xa6, 0x1800071c6\nmovzx   ecx, word ptr [rax+rcx*2]                                      ; +0xaa, 0x1800071ca\nmov     r8d, ebx                                                       ; +0xae, 0x1800071ce\nsub     r8d, r10d                                                      ; +0xb1, 0x1800071d1\nmov     [rbp+60h+var_5C], ecx                                          ; +0xb4, 0x1800071d4\nmov     eax, r8d                                                       ; +0xb7, 0x1800071d7\nshl     r10d, 14h                                                      ; +0xba, 0x1800071da\nshl     eax, 14h                                                       ; +0xbe, 0x1800071de\nsub     ecx, r12d                                                      ; +0xc1, 0x1800071e1\ncdq                                                                    ; +0xc4, 0x1800071e4\nsar     r8d, 1Fh                                                       ; +0xc5, 0x1800071e5\nidiv    ecx                                                            ; +0xc9, 0x1800071e9\nand     r8d, 0FF800h                                                   ; +0xcb, 0x1800071eb\nmov     edi, eax                                                       ; +0xd2, 0x1800071f2\nvpinsrd xmm1, xmm1, edi, 1                                             ; +0xd4, 0x1800071f4\nlea     r9d, ds:0[rax*4]                                               ; +0xda, 0x1800071fa\nlea     ecx, [rax+rax*2]                                               ; +0xe2, 0x180007202\nlea     r11d, [r8+400h]                                                ; +0xe5, 0x180007205\nadd     ecx, ecx                                                       ; +0xec, 0x18000720c\nlea     r8d, [rax+rax*2]                                               ; +0xee, 0x18000720e\nadd     r11d, r10d                                                     ; +0xf2, 0x180007212\nlea     r10d, [rax+rax]                                                ; +0xf5, 0x180007215\nlea     edx, [rax+rax*4]                                               ; +0xf9, 0x180007219\nimul    eax, 7                                                         ; +0xfc, 0x18000721c\nvmovd   xmm0, r9d                                                      ; +0xff, 0x18000721f\nmov     r9d, [rbp+60h+var_5C]                                          ; +0x104, 0x180007224\ncmp     [rbp+60h+var_60], r9d                                          ; +0x108, 0x180007228\nvpinsrd xmm0, xmm0, edx, 1                                             ; +0x10c, 0x18000722c\nvpinsrd xmm0, xmm0, ecx, 2                                             ; +0x112, 0x180007232\nvpinsrd xmm0, xmm0, eax, 3                                             ; +0x118, 0x180007238\nlea     eax, ds:0[rdi*8]                                               ; +0x11e, 0x18000723e\nvmovd   xmm4, eax                                                      ; +0x125, 0x180007245\nvpinsrd xmm1, xmm1, r10d, 2                                            ; +0x129, 0x180007249\nvpinsrd xmm1, xmm1, r8d, 3                                             ; +0x12f, 0x18000724f\nvinsertf128 ymm2, ymm1, xmm0, 1                                        ; +0x135, 0x180007255\nmovsxd  rax, r12d                                                      ; +0x13b, 0x18000725b\nmov     r8d, r9d                                                       ; +0x13e, 0x18000725e\ncmovle  r8d, [rbp+60h+var_60]                                          ; +0x141, 0x180007261\nsub     r8d, r12d                                                      ; +0x146, 0x180007266\nvmovd   xmm0, r11d                                                     ; +0x149, 0x180007269\nlea     rcx, [rsi+rax*4]                                               ; +0x14e, 0x18000726e\nmov     eax, r8d                                                       ; +0x152, 0x180007272\nvpbroadcastd ymm0, xmm0                                                ; +0x155, 0x180007275\nsar     eax, 3                                                         ; +0x15a, 0x18000727a\nlea     r11, unk_180144700                                             ; +0x15d, 0x18000727d\nvpaddd  ymm3, ymm0, ymm2                                               ; +0x164, 0x180007284\nvpbroadcastd ymm4, xmm4                                                ; +0x168, 0x180007288\nvmovdqu [rbp+60h+var_40], ymm3                                         ; +0x16d, 0x18000728d\ntest    eax, eax                                                       ; +0x172, 0x180007292\njz      short loc_1800072C9                                            ; +0x174, 0x180007294\nnop     word ptr [rax+rax+00000000h]                                   ; +0x176, 0x180007296\nvpsrad  ymm1, ymm3, 14h                                                ; +0x180, 0x1800072a0\nvpcmpeqb ymm0, ymm0, ymm0                                              ; +0x185, 0x1800072a5\nvpaddd  ymm3, ymm3, ymm4                                               ; +0x189, 0x1800072a9\nvmovdqu [rbp+60h+var_40], ymm3                                         ; +0x18d, 0x1800072ad\nvgatherdps ymm2, dword ptr [r11+ymm1*4], ymm0                          ; +0x192, 0x1800072b2\nvmulps  ymm0, ymm2, ymmword ptr [rcx]                                  ; +0x198, 0x1800072b8\nvmovups ymmword ptr [rcx], ymm0                                        ; +0x19c, 0x1800072bc\nadd     rcx, 20h ; ' '                                                 ; +0x1a0, 0x1800072c0\nsub     eax, 1                                                         ; +0x1a4, 0x1800072c4\njnz     short loc_1800072A0                                            ; +0x1a7, 0x1800072c7\nand     r8d, 7                                                         ; +0x1a9, 0x1800072c9\njz      short loc_1800072F5                                            ; +0x1ad, 0x1800072cd\nmov     edx, dword ptr [rbp+60h+var_40]                                ; +0x1af, 0x1800072cf\nmovsxd  rax, edx                                                       ; +0x1b2, 0x1800072d2\nlea     rcx, [rcx+4]                                                   ; +0x1b5, 0x1800072d5\nsar     rax, 14h                                                       ; +0x1b9, 0x1800072d9\nadd     edx, edi                                                       ; +0x1bd, 0x1800072dd\nvmovss  xmm0, dword ptr [r11+rax*4]                                    ; +0x1bf, 0x1800072df\nvmulss  xmm1, xmm0, dword ptr [rcx-4]                                  ; +0x1c5, 0x1800072e5\nvmovss  dword ptr [rcx-4], xmm1                                        ; +0x1ca, 0x1800072ea\nsub     r8d, 1                                                         ; +0x1cf, 0x1800072ef\njnz     short loc_1800072D2                                            ; +0x1d3, 0x1800072f3\nmov     r8, [rsp+0A0h+arg_10]                                          ; +0x1d5, 0x1800072f5\nmov     r12d, r9d                                                      ; +0x1dd, 0x1800072fd\nmov     r10d, ebx                                                      ; +0x1e0, 0x180007300\ninc     r14d                                                           ; +0x1e3, 0x180007303\ninc     r15                                                            ; +0x1e6, 0x180007306\ncmp     r14d, [r13+34h]                                                ; +0x1e9, 0x180007309\njl      loc_1800071A0                                                  ; +0x1ed, 0x18000730d\nmov     edx, [rbp+60h+var_60]                                          ; +0x1f3, 0x180007313\nmovsxd  rcx, r9d                                                       ; +0x1f6, 0x180007316\nmovsxd  r9, edx                                                        ; +0x1f9, 0x180007319\ncmp     rcx, r9                                                        ; +0x1fc, 0x18000731c\njge     loc_1800073C6                                                  ; +0x1ff, 0x18000731f\nmov     rax, r9                                                        ; +0x205, 0x180007325\nmovsxd  rdx, r10d                                                      ; +0x208, 0x180007328\nsub     rax, rcx                                                       ; +0x20b, 0x18000732b\ncmp     rax, 4                                                         ; +0x20e, 0x18000732e\njl      short loc_1800073AE                                            ; +0x212, 0x180007332\nmov     r8, r9                                                         ; +0x214, 0x180007334\nlea     rax, [rsi+8]                                                   ; +0x217, 0x180007337\nsub     r8, rcx                                                        ; +0x21b, 0x18000733b\nlea     rax, [rax+rcx*4]                                               ; +0x21e, 0x18000733e\nsub     r8, 4                                                          ; +0x222, 0x180007342\nshr     r8, 2                                                          ; +0x226, 0x180007346\ninc     r8                                                             ; +0x22a, 0x18000734a\nlea     rcx, [rcx+r8*4]                                                ; +0x22d, 0x18000734d\nnop     dword ptr [rax+00h]                                            ; +0x231, 0x180007351\nnop     word ptr [rax+rax+00000000h]                                   ; +0x235, 0x180007355\nvmovss  xmm0, dword ptr [rax-8]                                        ; +0x240, 0x180007360\nvmulss  xmm1, xmm0, dword ptr [r11+rdx*4]                              ; +0x245, 0x180007365\nvmovss  xmm0, dword ptr [rax-4]                                        ; +0x24b, 0x18000736b\nvmovss  xmm2, dword ptr [rax]                                          ; +0x250, 0x180007370\nvmovss  dword ptr [rax-8], xmm1                                        ; +0x254, 0x180007374\nlea     rax, [rax+10h]                                                 ; +0x259, 0x180007379\nvmulss  xmm1, xmm0, dword ptr [r11+rdx*4]                              ; +0x25d, 0x18000737d\nvmovss  dword ptr [rax-14h], xmm1                                      ; +0x263, 0x180007383\nvmulss  xmm0, xmm2, dword ptr [r11+rdx*4]                              ; +0x268, 0x180007388\nvmovss  xmm1, dword ptr [rax-0Ch]                                      ; +0x26e, 0x18000738e\nvmovss  dword ptr [rax-10h], xmm0                                      ; +0x273, 0x180007393\nvmulss  xmm0, xmm1, dword ptr [r11+rdx*4]                              ; +0x278, 0x180007398\nvmovss  dword ptr [rax-0Ch], xmm0                                      ; +0x27e, 0x18000739e\nsub     r8, 1                                                          ; +0x283, 0x1800073a3\njnz     short loc_180007360                                            ; +0x287, 0x1800073a7\ncmp     rcx, r9                                                        ; +0x289, 0x1800073a9\njge     short loc_1800073C6                                            ; +0x28c, 0x1800073ac\nvmovss  xmm0, dword ptr [rsi+rcx*4]                                    ; +0x28e, 0x1800073ae\nvmulss  xmm1, xmm0, dword ptr [r11+rdx*4]                              ; +0x293, 0x1800073b3\nvmovss  dword ptr [rsi+rcx*4], xmm1                                    ; +0x299, 0x1800073b9\ninc     rcx                                                            ; +0x29e, 0x1800073be\ncmp     rcx, r9                                                        ; +0x2a1, 0x1800073c1\njl      short loc_1800073AE                                            ; +0x2a4, 0x1800073c4\nmov     eax, 1                                                         ; +0x2a6, 0x1800073c6\njmp     short loc_1800073E1                                            ; +0x2ab, 0x1800073cb\nlea     r8, ds:0[rdx*4]; Size                                          ; +0x2ad, 0x1800073cd\nmov     rcx, rsi; void *                                               ; +0x2b5, 0x1800073d5\nxor     edx, edx; Val                                                  ; +0x2b8, 0x1800073d8\ncall    memset                                                         ; +0x2ba, 0x1800073da\nxor     eax, eax                                                       ; +0x2bf, 0x1800073df\nvzeroupper                                                             ; +0x2c1, 0x1800073e1\nlea     r11, [rsp+0A0h+var_20]                                         ; +0x2c4, 0x1800073e4\nmov     rbx, [r11+30h]                                                 ; +0x2cc, 0x1800073ec\nmov     rsi, [r11+38h]                                                 ; +0x2d0, 0x1800073f0\nmov     rdi, [r11+48h]                                                 ; +0x2d4, 0x1800073f4\nmov     rsp, r11                                                       ; +0x2d8, 0x1800073f8\npop     r15                                                            ; +0x2db, 0x1800073fb\npop     r14                                                            ; +0x2dd, 0x1800073fd\npop     r13                                                            ; +0x2df, 0x1800073ff\npop     r12                                                            ; +0x2e1, 0x180007401\npop     rbp                                                            ; +0x2e3, 0x180007403\nretn                                                                   ; +0x2e4, 0x180007404", "xrefs": ["<???> @ 0x1801a4240", "<???> @ 0x1801a4258", "<???> @ 0x1801f6354"], "is_objc": false, "is_arm32": false, "is_arm64": false, "bida_info": "8.0.0 @ https://github.com/Stazzical/BromaIDA", "bindings_info": "commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings"}