{"type": "func", "start": 6442471360, "end": 6442471963, "name": "sub_180004FC0", "pseudocode": "// \n// sub_180004FC0 from 0x180004fc0 to 0x18000521b (603 bytes)\n// \n// 1 xrefs:\n// > sub_180004520 @ 0x1800045a2\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__m128 *__fastcall sub_180004FC0(\n        __m128 *a1,\n        __m128 *a2,\n        __m128 *a3,\n        __m128 *a4,\n        __m128 *a5,\n        int a6,\n        int a7,\n        int a8,\n        int a9)\n{\n  int i; // eax\n  __m128 v10; // xmm1\n  __m128 v11; // xmm0\n  int v12; // r10d\n  __int32 v13; // eax\n  __m128 *result; // rax\n  int j; // r11d\n  __m128 v16; // xmm1\n  __m128 v17; // xmm0\n  __m128 v18; // xmm4\n  __m128 v19; // xmm3\n  __m128 v20; // xmm1\n  int v21; // r10d\n  float v22; // xmm0_4\n  int k; // r11d\n  __m128 v24; // xmm4\n  __m128 v25; // xmm0\n  __m128 v26; // xmm3\n  __m128 v27; // xmm4\n  __m128 v28; // xmm0\n  __m128 v29; // xmm2\n  int v30; // r10d\n  signed __int64 v31; // r9\n  signed __int64 v32; // rdx\n  signed __int64 v33; // r8\n  int m; // r8d\n  __m128i si128; // xmm0\n  __m128i v36; // xmm2\n  int v37; // edx\n  float v38; // xmm0_4\n\n  for ( i = a6 >> 3; i; --i )\n  {\n    v10 = a4[-2];\n    a4 -= 2;\n    v11 = a4[1];\n    a1[1] = _mm_shuffle_ps(v10, v10, 27);\n    *a1 = _mm_shuffle_ps(v11, v11, 27);\n    a1 += 2;\n  }\n  v12 = a6 & 7;\n  if ( (a6 & 7) != 0 )\n  {\n    do\n    {\n      v13 = a4[-1].m128_i32[3];\n      a4 = (__m128 *)((char *)a4 - 4);\n      a1->m128_i32[0] = v13;\n      a1 = (__m128 *)((char *)a1 + 4);\n      --v12;\n    }\n    while ( v12 );\n  }\n  result = a5;\n  for ( j = a7 >> 3; j; --j )\n  {\n    a2 -= 2;\n    a4 -= 2;\n    v16 = _mm_mul_ps(a3[1], result[1]);\n    v17 = *result;\n    result += 2;\n    v18 = _mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(*a2, *a2, 27), _mm_shuffle_ps(*a4, *a4, 27)), v16);\n    v19 = _mm_mul_ps(_mm_shuffle_ps(a2[1], a2[1], 27), _mm_shuffle_ps(a4[1], a4[1], 27));\n    v20 = *a3;\n    a3 += 2;\n    a1[1] = v18;\n    *a1 = _mm_add_ps(v19, _mm_mul_ps(v20, v17));\n    a1 += 2;\n  }\n  v21 = a7 & 7;\n  if ( (a7 & 7) != 0 )\n  {\n    do\n    {\n      a4 = (__m128 *)((char *)a4 - 4);\n      v22 = a3->m128_f32[0] * result->m128_f32[0];\n      a2 = (__m128 *)((char *)a2 - 4);\n      a3 = (__m128 *)((char *)a3 + 4);\n      result = (__m128 *)((char *)result + 4);\n      a1->m128_f32[0] = (float)(a4->m128_f32[0] * a2->m128_f32[0]) + v22;\n      a1 = (__m128 *)((char *)a1 + 4);\n      --v21;\n    }\n    while ( v21 );\n  }\n  for ( k = a8 >> 3; k; --k )\n  {\n    result -= 2;\n    a2 -= 2;\n    v24 = _mm_mul_ps(_mm_shuffle_ps(*a2, *a2, 27), a4[1]);\n    v25 = *a4;\n    a4 += 2;\n    v26 = _mm_mul_ps(_mm_shuffle_ps(a2[1], a2[1], 27), v25);\n    v27 = _mm_sub_ps(v24, _mm_mul_ps(_mm_shuffle_ps(*result, *result, 27), a3[1]));\n    v28 = *a3;\n    a3 += 2;\n    v29 = _mm_mul_ps(_mm_shuffle_ps(result[1], result[1], 27), v28);\n    a1[1] = v27;\n    *a1 = _mm_sub_ps(v26, v29);\n    a1 += 2;\n  }\n  v30 = a8 & 7;\n  if ( (a8 & 7) != 0 )\n  {\n    v31 = (char *)a4 - (char *)a1;\n    v32 = (char *)a2 - (char *)result;\n    v33 = (char *)a3 - (char *)a1;\n    do\n    {\n      result = (__m128 *)((char *)result - 4);\n      a1->m128_f32[0] = (float)(*(float *)((char *)result->m128_f32 + v32) * *(float *)((char *)a1->m128_f32 + v31))\n                      - (float)(*(float *)((char *)a1->m128_f32 + v33) * result->m128_f32[0]);\n      a1 = (__m128 *)((char *)a1 + 4);\n      --v30;\n    }\n    while ( v30 );\n  }\n  for ( m = a9 >> 3; m; --m )\n  {\n    result -= 2;\n    si128 = _mm_load_si128(xmmword_180144630);\n    v36 = _mm_xor_si128(si128, (__m128i)_mm_shuffle_ps(*result, *result, 27));\n    *(__m128i *)a1 = _mm_xor_si128(si128, (__m128i)_mm_shuffle_ps(result[1], result[1], 27));\n    a1[1] = (__m128)v36;\n    a1 += 2;\n  }\n  v37 = a9 & 7;\n  if ( (a9 & 7) != 0 )\n  {\n    do\n    {\n      v38 = result[-1].m128_f32[3];\n      result = (__m128 *)((char *)result - 4);\n      a1 = (__m128 *)((char *)a1 + 4);\n      a1[-1].m128_f32[3] = -v38;\n      --v37;\n    }\n    while ( v37 );\n  }\n  return result;\n}", "assembly": "; \n; sub_180004FC0 from 0x180004fc0 to 0x18000521b (603 bytes)\n; \n; 1 xrefs:\n; > sub_180004520 @ 0x1800045a2\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     r10d, [rsp+arg_28]                                             ; +0x0, 0x180004fc0\nmov     eax, r10d                                                      ; +0x5, 0x180004fc5\nsar     eax, 3                                                         ; +0x8, 0x180004fc8\ntest    eax, eax                                                       ; +0xb, 0x180004fcb\njz      short loc_180004FF6                                            ; +0xd, 0x180004fcd\nnop                                                                    ; +0xf, 0x180004fcf\nmovups  xmm1, xmmword ptr [r9-20h]                                     ; +0x10, 0x180004fd0\nsub     r9, 20h ; ' '                                                  ; +0x15, 0x180004fd5\nshufps  xmm1, xmm1, 1Bh                                                ; +0x19, 0x180004fd9\nmovups  xmm0, xmmword ptr [r9+10h]                                     ; +0x1d, 0x180004fdd\nmovups  xmmword ptr [rcx+10h], xmm1                                    ; +0x22, 0x180004fe2\nshufps  xmm0, xmm0, 1Bh                                                ; +0x26, 0x180004fe6\nmovups  xmmword ptr [rcx], xmm0                                        ; +0x2a, 0x180004fea\nadd     rcx, 20h ; ' '                                                 ; +0x2d, 0x180004fed\nsub     eax, 1                                                         ; +0x31, 0x180004ff1\njnz     short loc_180004FD0                                            ; +0x34, 0x180004ff4\nand     r10d, 7                                                        ; +0x36, 0x180004ff6\njz      short loc_180005014                                            ; +0x3a, 0x180004ffa\nnop     dword ptr [rax+00h]                                            ; +0x3c, 0x180004ffc\nmov     eax, [r9-4]                                                    ; +0x40, 0x180005000\nsub     r9, 4                                                          ; +0x44, 0x180005004\nmov     [rcx], eax                                                     ; +0x48, 0x180005008\nadd     rcx, 4                                                         ; +0x4a, 0x18000500a\nsub     r10d, 1                                                        ; +0x4e, 0x18000500e\njnz     short loc_180005000                                            ; +0x52, 0x180005012\nmov     r10d, [rsp+arg_30]                                             ; +0x54, 0x180005014\nmov     r11d, r10d                                                     ; +0x59, 0x180005019\nmov     rax, [rsp+arg_20]                                              ; +0x5c, 0x18000501c\nsar     r11d, 3                                                        ; +0x61, 0x180005021\ntest    r11d, r11d                                                     ; +0x65, 0x180005025\njz      short loc_180005093                                            ; +0x68, 0x180005028\nnop     word ptr [rax+rax+00h]                                         ; +0x6a, 0x18000502a\nmovups  xmm1, xmmword ptr [r8+10h]                                     ; +0x70, 0x180005030\nsub     rdx, 20h ; ' '                                                 ; +0x75, 0x180005035\nsub     r9, 20h ; ' '                                                  ; +0x79, 0x180005039\nmovups  xmm0, xmmword ptr [r9]                                         ; +0x7d, 0x18000503d\nmovups  xmm4, xmmword ptr [rdx]                                        ; +0x81, 0x180005041\nmovups  xmm2, xmmword ptr [r9+10h]                                     ; +0x84, 0x180005044\nmovups  xmm3, xmmword ptr [rdx+10h]                                    ; +0x89, 0x180005049\nshufps  xmm0, xmm0, 1Bh                                                ; +0x8d, 0x18000504d\nshufps  xmm4, xmm4, 1Bh                                                ; +0x91, 0x180005051\nmulps   xmm4, xmm0                                                     ; +0x95, 0x180005055\nmovups  xmm0, xmmword ptr [rax+10h]                                    ; +0x98, 0x180005058\nshufps  xmm3, xmm3, 1Bh                                                ; +0x9c, 0x18000505c\nmulps   xmm1, xmm0                                                     ; +0xa0, 0x180005060\nmovups  xmm0, xmmword ptr [rax]                                        ; +0xa3, 0x180005063\nadd     rax, 20h ; ' '                                                 ; +0xa6, 0x180005066\nshufps  xmm2, xmm2, 1Bh                                                ; +0xaa, 0x18000506a\naddps   xmm4, xmm1                                                     ; +0xae, 0x18000506e\nmulps   xmm3, xmm2                                                     ; +0xb1, 0x180005071\nmovups  xmm1, xmmword ptr [r8]                                         ; +0xb4, 0x180005074\nadd     r8, 20h ; ' '                                                  ; +0xb8, 0x180005078\nmulps   xmm1, xmm0                                                     ; +0xbc, 0x18000507c\nmovups  xmmword ptr [rcx+10h], xmm4                                    ; +0xbf, 0x18000507f\naddps   xmm3, xmm1                                                     ; +0xc3, 0x180005083\nmovups  xmmword ptr [rcx], xmm3                                        ; +0xc6, 0x180005086\nadd     rcx, 20h ; ' '                                                 ; +0xc9, 0x180005089\nsub     r11d, 1                                                        ; +0xcd, 0x18000508d\njnz     short loc_180005030                                            ; +0xd1, 0x180005091\nand     r10d, 7                                                        ; +0xd3, 0x180005093\njz      short loc_1800050D4                                            ; +0xd7, 0x180005097\nnop     dword ptr [rax+00000000h]                                      ; +0xd9, 0x180005099\nmovss   xmm0, dword ptr [r8]                                           ; +0xe0, 0x1800050a0\nsub     r9, 4                                                          ; +0xe5, 0x1800050a5\nmulss   xmm0, dword ptr [rax]                                          ; +0xe9, 0x1800050a9\nsub     rdx, 4                                                         ; +0xed, 0x1800050ad\nadd     r8, 4                                                          ; +0xf1, 0x1800050b1\nadd     rax, 4                                                         ; +0xf5, 0x1800050b5\nmovss   xmm1, dword ptr [r9]                                           ; +0xf9, 0x1800050b9\nmulss   xmm1, dword ptr [rdx]                                          ; +0xfe, 0x1800050be\naddss   xmm1, xmm0                                                     ; +0x102, 0x1800050c2\nmovss   dword ptr [rcx], xmm1                                          ; +0x106, 0x1800050c6\nadd     rcx, 4                                                         ; +0x10a, 0x1800050ca\nsub     r10d, 1                                                        ; +0x10e, 0x1800050ce\njnz     short loc_1800050A0                                            ; +0x112, 0x1800050d2\nmov     r10d, [rsp+arg_38]                                             ; +0x114, 0x1800050d4\nmov     r11d, r10d                                                     ; +0x119, 0x1800050d9\nsar     r11d, 3                                                        ; +0x11c, 0x1800050dc\ntest    r11d, r11d                                                     ; +0x120, 0x1800050e0\njz      short loc_180005153                                            ; +0x123, 0x1800050e3\nnop     word ptr [rax+rax+00000000h]                                   ; +0x125, 0x1800050e5\nmovups  xmm0, xmmword ptr [r8+10h]                                     ; +0x130, 0x1800050f0\nsub     rax, 20h ; ' '                                                 ; +0x135, 0x1800050f5\nsub     rdx, 20h ; ' '                                                 ; +0x139, 0x1800050f9\nmovups  xmm1, xmmword ptr [rax]                                        ; +0x13d, 0x1800050fd\nmovups  xmm4, xmmword ptr [rdx]                                        ; +0x140, 0x180005100\nmovups  xmm3, xmmword ptr [rdx+10h]                                    ; +0x143, 0x180005103\nmovups  xmm2, xmmword ptr [rax+10h]                                    ; +0x147, 0x180005107\nshufps  xmm4, xmm4, 1Bh                                                ; +0x14b, 0x18000510b\nshufps  xmm3, xmm3, 1Bh                                                ; +0x14f, 0x18000510f\nshufps  xmm1, xmm1, 1Bh                                                ; +0x153, 0x180005113\nmulps   xmm1, xmm0                                                     ; +0x157, 0x180005117\nmovups  xmm0, xmmword ptr [r9+10h]                                     ; +0x15a, 0x18000511a\nshufps  xmm2, xmm2, 1Bh                                                ; +0x15f, 0x18000511f\nmulps   xmm4, xmm0                                                     ; +0x163, 0x180005123\nmovups  xmm0, xmmword ptr [r9]                                         ; +0x166, 0x180005126\nadd     r9, 20h ; ' '                                                  ; +0x16a, 0x18000512a\nmulps   xmm3, xmm0                                                     ; +0x16e, 0x18000512e\nsubps   xmm4, xmm1                                                     ; +0x171, 0x180005131\nmovups  xmm0, xmmword ptr [r8]                                         ; +0x174, 0x180005134\nadd     r8, 20h ; ' '                                                  ; +0x178, 0x180005138\nmulps   xmm2, xmm0                                                     ; +0x17c, 0x18000513c\nmovups  xmmword ptr [rcx+10h], xmm4                                    ; +0x17f, 0x18000513f\nsubps   xmm3, xmm2                                                     ; +0x183, 0x180005143\nmovups  xmmword ptr [rcx], xmm3                                        ; +0x186, 0x180005146\nadd     rcx, 20h ; ' '                                                 ; +0x189, 0x180005149\nsub     r11d, 1                                                        ; +0x18d, 0x18000514d\njnz     short loc_1800050F0                                            ; +0x191, 0x180005151\nand     r10d, 7                                                        ; +0x193, 0x180005153\njz      short loc_18000519B                                            ; +0x197, 0x180005157\nsub     r9, rcx                                                        ; +0x199, 0x180005159\nsub     rdx, rax                                                       ; +0x19c, 0x18000515c\nsub     r8, rcx                                                        ; +0x19f, 0x18000515f\nnop     dword ptr [rax+00h]                                            ; +0x1a2, 0x180005162\nnop     word ptr [rax+rax+00000000h]                                   ; +0x1a6, 0x180005166\nmovss   xmm0, dword ptr [r8+rcx]                                       ; +0x1b0, 0x180005170\nsub     rax, 4                                                         ; +0x1b6, 0x180005176\nmovss   xmm1, dword ptr [rdx+rax]                                      ; +0x1ba, 0x18000517a\nmulss   xmm1, dword ptr [r9+rcx]                                       ; +0x1bf, 0x18000517f\nmulss   xmm0, dword ptr [rax]                                          ; +0x1c5, 0x180005185\nsubss   xmm1, xmm0                                                     ; +0x1c9, 0x180005189\nmovss   dword ptr [rcx], xmm1                                          ; +0x1cd, 0x18000518d\nadd     rcx, 4                                                         ; +0x1d1, 0x180005191\nsub     r10d, 1                                                        ; +0x1d5, 0x180005195\njnz     short loc_180005170                                            ; +0x1d9, 0x180005199\nmov     edx, [rsp+arg_40]                                              ; +0x1db, 0x18000519b\nmov     r8d, edx                                                       ; +0x1df, 0x18000519f\nsar     r8d, 3                                                         ; +0x1e2, 0x1800051a2\ntest    r8d, r8d                                                       ; +0x1e6, 0x1800051a6\njz      short loc_1800051E9                                            ; +0x1e9, 0x1800051a9\nnop     dword ptr [rax+rax+00h]                                        ; +0x1eb, 0x1800051ab\nmovdqa  xmm2, cs:xmmword_180144630                                     ; +0x1f0, 0x1800051b0\nsub     rax, 20h ; ' '                                                 ; +0x1f8, 0x1800051b8\nmovdqa  xmm0, xmm2                                                     ; +0x1fc, 0x1800051bc\nmovups  xmm3, xmmword ptr [rax]                                        ; +0x200, 0x1800051c0\nmovups  xmm1, xmmword ptr [rax+10h]                                    ; +0x203, 0x1800051c3\nshufps  xmm3, xmm3, 1Bh                                                ; +0x207, 0x1800051c7\nshufps  xmm1, xmm1, 1Bh                                                ; +0x20b, 0x1800051cb\npxor    xmm2, xmm3                                                     ; +0x20f, 0x1800051cf\npxor    xmm0, xmm1                                                     ; +0x213, 0x1800051d3\nmovdqu  xmmword ptr [rcx], xmm0                                        ; +0x217, 0x1800051d7\nmovups  xmmword ptr [rcx+10h], xmm2                                    ; +0x21b, 0x1800051db\nadd     rcx, 20h ; ' '                                                 ; +0x21f, 0x1800051df\nsub     r8d, 1                                                         ; +0x223, 0x1800051e3\njnz     short loc_1800051B0                                            ; +0x227, 0x1800051e7\nand     edx, 7                                                         ; +0x229, 0x1800051e9\njz      short locret_18000521A                                         ; +0x22c, 0x1800051ec\nmovss   xmm1, dword ptr cs:xmmword_180144610                           ; +0x22e, 0x1800051ee\nnop     word ptr [rax+rax+00000000h]                                   ; +0x236, 0x1800051f6\nmovss   xmm0, dword ptr [rax-4]                                        ; +0x240, 0x180005200\nlea     rax, [rax-4]                                                   ; +0x245, 0x180005205\nlea     rcx, [rcx+4]                                                   ; +0x249, 0x180005209\nxorps   xmm0, xmm1                                                     ; +0x24d, 0x18000520d\nmovss   dword ptr [rcx-4], xmm0                                        ; +0x250, 0x180005210\nsub     edx, 1                                                         ; +0x255, 0x180005215\njnz     short loc_180005200                                            ; +0x258, 0x180005218\nretn                                                                   ; +0x25a, 0x18000521a", "xrefs": ["sub_180004520 @ 0x1800045a2"], "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"}