{"type": "func", "start": 6442543632, "end": 6442544073, "name": "sub_180016A10", "pseudocode": "// \n// sub_180016A10 from 0x180016a10 to 0x180016bc9 (441 bytes)\n// \n// 5 xrefs:\n// > cocos2d::extension::CCTableView::_updateCellPositions @ 0x180015f60\n// > <???> @ 0x18002f02c\n// > <???> @ 0x18002f048\n// > <???> @ 0x18002f058\n// > <???> @ 0x18004a95c\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\nchar *__fastcall sub_180016A10(__int64 a1, unsigned __int64 a2, _DWORD *a3)\n{\n  __int64 v6; // r15\n  unsigned __int64 v7; // rcx\n  __int64 v8; // r15\n  unsigned __int64 v9; // rdx\n  unsigned __int64 v10; // rax\n  unsigned __int64 v11; // r14\n  void *v12; // rax\n  _QWORD *v13; // rdi\n  _DWORD *v14; // rcx\n  unsigned __int64 v15; // rdx\n  unsigned __int64 v16; // r8\n  void *v17; // rcx\n\n  if ( a2 > 0x3FFFFFFFFFFFFFFFLL )\n    sub_180003530();\n  v6 = *(_QWORD *)(a1 + 8) - *(_QWORD *)a1;\n  v7 = (__int64)(*(_QWORD *)(a1 + 16) - *(_QWORD *)a1) >> 2;\n  v8 = v6 >> 2;\n  v9 = v7 >> 1;\n  if ( v7 > 0x3FFFFFFFFFFFFFFFLL - (v7 >> 1) )\n    goto LABEL_28;\n  v10 = v9 + v7;\n  if ( v9 + v7 >= a2 )\n  {\n    if ( v10 > 0x3FFFFFFFFFFFFFFFLL )\n      goto LABEL_28;\n  }\n  else\n  {\n    v10 = a2;\n  }\n  v11 = 4 * v10;\n  if ( 4 * v10 < 0x1000 )\n  {\n    if ( v11 )\n      v13 = operator new(4 * v10);\n    else\n      v13 = nullptr;\n    goto LABEL_13;\n  }\n  if ( v11 + 39 < v11 )\nLABEL_28:\n    Concurrency::cancel_current_task();\n  v12 = operator new(v11 + 39);\n  if ( !v12 )\n    goto LABEL_26;\n  v13 = (_QWORD *)(((unsigned __int64)v12 + 39) & 0xFFFFFFFFFFFFFFE0uLL);\n  *(v13 - 1) = v12;\nLABEL_13:\n  v14 = (_DWORD *)v13 + v8;\n  v15 = a2 - v8;\n  if ( *a3 == _mm_cvtsi128_si32((__m128i)0LL) )\n  {\n    memset(v14, 0, 4 * v15);\n  }\n  else\n  {\n    if ( v15 >= 4 )\n    {\n      v16 = ((v15 - 4) >> 2) + 1;\n      v15 += -4LL * v16;\n      do\n      {\n        *v14 = *a3;\n        v14[1] = *a3;\n        v14[2] = *a3;\n        v14[3] = *a3;\n        v14 += 4;\n        --v16;\n      }\n      while ( v16 );\n    }\n    for ( ; v15; --v15 )\n      *v14++ = *a3;\n  }\n  memmove(v13, *(const void **)a1, *(_QWORD *)(a1 + 8) - *(_QWORD *)a1);\n  v17 = *(void **)a1;\n  if ( *(_QWORD *)a1 )\n  {\n    if ( ((*(_QWORD *)(a1 + 16) - (_QWORD)v17) & 0xFFFFFFFFFFFFFFFCuLL) < 0x1000 )\n    {\nLABEL_24:\n      j_j_free(v17);\n      goto LABEL_25;\n    }\n    if ( (unsigned __int64)v17 - *((_QWORD *)v17 - 1) - 8 <= 0x1F )\n    {\n      v17 = *((void **)v17 - 1);\n      goto LABEL_24;\n    }\nLABEL_26:\n    invalid_parameter_noinfo_noreturn();\n  }\nLABEL_25:\n  *(_QWORD *)a1 = v13;\n  *(_QWORD *)(a1 + 8) = (char *)v13 + 4 * a2;\n  *(_QWORD *)(a1 + 16) = (char *)v13 + v11;\n  return (char *)v13 + v11;\n}", "assembly": "; \n; sub_180016A10 from 0x180016a10 to 0x180016bc9 (441 bytes)\n; \n; 5 xrefs:\n; > cocos2d::extension::CCTableView::_updateCellPositions @ 0x180015f60\n; > <???> @ 0x18002f02c\n; > <???> @ 0x18002f048\n; > <???> @ 0x18002f058\n; > <???> @ 0x18004a95c\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\npush    rbx                                                            ; +0x0, 0x180016a10\npush    rbp                                                            ; +0x2, 0x180016a12\npush    rsi                                                            ; +0x3, 0x180016a13\nsub     rsp, 20h                                                       ; +0x4, 0x180016a14\nmov     rbx, r8                                                        ; +0x8, 0x180016a18\nmov     rbp, rdx                                                       ; +0xb, 0x180016a1b\nmov     r8, 3FFFFFFFFFFFFFFFh                                          ; +0xe, 0x180016a1e\nmov     rsi, rcx                                                       ; +0x18, 0x180016a28\ncmp     rdx, r8                                                        ; +0x1b, 0x180016a2b\nja      loc_180016BBD                                                  ; +0x1e, 0x180016a2e\nmov     [rsp+38h+arg_0], rdi                                           ; +0x24, 0x180016a34\nmov     rax, r8                                                        ; +0x29, 0x180016a39\nmov     [rsp+38h+arg_8], r14                                           ; +0x2c, 0x180016a3c\nmov     [rsp+38h+arg_10], r15                                          ; +0x31, 0x180016a41\nmov     r15, [rcx+8]                                                   ; +0x36, 0x180016a46\nsub     r15, [rcx]                                                     ; +0x3a, 0x180016a4a\nmov     rcx, [rcx+10h]                                                 ; +0x3d, 0x180016a4d\nsub     rcx, [rsi]                                                     ; +0x41, 0x180016a51\nsar     rcx, 2                                                         ; +0x44, 0x180016a54\nmov     rdx, rcx                                                       ; +0x48, 0x180016a58\nsar     r15, 2                                                         ; +0x4b, 0x180016a5b\nshr     rdx, 1                                                         ; +0x4f, 0x180016a5f\nsub     rax, rdx                                                       ; +0x52, 0x180016a62\ncmp     rcx, rax                                                       ; +0x55, 0x180016a65\nja      loc_180016BC3                                                  ; +0x58, 0x180016a68\nlea     rax, [rdx+rcx]                                                 ; +0x5e, 0x180016a6e\ncmp     rax, rbp                                                       ; +0x62, 0x180016a72\njnb     short loc_180016A7C                                            ; +0x65, 0x180016a75\nmov     rax, rbp                                                       ; +0x67, 0x180016a77\njmp     short loc_180016A85                                            ; +0x6a, 0x180016a7a\ncmp     rax, r8                                                        ; +0x6c, 0x180016a7c\nja      loc_180016BC3                                                  ; +0x6f, 0x180016a7f\nlea     r14, ds:0[rax*4]                                               ; +0x75, 0x180016a85\ncmp     r14, 1000h                                                     ; +0x7d, 0x180016a8d\njb      short loc_180016ABF                                            ; +0x84, 0x180016a94\nlea     rcx, [r14+27h]; Size                                           ; +0x86, 0x180016a96\ncmp     rcx, r14                                                       ; +0x8a, 0x180016a9a\njbe     loc_180016BC3                                                  ; +0x8d, 0x180016a9d\ncall    ??2@YAPEAX_K@Z; operator new(unsigned __int64)                 ; +0x93, 0x180016aa3\ntest    rax, rax                                                       ; +0x98, 0x180016aa8\njz      loc_180016BB6                                                  ; +0x9b, 0x180016aab\nlea     rdi, [rax+27h]                                                 ; +0xa1, 0x180016ab1\nand     rdi, 0FFFFFFFFFFFFFFE0h                                        ; +0xa5, 0x180016ab5\nmov     [rdi-8], rax                                                   ; +0xa9, 0x180016ab9\njmp     short loc_180016AD3                                            ; +0xad, 0x180016abd\ntest    r14, r14                                                       ; +0xaf, 0x180016abf\njz      short loc_180016AD1                                            ; +0xb2, 0x180016ac2\nmov     rcx, r14; Size                                                 ; +0xb4, 0x180016ac4\ncall    ??2@YAPEAX_K@Z; operator new(unsigned __int64)                 ; +0xb7, 0x180016ac7\nmov     rdi, rax                                                       ; +0xbc, 0x180016acc\njmp     short loc_180016AD3                                            ; +0xbf, 0x180016acf\nxor     edi, edi                                                       ; +0xc1, 0x180016ad1\nxorps   xmm0, xmm0                                                     ; +0xc3, 0x180016ad3\nlea     rcx, [rdi+r15*4]; void *                                       ; +0xc6, 0x180016ad6\nmovd    eax, xmm0                                                      ; +0xca, 0x180016ada\nmov     rdx, rbp                                                       ; +0xce, 0x180016ade\nsub     rdx, r15                                                       ; +0xd1, 0x180016ae1\ncmp     [rbx], eax                                                     ; +0xd4, 0x180016ae4\njnz     short loc_180016AF9                                            ; +0xd6, 0x180016ae6\nlea     r8, ds:0[rdx*4]; Size                                          ; +0xd8, 0x180016ae8\nxor     edx, edx; Val                                                  ; +0xe0, 0x180016af0\ncall    memset                                                         ; +0xe2, 0x180016af2\njmp     short loc_180016B41                                            ; +0xe7, 0x180016af7\ncmp     rdx, 4                                                         ; +0xe9, 0x180016af9\njb      short loc_180016B2E                                            ; +0xed, 0x180016afd\nlea     r8, [rdx-4]                                                    ; +0xef, 0x180016aff\nshr     r8, 2                                                          ; +0xf3, 0x180016b03\ninc     r8                                                             ; +0xf7, 0x180016b07\nimul    rax, r8, -4                                                    ; +0xfa, 0x180016b0a\nadd     rdx, rax                                                       ; +0xfe, 0x180016b0e\nmov     eax, [rbx]                                                     ; +0x101, 0x180016b11\nmov     [rcx], eax                                                     ; +0x103, 0x180016b13\nmov     eax, [rbx]                                                     ; +0x105, 0x180016b15\nmov     [rcx+4], eax                                                   ; +0x107, 0x180016b17\nmov     eax, [rbx]                                                     ; +0x10a, 0x180016b1a\nmov     [rcx+8], eax                                                   ; +0x10c, 0x180016b1c\nmov     eax, [rbx]                                                     ; +0x10f, 0x180016b1f\nmov     [rcx+0Ch], eax                                                 ; +0x111, 0x180016b21\nadd     rcx, 10h                                                       ; +0x114, 0x180016b24\nsub     r8, 1                                                          ; +0x118, 0x180016b28\njnz     short loc_180016B11                                            ; +0x11c, 0x180016b2c\ntest    rdx, rdx                                                       ; +0x11e, 0x180016b2e\njz      short loc_180016B41                                            ; +0x121, 0x180016b31\nmov     eax, [rbx]                                                     ; +0x123, 0x180016b33\nmov     [rcx], eax                                                     ; +0x125, 0x180016b35\nlea     rcx, [rcx+4]                                                   ; +0x127, 0x180016b37\nsub     rdx, 1                                                         ; +0x12b, 0x180016b3b\njnz     short loc_180016B33                                            ; +0x12f, 0x180016b3f\nmov     rdx, [rsi]; Src                                                ; +0x131, 0x180016b41\nmov     rcx, rdi; void *                                               ; +0x134, 0x180016b44\nmov     r8, [rsi+8]                                                    ; +0x137, 0x180016b47\nsub     r8, rdx; Size                                                  ; +0x13b, 0x180016b4b\ncall    memmove                                                        ; +0x13e, 0x180016b4e\nmov     rcx, [rsi]                                                     ; +0x143, 0x180016b53\ntest    rcx, rcx                                                       ; +0x146, 0x180016b56\njz      short loc_180016B8C                                            ; +0x149, 0x180016b59\nmov     rdx, [rsi+10h]                                                 ; +0x14b, 0x180016b5b\nsub     rdx, rcx                                                       ; +0x14f, 0x180016b5f\nand     rdx, 0FFFFFFFFFFFFFFFCh                                        ; +0x152, 0x180016b62\ncmp     rdx, 1000h                                                     ; +0x156, 0x180016b66\njb      short loc_180016B87                                            ; +0x15d, 0x180016b6d\nmov     r8, [rcx-8]                                                    ; +0x15f, 0x180016b6f\nadd     rdx, 27h ; '''                                                 ; +0x163, 0x180016b73\nsub     rcx, r8                                                        ; +0x167, 0x180016b77\nlea     rax, [rcx-8]                                                   ; +0x16a, 0x180016b7a\ncmp     rax, 1Fh                                                       ; +0x16e, 0x180016b7e\nja      short loc_180016BB6                                            ; +0x172, 0x180016b82\nmov     rcx, r8; Block                                                 ; +0x174, 0x180016b84\ncall    j_j_free                                                       ; +0x177, 0x180016b87\nmov     r15, [rsp+38h+arg_10]                                          ; +0x17c, 0x180016b8c\nlea     rax, [rdi+rbp*4]                                               ; +0x181, 0x180016b91\nmov     [rsi], rdi                                                     ; +0x185, 0x180016b95\nmov     [rsi+8], rax                                                   ; +0x188, 0x180016b98\nlea     rax, [r14+rdi]                                                 ; +0x18c, 0x180016b9c\nmov     r14, [rsp+38h+arg_8]                                           ; +0x190, 0x180016ba0\nmov     rdi, [rsp+38h+arg_0]                                           ; +0x195, 0x180016ba5\nmov     [rsi+10h], rax                                                 ; +0x19a, 0x180016baa\nadd     rsp, 20h                                                       ; +0x19e, 0x180016bae\npop     rsi                                                            ; +0x1a2, 0x180016bb2\npop     rbp                                                            ; +0x1a3, 0x180016bb3\npop     rbx                                                            ; +0x1a4, 0x180016bb4\nretn                                                                   ; +0x1a5, 0x180016bb5\ncall    cs:_invalid_parameter_noinfo_noreturn                          ; +0x1a6, 0x180016bb6\ndb 0CCh                                                                ; +0x1ac, 0x180016bbc\ncall    sub_180003530                                                  ; +0x1ad, 0x180016bbd\ndb 0CCh                                                                ; +0x1b2, 0x180016bc2\ncall    ?cancel_current_task@Concurrency@@YAXXZ; Concurrency::cancel_current_task(void) ; +0x1b3, 0x180016bc3\ndb 0CCh                                                                ; +0x1b8, 0x180016bc8", "xrefs": ["cocos2d::extension::CCTableView::_updateCellPositions @ 0x180015f60", "<???> @ 0x18002f02c", "<???> @ 0x18002f048", "<???> @ 0x18002f058", "<???> @ 0x18004a95c"], "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"}