Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 12 matching lines...) Expand all Loading... | |
| 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | 27 |
| 28 #ifndef V8_IA32_VIRTUAL_FRAME_IA32_H_ | 28 #ifndef V8_IA32_VIRTUAL_FRAME_IA32_H_ |
| 29 #define V8_IA32_VIRTUAL_FRAME_IA32_H_ | 29 #define V8_IA32_VIRTUAL_FRAME_IA32_H_ |
| 30 | 30 |
| 31 #include "type-info.h" | 31 #include "type-info.h" |
| 32 #include "register-allocator.h" | 32 #include "register-allocator.h" |
| 33 #include "scopes.h" | 33 #include "scopes.h" |
|
Søren Thygesen Gjesse
2010/05/06 07:48:11
Sort includes.
| |
| 34 #include "codegen.h" | |
| 34 | 35 |
| 35 namespace v8 { | 36 namespace v8 { |
| 36 namespace internal { | 37 namespace internal { |
| 37 | 38 |
| 38 // ------------------------------------------------------------------------- | 39 // ------------------------------------------------------------------------- |
| 39 // Virtual frames | 40 // Virtual frames |
| 40 // | 41 // |
| 41 // The virtual frame is an abstraction of the physical stack frame. It | 42 // The virtual frame is an abstraction of the physical stack frame. It |
| 42 // encapsulates the parameters, frame-allocated locals, and the expression | 43 // encapsulates the parameters, frame-allocated locals, and the expression |
| 43 // stack. It supports push/pop operations on the expression stack, as well | 44 // stack. It supports push/pop operations on the expression stack, as well |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 90 int element_count() { return elements_.length(); } | 91 int element_count() { return elements_.length(); } |
| 91 | 92 |
| 92 // The height of the virtual expression stack. | 93 // The height of the virtual expression stack. |
| 93 int height() { return element_count() - expression_base_index(); } | 94 int height() { return element_count() - expression_base_index(); } |
| 94 | 95 |
| 95 int register_location(int num) { | 96 int register_location(int num) { |
| 96 ASSERT(num >= 0 && num < RegisterAllocator::kNumRegisters); | 97 ASSERT(num >= 0 && num < RegisterAllocator::kNumRegisters); |
| 97 return register_locations_[num]; | 98 return register_locations_[num]; |
| 98 } | 99 } |
| 99 | 100 |
| 100 int register_location(Register reg) { | 101 inline int register_location(Register reg); |
| 101 return register_locations_[RegisterAllocator::ToNumber(reg)]; | |
| 102 } | |
| 103 | 102 |
| 104 void set_register_location(Register reg, int index) { | 103 inline void set_register_location(Register reg, int index); |
| 105 register_locations_[RegisterAllocator::ToNumber(reg)] = index; | |
| 106 } | |
| 107 | 104 |
| 108 bool is_used(int num) { | 105 bool is_used(int num) { |
| 109 ASSERT(num >= 0 && num < RegisterAllocator::kNumRegisters); | 106 ASSERT(num >= 0 && num < RegisterAllocator::kNumRegisters); |
| 110 return register_locations_[num] != kIllegalIndex; | 107 return register_locations_[num] != kIllegalIndex; |
| 111 } | 108 } |
| 112 | 109 |
| 113 bool is_used(Register reg) { | 110 inline bool is_used(Register reg); |
| 114 return register_locations_[RegisterAllocator::ToNumber(reg)] | |
| 115 != kIllegalIndex; | |
| 116 } | |
| 117 | 111 |
| 118 // Add extra in-memory elements to the top of the frame to match an actual | 112 // Add extra in-memory elements to the top of the frame to match an actual |
| 119 // frame (eg, the frame after an exception handler is pushed). No code is | 113 // frame (eg, the frame after an exception handler is pushed). No code is |
| 120 // emitted. | 114 // emitted. |
| 121 void Adjust(int count); | 115 void Adjust(int count); |
| 122 | 116 |
| 123 // Forget count elements from the top of the frame all in-memory | 117 // Forget count elements from the top of the frame all in-memory |
| 124 // (including synced) and adjust the stack pointer downward, to | 118 // (including synced) and adjust the stack pointer downward, to |
| 125 // match an external frame effect (examples include a call removing | 119 // match an external frame effect (examples include a call removing |
| 126 // its arguments, and exiting a try/catch removing an exception | 120 // its arguments, and exiting a try/catch removing an exception |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 210 // An element of the expression stack as an assembly operand. | 204 // An element of the expression stack as an assembly operand. |
| 211 Operand ElementAt(int index) const { | 205 Operand ElementAt(int index) const { |
| 212 return Operand(esp, index * kPointerSize); | 206 return Operand(esp, index * kPointerSize); |
| 213 } | 207 } |
| 214 | 208 |
| 215 // Random-access store to a frame-top relative frame element. The result | 209 // Random-access store to a frame-top relative frame element. The result |
| 216 // becomes owned by the frame and is invalidated. | 210 // becomes owned by the frame and is invalidated. |
| 217 void SetElementAt(int index, Result* value); | 211 void SetElementAt(int index, Result* value); |
| 218 | 212 |
| 219 // Set a frame element to a constant. The index is frame-top relative. | 213 // Set a frame element to a constant. The index is frame-top relative. |
| 220 void SetElementAt(int index, Handle<Object> value) { | 214 inline void SetElementAt(int index, Handle<Object> value); |
| 221 Result temp(value); | |
| 222 SetElementAt(index, &temp); | |
| 223 } | |
| 224 | 215 |
| 225 void PushElementAt(int index) { | 216 void PushElementAt(int index) { |
| 226 PushFrameSlotAt(element_count() - index - 1); | 217 PushFrameSlotAt(element_count() - index - 1); |
| 227 } | 218 } |
| 228 | 219 |
| 229 void StoreToElementAt(int index) { | 220 void StoreToElementAt(int index) { |
| 230 StoreToFrameSlotAt(element_count() - index - 1); | 221 StoreToFrameSlotAt(element_count() - index - 1); |
| 231 } | 222 } |
| 232 | 223 |
| 233 // A frame-allocated local as an assembly operand. | 224 // A frame-allocated local as an assembly operand. |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 308 // The receiver frame slot. | 299 // The receiver frame slot. |
| 309 Operand Receiver() { | 300 Operand Receiver() { |
| 310 return ParameterAt(-1); | 301 return ParameterAt(-1); |
| 311 } | 302 } |
| 312 | 303 |
| 313 // Push a try-catch or try-finally handler on top of the virtual frame. | 304 // Push a try-catch or try-finally handler on top of the virtual frame. |
| 314 void PushTryHandler(HandlerType type); | 305 void PushTryHandler(HandlerType type); |
| 315 | 306 |
| 316 // Call stub given the number of arguments it expects on (and | 307 // Call stub given the number of arguments it expects on (and |
| 317 // removes from) the stack. | 308 // removes from) the stack. |
| 318 Result CallStub(CodeStub* stub, int arg_count) { | 309 inline Result CallStub(CodeStub* stub, int arg_count); |
| 319 PrepareForCall(arg_count, arg_count); | |
| 320 return RawCallStub(stub); | |
| 321 } | |
| 322 | 310 |
| 323 // Call stub that takes a single argument passed in eax. The | 311 // Call stub that takes a single argument passed in eax. The |
| 324 // argument is given as a result which does not have to be eax or | 312 // argument is given as a result which does not have to be eax or |
| 325 // even a register. The argument is consumed by the call. | 313 // even a register. The argument is consumed by the call. |
| 326 Result CallStub(CodeStub* stub, Result* arg); | 314 Result CallStub(CodeStub* stub, Result* arg); |
| 327 | 315 |
| 328 // Call stub that takes a pair of arguments passed in edx (arg0) and | 316 // Call stub that takes a pair of arguments passed in edx (arg0) and |
| 329 // eax (arg1). The arguments are given as results which do not have | 317 // eax (arg1). The arguments are given as results which do not have |
| 330 // to be in the proper registers or even in registers. The | 318 // to be in the proper registers or even in registers. The |
| 331 // arguments are consumed by the call. | 319 // arguments are consumed by the call. |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 466 | 454 |
| 467 // The index of the element that is at the processor's stack pointer | 455 // The index of the element that is at the processor's stack pointer |
| 468 // (the esp register). | 456 // (the esp register). |
| 469 int stack_pointer_; | 457 int stack_pointer_; |
| 470 | 458 |
| 471 // The index of the register frame element using each register, or | 459 // The index of the register frame element using each register, or |
| 472 // kIllegalIndex if a register is not on the frame. | 460 // kIllegalIndex if a register is not on the frame. |
| 473 int register_locations_[RegisterAllocator::kNumRegisters]; | 461 int register_locations_[RegisterAllocator::kNumRegisters]; |
| 474 | 462 |
| 475 // The number of frame-allocated locals and parameters respectively. | 463 // The number of frame-allocated locals and parameters respectively. |
| 476 int parameter_count() { | 464 inline int parameter_count(); |
| 477 return cgen()->scope()->num_parameters(); | 465 |
| 478 } | 466 inline int local_count(); |
| 479 int local_count() { | |
| 480 return cgen()->scope()->num_stack_slots(); | |
| 481 } | |
| 482 | 467 |
| 483 // The index of the element that is at the processor's frame pointer | 468 // The index of the element that is at the processor's frame pointer |
| 484 // (the ebp register). The parameters, receiver, and return address | 469 // (the ebp register). The parameters, receiver, and return address |
| 485 // are below the frame pointer. | 470 // are below the frame pointer. |
| 486 int frame_pointer() { | 471 int frame_pointer() { |
| 487 return parameter_count() + 2; | 472 return parameter_count() + 2; |
| 488 } | 473 } |
| 489 | 474 |
| 490 // The index of the first parameter. The receiver lies below the first | 475 // The index of the first parameter. The receiver lies below the first |
| 491 // parameter. | 476 // parameter. |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 627 inline bool Equals(VirtualFrame* other); | 612 inline bool Equals(VirtualFrame* other); |
| 628 | 613 |
| 629 // Classes that need raw access to the elements_ array. | 614 // Classes that need raw access to the elements_ array. |
| 630 friend class DeferredCode; | 615 friend class DeferredCode; |
| 631 friend class JumpTarget; | 616 friend class JumpTarget; |
| 632 }; | 617 }; |
| 633 | 618 |
| 634 } } // namespace v8::internal | 619 } } // namespace v8::internal |
| 635 | 620 |
| 636 #endif // V8_IA32_VIRTUAL_FRAME_IA32_H_ | 621 #endif // V8_IA32_VIRTUAL_FRAME_IA32_H_ |
| OLD | NEW |