From f757d6ff29128dd0a09e02299306be22fa38821e Mon Sep 17 00:00:00 2001 From: ths Date: Sat, 7 Apr 2007 01:09:17 +0000 Subject: [PATCH] Fix ins/ext cornercase. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2627 c046a42c-6fe2-441c-8c8c-71466251a162 --- target-mips/op.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/target-mips/op.c b/target-mips/op.c index 5048bc0f9f..1e2dbc8c21 100644 --- a/target-mips/op.c +++ b/target-mips/op.c @@ -2232,7 +2232,7 @@ void op_ext(void) unsigned int pos = PARAM1; unsigned int size = PARAM2; - T0 = ((uint32_t)T1 >> pos) & ((1 << size) - 1); + T0 = ((uint32_t)T1 >> pos) & ((size < 32) ? ((1 << size) - 1) : ~0); RETURN(); } @@ -2240,7 +2240,7 @@ void op_ins(void) { unsigned int pos = PARAM1; unsigned int size = PARAM2; - target_ulong mask = ((1 << size) - 1) << pos; + target_ulong mask = ((size < 32) ? ((1 << size) - 1) : ~0) << pos; T0 = (T2 & ~mask) | (((uint32_t)T1 << pos) & mask); RETURN(); @@ -2258,7 +2258,7 @@ void op_dext(void) unsigned int pos = PARAM1; unsigned int size = PARAM2; - T0 = (T1 >> pos) & ((1 << size) - 1); + T0 = (T1 >> pos) & ((size < 32) ? ((1 << size) - 1) : ~0); RETURN(); } @@ -2266,7 +2266,7 @@ void op_dins(void) { unsigned int pos = PARAM1; unsigned int size = PARAM2; - target_ulong mask = ((1 << size) - 1) << pos; + target_ulong mask = ((size < 32) ? ((1 << size) - 1) : ~0) << pos; T0 = (T2 & ~mask) | ((T1 << pos) & mask); RETURN();