Skip to content

Commit f7a751c

Browse files
committed
correct impl
1 parent 813726f commit f7a751c

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

libcxx/include/__algorithm/minmax_element.h

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ __minmax_element_vectorized(_Iter __first, _Iter __last) {
8888
using __value_type = __iter_value_type<_Iter>;
8989
constexpr size_t __unroll_count = 4;
9090
constexpr size_t __vec_size = __native_vector_size<__value_type>;
91-
using __vec_type = __simd_vector<__value_type, __vec_size>;
91+
using __vec_type = __simd_vector<__value_type, __vec_size>;
9292
if (__last == __first) [[__unlikely__]] {
9393
return {__first, __first};
9494
}
@@ -105,19 +105,19 @@ __minmax_element_vectorized(_Iter __first, _Iter __last) {
105105
__vec_type __vec[__unroll_count];
106106
for(size_t __i = 0; __i < __unroll_count; ++__i) {
107107
__vec[__i] = std::__load_vector<__vec_type>(__first + __i * __vec_size);
108-
// min
108+
// block min
109109
auto __block_min_element = __builtin_reduce_min(__vec[__i]);
110110
if (__block_min_element < __min_element) {
111111
__min_element = __block_min_element;
112112
__min_block_start = __first + __i * __vec_size;
113-
__min_block_start = __first + (__i + 1) * __vec_size;
113+
__min_block_end = __first + (__i + 1) * __vec_size;
114114
}
115-
// max
115+
// block max
116116
auto __block_max_element = __builtin_reduce_max(__vec[__i]);
117117
if (__block_max_element > __max_element) {
118118
__max_element = __block_max_element;
119119
__max_block_start = __first + __i * __vec_size;
120-
__max_block_start = __first + (__i + 1) * __vec_size;
120+
__max_block_end = __first + (__i + 1) * __vec_size;
121121
}
122122
}
123123
__first += __unroll_count * __vec_size;
@@ -130,22 +130,22 @@ __minmax_element_vectorized(_Iter __first, _Iter __last) {
130130
if (__block_min_element < __min_element) {
131131
__min_element = __block_min_element;
132132
__min_block_start = __first;
133-
__min_block_start = __first + __vec_size;
133+
__min_block_end = __first + __vec_size;
134134
}
135135
// max
136136
auto __block_max_element = __builtin_reduce_max(__vec);
137137
if (__block_max_element > __max_element) {
138138
__max_element = __block_max_element;
139139
__max_block_start = __first;
140-
__max_block_start = __first + __vec_size;
140+
__max_block_end = __first + __vec_size;
141141
}
142142
__first += __vec_size;
143143
}
144144

145145
if (__last > __first) {
146-
__less_tag __pred;
147-
__identity __proj;
148-
auto __epilogue = std::__minmax_element_loop(__first, __last, __pred, __proj);
146+
auto __comp = std::__less<>{};
147+
std::__identity __proj;
148+
auto __epilogue = std::__minmax_element_loop(__first, __last, __comp, __proj);
149149
auto __epilogue_min_element = *__epilogue.first;
150150
auto __epilogue_max_element = *__epilogue.second;
151151
if (__epilogue_min_element < __min_element && __epilogue_max_element > __max_element) {
@@ -154,7 +154,7 @@ __minmax_element_vectorized(_Iter __first, _Iter __last) {
154154
__min_element = __epilogue_min_element;
155155
__min_block_start = __first;
156156
__min_block_end = __first; // this is global min_element
157-
} else {
157+
} else { // __epilogue_max_element > __max_element
158158
__max_element = __epilogue_max_element;
159159
__max_block_start = __first;
160160
__max_block_end = __first; // this is global max_element
@@ -173,6 +173,7 @@ __minmax_element_vectorized(_Iter __first, _Iter __last) {
173173
break;
174174
}
175175

176+
176177
return {__min_block_start, __max_block_start};
177178
}
178179

0 commit comments

Comments
 (0)