OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1416 __ push(reg); | 1416 __ push(reg); |
1417 __ CallStub(&stub); | 1417 __ CallStub(&stub); |
1418 __ test(eax, Operand(eax)); | 1418 __ test(eax, Operand(eax)); |
1419 __ popad(); | 1419 __ popad(); |
1420 EmitBranch(true_block, false_block, not_zero); | 1420 EmitBranch(true_block, false_block, not_zero); |
1421 } | 1421 } |
1422 } | 1422 } |
1423 } | 1423 } |
1424 | 1424 |
1425 | 1425 |
1426 void LCodeGen::EmitGoto(int block, LDeferredCode* deferred_stack_check) { | 1426 void LCodeGen::EmitGoto(int block) { |
1427 block = chunk_->LookupDestination(block); | 1427 block = chunk_->LookupDestination(block); |
1428 int next_block = GetNextEmittedBlock(current_block_); | 1428 int next_block = GetNextEmittedBlock(current_block_); |
1429 if (block != next_block) { | 1429 if (block != next_block) { |
1430 // Perform stack overflow check if this goto needs it before jumping. | 1430 __ jmp(chunk_->GetAssemblyLabel(block)); |
1431 if (deferred_stack_check != NULL) { | |
1432 ExternalReference stack_limit = | |
1433 ExternalReference::address_of_stack_limit(isolate()); | |
1434 __ cmp(esp, Operand::StaticVariable(stack_limit)); | |
1435 __ j(above_equal, chunk_->GetAssemblyLabel(block)); | |
1436 __ jmp(deferred_stack_check->entry()); | |
1437 deferred_stack_check->SetExit(chunk_->GetAssemblyLabel(block)); | |
1438 } else { | |
1439 __ jmp(chunk_->GetAssemblyLabel(block)); | |
1440 } | |
1441 } | 1431 } |
1442 } | 1432 } |
1443 | 1433 |
1444 | 1434 |
1445 void LCodeGen::DoDeferredStackCheck(LGoto* instr) { | |
1446 PushSafepointRegistersScope scope(this); | |
1447 CallRuntimeFromDeferred(Runtime::kStackGuard, 0, instr); | |
1448 } | |
1449 | |
1450 void LCodeGen::DoGoto(LGoto* instr) { | 1435 void LCodeGen::DoGoto(LGoto* instr) { |
1451 class DeferredStackCheck: public LDeferredCode { | 1436 EmitGoto(instr->block_id()); |
1452 public: | |
1453 DeferredStackCheck(LCodeGen* codegen, LGoto* instr) | |
1454 : LDeferredCode(codegen), instr_(instr) { } | |
1455 virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); } | |
1456 private: | |
1457 LGoto* instr_; | |
1458 }; | |
1459 | |
1460 DeferredStackCheck* deferred = NULL; | |
1461 if (instr->include_stack_check()) { | |
1462 deferred = new DeferredStackCheck(this, instr); | |
1463 } | |
1464 EmitGoto(instr->block_id(), deferred); | |
1465 } | 1437 } |
1466 | 1438 |
1467 | 1439 |
1468 Condition LCodeGen::TokenToCondition(Token::Value op, bool is_unsigned) { | 1440 Condition LCodeGen::TokenToCondition(Token::Value op, bool is_unsigned) { |
1469 Condition cond = no_condition; | 1441 Condition cond = no_condition; |
1470 switch (op) { | 1442 switch (op) { |
1471 case Token::EQ: | 1443 case Token::EQ: |
1472 case Token::EQ_STRICT: | 1444 case Token::EQ_STRICT: |
1473 cond = equal; | 1445 cond = equal; |
1474 break; | 1446 break; |
(...skipping 2953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4428 // builtin) | 4400 // builtin) |
4429 SafepointGenerator safepoint_generator(this, | 4401 SafepointGenerator safepoint_generator(this, |
4430 pointers, | 4402 pointers, |
4431 env->deoptimization_index()); | 4403 env->deoptimization_index()); |
4432 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); | 4404 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
4433 __ push(Immediate(Smi::FromInt(strict_mode_flag()))); | 4405 __ push(Immediate(Smi::FromInt(strict_mode_flag()))); |
4434 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION, safepoint_generator); | 4406 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION, safepoint_generator); |
4435 } | 4407 } |
4436 | 4408 |
4437 | 4409 |
| 4410 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { |
| 4411 PushSafepointRegistersScope scope(this); |
| 4412 CallRuntimeFromDeferred(Runtime::kStackGuard, 0, instr); |
| 4413 } |
| 4414 |
| 4415 |
4438 void LCodeGen::DoStackCheck(LStackCheck* instr) { | 4416 void LCodeGen::DoStackCheck(LStackCheck* instr) { |
4439 // Perform stack overflow check. | 4417 class DeferredStackCheck: public LDeferredCode { |
4440 Label done; | 4418 public: |
4441 ExternalReference stack_limit = | 4419 DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr) |
4442 ExternalReference::address_of_stack_limit(isolate()); | 4420 : LDeferredCode(codegen), instr_(instr) { } |
4443 __ cmp(esp, Operand::StaticVariable(stack_limit)); | 4421 virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); } |
4444 __ j(above_equal, &done, Label::kNear); | 4422 private: |
| 4423 LStackCheck* instr_; |
| 4424 }; |
4445 | 4425 |
4446 StackCheckStub stub; | 4426 if (instr->hydrogen()->is_function_entry()) { |
4447 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT); | 4427 // Perform stack overflow check. |
4448 __ bind(&done); | 4428 Label done; |
| 4429 ExternalReference stack_limit = |
| 4430 ExternalReference::address_of_stack_limit(isolate()); |
| 4431 __ cmp(esp, Operand::StaticVariable(stack_limit)); |
| 4432 __ j(above_equal, &done, Label::kNear); |
| 4433 |
| 4434 StackCheckStub stub; |
| 4435 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr, RESTORE_CONTEXT); |
| 4436 __ bind(&done); |
| 4437 } else { |
| 4438 ASSERT(instr->hydrogen()->is_backwards_branch()); |
| 4439 // Perform stack overflow check if this goto needs it before jumping. |
| 4440 DeferredStackCheck* deferred_stack_check = |
| 4441 new DeferredStackCheck(this, instr); |
| 4442 ExternalReference stack_limit = |
| 4443 ExternalReference::address_of_stack_limit(isolate()); |
| 4444 __ cmp(esp, Operand::StaticVariable(stack_limit)); |
| 4445 __ j(below, deferred_stack_check->entry()); |
| 4446 __ bind(instr->done_label()); |
| 4447 deferred_stack_check->SetExit(instr->done_label()); |
| 4448 } |
4449 } | 4449 } |
4450 | 4450 |
4451 | 4451 |
4452 void LCodeGen::DoOsrEntry(LOsrEntry* instr) { | 4452 void LCodeGen::DoOsrEntry(LOsrEntry* instr) { |
4453 // This is a pseudo-instruction that ensures that the environment here is | 4453 // This is a pseudo-instruction that ensures that the environment here is |
4454 // properly registered for deoptimization and records the assembler's PC | 4454 // properly registered for deoptimization and records the assembler's PC |
4455 // offset. | 4455 // offset. |
4456 LEnvironment* environment = instr->environment(); | 4456 LEnvironment* environment = instr->environment(); |
4457 environment->SetSpilledRegisters(instr->SpilledRegisterArray(), | 4457 environment->SetSpilledRegisters(instr->SpilledRegisterArray(), |
4458 instr->SpilledDoubleRegisterArray()); | 4458 instr->SpilledDoubleRegisterArray()); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4493 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); | 4493 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
4494 __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION, safepoint_generator); | 4494 __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION, safepoint_generator); |
4495 } | 4495 } |
4496 | 4496 |
4497 | 4497 |
4498 #undef __ | 4498 #undef __ |
4499 | 4499 |
4500 } } // namespace v8::internal | 4500 } } // namespace v8::internal |
4501 | 4501 |
4502 #endif // V8_TARGET_ARCH_IA32 | 4502 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |