[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH for-6.2 07/53] target/arm: Fix MVE 48-bit SQRSHRL for small right
From: |
Peter Maydell |
Subject: |
[PATCH for-6.2 07/53] target/arm: Fix MVE 48-bit SQRSHRL for small right shifts |
Date: |
Thu, 29 Jul 2021 12:14:26 +0100 |
We got an edge case wrong in the 48-bit SQRSHRL implementation: if
the shift is to the right, although it always makes the result
smaller than the input value it might not be within the 48-bit range
the result is supposed to be if the input had some bits in [63..48]
set and the shift didn't bring all of those within the [47..0] range.
Handle this similarly to the way we already do for this case in
do_uqrshl48_d(): extend the calculated result from 48 bits,
and return that if not saturating or if it doesn't change the
result; otherwise fall through to return a saturated value.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
Not squashed into the previous patch because that one has already
been reviewed, so as this fixes a different edge case I thought
it clearer kept separate.
---
target/arm/mve_helper.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/target/arm/mve_helper.c b/target/arm/mve_helper.c
index 5730b48f35e..1a4b2ef8075 100644
--- a/target/arm/mve_helper.c
+++ b/target/arm/mve_helper.c
@@ -1563,6 +1563,8 @@ uint64_t HELPER(mve_uqrshll)(CPUARMState *env, uint64_t
n, uint32_t shift)
static inline int64_t do_sqrshl48_d(int64_t src, int64_t shift,
bool round, uint32_t *sat)
{
+ int64_t val, extval;
+
if (shift <= -48) {
/* Rounding the sign bit always produces 0. */
if (round) {
@@ -1572,9 +1574,14 @@ static inline int64_t do_sqrshl48_d(int64_t src, int64_t
shift,
} else if (shift < 0) {
if (round) {
src >>= -shift - 1;
- return (src >> 1) + (src & 1);
+ val = (src >> 1) + (src & 1);
+ } else {
+ val = src >> -shift;
+ }
+ extval = sextract64(val, 0, 48);
+ if (!sat || val == extval) {
+ return extval;
}
- return src >> -shift;
} else if (shift < 48) {
int64_t extval = sextract64(src << shift, 0, 48);
if (!sat || src == (extval >> shift)) {
--
2.20.1
- [PATCH for-6.2 00/53] target/arm: MVE slices 3 and 4, Peter Maydell, 2021/07/29
- [PATCH for-6.2 01/53] target/arm: Note that we handle VMOVL as a special case of VSHLL, Peter Maydell, 2021/07/29
- [PATCH for-6.2 03/53] target/arm: Fix MVE VSLI by 0 and VSRI by <dt>, Peter Maydell, 2021/07/29
- [PATCH for-6.2 02/53] target/arm: Print MVE VPR in CPU dumps, Peter Maydell, 2021/07/29
- [PATCH for-6.2 04/53] target/arm: Fix signed VADDV, Peter Maydell, 2021/07/29
- [PATCH for-6.2 05/53] target/arm: Fix mask handling for MVE narrowing operations, Peter Maydell, 2021/07/29
- [PATCH for-6.2 06/53] target/arm: Fix 48-bit saturating shifts, Peter Maydell, 2021/07/29
- [PATCH for-6.2 09/53] target/arm: Factor out mve_eci_mask(), Peter Maydell, 2021/07/29
- [PATCH for-6.2 07/53] target/arm: Fix MVE 48-bit SQRSHRL for small right shifts,
Peter Maydell <=
- [PATCH for-6.2 08/53] target/arm: Fix calculation of LTP mask when LR is 0, Peter Maydell, 2021/07/29
- [PATCH for-6.2 10/53] target/arm: Fix VPT advance when ECI is non-zero, Peter Maydell, 2021/07/29
- [PATCH for-6.2 12/53] target/arm: Implement MVE VMULL (polynomial), Peter Maydell, 2021/07/29
- [PATCH for-6.2 13/53] target/arm: Implement MVE incrementing/decrementing dup insns, Peter Maydell, 2021/07/29
- [PATCH for-6.2 11/53] target/arm: Fix VLDRB/H/W for predicated elements, Peter Maydell, 2021/07/29
- [PATCH for-6.2 17/53] target/arm: Implement MVE VPSEL, Peter Maydell, 2021/07/29
- [PATCH for-6.2 18/53] target/arm: Implement MVE VMLAS, Peter Maydell, 2021/07/29
- [PATCH for-6.2 15/53] target/arm: Implement MVE integer vector comparisons, Peter Maydell, 2021/07/29