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

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

Issue 1255613002: Reduce duplicate code in full-codegen across platforms. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix mips Created 5 years, 5 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/mips/full-codegen-mips.cc ('k') | src/ppc/full-codegen-ppc.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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_MIPS64 7 #if V8_TARGET_ARCH_MIPS64
8 8
9 // Note on Mips implementation: 9 // Note on Mips implementation:
10 // 10 //
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 int no_frame_start = masm_->pc_offset(); 493 int no_frame_start = masm_->pc_offset();
494 masm_->MultiPop(static_cast<RegList>(fp.bit() | ra.bit())); 494 masm_->MultiPop(static_cast<RegList>(fp.bit() | ra.bit()));
495 masm_->Daddu(sp, sp, Operand(sp_delta)); 495 masm_->Daddu(sp, sp, Operand(sp_delta));
496 masm_->Jump(ra); 496 masm_->Jump(ra);
497 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset()); 497 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset());
498 } 498 }
499 } 499 }
500 } 500 }
501 501
502 502
503 void FullCodeGenerator::EffectContext::Plug(Variable* var) const {
504 DCHECK(var->IsStackAllocated() || var->IsContextSlot());
505 }
506
507
508 void FullCodeGenerator::AccumulatorValueContext::Plug(Variable* var) const {
509 DCHECK(var->IsStackAllocated() || var->IsContextSlot());
510 codegen()->GetVar(result_register(), var);
511 }
512
513
514 void FullCodeGenerator::StackValueContext::Plug(Variable* var) const { 503 void FullCodeGenerator::StackValueContext::Plug(Variable* var) const {
515 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); 504 DCHECK(var->IsStackAllocated() || var->IsContextSlot());
516 codegen()->GetVar(result_register(), var); 505 codegen()->GetVar(result_register(), var);
517 __ push(result_register()); 506 __ push(result_register());
518 } 507 }
519 508
520 509
521 void FullCodeGenerator::TestContext::Plug(Variable* var) const {
522 // For simplicity we always test the accumulator register.
523 codegen()->GetVar(result_register(), var);
524 codegen()->PrepareForBailoutBeforeSplit(condition(), false, NULL, NULL);
525 codegen()->DoTest(this);
526 }
527
528
529 void FullCodeGenerator::EffectContext::Plug(Heap::RootListIndex index) const { 510 void FullCodeGenerator::EffectContext::Plug(Heap::RootListIndex index) const {
530 } 511 }
531 512
532 513
533 void FullCodeGenerator::AccumulatorValueContext::Plug( 514 void FullCodeGenerator::AccumulatorValueContext::Plug(
534 Heap::RootListIndex index) const { 515 Heap::RootListIndex index) const {
535 __ LoadRoot(result_register(), index); 516 __ LoadRoot(result_register(), index);
536 } 517 }
537 518
538 519
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 } 660 }
680 661
681 662
682 void FullCodeGenerator::TestContext::Plug(Label* materialize_true, 663 void FullCodeGenerator::TestContext::Plug(Label* materialize_true,
683 Label* materialize_false) const { 664 Label* materialize_false) const {
684 DCHECK(materialize_true == true_label_); 665 DCHECK(materialize_true == true_label_);
685 DCHECK(materialize_false == false_label_); 666 DCHECK(materialize_false == false_label_);
686 } 667 }
687 668
688 669
689 void FullCodeGenerator::EffectContext::Plug(bool flag) const {
690 }
691
692
693 void FullCodeGenerator::AccumulatorValueContext::Plug(bool flag) const { 670 void FullCodeGenerator::AccumulatorValueContext::Plug(bool flag) const {
694 Heap::RootListIndex value_root_index = 671 Heap::RootListIndex value_root_index =
695 flag ? Heap::kTrueValueRootIndex : Heap::kFalseValueRootIndex; 672 flag ? Heap::kTrueValueRootIndex : Heap::kFalseValueRootIndex;
696 __ LoadRoot(result_register(), value_root_index); 673 __ LoadRoot(result_register(), value_root_index);
697 } 674 }
698 675
699 676
700 void FullCodeGenerator::StackValueContext::Plug(bool flag) const { 677 void FullCodeGenerator::StackValueContext::Plug(bool flag) const {
701 Heap::RootListIndex value_root_index = 678 Heap::RootListIndex value_root_index =
702 flag ? Heap::kTrueValueRootIndex : Heap::kFalseValueRootIndex; 679 flag ? Heap::kTrueValueRootIndex : Heap::kFalseValueRootIndex;
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
955 __ Push(cp, a2, a1); 932 __ Push(cp, a2, a1);
956 // Push initial value for function declaration. 933 // Push initial value for function declaration.
957 VisitForStackValue(declaration->fun()); 934 VisitForStackValue(declaration->fun());
958 __ CallRuntime(Runtime::kDeclareLookupSlot, 4); 935 __ CallRuntime(Runtime::kDeclareLookupSlot, 4);
959 break; 936 break;
960 } 937 }
961 } 938 }
962 } 939 }
963 940
964 941
965 void FullCodeGenerator::VisitImportDeclaration(ImportDeclaration* declaration) {
966 VariableProxy* proxy = declaration->proxy();
967 Variable* variable = proxy->var();
968 switch (variable->location()) {
969 case VariableLocation::GLOBAL:
970 case VariableLocation::UNALLOCATED:
971 // TODO(rossberg)
972 break;
973
974 case VariableLocation::CONTEXT: {
975 Comment cmnt(masm_, "[ ImportDeclaration");
976 EmitDebugCheckDeclarationContext(variable);
977 // TODO(rossberg)
978 break;
979 }
980
981 case VariableLocation::PARAMETER:
982 case VariableLocation::LOCAL:
983 case VariableLocation::LOOKUP:
984 UNREACHABLE();
985 }
986 }
987
988
989 void FullCodeGenerator::VisitExportDeclaration(ExportDeclaration* declaration) {
990 // TODO(rossberg)
991 }
992
993
994 void FullCodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) { 942 void FullCodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) {
995 // Call the runtime to declare the globals. 943 // Call the runtime to declare the globals.
996 // The context is the first argument. 944 // The context is the first argument.
997 __ li(a1, Operand(pairs)); 945 __ li(a1, Operand(pairs));
998 __ li(a0, Operand(Smi::FromInt(DeclareGlobalsFlags()))); 946 __ li(a0, Operand(Smi::FromInt(DeclareGlobalsFlags())));
999 __ Push(cp, a1, a0); 947 __ Push(cp, a1, a0);
1000 __ CallRuntime(Runtime::kDeclareGlobals, 3); 948 __ CallRuntime(Runtime::kDeclareGlobals, 3);
1001 // Return value is ignored. 949 // Return value is ignored.
1002 } 950 }
1003 951
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
1309 __ li(a0, Operand(info)); 1257 __ li(a0, Operand(info));
1310 __ LoadRoot(a1, pretenure ? Heap::kTrueValueRootIndex 1258 __ LoadRoot(a1, pretenure ? Heap::kTrueValueRootIndex
1311 : Heap::kFalseValueRootIndex); 1259 : Heap::kFalseValueRootIndex);
1312 __ Push(cp, a0, a1); 1260 __ Push(cp, a0, a1);
1313 __ CallRuntime(Runtime::kNewClosure, 3); 1261 __ CallRuntime(Runtime::kNewClosure, 3);
1314 } 1262 }
1315 context()->Plug(v0); 1263 context()->Plug(v0);
1316 } 1264 }
1317 1265
1318 1266
1319 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) {
1320 Comment cmnt(masm_, "[ VariableProxy");
1321 EmitVariableLoad(expr);
1322 }
1323
1324
1325 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, 1267 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer,
1326 int offset, 1268 int offset,
1327 FeedbackVectorICSlot slot) { 1269 FeedbackVectorICSlot slot) {
1328 if (NeedsHomeObject(initializer)) { 1270 if (NeedsHomeObject(initializer)) {
1329 __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); 1271 __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
1330 __ li(StoreDescriptor::NameRegister(), 1272 __ li(StoreDescriptor::NameRegister(),
1331 Operand(isolate()->factory()->home_object_symbol())); 1273 Operand(isolate()->factory()->home_object_symbol()));
1332 __ ld(StoreDescriptor::ValueRegister(), 1274 __ ld(StoreDescriptor::ValueRegister(),
1333 MemOperand(sp, offset * kPointerSize)); 1275 MemOperand(sp, offset * kPointerSize));
1334 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); 1276 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
(...skipping 2552 matching lines...) Expand 10 before | Expand all | Expand 10 after
3887 __ bind(&null); 3829 __ bind(&null);
3888 __ LoadRoot(v0, Heap::kNullValueRootIndex); 3830 __ LoadRoot(v0, Heap::kNullValueRootIndex);
3889 3831
3890 // All done. 3832 // All done.
3891 __ bind(&done); 3833 __ bind(&done);
3892 3834
3893 context()->Plug(v0); 3835 context()->Plug(v0);
3894 } 3836 }
3895 3837
3896 3838
3897 void FullCodeGenerator::EmitSubString(CallRuntime* expr) {
3898 // Load the arguments on the stack and call the stub.
3899 SubStringStub stub(isolate());
3900 ZoneList<Expression*>* args = expr->arguments();
3901 DCHECK(args->length() == 3);
3902 VisitForStackValue(args->at(0));
3903 VisitForStackValue(args->at(1));
3904 VisitForStackValue(args->at(2));
3905 __ CallStub(&stub);
3906 context()->Plug(v0);
3907 }
3908
3909
3910 void FullCodeGenerator::EmitRegExpExec(CallRuntime* expr) {
3911 // Load the arguments on the stack and call the stub.
3912 RegExpExecStub stub(isolate());
3913 ZoneList<Expression*>* args = expr->arguments();
3914 DCHECK(args->length() == 4);
3915 VisitForStackValue(args->at(0));
3916 VisitForStackValue(args->at(1));
3917 VisitForStackValue(args->at(2));
3918 VisitForStackValue(args->at(3));
3919 __ CallStub(&stub);
3920 context()->Plug(v0);
3921 }
3922
3923
3924 void FullCodeGenerator::EmitValueOf(CallRuntime* expr) { 3839 void FullCodeGenerator::EmitValueOf(CallRuntime* expr) {
3925 ZoneList<Expression*>* args = expr->arguments(); 3840 ZoneList<Expression*>* args = expr->arguments();
3926 DCHECK(args->length() == 1); 3841 DCHECK(args->length() == 1);
3927 3842
3928 VisitForAccumulatorValue(args->at(0)); // Load the object. 3843 VisitForAccumulatorValue(args->at(0)); // Load the object.
3929 3844
3930 Label done; 3845 Label done;
3931 // If the object is a smi return the object. 3846 // If the object is a smi return the object.
3932 __ JumpIfSmi(v0, &done); 3847 __ JumpIfSmi(v0, &done);
3933 // If the object is not a value type, return the object. 3848 // If the object is not a value type, return the object.
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
4070 string, 3985 string,
4071 Operand(SeqTwoByteString::kHeaderSize - kHeapObjectTag)); 3986 Operand(SeqTwoByteString::kHeaderSize - kHeapObjectTag));
4072 __ dsra(index, index, 32 - 1); 3987 __ dsra(index, index, 32 - 1);
4073 __ Daddu(at, at, index); 3988 __ Daddu(at, at, index);
4074 STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0); 3989 STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0);
4075 __ sh(value, MemOperand(at)); 3990 __ sh(value, MemOperand(at));
4076 context()->Plug(string); 3991 context()->Plug(string);
4077 } 3992 }
4078 3993
4079 3994
4080 void FullCodeGenerator::EmitMathPow(CallRuntime* expr) {
4081 // Load the arguments on the stack and call the runtime function.
4082 ZoneList<Expression*>* args = expr->arguments();
4083 DCHECK(args->length() == 2);
4084 VisitForStackValue(args->at(0));
4085 VisitForStackValue(args->at(1));
4086 MathPowStub stub(isolate(), MathPowStub::ON_STACK);
4087 __ CallStub(&stub);
4088 context()->Plug(v0);
4089 }
4090
4091
4092 void FullCodeGenerator::EmitSetValueOf(CallRuntime* expr) { 3995 void FullCodeGenerator::EmitSetValueOf(CallRuntime* expr) {
4093 ZoneList<Expression*>* args = expr->arguments(); 3996 ZoneList<Expression*>* args = expr->arguments();
4094 DCHECK(args->length() == 2); 3997 DCHECK(args->length() == 2);
4095 3998
4096 VisitForStackValue(args->at(0)); // Load the object. 3999 VisitForStackValue(args->at(0)); // Load the object.
4097 VisitForAccumulatorValue(args->at(1)); // Load the value. 4000 VisitForAccumulatorValue(args->at(1)); // Load the value.
4098 __ pop(a1); // v0 = value. a1 = object. 4001 __ pop(a1); // v0 = value. a1 = object.
4099 4002
4100 Label done; 4003 Label done;
4101 // If the object is a smi, return the value. 4004 // If the object is a smi, return the value.
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
4254 VisitForAccumulatorValue(args->at(1)); 4157 VisitForAccumulatorValue(args->at(1));
4255 4158
4256 __ pop(a1); 4159 __ pop(a1);
4257 __ mov(a0, result_register()); // StringAddStub requires args in a0, a1. 4160 __ mov(a0, result_register()); // StringAddStub requires args in a0, a1.
4258 StringAddStub stub(isolate(), STRING_ADD_CHECK_BOTH, NOT_TENURED); 4161 StringAddStub stub(isolate(), STRING_ADD_CHECK_BOTH, NOT_TENURED);
4259 __ CallStub(&stub); 4162 __ CallStub(&stub);
4260 context()->Plug(v0); 4163 context()->Plug(v0);
4261 } 4164 }
4262 4165
4263 4166
4264 void FullCodeGenerator::EmitStringCompare(CallRuntime* expr) {
4265 ZoneList<Expression*>* args = expr->arguments();
4266 DCHECK_EQ(2, args->length());
4267
4268 VisitForStackValue(args->at(0));
4269 VisitForStackValue(args->at(1));
4270
4271 StringCompareStub stub(isolate());
4272 __ CallStub(&stub);
4273 context()->Plug(v0);
4274 }
4275
4276
4277 void FullCodeGenerator::EmitCallFunction(CallRuntime* expr) { 4167 void FullCodeGenerator::EmitCallFunction(CallRuntime* expr) {
4278 ZoneList<Expression*>* args = expr->arguments(); 4168 ZoneList<Expression*>* args = expr->arguments();
4279 DCHECK(args->length() >= 2); 4169 DCHECK(args->length() >= 2);
4280 4170
4281 int arg_count = args->length() - 2; // 2 ~ receiver and function. 4171 int arg_count = args->length() - 2; // 2 ~ receiver and function.
4282 for (int i = 0; i < arg_count + 1; i++) { 4172 for (int i = 0; i < arg_count + 1; i++) {
4283 VisitForStackValue(args->at(i)); 4173 VisitForStackValue(args->at(i));
4284 } 4174 }
4285 VisitForAccumulatorValue(args->last()); // Function. 4175 VisitForAccumulatorValue(args->last()); // Function.
4286 4176
(...skipping 1254 matching lines...) Expand 10 before | Expand all | Expand 10 after
5541 reinterpret_cast<uint64_t>( 5431 reinterpret_cast<uint64_t>(
5542 isolate->builtins()->OsrAfterStackCheck()->entry())); 5432 isolate->builtins()->OsrAfterStackCheck()->entry()));
5543 return OSR_AFTER_STACK_CHECK; 5433 return OSR_AFTER_STACK_CHECK;
5544 } 5434 }
5545 5435
5546 5436
5547 } // namespace internal 5437 } // namespace internal
5548 } // namespace v8 5438 } // namespace v8
5549 5439
5550 #endif // V8_TARGET_ARCH_MIPS64 5440 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/mips/full-codegen-mips.cc ('k') | src/ppc/full-codegen-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698