diff --git a/Vc/sse/detail.h b/Vc/sse/detail.h index 68e116937..13bb59e69 100644 --- a/Vc/sse/detail.h +++ b/Vc/sse/detail.h @@ -764,9 +764,9 @@ Vc_INTRINSIC schar max(__m128i a, schar) { return std::max(schar(_mm_cvtsi128_si32(a) >> 8), schar(_mm_cvtsi128_si32(a))); } Vc_INTRINSIC uchar max(__m128i a, uchar) { - a = max(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)), schar()); - a = max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)), schar()); - a = max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)), schar()); + a = max(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)), uchar()); + a = max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)), uchar()); + a = max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)), uchar()); return std::max((_mm_cvtsi128_si32(a) >> 8) & 0xff, _mm_cvtsi128_si32(a) & 0xff); } diff --git a/tests/arithmetics.cpp b/tests/arithmetics.cpp index 592b8a756..f9285e1bf 100644 --- a/tests/arithmetics.cpp +++ b/tests/arithmetics.cpp @@ -472,6 +472,23 @@ TEST_TYPES(Vec, testMax, AllVectors) } } +#ifdef Vc_IMPL_AVX2 +TEST(minChar) +{ + uint8_t a[64]{0, 10, 250}; + COMPARE(Vc::schar_v(reinterpret_cast(a)).min(), Vc::schar{-6}); + COMPARE(Vc::uchar_v(a).min(), Vc::uchar{0}); +} + +// Tests issue: https://github.com/VcDevel/Vc/issues/349 +TEST(maxChar) +{ + uint8_t a[64]{0, 10, 250}; + COMPARE(Vc::schar_v(reinterpret_cast(a)).max(), Vc::schar{10}); + COMPARE(Vc::uchar_v(a).max(), Vc::uchar{250}); +} +#endif + // testProduct{{{1 TEST_TYPES(Vec, testProduct, AllVectors) {