Skip to content

Commit 8db7a6f

Browse files
guyuqiserge-sans-paille
authored andcommitted
Add u8-casting test cases
Change-Id: I184daefc43b9fcae5f4205778b3ed464491167cf Signed-off-by: Yuqi Gu <guyuqi@apache.org>
1 parent 5412849 commit 8db7a6f

File tree

2 files changed

+70
-31
lines changed

2 files changed

+70
-31
lines changed

include/xsimd/types/xsimd_fallback.hpp

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,23 +1199,23 @@ namespace xsimd
11991199
/*****************************************
12001200
* bitwise cast functions implementation *
12011201
*****************************************/
1202-
template <std::size_t in_N, std::size_t out_N>
1203-
batch<uint16_t, out_N> u8_to_u16(const batch<uint8_t, in_N>& x);
1202+
template <std::size_t in_N>
1203+
batch<uint16_t, sizeof(uint8_t)*in_N/sizeof(uint16_t)> u8_to_u16(const batch<uint8_t, in_N>& x);
12041204

1205-
template <std::size_t in_N, std::size_t out_N>
1206-
batch<uint8_t, out_N> u16_to_u8(const batch<uint16_t, in_N>& x);
1205+
template <std::size_t in_N>
1206+
batch<uint8_t, sizeof(uint16_t)*in_N/sizeof(uint8_t)> u16_to_u8(const batch<uint16_t, in_N>& x);
12071207

1208-
template <std::size_t in_N, std::size_t out_N>
1209-
batch<uint32_t, out_N> u8_to_u32(const batch<uint8_t, in_N>& x);
1208+
template <std::size_t in_N>
1209+
batch<uint32_t, sizeof(uint8_t)*in_N/sizeof(uint32_t)> u8_to_u32(const batch<uint8_t, in_N>& x);
12101210

1211-
template <std::size_t in_N, std::size_t out_N>
1212-
batch<uint8_t, out_N> u32_to_u8(const batch<uint32_t, in_N>& x);
1211+
template <std::size_t in_N>
1212+
batch<uint8_t, sizeof(uint32_t)*in_N/sizeof(uint8_t)> u32_to_u8(const batch<uint32_t, in_N>& x);
12131213

1214-
template <std::size_t in_N, std::size_t out_N>
1215-
batch<uint64_t, out_N> u8_to_u64(const batch<uint8_t, in_N>& x);
1214+
template <std::size_t in_N>
1215+
batch<uint64_t, sizeof(uint8_t)*in_N/sizeof(uint64_t)> u8_to_u64(const batch<uint8_t, in_N>& x);
12161216

1217-
template <std::size_t in_N, std::size_t out_N>
1218-
batch<uint8_t, out_N> u64_to_u8(const batch<uint64_t, in_N>& x);
1217+
template <std::size_t in_N>
1218+
batch<uint8_t, sizeof(uint64_t)*in_N/sizeof(uint8_t)> u64_to_u8(const batch<uint64_t, in_N>& x);
12191219

12201220

12211221
template <class T_in, class T_out, std::size_t N_in>
@@ -1243,40 +1243,40 @@ namespace xsimd
12431243
/***********************************************
12441244
* static_cast conversion by bitwise_cast_impl *
12451245
***********************************************/
1246-
template <std::size_t in_N, std::size_t out_N>
1247-
inline batch<uint16_t, out_N> u8_to_u16(const batch<uint8_t, in_N>& x)
1246+
template <std::size_t in_N>
1247+
inline batch<uint16_t, sizeof(uint8_t)*in_N/sizeof(uint16_t)> u8_to_u16(const batch<uint8_t, in_N>& x)
12481248
{
1249-
return bitwise_cast_impl<batch<uint8_t, in_N>, batch<uint16_t, out_N>>::run(x);
1249+
return bitwise_cast_impl<batch<uint8_t, in_N>, batch<uint16_t, sizeof(uint8_t)*in_N/sizeof(uint16_t)>>::run(x);
12501250
}
12511251

1252-
template <std::size_t in_N, std::size_t out_N>
1253-
inline batch<uint8_t, out_N> u16_to_u8(const batch<uint16_t, in_N>& x)
1252+
template <std::size_t in_N>
1253+
inline batch<uint8_t, sizeof(uint16_t)*in_N/sizeof(uint8_t)> u16_to_u8(const batch<uint16_t, in_N>& x)
12541254
{
1255-
return bitwise_cast_impl<batch<uint16_t, in_N>, batch<uint8_t, out_N>>::run(x);
1255+
return bitwise_cast_impl<batch<uint16_t, in_N>, batch<uint8_t, sizeof(uint16_t)*in_N/sizeof(uint8_t)>>::run(x);
12561256
}
12571257

1258-
template <std::size_t in_N, std::size_t out_N>
1259-
inline batch<uint32_t, out_N> u8_to_u32(const batch<uint8_t, in_N>& x)
1258+
template <std::size_t in_N>
1259+
inline batch<uint32_t, sizeof(uint8_t)*in_N/sizeof(uint32_t)> u8_to_u32(const batch<uint8_t, in_N>& x)
12601260
{
1261-
return bitwise_cast_impl<batch<uint8_t, in_N>, batch<uint32_t, out_N>>::run(x);
1261+
return bitwise_cast_impl<batch<uint8_t, in_N>, batch<uint32_t, sizeof(uint8_t)*in_N/sizeof(uint32_t)>>::run(x);
12621262
}
12631263

