fix(hex8): isolate AVX2 packet code from baseline COMDATs
This commit is contained in:
@@ -271,25 +271,29 @@ Result<Hex8HighLowResponse> Hex8Element::EvaluateHighLow(
|
||||
if (use_packets)
|
||||
for (std::size_t i = 0; i < 3; ++i)
|
||||
for (std::size_t first = 0; first < 24; first += 4) {
|
||||
hex8_internal::MaterialPacketInput input;
|
||||
input.weight = HighLow{point.weight};
|
||||
hex8_internal::MaterialPacketInput input{};
|
||||
const auto raw_pair = [](HighLow pair) {
|
||||
return hex8_internal::PacketPair{pair.high, pair.low};
|
||||
};
|
||||
input.weight = raw_pair(HighLow{point.weight});
|
||||
const auto row = 3U * a + i;
|
||||
for (std::size_t lane = 0; lane < 4; ++lane) {
|
||||
const auto column = first + lane;
|
||||
const auto b = column / 3U;
|
||||
const auto k = column % 3U;
|
||||
input.deviatoric_left[lane] = deviatoric_fg[a][i];
|
||||
input.deviatoric_right[lane] = fg[b][k];
|
||||
input.shear_left[lane] = shear_fg[b][i];
|
||||
input.shear_right[lane] = fg[a][k];
|
||||
input.tensor_left[lane] = shear_fft[i][k];
|
||||
input.gradient_dot[lane] = dots[b];
|
||||
input.accumulated[lane] = material[row][column];
|
||||
input.deviatoric_left.values[lane] = raw_pair(deviatoric_fg[a][i]);
|
||||
input.deviatoric_right.values[lane] = raw_pair(fg[b][k]);
|
||||
input.shear_left.values[lane] = raw_pair(shear_fg[b][i]);
|
||||
input.shear_right.values[lane] = raw_pair(fg[a][k]);
|
||||
input.tensor_left.values[lane] = raw_pair(shear_fft[i][k]);
|
||||
input.gradient_dot.values[lane] = raw_pair(dots[b]);
|
||||
input.accumulated.values[lane] = raw_pair(material[row][column]);
|
||||
}
|
||||
hex8_internal::PairPacket output;
|
||||
packet_evaluator(input, &output);
|
||||
for (std::size_t lane = 0; lane < 4; ++lane)
|
||||
material[row][first + lane] = output[lane];
|
||||
material[row][first + lane] =
|
||||
{output.values[lane].high, output.values[lane].low};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user