Chromium Code Reviews| 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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 JumpTarget::set_compiling_deferred_code(false); | 116 JumpTarget::set_compiling_deferred_code(false); |
| 117 | 117 |
| 118 #ifdef DEBUG | |
|
iposva
2009/05/15 22:35:14
This moved up here to be able to stop before any c
| |
| 119 if (strlen(FLAG_stop_at) > 0 && | |
| 120 fun->name()->IsEqualTo(CStrVector(FLAG_stop_at))) { | |
| 121 frame_->SpillAll(); | |
| 122 __ int3(); | |
| 123 } | |
| 124 #endif | |
| 125 | |
| 118 { | 126 { |
| 119 HistogramTimerScope codegen_timer(&Counters::code_generation); | 127 HistogramTimerScope codegen_timer(&Counters::code_generation); |
| 120 CodeGenState state(this); | 128 CodeGenState state(this); |
| 121 | 129 |
| 122 // Entry: | 130 // Entry: |
| 123 // Stack: receiver, arguments, return address. | 131 // Stack: receiver, arguments, return address. |
| 124 // ebp: caller's frame pointer | 132 // ebp: caller's frame pointer |
| 125 // esp: stack pointer | 133 // esp: stack pointer |
| 126 // edi: called JS function | 134 // edi: called JS function |
| 127 // esi: callee's context | 135 // esi: callee's context |
| 128 allocator_->Initialize(); | 136 allocator_->Initialize(); |
| 129 frame_->Enter(); | 137 frame_->Enter(); |
| 130 | 138 |
| 131 #ifdef DEBUG | |
| 132 if (strlen(FLAG_stop_at) > 0 && | |
| 133 fun->name()->IsEqualTo(CStrVector(FLAG_stop_at))) { | |
| 134 frame_->SpillAll(); | |
| 135 __ int3(); | |
| 136 } | |
| 137 #endif | |
| 138 | |
| 139 // Allocate space for locals and initialize them. | 139 // Allocate space for locals and initialize them. |
| 140 frame_->AllocateStackSlots(scope_->num_stack_slots()); | 140 frame_->AllocateStackSlots(scope_->num_stack_slots()); |
| 141 // Initialize the function return target after the locals are set | 141 // Initialize the function return target after the locals are set |
| 142 // up, because it needs the expected frame height from the frame. | 142 // up, because it needs the expected frame height from the frame. |
| 143 function_return_.Initialize(this, JumpTarget::BIDIRECTIONAL); | 143 function_return_.Initialize(this, JumpTarget::BIDIRECTIONAL); |
| 144 function_return_is_shadowed_ = false; | 144 function_return_is_shadowed_ = false; |
| 145 | 145 |
| 146 // Allocate the arguments object and copy the parameters into it. | 146 // Allocate the arguments object and copy the parameters into it. |
| 147 if (scope_->arguments() != NULL) { | 147 if (scope_->arguments() != NULL) { |
| 148 ASSERT(scope_->arguments_shadow() != NULL); | 148 ASSERT(scope_->arguments_shadow() != NULL); |
| (...skipping 4722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4871 } | 4871 } |
| 4872 | 4872 |
| 4873 // If the count operation didn't overflow and the result is a | 4873 // If the count operation didn't overflow and the result is a |
| 4874 // valid smi, we're done. Otherwise, we jump to the deferred | 4874 // valid smi, we're done. Otherwise, we jump to the deferred |
| 4875 // slow-case code. | 4875 // slow-case code. |
| 4876 // | 4876 // |
| 4877 // We combine the overflow and the smi check if we could | 4877 // We combine the overflow and the smi check if we could |
| 4878 // successfully allocate a temporary byte register. | 4878 // successfully allocate a temporary byte register. |
| 4879 if (tmp.is_valid()) { | 4879 if (tmp.is_valid()) { |
| 4880 __ setcc(overflow, tmp.reg()); | 4880 __ setcc(overflow, tmp.reg()); |
| 4881 __ or_(Operand(value.reg()), tmp.reg()); | 4881 __ or_(Operand(tmp.reg()), value.reg()); |
| 4882 __ test(tmp.reg(), Immediate(kSmiTagMask)); | |
| 4882 tmp.Unuse(); | 4883 tmp.Unuse(); |
| 4883 __ test(value.reg(), Immediate(kSmiTagMask)); | |
| 4884 deferred->enter()->Branch(not_zero, &value, not_taken); | 4884 deferred->enter()->Branch(not_zero, &value, not_taken); |
| 4885 } else { // Otherwise we test separately for overflow and smi check. | 4885 } else { // Otherwise we test separately for overflow and smi check. |
| 4886 deferred->enter()->Branch(overflow, &value, not_taken); | 4886 deferred->enter()->Branch(overflow, &value, not_taken); |
| 4887 __ test(value.reg(), Immediate(kSmiTagMask)); | 4887 __ test(value.reg(), Immediate(kSmiTagMask)); |
| 4888 deferred->enter()->Branch(not_zero, &value, not_taken); | 4888 deferred->enter()->Branch(not_zero, &value, not_taken); |
| 4889 } | 4889 } |
| 4890 | 4890 |
| 4891 // Store the new value in the target if not const. | 4891 // Store the new value in the target if not const. |
| 4892 deferred->BindExit(&value); | 4892 deferred->BindExit(&value); |
| 4893 frame_->Push(&value); | 4893 frame_->Push(&value); |
| (...skipping 2362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7256 | 7256 |
| 7257 // Slow-case: Go through the JavaScript implementation. | 7257 // Slow-case: Go through the JavaScript implementation. |
| 7258 __ bind(&slow); | 7258 __ bind(&slow); |
| 7259 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); | 7259 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); |
| 7260 } | 7260 } |
| 7261 | 7261 |
| 7262 | 7262 |
| 7263 #undef __ | 7263 #undef __ |
| 7264 | 7264 |
| 7265 } } // namespace v8::internal | 7265 } } // namespace v8::internal |
| OLD | NEW |