From 8cfcf1e8bfc36e968231f86f211363f4139caf17 Mon Sep 17 00:00:00 2001 From: Gamer64 Date: Sat, 2 Aug 2025 01:48:04 +0200 Subject: [PATCH] [vector_math]: Use NEON intrinsics in Vec4 dot operation (#177) PabloMK7: Changes the Vec4 dot operation to use NEON intrinsics on ARM devices. This function is used every time a triangle is added to the rendered, so it can be considered hot code. The other vector operations are not used as much, so there is no gain to provide NEON operations for them. The improvements from this change are most likely minimal. Co-authored-by: PabloMK7 Co-authored-by: Gamer64 <76565986+Gamer64ytb@users.noreply.github.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/177 Co-authored-by: Gamer64 Co-committed-by: Gamer64 --- src/common/vector_math.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/common/vector_math.h b/src/common/vector_math.h index b4885835df..829a79ce5a 100644 --- a/src/common/vector_math.h +++ b/src/common/vector_math.h @@ -1,9 +1,16 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Tony Wasserka // SPDX-FileCopyrightText: 2014 Dolphin Emulator Project // SPDX-License-Identifier: BSD-3-Clause AND GPL-2.0-or-later #pragma once +#ifdef __ARM_NEON +#include +#endif + #include #include @@ -641,6 +648,23 @@ template return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; } +template <> +[[nodiscard]] inline float Dot(const Vec4& a, const Vec4& b) { +#ifdef __ARM_NEON + float32x4_t va = vld1q_f32(&a.x); + float32x4_t vb = vld1q_f32(&b.x); + float32x4_t result = vmulq_f32(va, vb); +#if defined(__aarch64__) // Use vaddvq_f32 in ARMv8 architectures + return vaddvq_f32(result); +#else // Use manual addition for older architectures + float32x2_t sum2 = vadd_f32(vget_high_f32(result), vget_low_f32(result)); + return vget_lane_f32(vpadd_f32(sum2, sum2), 0); +#endif +#else + return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; +#endif +} + template [[nodiscard]] constexpr Vec3 Cross(const Vec3& a, const Vec3& b) {