Skip to content

Commit 70cc3f1

Browse files
Workaround template instanciation limit
1 parent 77655d9 commit 70cc3f1

File tree

1 file changed

+40
-21
lines changed

1 file changed

+40
-21
lines changed

include/xsimd/types/xsimd_avx512_int_base.hpp

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -114,45 +114,64 @@ namespace xsimd
114114

115115
namespace avx512_detail
116116
{
117-
template<class Tup, std::size_t... Is>
118-
__m512i revert_args_set_epi8(Tup&& t, detail::index_sequence<Is...>)
117+
inline __m512i int_init(std::integral_constant<std::size_t, 1>,
118+
int8_t t0, int8_t t1, int8_t t2, int8_t t3,
119+
int8_t t4, int8_t t5, int8_t t6, int8_t t7,
120+
int8_t t8, int8_t t9, int8_t t10, int8_t t11,
121+
int8_t t12, int8_t t13, int8_t t14, int8_t t15,
122+
int8_t t16, int8_t t17, int8_t t18, int8_t t19,
123+
int8_t t20, int8_t t21, int8_t t22, int8_t t23,
124+
int8_t t24, int8_t t25, int8_t t26, int8_t t27,
125+
int8_t t28, int8_t t29, int8_t t30, int8_t t31,
126+
int8_t t32, int8_t t33, int8_t t34, int8_t t35,
127+
int8_t t36, int8_t t37, int8_t t38, int8_t t39,
128+
int8_t t40, int8_t t41, int8_t t42, int8_t t43,
129+
int8_t t44, int8_t t45, int8_t t46, int8_t t47,
130+
int8_t t48, int8_t t49, int8_t t50, int8_t t51,
131+
int8_t t52, int8_t t53, int8_t t54, int8_t t55,
132+
int8_t t56, int8_t t57, int8_t t58, int8_t t59,
133+
int8_t t60, int8_t t61, int8_t t62, int8_t t63)
119134
{
120-
// funny, this instruction is not yet implemented in clang or gcc (will come in future versions)
121135
#if defined(__clang__) || __GNUC__
122136
return __extension__ (__m512i)(__v64qi)
123137
{
124-
static_cast<char>(std::get<Is>(std::forward<Tup>(t)))...
138+
t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15,
139+
t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29, t30, t31,
140+
t32, t33, t34, t35, t36, t37, t38, t39, t40, t41, t42, t43, t44, t45, t46, t47,
141+
t48, t49, t50, t51, t52, t53, t54, t55, t56, t57, t58, t59, t60, t61, t62, t63
125142
};
126143
#else
127-
return _mm512_set_epi8(static_cast<char>(std::get<Is>(std::forward<Tup>(t)))...);
144+
return _mm512_set_epi8(
145+
t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15,
146+
t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29, t30, t31,
147+
t32, t33, t34, t35, t36, t37, t38, t39, t40, t41, t42, t43, t44, t45, t46, t47,
148+
t48, t49, t50, t51, t52, t53, t54, t55, t56, t57, t58, t59, t60, t61, t62, t63);
128149
#endif
129150
}
130151

131-
template<class Tup, std::size_t... Is>
132-
__m512i revert_args_set_epi16(Tup&& t, detail::index_sequence<Is...>)
152+
inline __m512i int_init(std::integral_constant<std::size_t, 2>,
153+
int16_t t0, int16_t t1, int16_t t2, int16_t t3,
154+
int16_t t4, int16_t t5, int16_t t6, int16_t t7,
155+
int16_t t8, int16_t t9, int16_t t10, int16_t t11,
156+
int16_t t12, int16_t t13, int16_t t14, int16_t t15,
157+
int16_t t16, int16_t t17, int16_t t18, int16_t t19,
158+
int16_t t20, int16_t t21, int16_t t22, int16_t t23,
159+
int16_t t24, int16_t t25, int16_t t26, int16_t t27,
160+
int16_t t28, int16_t t29, int16_t t30, int16_t t31)
133161
{
134162
#if defined(__clang__) || __GNUC__
135163
return __extension__ (__m512i)(__v32hi)
136164
{
137-
static_cast<short>(std::get<Is>(std::forward<Tup>(t)))...
165+
t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15,
166+
t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29, t30, t31
138167
};
139168
#else
140-
return _mm512_set_epi16(static_cast<short>(std::get<Is>(std::forward<Tup>(t)))...);
169+
return _mm512_set_epi16(
170+
t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15,
171+
t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29, t30, t31);
141172
#endif
142173
}
143174

144-
template <class... Args>
145-
__m512i int_init(std::integral_constant<std::size_t, 1>, Args... args)
146-
{
147-
return revert_args_set_epi8(std::forward_as_tuple(args...), detail::make_index_sequence<sizeof...(Args)>{});
148-
}
149-
150-
template <class... Args>
151-
__m512i int_init(std::integral_constant<std::size_t, 2>, Args... args)
152-
{
153-
return revert_args_set_epi16(std::forward_as_tuple(args...), detail::make_index_sequence<sizeof...(Args)>{});
154-
}
155-
156175
inline __m512i int_init(std::integral_constant<std::size_t, 4>,
157176
int32_t t0, int32_t t1, int32_t t2, int32_t t3,
158177
int32_t t4, int32_t t5, int32_t t6, int32_t t7,

0 commit comments

Comments
 (0)