return *this;
}
+ TheTest & test_interleave_pq()
+ {
+ Data<R> dataA;
+ R a = dataA;
+ Data<R> resP = v_interleave_pairs(a);
+ Data<R> resQ = v_interleave_quads(a);
+ for (int i = 0; i < VTraits<R>::vlanes()/4; ++i)
+ {
+ SCOPED_TRACE(cv::format("i=%d", i));
+ EXPECT_EQ(resP[4*i], dataA[4*i ]);
+ EXPECT_EQ(resP[4*i + 1], dataA[4*i+2]);
+ EXPECT_EQ(resP[4*i + 2], dataA[4*i+1]);
+ EXPECT_EQ(resP[4*i + 3], dataA[4*i+3]);
+ }
+ for (int i = 0; i < VTraits<R>::vlanes(); ++i)
+ {
+ printf("%d%s", (int)resQ[i], i == VTraits<R>::vlanes()-1 ? "\n" : " ");
+ }
+ for (int i = 0; i < VTraits<R>::vlanes()/8; ++i)
+ {
+ SCOPED_TRACE(cv::format("i=%d", i));
+ EXPECT_EQ(resQ[8*i], dataA[8*i ]);
+ EXPECT_EQ(resQ[8*i + 1], dataA[8*i+4]);
+ EXPECT_EQ(resQ[8*i + 2], dataA[8*i+1]);
+ EXPECT_EQ(resQ[8*i + 3], dataA[8*i+5]);
+ EXPECT_EQ(resQ[8*i + 4], dataA[8*i+2]);
+ EXPECT_EQ(resQ[8*i + 5], dataA[8*i+6]);
+ EXPECT_EQ(resQ[8*i + 6], dataA[8*i+3]);
+ EXPECT_EQ(resQ[8*i + 7], dataA[8*i+7]);
+ }
+ return *this;
+ }
// float32x4 only
TheTest & test_interleave_2channel()
v_transpose4x4(a, b, c, d,
e, f, g, h);
- Data<R> res[4] = {e, f, g, h};
- // for (int i = 0; i < VTraits<R>::vlanes(); i += 4)
- // {
- int i = 0;
- for (int j = 0; j < 4; ++j)
- {
- SCOPED_TRACE(cv::format("i=%d j=%d", i, j));
- EXPECT_EQ(dataA[i + j], res[j][i]);
- EXPECT_EQ(dataB[i + j], res[j][i + 1]);
- EXPECT_EQ(dataC[i + j], res[j][i + 2]);
- EXPECT_EQ(dataD[i + j], res[j][i + 3]);
- }
- // }
+ // Data<R> res[4] = {e, f, g, h}; // Generates incorrect data in certain RVV case.
+ Data<R> res0 = e, res1 = f, res2 = g, res3 = h;
+ EXPECT_EQ(dataA[0], res0[0]);
+ EXPECT_EQ(dataB[0], res0[1]);
+ EXPECT_EQ(dataC[0], res0[2]);
+ EXPECT_EQ(dataD[0], res0[3]);
+
+ EXPECT_EQ(dataA[1], res1[0]);
+ EXPECT_EQ(dataB[1], res1[1]);
+ EXPECT_EQ(dataC[1], res1[2]);
+ EXPECT_EQ(dataD[1], res1[3]);
+
+ EXPECT_EQ(dataA[2], res2[0]);
+ EXPECT_EQ(dataB[2], res2[1]);
+ EXPECT_EQ(dataC[2], res2[2]);
+ EXPECT_EQ(dataD[2], res2[3]);
+
+ EXPECT_EQ(dataA[3], res3[0]);
+ EXPECT_EQ(dataB[3], res3[1]);
+ EXPECT_EQ(dataC[3], res3[2]);
+ EXPECT_EQ(dataD[3], res3[3]);
return *this;
}
// typedef v_uint8 R;
TheTest<v_uint8>()
.test_loadstore()
+ .test_interleave_pq()
.test_expand()
.test_expand_q()
.test_addsub()
.test_rotate<0>().test_rotate<1>().test_rotate<8>().test_rotate<15>()
.test_extract_n<0>().test_extract_n<1>()
.test_extract_highest()
+ .test_unpack()
+ .test_reverse()
#if 0 // not implemented in rvv backend yet.
.test_interleave()
.test_cmp()
.test_pack<1>().test_pack<2>().test_pack<3>().test_pack<8>()
.test_pack_u<1>().test_pack_u<2>().test_pack_u<3>().test_pack_u<8>()
.test_pack_b()
- .test_unpack()
- .test_reverse()
.test_popcount()
#endif
;
// typedef v_int8 R;
TheTest<v_int8>()
.test_loadstore()
+ .test_interleave_pq()
.test_expand()
.test_expand_q()
.test_addsub()
.test_rotate<0>().test_rotate<1>().test_rotate<8>().test_rotate<15>()
.test_extract_n<0>().test_extract_n<1>()
.test_extract_highest()
+ .test_unpack()
+ .test_reverse()
#if 0
.test_interleave()
.test_cmp()
.test_reduce()
.test_reduce_sad()
.test_pack<1>().test_pack<2>().test_pack<3>().test_pack<8>()
- .test_unpack()
- .test_reverse()
.test_popcount()
#endif
;
// typedef v_uint16 R;
TheTest<v_uint16>()
.test_loadstore()
+ .test_interleave_pq()
.test_expand()
.test_addsub()
.test_arithm_wrap()
.test_rotate<0>().test_rotate<1>().test_rotate<4>().test_rotate<7>()
.test_extract_n<0>().test_extract_n<1>()
.test_extract_highest()
+ .test_unpack()
+ .test_reverse()
#if 0
.test_interleave()
.test_cmp()
.test_reduce_sad()
.test_pack<1>().test_pack<2>().test_pack<7>().test_pack<16>()
.test_pack_u<1>().test_pack_u<2>().test_pack_u<7>().test_pack_u<16>()
- .test_unpack()
- .test_reverse()
.test_popcount()
#endif
;
// typedef v_int16 R;
TheTest<v_int16>()
.test_loadstore()
+ .test_interleave_pq()
.test_expand()
.test_addsub()
.test_arithm_wrap()
.test_rotate<0>().test_rotate<1>().test_rotate<4>().test_rotate<7>()
.test_extract_n<0>().test_extract_n<1>()
.test_extract_highest()
+ .test_unpack()
+ .test_reverse()
#if 0
.test_interleave()
.test_reduce()
.test_reduce_sad()
.test_pack<1>().test_pack<2>().test_pack<7>().test_pack<16>()
- .test_unpack()
- .test_reverse()
.test_popcount()
#endif
;
// typedef v_uint32 R;
TheTest<v_uint32>()
.test_loadstore()
+ .test_interleave_pq()
.test_expand()
.test_addsub()
.test_mul()
.test_broadcast_element<0>().test_broadcast_element<1>()
.test_extract_highest()
.test_broadcast_highest()
+ .test_unpack()
+ .test_transpose()
+ .test_reverse()
#if 0
.test_interleave()
.test_cmp()
.test_reduce()
.test_reduce_sad()
.test_pack<1>().test_pack<2>().test_pack<15>().test_pack<32>()
- .test_unpack()
- .test_reverse()
- .test_transpose()
.test_popcount()
#endif
;
// typedef v_int32 R;
TheTest<v_int32>()
.test_loadstore()
+ .test_interleave_pq()
.test_expand()
.test_addsub()
.test_mul()
.test_broadcast_element<0>().test_broadcast_element<1>()
.test_extract_highest()
.test_broadcast_highest()
+ .test_unpack()
+ .test_transpose()
+ .test_reverse()
#if 0
.test_interleave()
.test_cmp()
.test_reduce()
.test_reduce_sad()
.test_pack<1>().test_pack<2>().test_pack<15>().test_pack<32>()
- .test_unpack()
- .test_reverse()
.test_float_cvt32()
.test_float_cvt64()
- .test_transpose()
.test_popcount()
#endif
;
.test_rotate<0>().test_rotate<1>()
.test_extract_n<0>().test_extract_n<1>()
.test_extract_highest()
+ .test_reverse()
;
#if 0
#if CV_SIMD_64F
.test_cmp64()
#endif
- .test_reverse()
#endif
}
.test_extract_n<0>().test_extract_n<1>()
.test_extract_highest()
.test_cvt64_double()
+ .test_reverse()
;
#if 0
#if CV_SIMD_64F
.test_cmp64()
#endif
- .test_reverse()
#endif
}
// typedef v_float32 R;
TheTest<v_float32>()
.test_loadstore()
+ .test_interleave_pq()
.test_addsub()
.test_abs()
.test_mul()
.test_broadcast_element<0>().test_broadcast_element<1>()
.test_extract_highest()
.test_broadcast_highest()
+ .test_unpack()
+ .test_transpose()
+ .test_reverse()
#if 0
.test_interleave()
.test_interleave_2channel()
.test_cmp()
.test_reduce()
.test_reduce_sad()
- .test_unpack()
.test_float_math()
.test_float_cvt64()
.test_matmul()
- .test_transpose()
- .test_reverse()
.test_reduce_sum4()
#endif
;
.test_rotate<0>().test_rotate<1>()
.test_extract_n<0>().test_extract_n<1>()
.test_extract_highest()
+ .test_reverse()
#if 0
.test_cmp()
.test_unpack()
.test_float_cvt32()
.test_float_math()
- .test_reverse()
#endif
;
TheTest<v_uint8>()
.test_loadstore()
.test_interleave()
+ .test_interleave_pq()
.test_expand()
.test_expand_q()
.test_addsub()
TheTest<v_int8>()
.test_loadstore()
.test_interleave()
+ .test_interleave_pq()
.test_expand()
.test_expand_q()
.test_addsub()
TheTest<v_uint16>()
.test_loadstore()
.test_interleave()
+ .test_interleave_pq()
.test_expand()
.test_addsub()
.test_arithm_wrap()
TheTest<v_int16>()
.test_loadstore()
.test_interleave()
+ .test_interleave_pq()
.test_expand()
.test_addsub()
.test_arithm_wrap()
TheTest<v_uint32>()
.test_loadstore()
.test_interleave()
+ // .test_interleave_pq() //not implemented in AVX
.test_expand()
.test_addsub()
.test_mul()
TheTest<v_int32>()
.test_loadstore()
.test_interleave()
+ // .test_interleave_pq() //not implemented in AVX
.test_expand()
.test_addsub()
.test_mul()
.test_loadstore()
.test_interleave()
.test_interleave_2channel()
+ // .test_interleave_pq() //not implemented in AVX
.test_addsub()
.test_mul()
.test_div()