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

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

Issue 2372113004: [turbofan] JSGenericLowering mostly uses builtins instead of code stubs now (Closed)
Patch Set: Ross' comments Created 4 years, 2 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
« no previous file with comments | « src/full-codegen/s390/full-codegen-s390.cc ('k') | src/full-codegen/x87/full-codegen-x87.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #if V8_TARGET_ARCH_X64 5 #if V8_TARGET_ARCH_X64
6 6
7 #include "src/full-codegen/full-codegen.h" 7 #include "src/full-codegen/full-codegen.h"
8 #include "src/ast/compile-time-value.h" 8 #include "src/ast/compile-time-value.h"
9 #include "src/ast/scopes.h" 9 #include "src/ast/scopes.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after
964 // it to a JS receiver. See ECMA-262 version 5, section 12.6.4. 964 // it to a JS receiver. See ECMA-262 version 5, section 12.6.4.
965 Label convert, done_convert; 965 Label convert, done_convert;
966 __ JumpIfSmi(rax, &convert, Label::kNear); 966 __ JumpIfSmi(rax, &convert, Label::kNear);
967 __ CmpObjectType(rax, FIRST_JS_RECEIVER_TYPE, rcx); 967 __ CmpObjectType(rax, FIRST_JS_RECEIVER_TYPE, rcx);
968 __ j(above_equal, &done_convert, Label::kNear); 968 __ j(above_equal, &done_convert, Label::kNear);
969 __ CompareRoot(rax, Heap::kNullValueRootIndex); 969 __ CompareRoot(rax, Heap::kNullValueRootIndex);
970 __ j(equal, &exit); 970 __ j(equal, &exit);
971 __ CompareRoot(rax, Heap::kUndefinedValueRootIndex); 971 __ CompareRoot(rax, Heap::kUndefinedValueRootIndex);
972 __ j(equal, &exit); 972 __ j(equal, &exit);
973 __ bind(&convert); 973 __ bind(&convert);
974 ToObjectStub stub(isolate()); 974 __ Call(isolate()->builtins()->ToObject(), RelocInfo::CODE_TARGET);
975 __ CallStub(&stub);
976 RestoreContext(); 975 RestoreContext();
977 __ bind(&done_convert); 976 __ bind(&done_convert);
978 PrepareForBailoutForId(stmt->ToObjectId(), BailoutState::TOS_REGISTER); 977 PrepareForBailoutForId(stmt->ToObjectId(), BailoutState::TOS_REGISTER);
979 __ Push(rax); 978 __ Push(rax);
980 979
981 // Check cache validity in generated code. If we cannot guarantee cache 980 // Check cache validity in generated code. If we cannot guarantee cache
982 // validity, call the runtime system to check cache validity or get the 981 // validity, call the runtime system to check cache validity or get the
983 // property names in a fixed array. Note: Proxies never have an enum cache, 982 // property names in a fixed array. Note: Proxies never have an enum cache,
984 // so will always take the slow path. 983 // so will always take the slow path.
985 Label call_runtime; 984 Label call_runtime;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1064 __ movp(rbx, Operand(rsp, 4 * kPointerSize)); 1063 __ movp(rbx, Operand(rsp, 4 * kPointerSize));
1065 __ cmpp(rdx, FieldOperand(rbx, HeapObject::kMapOffset)); 1064 __ cmpp(rdx, FieldOperand(rbx, HeapObject::kMapOffset));
1066 __ j(equal, &update_each, Label::kNear); 1065 __ j(equal, &update_each, Label::kNear);
1067 1066
1068 // We need to filter the key, record slow-path here. 1067 // We need to filter the key, record slow-path here.
1069 int const vector_index = SmiFromSlot(slot)->value(); 1068 int const vector_index = SmiFromSlot(slot)->value();
1070 __ EmitLoadTypeFeedbackVector(rdx); 1069 __ EmitLoadTypeFeedbackVector(rdx);
1071 __ Move(FieldOperand(rdx, FixedArray::OffsetOfElementAt(vector_index)), 1070 __ Move(FieldOperand(rdx, FixedArray::OffsetOfElementAt(vector_index)),
1072 TypeFeedbackVector::MegamorphicSentinel(isolate())); 1071 TypeFeedbackVector::MegamorphicSentinel(isolate()));
1073 1072
1074 // rax contains the key. The receiver in rbx is the second argument to the 1073 // rax contains the key. The receiver in rbx is the second argument to
1075 // ForInFilterStub. ForInFilter returns undefined if the receiver doesn't 1074 // ForInFilter. ForInFilter returns undefined if the receiver doesn't
1076 // have the key or returns the name-converted key. 1075 // have the key or returns the name-converted key.
1077 ForInFilterStub has_stub(isolate()); 1076 __ Call(isolate()->builtins()->ForInFilter(), RelocInfo::CODE_TARGET);
1078 __ CallStub(&has_stub);
1079 RestoreContext(); 1077 RestoreContext();
1080 PrepareForBailoutForId(stmt->FilterId(), BailoutState::TOS_REGISTER); 1078 PrepareForBailoutForId(stmt->FilterId(), BailoutState::TOS_REGISTER);
1081 __ JumpIfRoot(result_register(), Heap::kUndefinedValueRootIndex, 1079 __ JumpIfRoot(result_register(), Heap::kUndefinedValueRootIndex,
1082 loop_statement.continue_label()); 1080 loop_statement.continue_label());
1083 1081
1084 // Update the 'each' property or variable from the possibly filtered 1082 // Update the 'each' property or variable from the possibly filtered
1085 // entry in register rax. 1083 // entry in register rax.
1086 __ bind(&update_each); 1084 __ bind(&update_each);
1087 // Perform the assignment as if via '='. 1085 // Perform the assignment as if via '='.
1088 { EffectContext context(this); 1086 { EffectContext context(this);
(...skipping 1841 matching lines...) Expand 10 before | Expand all | Expand 10 after
2930 break; 2928 break;
2931 } 2929 }
2932 2930
2933 case Token::TYPEOF: { 2931 case Token::TYPEOF: {
2934 Comment cmnt(masm_, "[ UnaryOperation (TYPEOF)"); 2932 Comment cmnt(masm_, "[ UnaryOperation (TYPEOF)");
2935 { 2933 {
2936 AccumulatorValueContext context(this); 2934 AccumulatorValueContext context(this);
2937 VisitForTypeofValue(expr->expression()); 2935 VisitForTypeofValue(expr->expression());
2938 } 2936 }
2939 __ movp(rbx, rax); 2937 __ movp(rbx, rax);
2940 TypeofStub typeof_stub(isolate()); 2938 __ Call(isolate()->builtins()->Typeof(), RelocInfo::CODE_TARGET);
2941 __ CallStub(&typeof_stub);
2942 context()->Plug(rax); 2939 context()->Plug(rax);
2943 break; 2940 break;
2944 } 2941 }
2945 2942
2946 default: 2943 default:
2947 UNREACHABLE(); 2944 UNREACHABLE();
2948 } 2945 }
2949 } 2946 }
2950 2947
2951 2948
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
3299 EmitHasProperty(); 3296 EmitHasProperty();
3300 PrepareForBailoutBeforeSplit(expr, false, NULL, NULL); 3297 PrepareForBailoutBeforeSplit(expr, false, NULL, NULL);
3301 __ CompareRoot(rax, Heap::kTrueValueRootIndex); 3298 __ CompareRoot(rax, Heap::kTrueValueRootIndex);
3302 Split(equal, if_true, if_false, fall_through); 3299 Split(equal, if_true, if_false, fall_through);
3303 break; 3300 break;
3304 3301
3305 case Token::INSTANCEOF: { 3302 case Token::INSTANCEOF: {
3306 VisitForAccumulatorValue(expr->right()); 3303 VisitForAccumulatorValue(expr->right());
3307 SetExpressionPosition(expr); 3304 SetExpressionPosition(expr);
3308 PopOperand(rdx); 3305 PopOperand(rdx);
3309 InstanceOfStub stub(isolate()); 3306 __ Call(isolate()->builtins()->InstanceOf(), RelocInfo::CODE_TARGET);
3310 __ CallStub(&stub);
3311 PrepareForBailoutBeforeSplit(expr, false, NULL, NULL); 3307 PrepareForBailoutBeforeSplit(expr, false, NULL, NULL);
3312 __ CompareRoot(rax, Heap::kTrueValueRootIndex); 3308 __ CompareRoot(rax, Heap::kTrueValueRootIndex);
3313 Split(equal, if_true, if_false, fall_through); 3309 Split(equal, if_true, if_false, fall_through);
3314 break; 3310 break;
3315 } 3311 }
3316 3312
3317 default: { 3313 default: {
3318 VisitForAccumulatorValue(expr->right()); 3314 VisitForAccumulatorValue(expr->right());
3319 SetExpressionPosition(expr); 3315 SetExpressionPosition(expr);
3320 Condition cc = CompareIC::ComputeCondition(op); 3316 Condition cc = CompareIC::ComputeCondition(op);
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
3554 DCHECK_EQ( 3550 DCHECK_EQ(
3555 isolate->builtins()->OnStackReplacement()->entry(), 3551 isolate->builtins()->OnStackReplacement()->entry(),
3556 Assembler::target_address_at(call_target_address, unoptimized_code)); 3552 Assembler::target_address_at(call_target_address, unoptimized_code));
3557 return ON_STACK_REPLACEMENT; 3553 return ON_STACK_REPLACEMENT;
3558 } 3554 }
3559 3555
3560 } // namespace internal 3556 } // namespace internal
3561 } // namespace v8 3557 } // namespace v8
3562 3558
3563 #endif // V8_TARGET_ARCH_X64 3559 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/full-codegen/s390/full-codegen-s390.cc ('k') | src/full-codegen/x87/full-codegen-x87.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698