// // sub_102ADC from 0x102adc to 0x102ca4 (456 bytes) // // 1 xrefs: // > @ 0x11a128 // // 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_102ADC(__int64 result, __int64 a2, __int64 a3, __int64 a4, const float *a5) { __int64 v5; // x30 float32x4_t v6; // q0 float32x4_t v7; // q1 float32x4_t v8; // q2 float32x4_t v9; // q3 float32x4_t *v10; // x8 float32x4_t v11; // q5 int v12; // w8 int8x16_t v13; // q0 int64x2_t v14; // q1 int8x16_t v15; // q2 float32x4_t v16; // q3 unsigned __int64 v17; // d5 float32x4_t *v18; // x10 float32x4_t v19; // q4 float32x4_t v20; // q7 float32x4_t *v21; // x9 float32x4_t v22; // q7 float32x4_t v23; // q17 unsigned __int64 v24; // d6 float32x4_t *v25; // x10 float32x4_t *v26; // x9 float32x4_t v27; // q6 float32x4_t v28; // q6 int v29; // w8 float32x4_t v30; // q0 float32x4_t v31; // q1 float32x4_t v32; // q2 float32x4_t v33; // q3 float32x4_t *v34; // x9 float32x4_t v35; // q5 if ( (_DWORD)a2 && (result & 0xF) != 0 ) { v6 = vld1q_dup_f32(a5); v7 = vld1q_dup_f32((const float *)a4); v8.n128_u64[0] = 0x3000000030000000LL; v8.n128_u64[1] = 0x3000000030000000LL; do { if ( (result & 0xF) == 0 ) break; v9 = vmulq_f32(vcvtq_f32_u32(vshrq_n_u32(v7, 1u)), v8); v10 = (float32x4_t *)(a3 + 4LL * (unsigned int)(8 * *(_DWORD *)(a4 + 4))); v7 = vaddq_s32(v7, v6); a2 = (unsigned int)(a2 - 1); v11 = vmlaq_f32(v10[1], v9, vsubq_f32(v10[3], v10[1])); *(float32x4_t *)result = vmlaq_f32(*v10, v9, vsubq_f32(v10[2], *v10)); *(float32x4_t *)(result + 16) = v11; result += 32; *(_QWORD *)a4 += *(_QWORD *)a5; } while ( (_DWORD)a2 ); } if ( (int)a2 >> 2 ) { for ( result = sub_102CE0(result, a2, a3, a4, a5, v5); v12; result += 128 ) { v17 = vshl_n_s32(vzip2_s32((int32x2_t)v13.n128_u64[0], (int32x2_t)vextq_s8(v13, v13, 8u).n128_u64[0]), 3u).n64_u64[0]; v18 = (float32x4_t *)(a3 + 4LL * (unsigned int)v17); v19 = vmulq_f32(vcvtq_f32_u32(vshrq_n_u32(vuzp1q_s32(v13, v15), 1u)), v16); v20 = vmlaq_n_f32(v18[1], vsubq_f32(v18[3], v18[1]), v19.n128_f32[0]); v21 = (float32x4_t *)(a3 + 4LL * HIDWORD(v17)); *(float32x4_t *)result = vmlaq_n_f32(*v18, vsubq_f32(v18[2], *v18), v19.n128_f32[0]); *(float32x4_t *)(result + 16) = v20; v22 = v21[1]; v23 = v21[3]; v24 = vshl_n_s32(vzip2_s32((int32x2_t)v15.n128_u64[0], (int32x2_t)vextq_s8(v15, v15, 8u).n128_u64[0]), 3u).n64_u64[0]; v25 = (float32x4_t *)(a3 + 4LL * (unsigned int)v24); *(float32x4_t *)(result + 32) = vmlaq_lane_f32(*v21, vsubq_f32(v21[2], *v21), (float32x2_t)v19.n128_u64[0], 1); *(float32x4_t *)(result + 48) = vmlaq_lane_f32(v22, vsubq_f32(v23, v22), (float32x2_t)v19.n128_u64[0], 1); v26 = (float32x4_t *)(a3 + 4LL * HIDWORD(v24)); --v12; v13 = vaddq_s64(v13, v14); v27 = vmlaq_laneq_f32(v25[1], vsubq_f32(v25[3], v25[1]), v19, 2); *(float32x4_t *)(result + 64) = vmlaq_laneq_f32(*v25, vsubq_f32(v25[2], *v25), v19, 2); *(float32x4_t *)(result + 80) = v27; v15 = vaddq_s64(v15, v14); v28 = vmlaq_laneq_f32(v26[1], vsubq_f32(v26[3], v26[1]), v19, 3); *(float32x4_t *)(result + 96) = vmlaq_laneq_f32(*v26, vsubq_f32(v26[2], *v26), v19, 3); *(float32x4_t *)(result + 112) = v28; } *(_QWORD *)a4 = v13.n128_u64[0]; } v29 = a2 & 3; if ( (a2 & 3) != 0 ) { v30 = vld1q_dup_f32(a5); v31 = vld1q_dup_f32((const float *)a4); v32.n128_u64[0] = 0x3000000030000000LL; v32.n128_u64[1] = 0x3000000030000000LL; do { v33 = vmulq_f32(vcvtq_f32_u32(vshrq_n_u32(v31, 1u)), v32); v34 = (float32x4_t *)(a3 + 4LL * (unsigned int)(8 * *(_DWORD *)(a4 + 4))); v31 = vaddq_s32(v31, v30); --v29; v35 = vmlaq_f32(v34[1], v33, vsubq_f32(v34[3], v34[1])); *(float32x4_t *)result = vmlaq_f32(*v34, v33, vsubq_f32(v34[2], *v34)); *(float32x4_t *)(result + 16) = v35; result += 32; *(_QWORD *)a4 += *(_QWORD *)a5; } while ( v29 ); } return result; }