From bc63463d517dab7f10416ab4ba1b298986921a58 Mon Sep 17 00:00:00 2001 From: Stefan Werner Date: Wed, 26 Aug 2026 11:22:35 +0200 Subject: [PATCH] Removed superfluous SIMD wrappers --- common/simd/arm/simd_wrapper_types.h | 68 ---------------------------- common/simd/vboolf4_sse2.h | 10 ++-- common/simd/vfloat4_sse2.h | 8 ++-- common/simd/vint4_sse2.h | 7 ++- common/simd/vuint4_sse2.h | 7 ++- 5 files changed, 13 insertions(+), 87 deletions(-) delete mode 100644 common/simd/arm/simd_wrapper_types.h diff --git a/common/simd/arm/simd_wrapper_types.h b/common/simd/arm/simd_wrapper_types.h deleted file mode 100644 index c288f9d8fa..0000000000 --- a/common/simd/arm/simd_wrapper_types.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2009-2024 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 - -#pragma once - -#include "../../sys/platform.h" - -namespace embree -{ -#if defined(_MSC_VER) && defined(_M_ARM64) - // On ARM64 MSVC, __m128 and __m128i are both aliased to __n128 in arm_neon.h, - // causing C++ overload ambiguity (and silent, incorrect overload resolution) - // whenever both an implicit "operator __m128()" and an implicit "operator - // __m128i()" are reachable for the same call. We wrap them in unique types - // to disambiguate the conversions at compile time. - - struct __m128_wrapper { - __m128 data; - __forceinline __m128_wrapper() {} - __forceinline __m128_wrapper(__m128 v) : data(v) {} - __forceinline operator __m128() const { return data; } - __forceinline operator __m128&() { return data; } - }; - - struct __m128i_wrapper { - __m128i data; - __forceinline __m128i_wrapper() {} - __forceinline __m128i_wrapper(__m128i v) : data(v) {} - __forceinline operator __m128i() const { return data; } - __forceinline operator __m128i&() { return data; } - }; - - struct __m128d_wrapper { - __m128d data; - __forceinline __m128d_wrapper() {} - __forceinline __m128d_wrapper(__m128d v) : data(v) {} - __forceinline operator __m128d() const { return data; } - __forceinline operator __m128d&() { return data; } - }; - -#else - // On other platforms, keep concrete wrappers to avoid attribute-bearing - // template arguments such as __m128 in identity_wrapper<__m128>. - struct __m128_wrapper { - __m128 data; - __forceinline __m128_wrapper() {} - __forceinline __m128_wrapper(__m128 v) : data(v) {} - __forceinline operator __m128() const { return data; } - __forceinline operator __m128&() { return data; } - }; - - struct __m128i_wrapper { - __m128i data; - __forceinline __m128i_wrapper() {} - __forceinline __m128i_wrapper(__m128i v) : data(v) {} - __forceinline operator __m128i() const { return data; } - __forceinline operator __m128i&() { return data; } - }; - - struct __m128d_wrapper { - __m128d data; - __forceinline __m128d_wrapper() {} - __forceinline __m128d_wrapper(__m128d v) : data(v) {} - __forceinline operator __m128d() const { return data; } - __forceinline operator __m128d&() { return data; } - }; -#endif -} diff --git a/common/simd/vboolf4_sse2.h b/common/simd/vboolf4_sse2.h index bfb72889b8..752289633d 100644 --- a/common/simd/vboolf4_sse2.h +++ b/common/simd/vboolf4_sse2.h @@ -3,8 +3,6 @@ #pragma once -#include "arm/simd_wrapper_types.h" - #define vboolf vboolf_impl #define vboold vboold_impl #define vint vint_impl @@ -26,7 +24,7 @@ namespace embree typedef vfloat4 Float; enum { size = 4 }; // number of SIMD elements - union { __m128_wrapper v; int i[4]; }; // data + union { __m128 v; int i[4]; }; // data //////////////////////////////////////////////////////////////////////////////// /// Constructors, Assignment & Cast Operators @@ -37,10 +35,10 @@ namespace embree __forceinline vboolf4& operator =(const vboolf4& other) { v = other.v; return *this; } __forceinline vboolf(__m128 input) : v(input) {} - __forceinline operator const __m128&() const { return v.data; } + __forceinline operator const __m128&() const { return v; } #if !defined(__EMSCRIPTEN__) - __forceinline const __m128i m128i() const { return _mm_castps_si128(v.data); } - __forceinline const __m128d m128d() const { return _mm_castps_pd(v.data); } + __forceinline const __m128i m128i() const { return _mm_castps_si128(v); } + __forceinline const __m128d m128d() const { return _mm_castps_pd(v); } #endif __forceinline vboolf(bool a) diff --git a/common/simd/vfloat4_sse2.h b/common/simd/vfloat4_sse2.h index 13a048d73c..737e8029d3 100644 --- a/common/simd/vfloat4_sse2.h +++ b/common/simd/vfloat4_sse2.h @@ -3,8 +3,6 @@ #pragma once -#include "arm/simd_wrapper_types.h" - #define vboolf vboolf_impl #define vboold vboold_impl #define vint vint_impl @@ -26,7 +24,7 @@ namespace embree typedef vfloat4 Float; enum { size = 4 }; // number of SIMD elements - union { __m128_wrapper v; float f[4]; int i[4]; }; // data + union { __m128 v; float f[4]; int i[4]; }; // data //////////////////////////////////////////////////////////////////////////////// /// Constructors, Assignment & Cast Operators @@ -39,8 +37,8 @@ namespace embree __forceinline vfloat4& operator =(const vfloat4& other) { v = other.v; return *this; } __forceinline vfloat(__m128 a) : v(a) {} - __forceinline operator const __m128&() const { return v.data; } - __forceinline operator __m128&() { return v.data; } + __forceinline operator const __m128&() const { return v; } + __forceinline operator __m128&() { return v; } __forceinline vfloat(float a) : v(_mm_set1_ps(a)) {} __forceinline vfloat(float a, float b, float c, float d) : v(_mm_set_ps(d, c, b, a)) {} diff --git a/common/simd/vint4_sse2.h b/common/simd/vint4_sse2.h index a64232a0d7..e93cce164b 100644 --- a/common/simd/vint4_sse2.h +++ b/common/simd/vint4_sse2.h @@ -3,7 +3,6 @@ #pragma once -#include "arm/simd_wrapper_types.h" #include "../math/emath.h" #define vboolf vboolf_impl @@ -27,7 +26,7 @@ namespace embree typedef vfloat4 Float; enum { size = 4 }; // number of SIMD elements - union { __m128i_wrapper v; int i[4]; }; // data + union { __m128i v; int i[4]; }; // data //////////////////////////////////////////////////////////////////////////////// /// Constructors, Assignment & Cast Operators @@ -38,8 +37,8 @@ namespace embree __forceinline vint4& operator =(const vint4& a) { v = a.v; return *this; } __forceinline vint(__m128i a) : v(a) {} - __forceinline operator const __m128i&() const { return v.data; } - __forceinline operator __m128i&() { return v.data; } + __forceinline operator const __m128i&() const { return v; } + __forceinline operator __m128i&() { return v; } __forceinline vint(int a) : v(_mm_set1_epi32(a)) {} __forceinline vint(int a, int b, int c, int d) : v(_mm_set_epi32(d, c, b, a)) {} diff --git a/common/simd/vuint4_sse2.h b/common/simd/vuint4_sse2.h index 4f1443c119..fa409d3d79 100644 --- a/common/simd/vuint4_sse2.h +++ b/common/simd/vuint4_sse2.h @@ -3,7 +3,6 @@ #pragma once -#include "arm/simd_wrapper_types.h" #include "../math/emath.h" #define vboolf vboolf_impl @@ -27,7 +26,7 @@ namespace embree typedef vfloat4 Float; enum { size = 4 }; // number of SIMD elements - union { __m128i_wrapper v; unsigned int i[4]; }; // data + union { __m128i v; unsigned int i[4]; }; // data //////////////////////////////////////////////////////////////////////////////// /// Constructors, Assignment & Cast Operators @@ -38,8 +37,8 @@ namespace embree __forceinline vuint4& operator =(const vuint4& a) { v = a.v; return *this; } __forceinline vuint(const __m128i a) : v(a) {} - __forceinline operator const __m128i&() const { return v.data; } - __forceinline operator __m128i&() { return v.data; } + __forceinline operator const __m128i&() const { return v; } + __forceinline operator __m128i&() { return v; } __forceinline vuint(unsigned int a) : v(_mm_set1_epi32(a)) {}