Commit f757d6ff29128dd0a09e02299306be22fa38821e

Authored by ths
1 parent d85fb99b

Fix ins/ext cornercase.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2627 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 4 additions and 4 deletions
target-mips/op.c
@@ -2232,7 +2232,7 @@ void op_ext(void) @@ -2232,7 +2232,7 @@ void op_ext(void)
2232 unsigned int pos = PARAM1; 2232 unsigned int pos = PARAM1;
2233 unsigned int size = PARAM2; 2233 unsigned int size = PARAM2;
2234 2234
2235 - T0 = ((uint32_t)T1 >> pos) & ((1 << size) - 1); 2235 + T0 = ((uint32_t)T1 >> pos) & ((size < 32) ? ((1 << size) - 1) : ~0);
2236 RETURN(); 2236 RETURN();
2237 } 2237 }
2238 2238
@@ -2240,7 +2240,7 @@ void op_ins(void) @@ -2240,7 +2240,7 @@ void op_ins(void)
2240 { 2240 {
2241 unsigned int pos = PARAM1; 2241 unsigned int pos = PARAM1;
2242 unsigned int size = PARAM2; 2242 unsigned int size = PARAM2;
2243 - target_ulong mask = ((1 << size) - 1) << pos; 2243 + target_ulong mask = ((size < 32) ? ((1 << size) - 1) : ~0) << pos;
2244 2244
2245 T0 = (T2 & ~mask) | (((uint32_t)T1 << pos) & mask); 2245 T0 = (T2 & ~mask) | (((uint32_t)T1 << pos) & mask);
2246 RETURN(); 2246 RETURN();
@@ -2258,7 +2258,7 @@ void op_dext(void) @@ -2258,7 +2258,7 @@ void op_dext(void)
2258 unsigned int pos = PARAM1; 2258 unsigned int pos = PARAM1;
2259 unsigned int size = PARAM2; 2259 unsigned int size = PARAM2;
2260 2260
2261 - T0 = (T1 >> pos) & ((1 << size) - 1); 2261 + T0 = (T1 >> pos) & ((size < 32) ? ((1 << size) - 1) : ~0);
2262 RETURN(); 2262 RETURN();
2263 } 2263 }
2264 2264
@@ -2266,7 +2266,7 @@ void op_dins(void) @@ -2266,7 +2266,7 @@ void op_dins(void)
2266 { 2266 {
2267 unsigned int pos = PARAM1; 2267 unsigned int pos = PARAM1;
2268 unsigned int size = PARAM2; 2268 unsigned int size = PARAM2;
2269 - target_ulong mask = ((1 << size) - 1) << pos; 2269 + target_ulong mask = ((size < 32) ? ((1 << size) - 1) : ~0) << pos;
2270 2270
2271 T0 = (T2 & ~mask) | ((T1 << pos) & mask); 2271 T0 = (T2 & ~mask) | ((T1 << pos) & mask);
2272 RETURN(); 2272 RETURN();