| Index: src/mips/macro-assembler-mips.cc | 
| =================================================================== | 
| --- src/mips/macro-assembler-mips.cc	(revision 10035) | 
| +++ src/mips/macro-assembler-mips.cc	(working copy) | 
| @@ -910,34 +910,21 @@ | 
| uint16_t pos, | 
| uint16_t size) { | 
| ASSERT(pos < 32); | 
| -  ASSERT(pos + size < 32); | 
| +  ASSERT(pos + size <= 32); | 
| +  ASSERT(size != 0); | 
|  | 
| if (mips32r2) { | 
| ins_(rt, rs, pos, size); | 
| } else { | 
| ASSERT(!rt.is(t8) && !rs.is(t8)); | 
| - | 
| -    srl(t8, rt, pos + size); | 
| -    // The left chunk from rt that needs to | 
| -    // be saved is on the right side of t8. | 
| -    sll(at, t8, pos + size); | 
| -    // The 'at' register now contains the left chunk on | 
| -    // the left (proper position) and zeroes. | 
| -    sll(t8, rt, 32 - pos); | 
| -    // t8 now contains the right chunk on the left and zeroes. | 
| -    srl(t8, t8, 32 - pos); | 
| -    // t8 now contains the right chunk on | 
| -    // the right (proper position) and zeroes. | 
| -    or_(rt, at, t8); | 
| -    // rt now contains the left and right chunks from the original rt | 
| -    // in their proper position and zeroes in the middle. | 
| -    sll(t8, rs, 32 - size); | 
| -    // t8 now contains the chunk from rs on the left and zeroes. | 
| -    srl(t8, t8, 32 - size - pos); | 
| -    // t8 now contains the original chunk from rs in | 
| -    // the middle (proper position). | 
| -    or_(rt, rt, t8); | 
| -    // rt now contains the result of the ins instruction in R2 mode. | 
| +    Subu(at, zero_reg, Operand(1)); | 
| +    srl(at, at, 32 - size); | 
| +    and_(t8, rs, at); | 
| +    sll(t8, t8, pos); | 
| +    sll(at, at, pos); | 
| +    nor(at, at, zero_reg); | 
| +    and_(at, rt, at); | 
| +    or_(rt, t8, at); | 
| } | 
| } | 
|  | 
|  |