| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/arm64/lithium-codegen-arm64.h" | 7 #include "src/arm64/lithium-codegen-arm64.h" |
| 8 #include "src/arm64/lithium-gap-resolver-arm64.h" | 8 #include "src/arm64/lithium-gap-resolver-arm64.h" |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 CallICState::CallType call_type = | 428 CallICState::CallType call_type = |
| 429 (flags & CALL_AS_METHOD) ? CallICState::METHOD : CallICState::FUNCTION; | 429 (flags & CALL_AS_METHOD) ? CallICState::METHOD : CallICState::FUNCTION; |
| 430 | 430 |
| 431 Handle<Code> ic = | 431 Handle<Code> ic = |
| 432 CodeFactory::CallICInOptimizedCode(isolate(), arity, call_type).code(); | 432 CodeFactory::CallICInOptimizedCode(isolate(), arity, call_type).code(); |
| 433 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 433 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 434 } else { | 434 } else { |
| 435 CallFunctionStub stub(isolate(), arity, flags); | 435 CallFunctionStub stub(isolate(), arity, flags); |
| 436 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 436 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
| 437 } | 437 } |
| 438 RecordPushedArgumentsDelta(instr->hydrogen()->argument_delta()); |
| 438 } | 439 } |
| 439 | 440 |
| 440 | 441 |
| 441 void LCodeGen::DoCallNew(LCallNew* instr) { | 442 void LCodeGen::DoCallNew(LCallNew* instr) { |
| 442 DCHECK(ToRegister(instr->context()).is(cp)); | 443 DCHECK(ToRegister(instr->context()).is(cp)); |
| 443 DCHECK(instr->IsMarkedAsCall()); | 444 DCHECK(instr->IsMarkedAsCall()); |
| 444 DCHECK(ToRegister(instr->constructor()).is(x1)); | 445 DCHECK(ToRegister(instr->constructor()).is(x1)); |
| 445 | 446 |
| 446 __ Mov(x0, instr->arity()); | 447 __ Mov(x0, instr->arity()); |
| 447 // No cell in x2 for construct type feedback in optimized code. | 448 // No cell in x2 for construct type feedback in optimized code. |
| 448 __ LoadRoot(x2, Heap::kUndefinedValueRootIndex); | 449 __ LoadRoot(x2, Heap::kUndefinedValueRootIndex); |
| 449 | 450 |
| 450 CallConstructStub stub(isolate(), NO_CALL_CONSTRUCTOR_FLAGS); | 451 CallConstructStub stub(isolate(), NO_CALL_CONSTRUCTOR_FLAGS); |
| 451 CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr); | 452 CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr); |
| 453 RecordPushedArgumentsDelta(instr->hydrogen()->argument_delta()); |
| 452 | 454 |
| 453 DCHECK(ToRegister(instr->result()).is(x0)); | 455 DCHECK(ToRegister(instr->result()).is(x0)); |
| 454 } | 456 } |
| 455 | 457 |
| 456 | 458 |
| 457 void LCodeGen::DoCallNewArray(LCallNewArray* instr) { | 459 void LCodeGen::DoCallNewArray(LCallNewArray* instr) { |
| 458 DCHECK(instr->IsMarkedAsCall()); | 460 DCHECK(instr->IsMarkedAsCall()); |
| 459 DCHECK(ToRegister(instr->context()).is(cp)); | 461 DCHECK(ToRegister(instr->context()).is(cp)); |
| 460 DCHECK(ToRegister(instr->constructor()).is(x1)); | 462 DCHECK(ToRegister(instr->constructor()).is(x1)); |
| 461 | 463 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 __ Bind(&packed_case); | 499 __ Bind(&packed_case); |
| 498 } | 500 } |
| 499 | 501 |
| 500 ArraySingleArgumentConstructorStub stub(isolate(), kind, override_mode); | 502 ArraySingleArgumentConstructorStub stub(isolate(), kind, override_mode); |
| 501 CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr); | 503 CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr); |
| 502 __ Bind(&done); | 504 __ Bind(&done); |
| 503 } else { | 505 } else { |
| 504 ArrayNArgumentsConstructorStub stub(isolate(), kind, override_mode); | 506 ArrayNArgumentsConstructorStub stub(isolate(), kind, override_mode); |
| 505 CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr); | 507 CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr); |
| 506 } | 508 } |
| 509 RecordPushedArgumentsDelta(instr->hydrogen()->argument_delta()); |
| 507 | 510 |
| 508 DCHECK(ToRegister(instr->result()).is(x0)); | 511 DCHECK(ToRegister(instr->result()).is(x0)); |
| 509 } | 512 } |
| 510 | 513 |
| 511 | 514 |
| 512 void LCodeGen::CallRuntime(const Runtime::Function* function, | 515 void LCodeGen::CallRuntime(const Runtime::Function* function, |
| 513 int num_arguments, | 516 int num_arguments, |
| 514 LInstruction* instr, | 517 LInstruction* instr, |
| 515 SaveFPRegsMode save_doubles) { | 518 SaveFPRegsMode save_doubles) { |
| 516 DCHECK(instr != NULL); | 519 DCHECK(instr != NULL); |
| 517 | 520 |
| 518 __ CallRuntime(function, num_arguments, save_doubles); | 521 __ CallRuntime(function, num_arguments, save_doubles); |
| 519 | 522 |
| 520 RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); | 523 RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); |
| 521 } | 524 } |
| 522 | 525 |
| 523 | 526 |
| 524 void LCodeGen::LoadContextFromDeferred(LOperand* context) { | 527 void LCodeGen::LoadContextFromDeferred(LOperand* context) { |
| 525 if (context->IsRegister()) { | 528 if (context->IsRegister()) { |
| 526 __ Mov(cp, ToRegister(context)); | 529 __ Mov(cp, ToRegister(context)); |
| 527 } else if (context->IsStackSlot()) { | 530 } else if (context->IsStackSlot()) { |
| 528 __ Ldr(cp, ToMemOperand(context)); | 531 __ Ldr(cp, ToMemOperand(context, kMustUseFramePointer)); |
| 529 } else if (context->IsConstantOperand()) { | 532 } else if (context->IsConstantOperand()) { |
| 530 HConstant* constant = | 533 HConstant* constant = |
| 531 chunk_->LookupConstant(LConstantOperand::cast(context)); | 534 chunk_->LookupConstant(LConstantOperand::cast(context)); |
| 532 __ LoadHeapObject(cp, | 535 __ LoadHeapObject(cp, |
| 533 Handle<HeapObject>::cast(constant->handle(isolate()))); | 536 Handle<HeapObject>::cast(constant->handle(isolate()))); |
| 534 } else { | 537 } else { |
| 535 UNREACHABLE(); | 538 UNREACHABLE(); |
| 536 } | 539 } |
| 537 } | 540 } |
| 538 | 541 |
| (...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1274 return Operand(0); | 1277 return Operand(0); |
| 1275 } | 1278 } |
| 1276 | 1279 |
| 1277 | 1280 |
| 1278 static int64_t ArgumentsOffsetWithoutFrame(int index) { | 1281 static int64_t ArgumentsOffsetWithoutFrame(int index) { |
| 1279 DCHECK(index < 0); | 1282 DCHECK(index < 0); |
| 1280 return -(index + 1) * kPointerSize; | 1283 return -(index + 1) * kPointerSize; |
| 1281 } | 1284 } |
| 1282 | 1285 |
| 1283 | 1286 |
| 1284 MemOperand LCodeGen::ToMemOperand(LOperand* op) const { | 1287 MemOperand LCodeGen::ToMemOperand(LOperand* op, StackMode stack_mode) const { |
| 1285 DCHECK(op != NULL); | 1288 DCHECK(op != NULL); |
| 1286 DCHECK(!op->IsRegister()); | 1289 DCHECK(!op->IsRegister()); |
| 1287 DCHECK(!op->IsDoubleRegister()); | 1290 DCHECK(!op->IsDoubleRegister()); |
| 1288 DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); | 1291 DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); |
| 1289 if (NeedsEagerFrame()) { | 1292 if (NeedsEagerFrame()) { |
| 1290 return MemOperand(fp, StackSlotOffset(op->index())); | 1293 int fp_offset = StackSlotOffset(op->index()); |
| 1294 // Loads and stores have a bigger reach in positive offset than negative. |
| 1295 // We try to access using jssp (positive offset) first, then fall back to |
| 1296 // fp (negative offset) if that fails. |
| 1297 // |
| 1298 // We can reference a stack slot from jssp only if we know how much we've |
| 1299 // put on the stack. We don't know this in the following cases: |
| 1300 // - stack_mode != kCanUseStackPointer: this is the case when deferred |
| 1301 // code has saved the registers. |
| 1302 // - saves_caller_doubles(): some double registers have been pushed, jssp |
| 1303 // references the end of the double registers and not the end of the stack |
| 1304 // slots. |
| 1305 // In both of the cases above, we _could_ add the tracking information |
| 1306 // required so that we can use jssp here, but in practice it isn't worth it. |
| 1307 if ((stack_mode == kCanUseStackPointer) && |
| 1308 !info()->saves_caller_doubles()) { |
| 1309 int jssp_offset_to_fp = |
| 1310 StandardFrameConstants::kFixedFrameSizeFromFp + |
| 1311 (pushed_arguments_ + GetStackSlotCount()) * kPointerSize; |
| 1312 int jssp_offset = fp_offset + jssp_offset_to_fp; |
| 1313 if (masm()->IsImmLSScaled(jssp_offset, LSDoubleWord)) { |
| 1314 return MemOperand(masm()->StackPointer(), jssp_offset); |
| 1315 } |
| 1316 } |
| 1317 return MemOperand(fp, fp_offset); |
| 1291 } else { | 1318 } else { |
| 1292 // Retrieve parameter without eager stack-frame relative to the | 1319 // Retrieve parameter without eager stack-frame relative to the |
| 1293 // stack-pointer. | 1320 // stack-pointer. |
| 1294 return MemOperand(masm()->StackPointer(), | 1321 return MemOperand(masm()->StackPointer(), |
| 1295 ArgumentsOffsetWithoutFrame(op->index())); | 1322 ArgumentsOffsetWithoutFrame(op->index())); |
| 1296 } | 1323 } |
| 1297 } | 1324 } |
| 1298 | 1325 |
| 1299 | 1326 |
| 1300 Handle<Object> LCodeGen::ToHandle(LConstantOperand* op) const { | 1327 Handle<Object> LCodeGen::ToHandle(LConstantOperand* op) const { |
| (...skipping 777 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2078 __ Call(code, RelocInfo::CODE_TARGET, TypeFeedbackId::None()); | 2105 __ Call(code, RelocInfo::CODE_TARGET, TypeFeedbackId::None()); |
| 2079 } else { | 2106 } else { |
| 2080 DCHECK(instr->target()->IsRegister()); | 2107 DCHECK(instr->target()->IsRegister()); |
| 2081 Register target = ToRegister(instr->target()); | 2108 Register target = ToRegister(instr->target()); |
| 2082 generator.BeforeCall(__ CallSize(target)); | 2109 generator.BeforeCall(__ CallSize(target)); |
| 2083 __ Add(target, target, Code::kHeaderSize - kHeapObjectTag); | 2110 __ Add(target, target, Code::kHeaderSize - kHeapObjectTag); |
| 2084 __ Call(target); | 2111 __ Call(target); |
| 2085 } | 2112 } |
| 2086 generator.AfterCall(); | 2113 generator.AfterCall(); |
| 2087 } | 2114 } |
| 2115 |
| 2116 RecordPushedArgumentsDelta(instr->hydrogen()->argument_delta()); |
| 2088 } | 2117 } |
| 2089 | 2118 |
| 2090 | 2119 |
| 2091 void LCodeGen::DoCallJSFunction(LCallJSFunction* instr) { | 2120 void LCodeGen::DoCallJSFunction(LCallJSFunction* instr) { |
| 2092 DCHECK(instr->IsMarkedAsCall()); | 2121 DCHECK(instr->IsMarkedAsCall()); |
| 2093 DCHECK(ToRegister(instr->function()).is(x1)); | 2122 DCHECK(ToRegister(instr->function()).is(x1)); |
| 2094 | 2123 |
| 2095 if (instr->hydrogen()->pass_argument_count()) { | 2124 if (instr->hydrogen()->pass_argument_count()) { |
| 2096 __ Mov(x0, Operand(instr->arity())); | 2125 __ Mov(x0, Operand(instr->arity())); |
| 2097 } | 2126 } |
| 2098 | 2127 |
| 2099 // Change context. | 2128 // Change context. |
| 2100 __ Ldr(cp, FieldMemOperand(x1, JSFunction::kContextOffset)); | 2129 __ Ldr(cp, FieldMemOperand(x1, JSFunction::kContextOffset)); |
| 2101 | 2130 |
| 2102 // Load the code entry address | 2131 // Load the code entry address |
| 2103 __ Ldr(x10, FieldMemOperand(x1, JSFunction::kCodeEntryOffset)); | 2132 __ Ldr(x10, FieldMemOperand(x1, JSFunction::kCodeEntryOffset)); |
| 2104 __ Call(x10); | 2133 __ Call(x10); |
| 2105 | 2134 |
| 2106 RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); | 2135 RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT); |
| 2136 RecordPushedArgumentsDelta(instr->hydrogen()->argument_delta()); |
| 2107 } | 2137 } |
| 2108 | 2138 |
| 2109 | 2139 |
| 2110 void LCodeGen::DoCallRuntime(LCallRuntime* instr) { | 2140 void LCodeGen::DoCallRuntime(LCallRuntime* instr) { |
| 2111 CallRuntime(instr->function(), instr->arity(), instr); | 2141 CallRuntime(instr->function(), instr->arity(), instr); |
| 2142 RecordPushedArgumentsDelta(instr->hydrogen()->argument_delta()); |
| 2112 } | 2143 } |
| 2113 | 2144 |
| 2114 | 2145 |
| 2115 void LCodeGen::DoCallStub(LCallStub* instr) { | 2146 void LCodeGen::DoCallStub(LCallStub* instr) { |
| 2116 DCHECK(ToRegister(instr->context()).is(cp)); | 2147 DCHECK(ToRegister(instr->context()).is(cp)); |
| 2117 DCHECK(ToRegister(instr->result()).is(x0)); | 2148 DCHECK(ToRegister(instr->result()).is(x0)); |
| 2118 switch (instr->hydrogen()->major_key()) { | 2149 switch (instr->hydrogen()->major_key()) { |
| 2119 case CodeStub::RegExpExec: { | 2150 case CodeStub::RegExpExec: { |
| 2120 RegExpExecStub stub(isolate()); | 2151 RegExpExecStub stub(isolate()); |
| 2121 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 2152 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
| 2122 break; | 2153 break; |
| 2123 } | 2154 } |
| 2124 case CodeStub::SubString: { | 2155 case CodeStub::SubString: { |
| 2125 SubStringStub stub(isolate()); | 2156 SubStringStub stub(isolate()); |
| 2126 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 2157 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
| 2127 break; | 2158 break; |
| 2128 } | 2159 } |
| 2129 case CodeStub::StringCompare: { | 2160 case CodeStub::StringCompare: { |
| 2130 StringCompareStub stub(isolate()); | 2161 StringCompareStub stub(isolate()); |
| 2131 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 2162 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
| 2132 break; | 2163 break; |
| 2133 } | 2164 } |
| 2134 default: | 2165 default: |
| 2135 UNREACHABLE(); | 2166 UNREACHABLE(); |
| 2136 } | 2167 } |
| 2168 RecordPushedArgumentsDelta(instr->hydrogen()->argument_delta()); |
| 2137 } | 2169 } |
| 2138 | 2170 |
| 2139 | 2171 |
| 2140 void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) { | 2172 void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) { |
| 2141 GenerateOsrPrologue(); | 2173 GenerateOsrPrologue(); |
| 2142 } | 2174 } |
| 2143 | 2175 |
| 2144 | 2176 |
| 2145 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { | 2177 void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { |
| 2146 Register temp = ToRegister(instr->temp()); | 2178 Register temp = ToRegister(instr->temp()); |
| (...skipping 1042 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3189 if (known_function.is_null()) { | 3221 if (known_function.is_null()) { |
| 3190 LPointerMap* pointers = instr->pointer_map(); | 3222 LPointerMap* pointers = instr->pointer_map(); |
| 3191 SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); | 3223 SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); |
| 3192 ParameterCount count(instr->arity()); | 3224 ParameterCount count(instr->arity()); |
| 3193 __ InvokeFunction(x1, count, CALL_FUNCTION, generator); | 3225 __ InvokeFunction(x1, count, CALL_FUNCTION, generator); |
| 3194 } else { | 3226 } else { |
| 3195 CallKnownFunction(known_function, | 3227 CallKnownFunction(known_function, |
| 3196 instr->hydrogen()->formal_parameter_count(), | 3228 instr->hydrogen()->formal_parameter_count(), |
| 3197 instr->arity(), instr); | 3229 instr->arity(), instr); |
| 3198 } | 3230 } |
| 3231 RecordPushedArgumentsDelta(instr->hydrogen()->argument_delta()); |
| 3199 } | 3232 } |
| 3200 | 3233 |
| 3201 | 3234 |
| 3202 void LCodeGen::DoIsConstructCallAndBranch(LIsConstructCallAndBranch* instr) { | 3235 void LCodeGen::DoIsConstructCallAndBranch(LIsConstructCallAndBranch* instr) { |
| 3203 Register temp1 = ToRegister(instr->temp1()); | 3236 Register temp1 = ToRegister(instr->temp1()); |
| 3204 Register temp2 = ToRegister(instr->temp2()); | 3237 Register temp2 = ToRegister(instr->temp2()); |
| 3205 | 3238 |
| 3206 // Get the frame pointer for the calling frame. | 3239 // Get the frame pointer for the calling frame. |
| 3207 __ Ldr(temp1, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | 3240 __ Ldr(temp1, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
| 3208 | 3241 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3302 } | 3335 } |
| 3303 | 3336 |
| 3304 | 3337 |
| 3305 void LCodeGen::DoLabel(LLabel* label) { | 3338 void LCodeGen::DoLabel(LLabel* label) { |
| 3306 Comment(";;; <@%d,#%d> -------------------- B%d%s --------------------", | 3339 Comment(";;; <@%d,#%d> -------------------- B%d%s --------------------", |
| 3307 current_instruction_, | 3340 current_instruction_, |
| 3308 label->hydrogen_value()->id(), | 3341 label->hydrogen_value()->id(), |
| 3309 label->block_id(), | 3342 label->block_id(), |
| 3310 LabelType(label)); | 3343 LabelType(label)); |
| 3311 | 3344 |
| 3345 // Inherit pushed_arguments_ from the predecessor's argument count. |
| 3346 if (label->block()->HasPredecessor()) { |
| 3347 pushed_arguments_ = label->block()->predecessors()->at(0)->argument_count(); |
| 3348 #ifdef DEBUG |
| 3349 for (auto p : *label->block()->predecessors()) { |
| 3350 DCHECK_EQ(p->argument_count(), pushed_arguments_); |
| 3351 } |
| 3352 #endif |
| 3353 } |
| 3354 |
| 3312 __ Bind(label->label()); | 3355 __ Bind(label->label()); |
| 3313 current_block_ = label->block_id(); | 3356 current_block_ = label->block_id(); |
| 3314 DoGap(label); | 3357 DoGap(label); |
| 3315 } | 3358 } |
| 3316 | 3359 |
| 3317 | 3360 |
| 3318 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { | 3361 void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { |
| 3319 Register context = ToRegister(instr->context()); | 3362 Register context = ToRegister(instr->context()); |
| 3320 Register result = ToRegister(instr->result()); | 3363 Register result = ToRegister(instr->result()); |
| 3321 __ Ldr(result, ContextMemOperand(context, instr->slot_index())); | 3364 __ Ldr(result, ContextMemOperand(context, instr->slot_index())); |
| (...skipping 1425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4747 LOperand* arg = instr->argument(i); | 4790 LOperand* arg = instr->argument(i); |
| 4748 if (arg->IsDoubleRegister() || arg->IsDoubleStackSlot()) { | 4791 if (arg->IsDoubleRegister() || arg->IsDoubleStackSlot()) { |
| 4749 Abort(kDoPushArgumentNotImplementedForDoubleType); | 4792 Abort(kDoPushArgumentNotImplementedForDoubleType); |
| 4750 return; | 4793 return; |
| 4751 } | 4794 } |
| 4752 args.Queue(ToRegister(arg)); | 4795 args.Queue(ToRegister(arg)); |
| 4753 } | 4796 } |
| 4754 | 4797 |
| 4755 // The preamble was done by LPreparePushArguments. | 4798 // The preamble was done by LPreparePushArguments. |
| 4756 args.PushQueued(MacroAssembler::PushPopQueue::SKIP_PREAMBLE); | 4799 args.PushQueued(MacroAssembler::PushPopQueue::SKIP_PREAMBLE); |
| 4800 |
| 4801 RecordPushedArgumentsDelta(instr->ArgumentCount()); |
| 4757 } | 4802 } |
| 4758 | 4803 |
| 4759 | 4804 |
| 4760 void LCodeGen::DoReturn(LReturn* instr) { | 4805 void LCodeGen::DoReturn(LReturn* instr) { |
| 4761 if (FLAG_trace && info()->IsOptimizing()) { | 4806 if (FLAG_trace && info()->IsOptimizing()) { |
| 4762 // Push the return value on the stack as the parameter. | 4807 // Push the return value on the stack as the parameter. |
| 4763 // Runtime::TraceExit returns its parameter in x0. We're leaving the code | 4808 // Runtime::TraceExit returns its parameter in x0. We're leaving the code |
| 4764 // managed by the register allocator and tearing down the frame, it's | 4809 // managed by the register allocator and tearing down the frame, it's |
| 4765 // safe to write to the context register. | 4810 // safe to write to the context register. |
| 4766 __ Push(x0); | 4811 __ Push(x0); |
| (...skipping 1282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6049 Handle<ScopeInfo> scope_info = instr->scope_info(); | 6094 Handle<ScopeInfo> scope_info = instr->scope_info(); |
| 6050 __ Push(scope_info); | 6095 __ Push(scope_info); |
| 6051 __ Push(ToRegister(instr->function())); | 6096 __ Push(ToRegister(instr->function())); |
| 6052 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6097 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 6053 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6098 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 6054 } | 6099 } |
| 6055 | 6100 |
| 6056 | 6101 |
| 6057 | 6102 |
| 6058 } } // namespace v8::internal | 6103 } } // namespace v8::internal |
| OLD | NEW |