Skip to content

Commit 9cdeaab

Browse files
Fix interaction between make_sized_batch_t and batches of complex
Fix #1049
1 parent caeb777 commit 9cdeaab

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

include/xsimd/types/xsimd_batch.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1442,7 +1442,7 @@ namespace xsimd
14421442
using type = void;
14431443
};
14441444

1445-
template <typename T, class Arch, bool BatchExists = xsimd::types::has_simd_register<T, Arch>::value>
1445+
template <typename T, class Arch, bool BatchExists = xsimd::has_simd_register<T, Arch>::value>
14461446
struct batch_trait;
14471447

14481448
template <typename T, class Arch>

include/xsimd/types/xsimd_traits.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ namespace xsimd
3535
{
3636
};
3737

38+
template <class T, class A>
39+
struct has_simd_register<std::complex<T>, A> : has_simd_register<T, A>
40+
{
41+
};
42+
3843
namespace detail
3944
{
4045
template <class T, bool>

test/test_arch.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,26 +142,34 @@ TEST_CASE("[multi arch support]")
142142
{
143143
using batch4f = xsimd::make_sized_batch_t<float, 4>;
144144
using batch2d = xsimd::make_sized_batch_t<double, 2>;
145+
using batch4c = xsimd::make_sized_batch_t<std::complex<float>, 4>;
146+
using batch2z = xsimd::make_sized_batch_t<std::complex<double>, 2>;
145147
using batch4i32 = xsimd::make_sized_batch_t<int32_t, 4>;
146148
using batch4u32 = xsimd::make_sized_batch_t<uint32_t, 4>;
147149

148150
using batch8f = xsimd::make_sized_batch_t<float, 8>;
149151
using batch4d = xsimd::make_sized_batch_t<double, 4>;
152+
using batch8c = xsimd::make_sized_batch_t<std::complex<float>, 8>;
153+
using batch4z = xsimd::make_sized_batch_t<std::complex<double>, 4>;
150154
using batch8i32 = xsimd::make_sized_batch_t<int32_t, 8>;
151155
using batch8u32 = xsimd::make_sized_batch_t<uint32_t, 8>;
152156

153157
#if XSIMD_WITH_SSE2 || XSIMD_WITH_NEON || XSIMD_WITH_NEON64 || XSIMD_WITH_SVE || (XSIMD_WITH_RVV && XSIMD_RVV_BITS == 128)
154158
CHECK_EQ(4, size_t(batch4f::size));
159+
CHECK_EQ(4, size_t(batch4c::size));
155160
CHECK_EQ(4, size_t(batch4i32::size));
156161
CHECK_EQ(4, size_t(batch4u32::size));
157162

158163
CHECK_UNARY(bool(std::is_same<float, batch4f::value_type>::value));
164+
CHECK_UNARY(bool(std::is_same<std::complex<float>, batch4c::value_type>::value));
159165
CHECK_UNARY(bool(std::is_same<int32_t, batch4i32::value_type>::value));
160166
CHECK_UNARY(bool(std::is_same<uint32_t, batch4u32::value_type>::value));
161167

162168
#if XSIMD_WITH_SSE2 || XSIMD_WITH_NEON64 || XSIMD_WITH_SVE || XSIMD_WITH_RVV
163169
CHECK_EQ(2, size_t(batch2d::size));
170+
CHECK_EQ(2, size_t(batch2z::size));
164171
CHECK_UNARY(bool(std::is_same<double, batch2d::value_type>::value));
172+
CHECK_UNARY(bool(std::is_same<std::complex<double>, batch2z::value_type>::value));
165173
#else
166174
CHECK_UNARY(bool(std::is_same<void, batch2d>::value));
167175
#endif
@@ -170,6 +178,8 @@ TEST_CASE("[multi arch support]")
170178
#if !XSIMD_WITH_AVX && !XSIMD_WITH_FMA3 && !(XSIMD_WITH_SVE && XSIMD_SVE_BITS == 256) && !(XSIMD_WITH_RVV && XSIMD_RVV_BITS == 256)
171179
CHECK_UNARY(bool(std::is_same<void, batch8f>::value));
172180
CHECK_UNARY(bool(std::is_same<void, batch4d>::value));
181+
CHECK_UNARY(bool(std::is_same<void, batch8c>::value));
182+
CHECK_UNARY(bool(std::is_same<void, batch4z>::value));
173183
CHECK_UNARY(bool(std::is_same<void, batch8i32>::value));
174184
CHECK_UNARY(bool(std::is_same<void, batch8u32>::value));
175185
#else
@@ -178,10 +188,15 @@ TEST_CASE("[multi arch support]")
178188
CHECK_EQ(8, size_t(batch8u32::size));
179189
CHECK_EQ(4, size_t(batch4d::size));
180190

191+
CHECK_EQ(8, size_t(batch8c::size));
192+
CHECK_EQ(4, size_t(batch4z::size));
193+
181194
CHECK_UNARY(bool(std::is_same<float, batch8f::value_type>::value));
182195
CHECK_UNARY(bool(std::is_same<double, batch4d::value_type>::value));
183196
CHECK_UNARY(bool(std::is_same<int32_t, batch8i32::value_type>::value));
184197
CHECK_UNARY(bool(std::is_same<uint32_t, batch8u32::value_type>::value));
198+
CHECK_UNARY(bool(std::is_same<std::complex<float>, batch8c::value_type>::value));
199+
CHECK_UNARY(bool(std::is_same<std::complex<double>, batch4z::value_type>::value));
185200
#endif
186201
}
187202

0 commit comments

Comments
 (0)