| Index: src/ic-ia32.cc
|
| ===================================================================
|
| --- src/ic-ia32.cc (revision 1003)
|
| +++ src/ic-ia32.cc (working copy)
|
| @@ -733,6 +733,27 @@
|
| }
|
|
|
|
|
| +void KeyedLoadIC::PatchInlinedMapCheck(Address address, Object* value) {
|
| + static const byte kTestEaxByte = 0xA9;
|
| + Address test_instruction_address = address + 4; // 4 = stub address
|
| + // The keyed load has a fast inlined case if the IC call instruction
|
| + // is immediately followed by a test instruction.
|
| + if (*test_instruction_address == kTestEaxByte) {
|
| + // Fetch the offset from the call instruction to the map cmp
|
| + // instruction. This offset is stored in the last 4 bytes of the
|
| + // 5 byte test instruction.
|
| + Address offset_address = test_instruction_address + 1;
|
| + int offset_value = *(reinterpret_cast<int*>(offset_address));
|
| + // Compute the map address. The operand-immediate compare
|
| + // instruction is two bytes larger than a call instruction so we
|
| + // add 2 to get to the map address.
|
| + Address map_address = address + offset_value + 2;
|
| + // patch the map check.
|
| + (*(reinterpret_cast<Object**>(map_address))) = value;
|
| + }
|
| +}
|
| +
|
| +
|
| // Defined in ic.cc.
|
| Object* KeyedLoadIC_Miss(Arguments args);
|
|
|
|
|