OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 ASSERT(allocator_ == NULL); | 106 ASSERT(allocator_ == NULL); |
107 RegisterAllocator register_allocator(this); | 107 RegisterAllocator register_allocator(this); |
108 allocator_ = ®ister_allocator; | 108 allocator_ = ®ister_allocator; |
109 ASSERT(frame_ == NULL); | 109 ASSERT(frame_ == NULL); |
110 frame_ = new VirtualFrame(this); | 110 frame_ = new VirtualFrame(this); |
111 set_in_spilled_code(false); | 111 set_in_spilled_code(false); |
112 | 112 |
113 // Adjust for function-level loop nesting. | 113 // Adjust for function-level loop nesting. |
114 loop_nesting_ += fun->loop_nesting(); | 114 loop_nesting_ += fun->loop_nesting(); |
115 | 115 |
116 { | 116 #ifdef DEBUG |
| 117 if (strlen(FLAG_stop_at) > 0 && |
| 118 fun->name()->IsEqualTo(CStrVector(FLAG_stop_at))) { |
| 119 frame_->SpillAll(); |
| 120 __ int3(); |
| 121 } |
| 122 #endif |
| 123 |
| 124 // New scope to get automatic timing calculation. |
| 125 { // NOLINT |
117 CodeGenState state(this); | 126 CodeGenState state(this); |
118 | 127 |
119 // Entry: | 128 // Entry: |
120 // Stack: receiver, arguments, return address. | 129 // Stack: receiver, arguments, return address. |
121 // ebp: caller's frame pointer | 130 // ebp: caller's frame pointer |
122 // esp: stack pointer | 131 // esp: stack pointer |
123 // edi: called JS function | 132 // edi: called JS function |
124 // esi: callee's context | 133 // esi: callee's context |
125 allocator_->Initialize(); | 134 allocator_->Initialize(); |
126 frame_->Enter(); | 135 frame_->Enter(); |
127 | 136 |
128 #ifdef DEBUG | |
129 if (strlen(FLAG_stop_at) > 0 && | |
130 fun->name()->IsEqualTo(CStrVector(FLAG_stop_at))) { | |
131 frame_->SpillAll(); | |
132 __ int3(); | |
133 } | |
134 #endif | |
135 | |
136 // Allocate space for locals and initialize them. | 137 // Allocate space for locals and initialize them. |
137 frame_->AllocateStackSlots(scope_->num_stack_slots()); | 138 frame_->AllocateStackSlots(scope_->num_stack_slots()); |
138 // Initialize the function return target after the locals are set | 139 // Initialize the function return target after the locals are set |
139 // up, because it needs the expected frame height from the frame. | 140 // up, because it needs the expected frame height from the frame. |
140 function_return_.Initialize(this, JumpTarget::BIDIRECTIONAL); | 141 function_return_.Initialize(this, JumpTarget::BIDIRECTIONAL); |
141 function_return_is_shadowed_ = false; | 142 function_return_is_shadowed_ = false; |
142 | 143 |
143 // Allocate the arguments object and copy the parameters into it. | 144 // Allocate the arguments object and copy the parameters into it. |
144 if (scope_->arguments() != NULL) { | 145 if (scope_->arguments() != NULL) { |
145 ASSERT(scope_->arguments_shadow() != NULL); | 146 ASSERT(scope_->arguments_shadow() != NULL); |
(...skipping 4723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4869 } | 4870 } |
4870 | 4871 |
4871 // If the count operation didn't overflow and the result is a | 4872 // If the count operation didn't overflow and the result is a |
4872 // valid smi, we're done. Otherwise, we jump to the deferred | 4873 // valid smi, we're done. Otherwise, we jump to the deferred |
4873 // slow-case code. | 4874 // slow-case code. |
4874 // | 4875 // |
4875 // We combine the overflow and the smi check if we could | 4876 // We combine the overflow and the smi check if we could |
4876 // successfully allocate a temporary byte register. | 4877 // successfully allocate a temporary byte register. |
4877 if (tmp.is_valid()) { | 4878 if (tmp.is_valid()) { |
4878 __ setcc(overflow, tmp.reg()); | 4879 __ setcc(overflow, tmp.reg()); |
4879 __ or_(Operand(value.reg()), tmp.reg()); | 4880 __ or_(Operand(tmp.reg()), value.reg()); |
| 4881 __ test(tmp.reg(), Immediate(kSmiTagMask)); |
4880 tmp.Unuse(); | 4882 tmp.Unuse(); |
4881 __ test(value.reg(), Immediate(kSmiTagMask)); | |
4882 deferred->enter()->Branch(not_zero, &value, not_taken); | 4883 deferred->enter()->Branch(not_zero, &value, not_taken); |
4883 } else { // Otherwise we test separately for overflow and smi check. | 4884 } else { // Otherwise we test separately for overflow and smi check. |
4884 deferred->enter()->Branch(overflow, &value, not_taken); | 4885 deferred->enter()->Branch(overflow, &value, not_taken); |
4885 __ test(value.reg(), Immediate(kSmiTagMask)); | 4886 __ test(value.reg(), Immediate(kSmiTagMask)); |
4886 deferred->enter()->Branch(not_zero, &value, not_taken); | 4887 deferred->enter()->Branch(not_zero, &value, not_taken); |
4887 } | 4888 } |
4888 | 4889 |
4889 // Store the new value in the target if not const. | 4890 // Store the new value in the target if not const. |
4890 deferred->BindExit(&value); | 4891 deferred->BindExit(&value); |
4891 frame_->Push(&value); | 4892 frame_->Push(&value); |
(...skipping 2339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7231 | 7232 |
7232 // Slow-case: Go through the JavaScript implementation. | 7233 // Slow-case: Go through the JavaScript implementation. |
7233 __ bind(&slow); | 7234 __ bind(&slow); |
7234 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); | 7235 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); |
7235 } | 7236 } |
7236 | 7237 |
7237 | 7238 |
7238 #undef __ | 7239 #undef __ |
7239 | 7240 |
7240 } } // namespace v8::internal | 7241 } } // namespace v8::internal |
OLD | NEW |