1264-
template <std::size_t in_N, std::size_t out_N>
1265-
inline batch<uint8_t, out_N> u32_to_u8(const batch<uint32_t, in_N>& x)
1264+
template <std::size_t in_N>
1265+
inline batch<uint8_t, sizeof(uint32_t)*in_N/sizeof(uint8_t)> u32_to_u8(const batch<uint32_t, in_N>& x)
12661266
{
1267-
return bitwise_cast_impl<batch<uint32_t, in_N>, batch<uint8_t, out_N>>::run(x);
1267+
return bitwise_cast_impl<batch<uint32_t, in_N>, batch<uint8_t, sizeof(uint32_t)*in_N/sizeof(uint8_t)>>::run(x);
12681268
}
12691269

1270-
template <std::size_t in_N, std::size_t out_N>
1271-
inline batch<uint64_t, out_N> u8_to_u64(const batch<uint8_t, in_N>& x)
1270+
template <std::size_t in_N>
1271+
inline batch<uint64_t, sizeof(uint8_t)*in_N/sizeof(uint64_t)> u8_to_u64(const batch<uint8_t, in_N>& x)
12721272
{
1273-
return bitwise_cast_impl<batch<uint8_t, in_N>, batch<uint64_t, out_N>>::run(x);
1273+
return bitwise_cast_impl<batch<uint8_t, in_N>, batch<uint64_t, sizeof(uint8_t)*in_N/sizeof(uint64_t)>>::run(x);
12741274
}
12751275

1276-
template <std::size_t in_N, std::size_t out_N>
1277-
inline batch<uint8_t, out_N> u64_to_u8(const batch<uint64_t, in_N>& x)
1276+
template <std::size_t in_N>
1277+
inline batch<uint8_t, sizeof(uint64_t)*in_N/sizeof(uint8_t)> u64_to_u8(const batch<uint64_t, in_N>& x)
12781278
{
1279-
return bitwise_cast_impl<batch<uint64_t, in_N>, batch<uint8_t, out_N>>::run(x);
1279+
return bitwise_cast_impl<batch<uint64_t, in_N>, batch<uint8_t, sizeof(uint64_t)*in_N/sizeof(uint8_t)>>::run(x);
12801280
}
12811281

12821282
}

test/test_conversion.cpp

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,18 @@ class conversion_test : public testing::Test
2323
using float_batch = xsimd::batch<float, N * 2>;
2424
using double_batch = xsimd::batch<double, N>;
2525

26+
using uint8_batch = xsimd::batch<uint8_t, N * 8>;
27+
using uint16_batch = xsimd::batch<uint16_t, N * 4>;
28+
using uint32_batch = xsimd::batch<uint32_t, N * 2>;
29+
using uint64_batch = xsimd::batch<uint64_t, N>;
30+
2631
using int32_vector = std::vector<int32_t, xsimd::aligned_allocator<int32_t, A>>;
2732
using int64_vector = std::vector<int64_t, xsimd::aligned_allocator<int64_t, A>>;
2833
using float_vector = std::vector<float, xsimd::aligned_allocator<float, A>>;
2934
using double_vector = std::vector<double, xsimd::aligned_allocator<double, A>>;
3035

36+
using uint8_vector = std::vector<uint8_t, xsimd::aligned_allocator<uint8_t, A>>;
37+
3138
/*int32_batch i32pos;
3239
int32_batch i32neg;
3340
int64_batch i64pos;
@@ -46,10 +53,13 @@ class conversion_test : public testing::Test
4653
double_vector i64posres;
4754
double_vector i64negres;
4855

56+
uint8_vector ui8res;
57+
4958
conversion_test()
5059
: fposres(2 * N, 7), fnegres(2 * N, -6), dposres(N, 5), dnegres(N, -1),
5160
i32posres(2 * N, float(2)), i32negres(2 * N, float(-3)),
52-
i64posres(N, double(2)), i64negres(N, double(-3))
61+
i64posres(N, double(2)), i64negres(N, double(-3)),
62+
ui8res(8 * N, 4)
5363
{
5464
}
5565

@@ -116,6 +126,30 @@ class conversion_test : public testing::Test
116126
EXPECT_VECTOR_EQ(i64vres, i64negres) << print_function_name("to_float(negative int64)");
117127
}
118128
}
129+
130+
void test_u8_casting()
131+
{
132+
uint8_batch ui8tmp(4);
133+
uint8_vector ui8vres(uint8_batch::size);
134+
{
135+
uint16_batch ui16casting = u8_to_u16(ui8tmp);
136+
uint8_batch ui8casting = u16_to_u8(ui16casting);
137+
ui8casting.store_aligned(ui8vres.data());
138+
EXPECT_VECTOR_EQ(ui8vres, ui8res) << print_function_name("u8_to_16");
139+
}
140+
{
141+
uint32_batch ui32casting = u8_to_u32(ui8tmp);
142+
uint8_batch ui8casting = u32_to_u8(ui32casting);
143+
ui8casting.store_aligned(ui8vres.data());
144+
EXPECT_VECTOR_EQ(ui8vres, ui8res) << print_function_name("u8_to_32");
145+
}
146+
{
147+
uint64_batch ui64casting = u8_to_u64(ui8tmp);
148+
uint8_batch ui8casting = u64_to_u8(ui64casting);
149+
ui8casting.store_aligned(ui8vres.data());
150+
EXPECT_VECTOR_EQ(ui8vres, ui8res) << print_function_name("u8_to_64");
151+
}
152+
}
119153
};
120154

121155
TYPED_TEST_SUITE(conversion_test, conversion_types, conversion_test_names);
@@ -139,3 +173,8 @@ TYPED_TEST(conversion_test, to_double)
139173
{
140174
this->test_to_double();
141175
}
176+
177+
TYPED_TEST(conversion_test, u8_casting)
178+
{
179+
this->test_u8_casting();
180+
}

0 commit comments

Comments
 (0)