On Fri, 16 Jul 2021 at 17:58, Richard Henderson <richard.hender...@linaro.org> wrote: > > On 7/13/21 6:37 AM, Peter Maydell wrote: > > if (mask01 > 8) { > > - /* high bit set, but not 0b1000: invert the relevant half of P0 */ > > - vpr ^= 0xff; > > + if (eci == ECI_NONE) { > > + /* high bit set, but not 0b1000: invert the relevant half of > > P0 */ > > + vpr ^= 0xff; > > + } else if (eci == ECI_A0) { > > + /* Invert only the beat 1 P0 bits, as we didn't execute beat 0 > > */ > > + vpr ^= 0xf0; > > + } /* otherwise we didn't execute either beat 0 or beat 1 */ > > } > > if (mask23 > 8) { > > - /* high bit set, but not 0b1000: invert the relevant half of P0 */ > > - vpr ^= 0xff00; > > + if (eci != ECI_A0A1A2 && eci != ECI_A0A1A2B0) { > > + /* high bit set, but not 0b1000: invert the relevant half of > > P0 */ > > + vpr ^= 0xff00; > > + } else { > > + /* We didn't execute beat 2, only invert the beat 3 P0 bits */ > > + vpr ^= 0xf000; > > + } > > } > > It might not be any cleaner, but I wondered if mve_eci_mask could help here. > > inv_mask = mve_eci_mask(...); > if (mask01 <= 8) { > inv_mask &= ~0xff; > } > if (mask23 <= 8) { > inv_mask &= ~0xff00; > } > vpr ^= inv_mask;
Yes, I think that works better (you need to capture the ECI mask at the start of the function before we update env->condexec_bits, though). thanks -- PMM