Skip to content

Commit 0bde434

Browse files
authored
Clean up vector_algorithms.cpp again: unsigned bit manipulation, scope guard for multiple return (#5532)
1 parent 41ec195 commit 0bde434

File tree

1 file changed

+42
-43
lines changed

1 file changed

+42
-43
lines changed

stl/src/vector_algorithms.cpp

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2884,7 +2884,7 @@ namespace {
28842884

28852885
do {
28862886
const __m256i _Data = _mm256_loadu_si256(static_cast<const __m256i*>(_First));
2887-
int _Bingo = _mm256_movemask_epi8(_Traits::_Cmp_avx(_Data, _Comparand));
2887+
unsigned int _Bingo = _mm256_movemask_epi8(_Traits::_Cmp_avx(_Data, _Comparand));
28882888

28892889
if constexpr (_Pred == _Predicate::_Not_equal) {
28902890
_Bingo ^= 0xFFFF'FFFF;
@@ -2903,7 +2903,7 @@ namespace {
29032903
const __m256i _Tail_mask = _Avx2_tail_mask_32(_Avx_tail_size);
29042904
const __m256i _Data = _mm256_maskload_epi32(static_cast<const int*>(_First), _Tail_mask);
29052905
const __m256i _Cmp = _Traits::_Cmp_avx(_Data, _Comparand);
2906-
int _Bingo = _mm256_movemask_epi8(_mm256_and_si256(_Cmp, _Tail_mask));
2906+
unsigned int _Bingo = _mm256_movemask_epi8(_mm256_and_si256(_Cmp, _Tail_mask));
29072907

29082908
if constexpr (_Pred == _Predicate::_Not_equal) {
29092909
_Bingo ^= (1 << _Avx_tail_size) - 1;
@@ -2928,7 +2928,7 @@ namespace {
29282928

29292929
do {
29302930
const __m128i _Data = _mm_loadu_si128(static_cast<const __m128i*>(_First));
2931-
int _Bingo = _mm_movemask_epi8(_Traits::_Cmp_sse(_Data, _Comparand));
2931+
unsigned int _Bingo = _mm_movemask_epi8(_Traits::_Cmp_sse(_Data, _Comparand));
29322932

29332933
if constexpr (_Pred == _Predicate::_Not_equal) {
29342934
_Bingo ^= 0xFFFF;
@@ -2975,7 +2975,7 @@ namespace {
29752975
do {
29762976
_Rewind_bytes(_Last, 32);
29772977
const __m256i _Data = _mm256_loadu_si256(static_cast<const __m256i*>(_Last));
2978-
int _Bingo = _mm256_movemask_epi8(_Traits::_Cmp_avx(_Data, _Comparand));
2978+
unsigned int _Bingo = _mm256_movemask_epi8(_Traits::_Cmp_avx(_Data, _Comparand));
29792979

29802980
if constexpr (_Pred == _Predicate::_Not_equal) {
29812981
_Bingo ^= 0xFFFF'FFFF;
@@ -2993,7 +2993,7 @@ namespace {
29932993
const __m256i _Tail_mask = _Avx2_tail_mask_32(_Avx_tail_size);
29942994
const __m256i _Data = _mm256_maskload_epi32(static_cast<const int*>(_Last), _Tail_mask);
29952995
const __m256i _Cmp = _Traits::_Cmp_avx(_Data, _Comparand);
2996-
int _Bingo = _mm256_movemask_epi8(_mm256_and_si256(_Cmp, _Tail_mask));
2996+
unsigned int _Bingo = _mm256_movemask_epi8(_mm256_and_si256(_Cmp, _Tail_mask));
29972997

29982998
if constexpr (_Pred == _Predicate::_Not_equal) {
29992999
_Bingo ^= (1 << _Avx_tail_size) - 1;
@@ -3017,7 +3017,7 @@ namespace {
30173017
do {
30183018
_Rewind_bytes(_Last, 16);
30193019
const __m128i _Data = _mm_loadu_si128(static_cast<const __m128i*>(_Last));
3020-
int _Bingo = _mm_movemask_epi8(_Traits::_Cmp_sse(_Data, _Comparand));
3020+
unsigned int _Bingo = _mm_movemask_epi8(_Traits::_Cmp_sse(_Data, _Comparand));
30213021

30223022
if constexpr (_Pred == _Predicate::_Not_equal) {
30233023
_Bingo ^= 0xFFFF;
@@ -3081,9 +3081,9 @@ namespace {
30813081
const void* _Next = _First;
30823082
_Advance_bytes(_Next, sizeof(_Ty));
30833083

3084-
const __m256i _Data = _mm256_loadu_si256(static_cast<const __m256i*>(_First));
3085-
const __m256i _Comparand = _mm256_loadu_si256(static_cast<const __m256i*>(_Next));
3086-
const int _Bingo = _mm256_movemask_epi8(_Traits::_Cmp_avx(_Data, _Comparand));
3084+
const __m256i _Data = _mm256_loadu_si256(static_cast<const __m256i*>(_First));
3085+
const __m256i _Comparand = _mm256_loadu_si256(static_cast<const __m256i*>(_Next));
3086+
const unsigned int _Bingo = _mm256_movemask_epi8(_Traits::_Cmp_avx(_Data, _Comparand));
30873087

30883088
if (_Bingo != 0) {
30893089
const unsigned long _Offset = _tzcnt_u32(_Bingo);
@@ -3098,11 +3098,11 @@ namespace {
30983098
const void* _Next = _First;
30993099
_Advance_bytes(_Next, sizeof(_Ty));
31003100

3101-
const __m256i _Tail_mask = _Avx2_tail_mask_32(_Avx_tail_size);
3102-
const __m256i _Data = _mm256_maskload_epi32(static_cast<const int*>(_First), _Tail_mask);
3103-
const __m256i _Comparand = _mm256_maskload_epi32(static_cast<const int*>(_Next), _Tail_mask);
3104-
const __m256i _Cmp = _Traits::_Cmp_avx(_Data, _Comparand);
3105-
const int _Bingo = _mm256_movemask_epi8(_mm256_and_si256(_Cmp, _Tail_mask));
3101+
const __m256i _Tail_mask = _Avx2_tail_mask_32(_Avx_tail_size);
3102+
const __m256i _Data = _mm256_maskload_epi32(static_cast<const int*>(_First), _Tail_mask);
3103+
const __m256i _Comparand = _mm256_maskload_epi32(static_cast<const int*>(_Next), _Tail_mask);
3104+
const __m256i _Cmp = _Traits::_Cmp_avx(_Data, _Comparand);
3105+
const unsigned int _Bingo = _mm256_movemask_epi8(_mm256_and_si256(_Cmp, _Tail_mask));
31063106

31073107
if (_Bingo != 0) {
31083108
const unsigned long _Offset = _tzcnt_u32(_Bingo);
@@ -3124,9 +3124,9 @@ namespace {
31243124
const void* _Next = _First;
31253125
_Advance_bytes(_Next, sizeof(_Ty));
31263126

3127-
const __m128i _Data = _mm_loadu_si128(static_cast<const __m128i*>(_First));
3128-
const __m128i _Comparand = _mm_loadu_si128(static_cast<const __m128i*>(_Next));
3129-
const int _Bingo = _mm_movemask_epi8(_Traits::_Cmp_sse(_Data, _Comparand));
3127+
const __m128i _Data = _mm_loadu_si128(static_cast<const __m128i*>(_First));
3128+
const __m128i _Comparand = _mm_loadu_si128(static_cast<const __m128i*>(_Next));
3129+
const unsigned int _Bingo = _mm_movemask_epi8(_Traits::_Cmp_sse(_Data, _Comparand));
31303130

31313131
if (_Bingo != 0) {
31323132
unsigned long _Offset;
@@ -3183,8 +3183,8 @@ namespace {
31833183
do {
31843184
const __m256i _Data = _mm256_loadu_si256(reinterpret_cast<const __m256i*>(_First));
31853185

3186-
const __m256i _Cmp = _Traits::_Cmp_avx(_Comparand, _Data);
3187-
const auto _Mask = static_cast<uint32_t>(_mm256_movemask_epi8(_Cmp));
3186+
const __m256i _Cmp = _Traits::_Cmp_avx(_Comparand, _Data);
3187+
const uint32_t _Mask = _mm256_movemask_epi8(_Cmp);
31883188

31893189
uint64_t _MskX = uint64_t{_Carry} | (uint64_t{_Mask} << 32);
31903190

@@ -3585,11 +3585,11 @@ namespace {
35853585
}
35863586

35873587
if (const size_t _Avx_tail_size = _Size_bytes & 0x1C; _Avx_tail_size != 0) {
3588-
const __m256i _Tail_mask = _Avx2_tail_mask_32(_Avx_tail_size);
3589-
const __m256i _Data = _mm256_maskload_epi32(static_cast<const int*>(_First), _Tail_mask);
3590-
const __m256i _Mask = _mm256_and_si256(_Traits::_Cmp_avx(_Data, _Comparand), _Tail_mask);
3591-
const int _Bingo = _mm256_movemask_epi8(_Mask);
3592-
const size_t _Tail_count = __popcnt(_Bingo); // Assume available with SSE4.2
3588+
const __m256i _Tail_mask = _Avx2_tail_mask_32(_Avx_tail_size);
3589+
const __m256i _Data = _mm256_maskload_epi32(static_cast<const int*>(_First), _Tail_mask);
3590+
const __m256i _Mask = _mm256_and_si256(_Traits::_Cmp_avx(_Data, _Comparand), _Tail_mask);
3591+
const unsigned int _Bingo = _mm256_movemask_epi8(_Mask);
3592+
const size_t _Tail_count = __popcnt(_Bingo); // Assume available with SSE4.2
35933593
_Result += _Tail_count / sizeof(_Ty);
35943594
_Advance_bytes(_First, _Avx_tail_size);
35953595
}
@@ -4292,8 +4292,8 @@ namespace {
42924292
_Found = _mm_and_si128(_Found, _Found_part);
42934293
}
42944294

4295-
const int _Bingo = _mm_cvtsi128_si32(_Found);
4296-
int _Found_pos = _Found_pos_init;
4295+
const unsigned int _Bingo = _mm_cvtsi128_si32(_Found);
4296+
int _Found_pos = _Found_pos_init;
42974297

42984298
if (_Bingo != 0) {
42994299
unsigned long _Tmp;
@@ -4478,7 +4478,7 @@ namespace {
44784478
}
44794479
}
44804480

4481-
if (const int _Bingo = _mm256_movemask_epi8(_Eq); _Bingo != 0) {
4481+
if (const uint32_t _Bingo = _mm256_movemask_epi8(_Eq); _Bingo != 0) {
44824482
const unsigned long _Offset = _tzcnt_u32(_Bingo);
44834483
_Advance_bytes(_First1, _Offset);
44844484
return _First1;
@@ -4497,7 +4497,7 @@ namespace {
44974497
}
44984498
}
44994499

4500-
if (const int _Bingo = _mm256_movemask_epi8(_mm256_and_si256(_Eq, _Tail_mask)); _Bingo != 0) {
4500+
if (const uint32_t _Bingo = _mm256_movemask_epi8(_mm256_and_si256(_Eq, _Tail_mask)); _Bingo != 0) {
45014501
const unsigned long _Offset = _tzcnt_u32(_Bingo);
45024502
_Advance_bytes(_First1, _Offset);
45034503
return _First1;
@@ -4832,8 +4832,8 @@ namespace {
48324832
_Advance_bytes(_Cur_needle, 16);
48334833
}
48344834

4835-
const int _Bingo = _mm_cvtsi128_si32(_Found);
4836-
int _Found_pos = _Not_found;
4835+
const unsigned int _Bingo = _mm_cvtsi128_si32(_Found);
4836+
int _Found_pos = _Not_found;
48374837

48384838
if (_Bingo != 0) {
48394839
unsigned long _Tmp;
@@ -5310,7 +5310,7 @@ namespace {
53105310

53115311
#pragma warning(push)
53125312
#pragma warning(disable : 4324) // structure was padded due to alignment specifier
5313-
const auto _Check_first = [=, &_Mid1](long _Match) noexcept {
5313+
const auto _Check_first = [=, &_Mid1](unsigned long _Match) noexcept {
53145314
while (_Match != 0) {
53155315
const unsigned int _Pos = _Traits::_Bsr(_Match);
53165316

@@ -5331,7 +5331,7 @@ namespace {
53315331
return false;
53325332
};
53335333

5334-
const auto _Check = [=, &_Mid1](long _Match) noexcept {
5334+
const auto _Check = [=, &_Mid1](unsigned long _Match) noexcept {
53355335
while (_Match != 0) {
53365336
const unsigned int _Pos = _Traits::_Bsr(_Match);
53375337

@@ -5397,7 +5397,7 @@ namespace {
53975397

53985398
#pragma warning(push)
53995399
#pragma warning(disable : 4324) // structure was padded due to alignment specifier
5400-
const auto _Check = [=, &_Mid1](long _Match) noexcept {
5400+
const auto _Check = [=, &_Mid1](unsigned long _Match) noexcept {
54015401
while (_Match != 0) {
54025402
const unsigned int _Pos = _Traits::_Bsr(_Match);
54035403

@@ -5696,7 +5696,7 @@ namespace {
56965696
#pragma warning(push)
56975697
#pragma warning(disable : 4324) // structure was padded due to alignment specifier
56985698
const auto _Check_unfit = [=, &_Mid1](const unsigned int _Match) noexcept {
5699-
long _Unfit_match = _Match & _Needle_unfit_mask;
5699+
unsigned long _Unfit_match = _Match & _Needle_unfit_mask;
57005700
while (_Unfit_match != 0) {
57015701
const void* _Tmp1 = _Mid1;
57025702
unsigned long _Match_last_pos;
@@ -5716,7 +5716,7 @@ namespace {
57165716
return true;
57175717
}
57185718

5719-
_bittestandreset(&_Unfit_match, _Match_last_pos);
5719+
_Unfit_match ^= 1 << _Match_last_pos;
57205720
}
57215721

57225722
return false;
@@ -5773,7 +5773,7 @@ namespace {
57735773

57745774
#pragma warning(push)
57755775
#pragma warning(disable : 4324) // structure was padded due to alignment specifier
5776-
const auto _Check = [=, &_Mid1](long _Match) noexcept {
5776+
const auto _Check = [=, &_Mid1](unsigned long _Match) noexcept {
57775777
while (_Match != 0) {
57785778
const void* _Tmp1 = _Mid1;
57795779
unsigned long _Match_last_pos;
@@ -5805,7 +5805,7 @@ namespace {
58055805
}
58065806
}
58075807

5808-
_bittestandreset(&_Match, _Match_last_pos);
5808+
_Match ^= 1 << _Match_last_pos;
58095809
}
58105810

58115811
return false;
@@ -7025,7 +7025,8 @@ namespace {
70257025
using _Traits_2_sse = void;
70267026
#else // ^^^ defined(_M_ARM64EC) / !defined(_M_ARM64EC) vvv
70277027
struct _Traits_avx {
7028-
using _Vec = __m256i;
7028+
using _Guard = _Zeroupper_on_exit;
7029+
using _Vec = __m256i;
70297030

70307031
static __m256i _Load(const void* _Src) noexcept {
70317032
return _mm256_loadu_si256(reinterpret_cast<const __m256i*>(_Src));
@@ -7045,7 +7046,8 @@ namespace {
70457046
};
70467047

70477048
struct _Traits_sse {
7048-
using _Vec = __m128i;
7049+
using _Guard = char;
7050+
using _Vec = __m128i;
70497051

70507052
static __m128i _Load(const void* _Src) noexcept {
70517053
return _mm_loadu_si128(reinterpret_cast<const __m128i*>(_Src));
@@ -7174,6 +7176,7 @@ namespace {
71747176
template <class _Traits, class _Elem>
71757177
bool _Impl(void* const _Dest, const _Elem* const _Src, const size_t _Size_bytes, const size_t _Size_bits,
71767178
const size_t _Size_chars, const _Elem _Elem0, const _Elem _Elem1) noexcept {
7179+
[[maybe_unused]] typename _Traits::_Guard _Guard; // TRANSITION, DevCom-10331414
71777180
const auto _Dx0 = _Traits::_Set(_Elem0);
71787181
const auto _Dx1 = _Traits::_Set(_Elem1);
71797182

@@ -7190,14 +7193,12 @@ namespace {
71907193

71917194
// Convert characters to bits
71927195
if (!_Loop<_Traits>(_Src, _Src + _Size_convert, _Dx0, _Dx1, _Out)) {
7193-
_Traits::_Exit_vectorized(); // TRANSITION, DevCom-10331414
71947196
return false;
71957197
}
71967198

71977199
// Verify remaining characters, if any
71987200
if (_Size_convert != _Size_chars
71997201
&& !_Loop<_Traits>(_Src + _Size_convert, _Src + _Size_chars, _Dx0, _Dx1, [](_Traits::_Vec) {})) {
7200-
_Traits::_Exit_vectorized(); // TRANSITION, DevCom-10331414
72017202
return false;
72027203
}
72037204

@@ -7206,8 +7207,6 @@ namespace {
72067207
memset(_Dst_words, 0, _Byte_length(_Dst_words, _Dst_words_end));
72077208
}
72087209

7209-
_Traits::_Exit_vectorized(); // TRANSITION, DevCom-10331414
7210-
72117210
return true;
72127211
}
72137212
#endif // ^^^ !defined(_M_ARM64EC) ^^^

0 commit comments

Comments
 (0)