summaryrefslogtreecommitdiffstats
path: root/target-mips
diff options
context:
space:
mode:
authorPetar Jovanovic2013-05-08 13:17:40 +0200
committerAurelien Jarno2013-05-08 18:46:38 +0200
commitc0f5f9ce86ddca0a7d7ca60012059a5a18aa9c07 (patch)
treecef6856b1ab0a712df749604b1a1dc862564f549 /target-mips
parenttarget-mips: add missing check_dspr2 for multiply instructions (diff)
downloadqemu-c0f5f9ce86ddca0a7d7ca60012059a5a18aa9c07.tar.gz
qemu-c0f5f9ce86ddca0a7d7ca60012059a5a18aa9c07.tar.xz
qemu-c0f5f9ce86ddca0a7d7ca60012059a5a18aa9c07.zip
target-mips: fix incorrect behaviour for INSV
Corner case for INSV instruction when size=32 has not been correctly implemented. The mask for size should be one bit wider, and preparing the filter variable should be aware of this case too. The test for INSV has been extended to include the case that triggers the bug. Signed-off-by: Petar Jovanovic <petar.jovanovic@imgtec.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Diffstat (limited to 'target-mips')
-rw-r--r--target-mips/dsp_helper.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/target-mips/dsp_helper.c b/target-mips/dsp_helper.c
index 805247d252..9212789b4e 100644
--- a/target-mips/dsp_helper.c
+++ b/target-mips/dsp_helper.c
@@ -2921,7 +2921,7 @@ target_ulong helper_##name(CPUMIPSState *env, target_ulong rs, \
return rt; \
} \
\
- filter = ((int32_t)0x01 << size) - 1; \
+ filter = ((int64_t)0x01 << size) - 1; \
filter = filter << pos; \
temprs = (rs << pos) & filter; \
temprt = rt & ~filter; \
@@ -2930,7 +2930,7 @@ target_ulong helper_##name(CPUMIPSState *env, target_ulong rs, \
return (target_long)(ret_type)temp; \
}
-BIT_INSV(insv, 0x1F, 0x1F, int32_t);
+BIT_INSV(insv, 0x1F, 0x3F, int32_t);
#ifdef TARGET_MIPS64
BIT_INSV(dinsv, 0x7F, 0x3F, target_long);
#endif