target/arm: Fix mask handling for MVE narrowing operations
commita5e59e8dcbbf7b1205370b3f4519749df5d0b726
authorPeter Maydell <peter.maydell@linaro.org>
Fri, 13 Aug 2021 16:11:47 +0000 (13 17:11 +0100)
committerPeter Maydell <peter.maydell@linaro.org>
Wed, 25 Aug 2021 09:48:48 +0000 (25 10:48 +0100)
tree70f5e99872ee7748b4070ccd7b1faa789f424514
parented5a59d61f1619f4015a7a02f72e3590528008b4
target/arm: Fix mask handling for MVE narrowing operations

In the MVE helpers for the narrowing operations (DO_VSHRN and
DO_VSHRN_SAT) we were using the wrong bits of the predicate mask for
the 'top' versions of the insn.  This is because the loop works over
the double-sized input elements and shifts the predicate mask by that
many bits each time, but when we write out the half-sized output we
must look at the mask bits for whichever half of the element we are
writing to.

Correct this by shifting the whole mask right by ESIZE bits for the
'top' insns.  This allows us also to simplify the saturation bit
checking (where we had noticed that we needed to look at a different
mask bit for the 'top' insn.)

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
target/arm/mve_helper.c