-
Notifications
You must be signed in to change notification settings - Fork 263
/
Copy pathtest_extract_pair.cpp
92 lines (80 loc) · 2.94 KB
/
test_extract_pair.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/***************************************************************************
* Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and *
* Martin Renou *
* Copyright (c) QuantStack *
* Copyright (c) Serge Guelton *
* *
* Distributed under the terms of the BSD 3-Clause License. *
* *
* The full license is in the file LICENSE, distributed with this software. *
****************************************************************************/
#include "xsimd/xsimd.hpp"
#ifndef XSIMD_NO_SUPPORTED_ARCHITECTURE
#include "test_utils.hpp"
namespace xsimd
{
template <typename T, std::size_t N>
struct init_extract_pair_base
{
using extract_vector_type = std::array<T, N>;
extract_vector_type lhs_in, rhs_in, exped;
std::vector<extract_vector_type> create_extract_vectors(const int index)
{
std::vector<extract_vector_type> vects;
vects.reserve(3);
int num = static_cast<int>(N);
/* Generate input data: lhs, rhs */
for (int i = 0; i < num; ++i)
{
lhs_in[i] = 2 * i + 1;
rhs_in[i] = 2 * i + 2;
}
vects.push_back(std::move(lhs_in));
vects.push_back(std::move(rhs_in));
/* Expected shuffle data */
for (int i = 0; i < (num - index); ++i)
{
exped[i] = rhs_in[i + index];
if (i < index)
{
exped[num - 1 - i] = lhs_in[index - 1 - i];
}
}
vects.push_back(std::move(exped));
return vects;
}
};
}
template <class B>
struct extract_pair_test
{
using batch_type = B;
using value_type = typename B::value_type;
static constexpr size_t size = B::size;
void extract_pair_128()
{
xsimd::init_extract_pair_base<value_type, size> extract_pair_base;
auto extract_pair_vecs = extract_pair_base.create_extract_vectors(1);
auto v_lhs = extract_pair_vecs[0];
auto v_rhs = extract_pair_vecs[1];
auto v_exped = extract_pair_vecs[2];
B b_lhs = B::load_unaligned(v_lhs.data());
B b_rhs = B::load_unaligned(v_rhs.data());
B b_exped = B::load_unaligned(v_exped.data());
/* Only Test 128bit */
if ((sizeof(value_type) * size) == 16)
{
B b_res = xsimd::extract_pair(b_lhs, b_rhs, 1);
CHECK_BATCH_EQ(b_res, b_exped);
}
}
};
TEST_CASE_TEMPLATE("[extract pair]", B, BATCH_TYPES)
{
extract_pair_test<B> Test;
SUBCASE("extract_pair_128")
{
Test.extract_pair_128();
}
}
#endif