Skip to content

Commit a84a14c

Browse files
Fix horizontal max/min for uchar
Fixes: #349
1 parent c93ca58 commit a84a14c

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

Vc/sse/detail.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -719,9 +719,9 @@ Vc_INTRINSIC schar min(__m128i a, schar) {
719719
return std::min(schar(_mm_cvtsi128_si32(a) >> 8), schar(_mm_cvtsi128_si32(a)));
720720
}
721721
Vc_INTRINSIC uchar min(__m128i a, uchar) {
722-
a = min(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)), schar());
723-
a = min(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)), schar());
724-
a = min(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)), schar());
722+
a = min(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)), uchar());
723+
a = min(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)), uchar());
724+
a = min(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)), uchar());
725725
return std::min((_mm_cvtsi128_si32(a) >> 8) & 0xff, _mm_cvtsi128_si32(a) & 0xff);
726726
}
727727

@@ -764,9 +764,9 @@ Vc_INTRINSIC schar max(__m128i a, schar) {
764764
return std::max(schar(_mm_cvtsi128_si32(a) >> 8), schar(_mm_cvtsi128_si32(a)));
765765
}
766766
Vc_INTRINSIC uchar max(__m128i a, uchar) {
767-
a = max(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)), schar());
768-
a = max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)), schar());
769-
a = max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)), schar());
767+
a = max(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(1, 0, 3, 2)), uchar());
768+
a = max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 0, 3, 2)), uchar());
769+
a = max(a, _mm_shufflelo_epi16(a, _MM_SHUFFLE(1, 1, 1, 1)), uchar());
770770
return std::max((_mm_cvtsi128_si32(a) >> 8) & 0xff, _mm_cvtsi128_si32(a) & 0xff);
771771
}
772772

tests/arithmetics.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,23 @@ TEST_TYPES(Vec, testMax, AllVectors)
472472
}
473473
}
474474

475+
#if defined(Vc_IMPL_AVX2) && !defined(Vc_MSVC)
476+
TEST(minChar)
477+
{
478+
uint8_t a[64]{0, 10, 250};
479+
COMPARE(Vc::schar_v(reinterpret_cast<Vc::schar*>(a)).min(), Vc::schar{-6});
480+
COMPARE(Vc::uchar_v(a).min(), Vc::uchar{0});
481+
}
482+
483+
// Tests issue: https://github.com/VcDevel/Vc/issues/349
484+
TEST(maxChar)
485+
{
486+
uint8_t a[64]{0, 10, 250};
487+
COMPARE(Vc::schar_v(reinterpret_cast<Vc::schar*>(a)).max(), Vc::schar{10});
488+
COMPARE(Vc::uchar_v(a).max(), Vc::uchar{250});
489+
}
490+
#endif
491+
475492
// testProduct{{{1
476493
TEST_TYPES(Vec, testProduct, AllVectors)
477494
{

0 commit comments

Comments
 (0)