| Index: src/ic-ia32.cc
|
| ===================================================================
|
| --- src/ic-ia32.cc (revision 1755)
|
| +++ src/ic-ia32.cc (working copy)
|
| @@ -729,8 +729,24 @@
|
| }
|
|
|
|
|
| +// One byte opcode for test eax,0xXXXXXXXX.
|
| +static const byte kTestEaxByte = 0xA9;
|
| +
|
| +
|
| +bool KeyedLoadIC::HasInlinedVersion(Address address) {
|
| + Address test_instruction_address = address + 4; // 4 = stub address
|
| + return *test_instruction_address == kTestEaxByte;
|
| +}
|
| +
|
| +
|
| +void KeyedLoadIC::ClearInlinedVersion(Address address) {
|
| + // Insert null as the map to check for to make sure the map check fails
|
| + // sending control flow to the IC instead of the inlined version.
|
| + PatchInlinedMapCheck(address, Heap::null_value());
|
| +}
|
| +
|
| +
|
| 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.
|
| @@ -744,7 +760,7 @@
|
| // bytes of the 7-byte operand-immediate compare instruction, so
|
| // we add 3 to the offset to get the map address.
|
| Address map_address = test_instruction_address + offset_value + 3;
|
| - // patch the map check.
|
| + // Patch the map check.
|
| (*(reinterpret_cast<Object**>(map_address))) = value;
|
| }
|
| }
|
|
|