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 | 2232 | unsigned int pos = PARAM1; |
2233 | 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 | 2236 | RETURN(); |
2237 | 2237 | } |
2238 | 2238 | |
... | ... | @@ -2240,7 +2240,7 @@ void op_ins(void) |
2240 | 2240 | { |
2241 | 2241 | unsigned int pos = PARAM1; |
2242 | 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 | 2245 | T0 = (T2 & ~mask) | (((uint32_t)T1 << pos) & mask); |
2246 | 2246 | RETURN(); |
... | ... | @@ -2258,7 +2258,7 @@ void op_dext(void) |
2258 | 2258 | unsigned int pos = PARAM1; |
2259 | 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 | 2262 | RETURN(); |
2263 | 2263 | } |
2264 | 2264 | |
... | ... | @@ -2266,7 +2266,7 @@ void op_dins(void) |
2266 | 2266 | { |
2267 | 2267 | unsigned int pos = PARAM1; |
2268 | 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 | 2271 | T0 = (T2 & ~mask) | ((T1 << pos) & mask); |
2272 | 2272 | RETURN(); | ... | ... |