Commit f757d6ff29128dd0a09e02299306be22fa38821e
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(); |