[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 5/8] target-arm: fix neon vqrshl instruction
From: |
christophe.lyon |
Subject: |
[Qemu-devel] [PATCH 5/8] target-arm: fix neon vqrshl instruction |
Date: |
Mon, 31 Jan 2011 19:06:43 +0100 |
From: Christophe Lyon <address@hidden>
Signed-off-by: Juha Riihimäki <address@hidden>
Signed-off-by: Christophe Lyon <address@hidden>
---
target-arm/neon_helper.c | 21 ++++++++++++++++++---
1 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/target-arm/neon_helper.c b/target-arm/neon_helper.c
index 891b812..46fcdc4 100644
--- a/target-arm/neon_helper.c
+++ b/target-arm/neon_helper.c
@@ -736,9 +736,24 @@ uint64_t HELPER(neon_qshlu_s64)(CPUState *env, uint64_t
valop, uint64_t shiftop)
}} while (0)
NEON_VOP_ENV(qrshl_u8, neon_u8, 4)
NEON_VOP_ENV(qrshl_u16, neon_u16, 2)
-NEON_VOP_ENV(qrshl_u32, neon_u32, 1)
#undef NEON_FN
+uint32_t HELPER(neon_qrshl_u32)(CPUState *env, uint32_t val, uint32_t shiftop)
+{
+ int8_t shift = (int8_t)shiftop;
+ if (shift < 0) {
+ val = ((uint64_t)val + (1 << (-1 - shift))) >> -shift;
+ } else {
+ uint32_t tmp = val;
+ val <<= shift;
+ if ((val >> shift) != tmp) {
+ SET_QC();
+ val = ~0;
+ }
+ }
+ return val;
+}
+
uint64_t HELPER(neon_qrshl_u64)(CPUState *env, uint64_t val, uint64_t shiftop)
{
int8_t shift = (int8_t)shiftop;
@@ -764,7 +779,7 @@ uint64_t HELPER(neon_qrshl_u64)(CPUState *env, uint64_t
val, uint64_t shiftop)
dest = src1 << tmp; \
if ((dest >> tmp) != src1) { \
SET_QC(); \
- dest = src1 >> 31; \
+ dest = (uint32_t)(1 << (sizeof(src1) * 8 - 1)) - (src1 > 0 ? 1 :
0); \
} \
}} while (0)
NEON_VOP_ENV(qrshl_s8, neon_s8, 4)
@@ -780,7 +795,7 @@ uint64_t HELPER(neon_qrshl_s64)(CPUState *env, uint64_t
valop, uint64_t shiftop)
if (shift < 0) {
val = (val + (1 << (-1 - shift))) >> -shift;
} else {
- int64_t tmp = val;;
+ int64_t tmp = val;
val <<= shift;
if ((val >> shift) != tmp) {
SET_QC();
--
1.7.2.3
- [Qemu-devel] [PATCH v2 0/8] target-arm: Fix Neon instructions VQMOVUN VQRSHL VQRSHRN VQRSHRUN VQSHRN VQSHRUN VSLI VSRI, christophe.lyon, 2011/01/31
- [Qemu-devel] [PATCH 1/8] target-arm: Fixes for several shift instructions: VRSHL, VRSHR, VRSHRN, VSHLL, VRSRA., christophe.lyon, 2011/01/31
- [Qemu-devel] [PATCH 4/8] target-arm: fiddle decoding of 64 bit shift by imm and narrow, christophe.lyon, 2011/01/31
- [Qemu-devel] [PATCH 2/8] target-arm: Create and use neon_unarrow_sat* helpers, christophe.lyon, 2011/01/31
- [Qemu-devel] [PATCH 8/8] target-arm: Fix VQRSHL Neon instructions (signed/unsigned 64 bits and signed 32 bits variants)., christophe.lyon, 2011/01/31
- [Qemu-devel] [PATCH 6/8] target-arm: Fix Neon VQ(R)SHRN instructions., christophe.lyon, 2011/01/31
- [Qemu-devel] [PATCH 5/8] target-arm: fix neon vqrshl instruction,
christophe.lyon <=
- [Qemu-devel] [PATCH 3/8] target-arm: VQRSHRN related changes, christophe.lyon, 2011/01/31
- [Qemu-devel] [PATCH 7/8] target-arm: implement vsli.64, vsri.64, christophe.lyon, 2011/01/31