{"type": "func", "start": 6443771836, "end": 6443772133, "name": "strrchr", "pseudocode": "// \n// strrchr from 0x1801427bc to 0x1801428e5 (297 bytes)\n// \n// 1 xrefs:\n// > fp_format_a @ 0x1801376b5\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 *__cdecl strrchr(const char *Str, int Ch)\n{\n  char *v2; // r9\n  __m128i *v3; // r8\n  __m128i *v4; // rdx\n  __int64 v5; // rax\n  __m128i *v7; // r10\n  int v8; // r8d\n  __m128i v9; // xmm2\n  unsigned int v10; // edx\n  int i; // ecx\n  __int64 v12; // rcx\n  char *v13; // rcx\n  unsigned int v14; // edx\n  __int64 v15; // rcx\n  char *v16; // rcx\n  __m128i v17; // xmm0\n  unsigned __int8 v18; // zf\n  int v19; // ecx\n\n  v2 = nullptr;\n  v3 = (__m128i *)Str;\n  if ( Ch )\n  {\n    if ( dword_1801B1700 >= 2 )\n    {\n      while ( ((unsigned __int8)v3 & 0xF) != 0 )\n      {\n        if ( v3->m128i_i8[0] == Ch )\n          v2 = (char *)v3;\n        if ( !v3->m128i_i8[0] )\n          return v2;\n        v3 = (__m128i *)((char *)v3 + 1);\n      }\n      v17 = _mm_cvtsi32_si128((unsigned __int8)Ch);\n      while ( 1 )\n      {\n        v19 = _mm_cmpistri(v17, *v3, 64);\n        v18 = _mm_cmpistrz(v17, *v3, 64);\n        if ( _mm_cmpistrc(v17, *v3, 64) )\n        {\n          v2 = &v3->m128i_i8[v19];\n          v18 = _mm_cmpistrz(v17, *v3, 64);\n        }\n        if ( v18 )\n          break;\n        ++v3;\n      }\n    }\n    else\n    {\n      v7 = (__m128i *)((unsigned __int64)Str & 0xFFFFFFFFFFFFFFF0uLL);\n      v8 = -1 << ((unsigned __int8)Str & 0xF);\n      v9 = _mm_shuffle_epi32(\n             _mm_shufflelo_epi16(_mm_cvtsi32_si128((unsigned __int8)Ch | ((unsigned __int8)Ch << 8)), 0),\n             0);\n      v10 = v8 & _mm_movemask_epi8(_mm_cmpeq_epi8(v9, *(__m128i *)((unsigned __int64)Str & 0xFFFFFFFFFFFFFFF0uLL)));\n      for ( i = v8\n              & _mm_movemask_epi8(_mm_cmpeq_epi8((__m128i)0LL, *(__m128i *)((unsigned __int64)Str & 0xFFFFFFFFFFFFFFF0uLL)));\n            !i;\n            v10 = _mm_movemask_epi8(_mm_cmpeq_epi8(v9, *v7)) )\n      {\n        _BitScanReverse((unsigned int *)&v12, v10);\n        v13 = &v7->m128i_i8[v12];\n        if ( v10 )\n          v2 = v13;\n        i = _mm_movemask_epi8(_mm_cmpeq_epi8((__m128i)0LL, *++v7));\n      }\n      v14 = ((i & -i) - 1) & v10;\n      _BitScanReverse((unsigned int *)&v15, v14);\n      v16 = &v7->m128i_i8[v15];\n      if ( v14 )\n        return v16;\n    }\n    return v2;\n  }\n  else\n  {\n    v4 = (__m128i *)((unsigned __int64)Str & 0xFFFFFFFFFFFFFFF0uLL);\n    for ( LODWORD(v5) = (-1 << ((unsigned __int8)Str & 0xF))\n                      & _mm_movemask_epi8(_mm_cmpeq_epi8((__m128i)0LL, *(__m128i *)((unsigned __int64)Str\n                                                                                  & 0xFFFFFFFFFFFFFFF0uLL)));\n          !(_DWORD)v5;\n          LODWORD(v5) = _mm_movemask_epi8(_mm_cmpeq_epi8((__m128i)0LL, *v4)) )\n    {\n      ++v4;\n    }\n    _BitScanForward((unsigned int *)&v5, v5);\n    return &v4->m128i_i8[v5];\n  }\n}", "assembly": "; \n; strrchr from 0x1801427bc to 0x1801428e5 (297 bytes)\n; \n; 1 xrefs:\n; > fp_format_a @ 0x1801376b5\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\nxor     r9d, r9d                                                       ; +0x0, 0x1801427bc\nmov     r8, rcx                                                        ; +0x3, 0x1801427bf\ntest    edx, edx                                                       ; +0x6, 0x1801427c2\njnz     short loc_180142805                                            ; +0x8, 0x1801427c4\nand     r8d, 0Fh                                                       ; +0xa, 0x1801427c6\nmov     rdx, rcx                                                       ; +0xe, 0x1801427ca\nand     rdx, 0FFFFFFFFFFFFFFF0h                                        ; +0x11, 0x1801427cd\nmov     ecx, r8d                                                       ; +0x15, 0x1801427d1\nor      r8d, 0FFFFFFFFh                                                ; +0x18, 0x1801427d4\nxorps   xmm0, xmm0                                                     ; +0x1c, 0x1801427d8\nshl     r8d, cl                                                        ; +0x1f, 0x1801427db\npcmpeqb xmm0, xmmword ptr [rdx]                                        ; +0x22, 0x1801427de\npmovmskb eax, xmm0                                                     ; +0x26, 0x1801427e2\nand     eax, r8d                                                       ; +0x2a, 0x1801427e6\njnz     short loc_1801427FE                                            ; +0x2d, 0x1801427e9\nadd     rdx, 10h                                                       ; +0x2f, 0x1801427eb\nxorps   xmm0, xmm0                                                     ; +0x33, 0x1801427ef\npcmpeqb xmm0, xmmword ptr [rdx]                                        ; +0x36, 0x1801427f2\npmovmskb eax, xmm0                                                     ; +0x3a, 0x1801427f6\ntest    eax, eax                                                       ; +0x3e, 0x1801427fa\njz      short loc_1801427EB                                            ; +0x40, 0x1801427fc\nbsf     eax, eax                                                       ; +0x42, 0x1801427fe\nadd     rax, rdx                                                       ; +0x45, 0x180142801\nretn                                                                   ; +0x48, 0x180142804\ncmp     cs:dword_1801B1700, 2                                          ; +0x49, 0x180142805\njge     loc_1801428BA                                                  ; +0x50, 0x18014280c\nmovzx   eax, dl                                                        ; +0x56, 0x180142812\nmov     r10, r8                                                        ; +0x59, 0x180142815\nand     r8d, 0Fh                                                       ; +0x5c, 0x180142818\nand     r10, 0FFFFFFFFFFFFFFF0h                                        ; +0x60, 0x18014281c\nmov     ecx, eax                                                       ; +0x64, 0x180142820\nshl     ecx, 8                                                         ; +0x66, 0x180142822\nor      ecx, eax                                                       ; +0x69, 0x180142825\nmovd    xmm0, ecx                                                      ; +0x6b, 0x180142827\nmov     ecx, r8d                                                       ; +0x6f, 0x18014282b\npshuflw xmm1, xmm0, 0                                                  ; +0x72, 0x18014282e\nor      r8d, 0FFFFFFFFh                                                ; +0x77, 0x180142833\nxorps   xmm0, xmm0                                                     ; +0x7b, 0x180142837\nshl     r8d, cl                                                        ; +0x7e, 0x18014283a\npcmpeqb xmm0, xmmword ptr [r10]                                        ; +0x81, 0x18014283d\npmovmskb ecx, xmm0                                                     ; +0x86, 0x180142842\npshufd  xmm2, xmm1, 0                                                  ; +0x8a, 0x180142846\nmovdqa  xmm0, xmm2                                                     ; +0x8f, 0x18014284b\npcmpeqb xmm0, xmmword ptr [r10]                                        ; +0x93, 0x18014284f\npmovmskb edx, xmm0                                                     ; +0x98, 0x180142854\nand     edx, r8d                                                       ; +0x9c, 0x180142858\nand     ecx, r8d                                                       ; +0x9f, 0x18014285b\njnz     short loc_18014288D                                            ; +0xa2, 0x18014285e\nbsr     ecx, edx                                                       ; +0xa4, 0x180142860\nxorps   xmm1, xmm1                                                     ; +0xa7, 0x180142863\nmovdqa  xmm0, xmm2                                                     ; +0xaa, 0x180142866\nadd     rcx, r10                                                       ; +0xae, 0x18014286a\ntest    edx, edx                                                       ; +0xb1, 0x18014286d\ncmovnz  r9, rcx                                                        ; +0xb3, 0x18014286f\nadd     r10, 10h                                                       ; +0xb7, 0x180142873\npcmpeqb xmm1, xmmword ptr [r10]                                        ; +0xbb, 0x180142877\npcmpeqb xmm0, xmmword ptr [r10]                                        ; +0xc0, 0x18014287c\npmovmskb ecx, xmm1                                                     ; +0xc5, 0x180142881\npmovmskb edx, xmm0                                                     ; +0xc9, 0x180142885\ntest    ecx, ecx                                                       ; +0xcd, 0x180142889\njz      short loc_180142860                                            ; +0xcf, 0x18014288b\nmov     eax, ecx                                                       ; +0xd1, 0x18014288d\nneg     eax                                                            ; +0xd3, 0x18014288f\nand     eax, ecx                                                       ; +0xd5, 0x180142891\ndec     eax                                                            ; +0xd7, 0x180142893\nand     edx, eax                                                       ; +0xd9, 0x180142895\nbsr     ecx, edx                                                       ; +0xdb, 0x180142897\nadd     rcx, r10                                                       ; +0xde, 0x18014289a\ntest    edx, edx                                                       ; +0xe1, 0x18014289d\ncmovnz  r9, rcx                                                        ; +0xe3, 0x18014289f\nmov     rax, r9                                                        ; +0xe7, 0x1801428a3\nretn                                                                   ; +0xea, 0x1801428a6\nmovsx   eax, byte ptr [r8]                                             ; +0xeb, 0x1801428a7\ncmp     eax, edx                                                       ; +0xef, 0x1801428ab\ncmovz   r9, r8                                                         ; +0xf1, 0x1801428ad\ncmp     byte ptr [r8], 0                                               ; +0xf5, 0x1801428b1\njz      short loc_1801428A3                                            ; +0xf9, 0x1801428b5\ninc     r8                                                             ; +0xfb, 0x1801428b7\ntest    r8b, 0Fh                                                       ; +0xfe, 0x1801428ba\njnz     short loc_1801428A7                                            ; +0x102, 0x1801428be\nmovzx   eax, dl                                                        ; +0x104, 0x1801428c0\nmovd    xmm0, eax                                                      ; +0x107, 0x1801428c3\npcmpistri xmm0, xmmword ptr [r8], 40h ; '@'                            ; +0x10b, 0x1801428c7\njnb     short loc_1801428DD                                            ; +0x112, 0x1801428ce\nmovsxd  r9, ecx                                                        ; +0x114, 0x1801428d0\nadd     r9, r8                                                         ; +0x117, 0x1801428d3\npcmpistri xmm0, xmmword ptr [r8], 40h ; '@'                            ; +0x11a, 0x1801428d6\njz      short loc_1801428A3                                            ; +0x121, 0x1801428dd\nadd     r8, 10h                                                        ; +0x123, 0x1801428df\njmp     short loc_1801428C7                                            ; +0x127, 0x1801428e3", "xrefs": ["fp_format_a @ 0x1801376b5"], "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"}