From patchwork Fri Mar 26 16:06:59 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [39/48] target-arm: fix neon vrshr instruction Date: Fri, 26 Mar 2010 06:06:59 -0000 From: Riku Voipio X-Patchwork-Id: 48678 Message-Id: To: qemu-devel@nongnu.org Cc: Riku Voipio , =?UTF-8?q?Juha=20Riihim=C3=A4ki?= From: Juha Riihimäki Signed-Off-By: Riku Voipio Signed-off-by: Juha Riihimäki --- target-arm/neon_helper.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/target-arm/neon_helper.c b/target-arm/neon_helper.c index 0df13f5..4604698 100644 --- a/target-arm/neon_helper.c +++ b/target-arm/neon_helper.c @@ -573,7 +573,13 @@ uint64_t HELPER(neon_rshl_u64)(uint64_t val, uint64_t shiftop) /* Rounding a 1-bit result just preserves that bit. */ val >>= 63; } if (shift < 0) { - val = (val + ((uint64_t)1 << (-1 - shift))) >> -shift; + uint64_t r = ((uint64_t)1 << (-1 - shift)); + uint64_t lo = val + r; + if (lo < val || lo < r) { + val = (lo >> -shift) | ((1ull << 63) >> (-shift - 1)); + } else { + val = lo >> -shift; + } } else { val <<= shift; }