Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(415)

Side by Side Diff: src/x64/lithium-codegen-x64.cc

Issue 255543003: CodeStubs contain their corresponding Isolate* now. (part 2) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 972 matching lines...) Expand 10 before | Expand all | Expand 10 after
983 // Nothing to do. 983 // Nothing to do.
984 } 984 }
985 985
986 986
987 void LCodeGen::DoCallStub(LCallStub* instr) { 987 void LCodeGen::DoCallStub(LCallStub* instr) {
988 ASSERT(ToRegister(instr->context()).is(rsi)); 988 ASSERT(ToRegister(instr->context()).is(rsi));
989 ASSERT(ToRegister(instr->result()).is(rax)); 989 ASSERT(ToRegister(instr->result()).is(rax));
990 switch (instr->hydrogen()->major_key()) { 990 switch (instr->hydrogen()->major_key()) {
991 case CodeStub::RegExpExec: { 991 case CodeStub::RegExpExec: {
992 RegExpExecStub stub(isolate()); 992 RegExpExecStub stub(isolate());
993 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); 993 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
994 break; 994 break;
995 } 995 }
996 case CodeStub::SubString: { 996 case CodeStub::SubString: {
997 SubStringStub stub(isolate()); 997 SubStringStub stub(isolate());
998 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); 998 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
999 break; 999 break;
1000 } 1000 }
1001 case CodeStub::StringCompare: { 1001 case CodeStub::StringCompare: {
1002 StringCompareStub stub(isolate()); 1002 StringCompareStub stub(isolate());
1003 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); 1003 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
1004 break; 1004 break;
1005 } 1005 }
1006 default: 1006 default:
1007 UNREACHABLE(); 1007 UNREACHABLE();
1008 } 1008 }
1009 } 1009 }
1010 1010
1011 1011
1012 void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) { 1012 void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) {
1013 GenerateOsrPrologue(); 1013 GenerateOsrPrologue();
(...skipping 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after
2023 } 2023 }
2024 2024
2025 2025
2026 void LCodeGen::DoArithmeticT(LArithmeticT* instr) { 2026 void LCodeGen::DoArithmeticT(LArithmeticT* instr) {
2027 ASSERT(ToRegister(instr->context()).is(rsi)); 2027 ASSERT(ToRegister(instr->context()).is(rsi));
2028 ASSERT(ToRegister(instr->left()).is(rdx)); 2028 ASSERT(ToRegister(instr->left()).is(rdx));
2029 ASSERT(ToRegister(instr->right()).is(rax)); 2029 ASSERT(ToRegister(instr->right()).is(rax));
2030 ASSERT(ToRegister(instr->result()).is(rax)); 2030 ASSERT(ToRegister(instr->result()).is(rax));
2031 2031
2032 BinaryOpICStub stub(isolate(), instr->op(), NO_OVERWRITE); 2032 BinaryOpICStub stub(isolate(), instr->op(), NO_OVERWRITE);
2033 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); 2033 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
2034 } 2034 }
2035 2035
2036 2036
2037 template<class InstrType> 2037 template<class InstrType>
2038 void LCodeGen::EmitBranch(InstrType instr, Condition cc) { 2038 void LCodeGen::EmitBranch(InstrType instr, Condition cc) {
2039 int left_block = instr->TrueDestination(chunk_); 2039 int left_block = instr->TrueDestination(chunk_);
2040 int right_block = instr->FalseDestination(chunk_); 2040 int right_block = instr->FalseDestination(chunk_);
2041 2041
2042 int next_block = GetNextEmittedBlock(); 2042 int next_block = GetNextEmittedBlock();
2043 2043
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after
2619 __ Cmp(FieldOperand(reg, HeapObject::kMapOffset), instr->map()); 2619 __ Cmp(FieldOperand(reg, HeapObject::kMapOffset), instr->map());
2620 EmitBranch(instr, equal); 2620 EmitBranch(instr, equal);
2621 } 2621 }
2622 2622
2623 2623
2624 void LCodeGen::DoInstanceOf(LInstanceOf* instr) { 2624 void LCodeGen::DoInstanceOf(LInstanceOf* instr) {
2625 ASSERT(ToRegister(instr->context()).is(rsi)); 2625 ASSERT(ToRegister(instr->context()).is(rsi));
2626 InstanceofStub stub(isolate(), InstanceofStub::kNoFlags); 2626 InstanceofStub stub(isolate(), InstanceofStub::kNoFlags);
2627 __ Push(ToRegister(instr->left())); 2627 __ Push(ToRegister(instr->left()));
2628 __ Push(ToRegister(instr->right())); 2628 __ Push(ToRegister(instr->right()));
2629 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); 2629 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
2630 Label true_value, done; 2630 Label true_value, done;
2631 __ testp(rax, rax); 2631 __ testp(rax, rax);
2632 __ j(zero, &true_value, Label::kNear); 2632 __ j(zero, &true_value, Label::kNear);
2633 __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex); 2633 __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex);
2634 __ jmp(&done, Label::kNear); 2634 __ jmp(&done, Label::kNear);
2635 __ bind(&true_value); 2635 __ bind(&true_value);
2636 __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex); 2636 __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex);
2637 __ bind(&done); 2637 __ bind(&done);
2638 } 2638 }
2639 2639
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
2717 static const int kAdditionalDelta = 10; 2717 static const int kAdditionalDelta = 10;
2718 int delta = 2718 int delta =
2719 masm_->SizeOfCodeGeneratedSince(map_check) + kAdditionalDelta; 2719 masm_->SizeOfCodeGeneratedSince(map_check) + kAdditionalDelta;
2720 ASSERT(delta >= 0); 2720 ASSERT(delta >= 0);
2721 __ PushImm32(delta); 2721 __ PushImm32(delta);
2722 2722
2723 // We are pushing three values on the stack but recording a 2723 // We are pushing three values on the stack but recording a
2724 // safepoint with two arguments because stub is going to 2724 // safepoint with two arguments because stub is going to
2725 // remove the third argument from the stack before jumping 2725 // remove the third argument from the stack before jumping
2726 // to instanceof builtin on the slow path. 2726 // to instanceof builtin on the slow path.
2727 CallCodeGeneric(stub.GetCode(isolate()), 2727 CallCodeGeneric(stub.GetCode(),
2728 RelocInfo::CODE_TARGET, 2728 RelocInfo::CODE_TARGET,
2729 instr, 2729 instr,
2730 RECORD_SAFEPOINT_WITH_REGISTERS, 2730 RECORD_SAFEPOINT_WITH_REGISTERS,
2731 2); 2731 2);
2732 ASSERT(delta == masm_->SizeOfCodeGeneratedSince(map_check)); 2732 ASSERT(delta == masm_->SizeOfCodeGeneratedSince(map_check));
2733 LEnvironment* env = instr->GetDeferredLazyDeoptimizationEnvironment(); 2733 LEnvironment* env = instr->GetDeferredLazyDeoptimizationEnvironment();
2734 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 2734 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
2735 // Move result to a register that survives the end of the 2735 // Move result to a register that survives the end of the
2736 // PushSafepointRegisterScope. 2736 // PushSafepointRegisterScope.
2737 __ movp(kScratchRegister, rax); 2737 __ movp(kScratchRegister, rax);
(...skipping 1164 matching lines...) Expand 10 before | Expand all | Expand 10 after
3902 } 3902 }
3903 3903
3904 3904
3905 void LCodeGen::DoCallFunction(LCallFunction* instr) { 3905 void LCodeGen::DoCallFunction(LCallFunction* instr) {
3906 ASSERT(ToRegister(instr->context()).is(rsi)); 3906 ASSERT(ToRegister(instr->context()).is(rsi));
3907 ASSERT(ToRegister(instr->function()).is(rdi)); 3907 ASSERT(ToRegister(instr->function()).is(rdi));
3908 ASSERT(ToRegister(instr->result()).is(rax)); 3908 ASSERT(ToRegister(instr->result()).is(rax));
3909 3909
3910 int arity = instr->arity(); 3910 int arity = instr->arity();
3911 CallFunctionStub stub(isolate(), arity, instr->hydrogen()->function_flags()); 3911 CallFunctionStub stub(isolate(), arity, instr->hydrogen()->function_flags());
3912 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); 3912 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
3913 } 3913 }
3914 3914
3915 3915
3916 void LCodeGen::DoCallNew(LCallNew* instr) { 3916 void LCodeGen::DoCallNew(LCallNew* instr) {
3917 ASSERT(ToRegister(instr->context()).is(rsi)); 3917 ASSERT(ToRegister(instr->context()).is(rsi));
3918 ASSERT(ToRegister(instr->constructor()).is(rdi)); 3918 ASSERT(ToRegister(instr->constructor()).is(rdi));
3919 ASSERT(ToRegister(instr->result()).is(rax)); 3919 ASSERT(ToRegister(instr->result()).is(rax));
3920 3920
3921 __ Set(rax, instr->arity()); 3921 __ Set(rax, instr->arity());
3922 // No cell in ebx for construct type feedback in optimized code 3922 // No cell in ebx for construct type feedback in optimized code
3923 __ LoadRoot(rbx, Heap::kUndefinedValueRootIndex); 3923 __ LoadRoot(rbx, Heap::kUndefinedValueRootIndex);
3924 CallConstructStub stub(isolate(), NO_CALL_FUNCTION_FLAGS); 3924 CallConstructStub stub(isolate(), NO_CALL_FUNCTION_FLAGS);
3925 CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr); 3925 CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr);
3926 } 3926 }
3927 3927
3928 3928
3929 void LCodeGen::DoCallNewArray(LCallNewArray* instr) { 3929 void LCodeGen::DoCallNewArray(LCallNewArray* instr) {
3930 ASSERT(ToRegister(instr->context()).is(rsi)); 3930 ASSERT(ToRegister(instr->context()).is(rsi));
3931 ASSERT(ToRegister(instr->constructor()).is(rdi)); 3931 ASSERT(ToRegister(instr->constructor()).is(rdi));
3932 ASSERT(ToRegister(instr->result()).is(rax)); 3932 ASSERT(ToRegister(instr->result()).is(rax));
3933 3933
3934 __ Set(rax, instr->arity()); 3934 __ Set(rax, instr->arity());
3935 __ LoadRoot(rbx, Heap::kUndefinedValueRootIndex); 3935 __ LoadRoot(rbx, Heap::kUndefinedValueRootIndex);
3936 ElementsKind kind = instr->hydrogen()->elements_kind(); 3936 ElementsKind kind = instr->hydrogen()->elements_kind();
3937 AllocationSiteOverrideMode override_mode = 3937 AllocationSiteOverrideMode override_mode =
3938 (AllocationSite::GetMode(kind) == TRACK_ALLOCATION_SITE) 3938 (AllocationSite::GetMode(kind) == TRACK_ALLOCATION_SITE)
3939 ? DISABLE_ALLOCATION_SITES 3939 ? DISABLE_ALLOCATION_SITES
3940 : DONT_OVERRIDE; 3940 : DONT_OVERRIDE;
3941 3941
3942 if (instr->arity() == 0) { 3942 if (instr->arity() == 0) {
3943 ArrayNoArgumentConstructorStub stub(isolate(), kind, override_mode); 3943 ArrayNoArgumentConstructorStub stub(isolate(), kind, override_mode);
3944 CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr); 3944 CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr);
3945 } else if (instr->arity() == 1) { 3945 } else if (instr->arity() == 1) {
3946 Label done; 3946 Label done;
3947 if (IsFastPackedElementsKind(kind)) { 3947 if (IsFastPackedElementsKind(kind)) {
3948 Label packed_case; 3948 Label packed_case;
3949 // We might need a change here 3949 // We might need a change here
3950 // look at the first argument 3950 // look at the first argument
3951 __ movp(rcx, Operand(rsp, 0)); 3951 __ movp(rcx, Operand(rsp, 0));
3952 __ testp(rcx, rcx); 3952 __ testp(rcx, rcx);
3953 __ j(zero, &packed_case, Label::kNear); 3953 __ j(zero, &packed_case, Label::kNear);
3954 3954
3955 ElementsKind holey_kind = GetHoleyElementsKind(kind); 3955 ElementsKind holey_kind = GetHoleyElementsKind(kind);
3956 ArraySingleArgumentConstructorStub stub(isolate(), 3956 ArraySingleArgumentConstructorStub stub(isolate(),
3957 holey_kind, 3957 holey_kind,
3958 override_mode); 3958 override_mode);
3959 CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr); 3959 CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr);
3960 __ jmp(&done, Label::kNear); 3960 __ jmp(&done, Label::kNear);
3961 __ bind(&packed_case); 3961 __ bind(&packed_case);
3962 } 3962 }
3963 3963
3964 ArraySingleArgumentConstructorStub stub(isolate(), kind, override_mode); 3964 ArraySingleArgumentConstructorStub stub(isolate(), kind, override_mode);
3965 CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr); 3965 CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr);
3966 __ bind(&done); 3966 __ bind(&done);
3967 } else { 3967 } else {
3968 ArrayNArgumentsConstructorStub stub(isolate(), kind, override_mode); 3968 ArrayNArgumentsConstructorStub stub(isolate(), kind, override_mode);
3969 CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr); 3969 CallCode(stub.GetCode(), RelocInfo::CONSTRUCT_CALL, instr);
3970 } 3970 }
3971 } 3971 }
3972 3972
3973 3973
3974 void LCodeGen::DoCallRuntime(LCallRuntime* instr) { 3974 void LCodeGen::DoCallRuntime(LCallRuntime* instr) {
3975 ASSERT(ToRegister(instr->context()).is(rsi)); 3975 ASSERT(ToRegister(instr->context()).is(rsi));
3976 CallRuntime(instr->function(), instr->arity(), instr, instr->save_doubles()); 3976 CallRuntime(instr->function(), instr->arity(), instr, instr->save_doubles());
3977 } 3977 }
3978 3978
3979 3979
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
4431 } 4431 }
4432 4432
4433 4433
4434 void LCodeGen::DoStringAdd(LStringAdd* instr) { 4434 void LCodeGen::DoStringAdd(LStringAdd* instr) {
4435 ASSERT(ToRegister(instr->context()).is(rsi)); 4435 ASSERT(ToRegister(instr->context()).is(rsi));
4436 ASSERT(ToRegister(instr->left()).is(rdx)); 4436 ASSERT(ToRegister(instr->left()).is(rdx));
4437 ASSERT(ToRegister(instr->right()).is(rax)); 4437 ASSERT(ToRegister(instr->right()).is(rax));
4438 StringAddStub stub(isolate(), 4438 StringAddStub stub(isolate(),
4439 instr->hydrogen()->flags(), 4439 instr->hydrogen()->flags(),
4440 instr->hydrogen()->pretenure_flag()); 4440 instr->hydrogen()->pretenure_flag());
4441 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); 4441 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
4442 } 4442 }
4443 4443
4444 4444
4445 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { 4445 void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) {
4446 class DeferredStringCharCodeAt V8_FINAL : public LDeferredCode { 4446 class DeferredStringCharCodeAt V8_FINAL : public LDeferredCode {
4447 public: 4447 public:
4448 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr) 4448 DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr)
4449 : LDeferredCode(codegen), instr_(instr) { } 4449 : LDeferredCode(codegen), instr_(instr) { }
4450 virtual void Generate() V8_OVERRIDE { 4450 virtual void Generate() V8_OVERRIDE {
4451 codegen()->DoDeferredStringCharCodeAt(instr_); 4451 codegen()->DoDeferredStringCharCodeAt(instr_);
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after
5314 void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) { 5314 void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) {
5315 ASSERT(ToRegister(instr->context()).is(rsi)); 5315 ASSERT(ToRegister(instr->context()).is(rsi));
5316 // Use the fast case closure allocation code that allocates in new 5316 // Use the fast case closure allocation code that allocates in new
5317 // space for nested functions that don't need literals cloning. 5317 // space for nested functions that don't need literals cloning.
5318 bool pretenure = instr->hydrogen()->pretenure(); 5318 bool pretenure = instr->hydrogen()->pretenure();
5319 if (!pretenure && instr->hydrogen()->has_no_literals()) { 5319 if (!pretenure && instr->hydrogen()->has_no_literals()) {
5320 FastNewClosureStub stub(isolate(), 5320 FastNewClosureStub stub(isolate(),
5321 instr->hydrogen()->strict_mode(), 5321 instr->hydrogen()->strict_mode(),
5322 instr->hydrogen()->is_generator()); 5322 instr->hydrogen()->is_generator());
5323 __ Move(rbx, instr->hydrogen()->shared_info()); 5323 __ Move(rbx, instr->hydrogen()->shared_info());
5324 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); 5324 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
5325 } else { 5325 } else {
5326 __ Push(rsi); 5326 __ Push(rsi);
5327 __ Push(instr->hydrogen()->shared_info()); 5327 __ Push(instr->hydrogen()->shared_info());
5328 __ PushRoot(pretenure ? Heap::kTrueValueRootIndex : 5328 __ PushRoot(pretenure ? Heap::kTrueValueRootIndex :
5329 Heap::kFalseValueRootIndex); 5329 Heap::kFalseValueRootIndex);
5330 CallRuntime(Runtime::kHiddenNewClosure, 3, instr); 5330 CallRuntime(Runtime::kHiddenNewClosure, 3, instr);
5331 } 5331 }
5332 } 5332 }
5333 5333
5334 5334
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
5727 __ bind(deferred->exit()); 5727 __ bind(deferred->exit());
5728 __ bind(&done); 5728 __ bind(&done);
5729 } 5729 }
5730 5730
5731 5731
5732 #undef __ 5732 #undef __
5733 5733
5734 } } // namespace v8::internal 5734 } } // namespace v8::internal
5735 5735
5736 #endif // V8_TARGET_ARCH_X64 5736 #endif // V8_TARGET_ARCH_X64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698