266 {
269 const u8 D_byte =
W0 ^
W1;
270 for (int p = 0; p < 8; ++p) {
271 const int shift = 7 - p;
272 d_mask[p] = ((D_byte >> shift) & 1) ? 0xFFu : 0x00u;
273 m0_mask[p] = ((
W0 >> shift) & 1) ? 0xFFu : 0x00u;
274 }
275 for (int s = 0; s < 8; ++s) {
276 const int bit_idx = 7 - s;
277 const u8 b0 =
static_cast<u8>((lanes[0] >> bit_idx) & 1u);
278 const u8 b1 =
static_cast<u8>((lanes[1] >> bit_idx) & 1u);
281 for (int q = 0; q < 4; ++q) {
282 const int p_hi = 3 - q;
283 const int p_lo = 7 - q;
284 const u8 m0_p_hi =
static_cast<u8>(m0_mask[p_hi] & 1u);
285 const u8 d_p_hi =
static_cast<u8>(d_mask[p_hi] & 1u);
286 const u8 m0_p_lo =
static_cast<u8>(m0_mask[p_lo] & 1u);
287 const u8 d_p_lo =
static_cast<u8>(d_mask[p_lo] & 1u);
288 const u8 v0_hi =
static_cast<u8>(m0_p_hi ^ (b0 & d_p_hi));
289 const u8 v1_hi =
static_cast<u8>(m0_p_hi ^ (b1 & d_p_hi));
290 const u8 v0_lo =
static_cast<u8>(m0_p_lo ^ (b0 & d_p_lo));
291 const u8 v1_lo =
static_cast<u8>(m0_p_lo ^ (b1 & d_p_lo));
292 byte_hi |=
static_cast<u8>((v1_hi << (2 * q)) | (v0_hi << (2 * q + 1)));
293 byte_lo |=
static_cast<u8>((v1_lo << (2 * q)) | (v0_lo << (2 * q + 1)));
294 }
295 output[s * 2 + 0] = byte_hi;
296 output[s * 2 + 1] = byte_lo;
297 }
298}