OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 8748 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8759 // Use a fresh temporary to load the elements without destroying | 8759 // Use a fresh temporary to load the elements without destroying |
8760 // the receiver which is needed for the deferred slow case. | 8760 // the receiver which is needed for the deferred slow case. |
8761 Result elements = allocator()->Allocate(); | 8761 Result elements = allocator()->Allocate(); |
8762 ASSERT(elements.is_valid()); | 8762 ASSERT(elements.is_valid()); |
8763 | 8763 |
8764 Result key = frame_->Pop(); | 8764 Result key = frame_->Pop(); |
8765 Result receiver = frame_->Pop(); | 8765 Result receiver = frame_->Pop(); |
8766 key.ToRegister(); | 8766 key.ToRegister(); |
8767 receiver.ToRegister(); | 8767 receiver.ToRegister(); |
8768 | 8768 |
| 8769 // If key and receiver are shared registers on the frame, their values will |
| 8770 // be automatically saved and restored when going to deferred code. |
| 8771 // The result is in elements, which is guaranteed non-shared. |
8769 DeferredReferenceGetKeyedValue* deferred = | 8772 DeferredReferenceGetKeyedValue* deferred = |
8770 new DeferredReferenceGetKeyedValue(elements.reg(), | 8773 new DeferredReferenceGetKeyedValue(elements.reg(), |
8771 receiver.reg(), | 8774 receiver.reg(), |
8772 key.reg()); | 8775 key.reg()); |
8773 | 8776 |
8774 __ test(receiver.reg(), Immediate(kSmiTagMask)); | 8777 __ test(receiver.reg(), Immediate(kSmiTagMask)); |
8775 deferred->Branch(zero); | 8778 deferred->Branch(zero); |
8776 | 8779 |
8777 // Check that the receiver has the expected map. | 8780 // Check that the receiver has the expected map. |
8778 // Initially, use an invalid map. The map is patched in the IC | 8781 // Initially, use an invalid map. The map is patched in the IC |
(...skipping 4710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13489 // tagged as a small integer. | 13492 // tagged as a small integer. |
13490 __ bind(&runtime); | 13493 __ bind(&runtime); |
13491 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 13494 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
13492 } | 13495 } |
13493 | 13496 |
13494 #undef __ | 13497 #undef __ |
13495 | 13498 |
13496 } } // namespace v8::internal | 13499 } } // namespace v8::internal |
13497 | 13500 |
13498 #endif // V8_TARGET_ARCH_IA32 | 13501 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |