Index: src/mips/macro-assembler-mips.cc |
diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc |
index ccf048194c90a69c668311c03e6b588e6a4e92d1..fb93208bf53f28fd38ee5caf567e59bafc062dc7 100644 |
--- a/src/mips/macro-assembler-mips.cc |
+++ b/src/mips/macro-assembler-mips.cc |
@@ -910,34 +910,21 @@ void MacroAssembler::Ins(Register rt, |
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); |
} |
} |