102 static_assert(std::is_floating_point_v<T>,
"T not a floating point type");
103 constexpr size_t VEC_WIDTH = ISA_WIDTH / (
sizeof(T) * CHAR_BIT);
104 const T* array = std::assume_aligned<alignmentForArray<ISA_WIDTH>()>(distancesIn);
110 vload(minValues1, array);
111 vload(minValues2, array + VEC_WIDTH);
112 vload(minValues3, array + VEC_WIDTH * 2);
113 vload(minValues4, array + VEC_WIDTH * 3);
118 for (
int i = 4 * VEC_WIDTH; i < n; i += 4 * VEC_WIDTH) {
120 vload(values1, array + i);
121 vmin(minValues1, values1, minValues1);
123 vload(values2, array + i + VEC_WIDTH);
124 vmin(minValues2, values2, minValues2);
126 vload(values3, array + i + 2 * VEC_WIDTH);
127 vmin(minValues3, values3, minValues3);
129 vload(values4, array + i + 3 * VEC_WIDTH);
130 vmin(minValues4, values4, minValues4);
133 vmin(minValues1, minValues1, minValues2);
135 vmin(minValues3, minValues3, minValues4);
137 vmin(minValues1, minValues1, minValues3);
139 T finalMinValues[VEC_WIDTH];
140 vstore(finalMinValues, minValues1);
143 return std::reduce(std::begin(finalMinValues), std::end(finalMinValues),
145 [](T
a, T b) {
return a < b ?
a : b; });
155 const T* distancesIn,
int n) {
158 static_assert(std::is_floating_point_v<T>,
"T not a floating point type");
159 constexpr int VEC_WIDTH = ISA_WIDTH / (
sizeof(T) * CHAR_BIT);
160 const T* array = std::assume_aligned<alignmentForArray<ISA_WIDTH>()>(distancesIn);
169 for (
int i = 0; i < n; i += 4 * VEC_WIDTH) {
171 vload(values1, array + i);
172 vec_mask eq1 = values1 == target;
174 vload(values2, array + i + VEC_WIDTH);
175 vec_mask eq2 = values2 == target;
177 vload(values3, array + i + VEC_WIDTH * 2);
178 vec_mask eq3 = values3 == target;
180 vload(values4, array + i + VEC_WIDTH * 3);
181 vec_mask eq4 = values4 == target;
183 vec_mask eq12 = eq1 || eq2;
184 vec_mask eq34 = eq3 || eq4;
185 vec_mask eqAny = eq12 || eq34;
187 for (
int idx = i; idx < i + 4 * VEC_WIDTH; ++idx) {
188 if (distancesIn[idx] == value) {