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

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

Issue 1706283002: [fullcodegen] Implement operand stack depth tracking. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Ported to MIPS. Created 4 years, 10 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
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_MIPS64 5 #if V8_TARGET_ARCH_MIPS64
6 6
7 // Note on Mips implementation: 7 // Note on Mips implementation:
8 // 8 //
9 // The result_register() for mips is the 'v0' register, which is defined 9 // The result_register() for mips is the 'v0' register, which is defined
10 // by the ABI to contain function return values. However, the first 10 // by the ABI to contain function return values. However, the first
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 if (true_label_ != fall_through_) __ Branch(true_label_); 544 if (true_label_ != fall_through_) __ Branch(true_label_);
545 } 545 }
546 } else { 546 } else {
547 // For simplicity we always test the accumulator register. 547 // For simplicity we always test the accumulator register.
548 __ li(result_register(), Operand(lit)); 548 __ li(result_register(), Operand(lit));
549 codegen()->DoTest(this); 549 codegen()->DoTest(this);
550 } 550 }
551 } 551 }
552 552
553 553
554 void FullCodeGenerator::EffectContext::DropAndPlug(int count,
555 Register reg) const {
556 DCHECK(count > 0);
557 __ Drop(count);
558 }
559
560
561 void FullCodeGenerator::AccumulatorValueContext::DropAndPlug(
562 int count,
563 Register reg) const {
564 DCHECK(count > 0);
565 __ Drop(count);
566 __ Move(result_register(), reg);
567 }
568
569
570 void FullCodeGenerator::StackValueContext::DropAndPlug(int count, 554 void FullCodeGenerator::StackValueContext::DropAndPlug(int count,
571 Register reg) const { 555 Register reg) const {
572 DCHECK(count > 0); 556 DCHECK(count > 0);
573 if (count > 1) __ Drop(count - 1); 557 if (count > 1) __ Drop(count - 1);
574 __ sd(reg, MemOperand(sp, 0)); 558 __ sd(reg, MemOperand(sp, 0));
575 } 559 }
576 560
577 561
578 void FullCodeGenerator::TestContext::DropAndPlug(int count,
579 Register reg) const {
580 DCHECK(count > 0);
581 // For simplicity we always test the accumulator register.
582 __ Drop(count);
583 __ Move(result_register(), reg);
584 codegen()->PrepareForBailoutBeforeSplit(condition(), false, NULL, NULL);
585 codegen()->DoTest(this);
586 }
587
588
589 void FullCodeGenerator::EffectContext::Plug(Label* materialize_true, 562 void FullCodeGenerator::EffectContext::Plug(Label* materialize_true,
590 Label* materialize_false) const { 563 Label* materialize_false) const {
591 DCHECK(materialize_true == materialize_false); 564 DCHECK(materialize_true == materialize_false);
592 __ bind(materialize_true); 565 __ bind(materialize_true);
593 } 566 }
594 567
595 568
596 void FullCodeGenerator::AccumulatorValueContext::Plug( 569 void FullCodeGenerator::AccumulatorValueContext::Plug(
597 Label* materialize_true, 570 Label* materialize_true,
598 Label* materialize_false) const { 571 Label* materialize_false) const {
(...skipping 1495 matching lines...) Expand 10 before | Expand all | Expand 10 after
2094 Literal* key = prop->key()->AsLiteral(); 2067 Literal* key = prop->key()->AsLiteral();
2095 DCHECK(!prop->IsSuperAccess()); 2068 DCHECK(!prop->IsSuperAccess());
2096 2069
2097 __ li(LoadDescriptor::NameRegister(), Operand(key->value())); 2070 __ li(LoadDescriptor::NameRegister(), Operand(key->value()));
2098 __ li(LoadDescriptor::SlotRegister(), 2071 __ li(LoadDescriptor::SlotRegister(),
2099 Operand(SmiFromSlot(prop->PropertyFeedbackSlot()))); 2072 Operand(SmiFromSlot(prop->PropertyFeedbackSlot())));
2100 CallLoadIC(NOT_INSIDE_TYPEOF); 2073 CallLoadIC(NOT_INSIDE_TYPEOF);
2101 } 2074 }
2102 2075
2103 2076
2104 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
2105 // Stack: receiver, home_object.
2106 SetExpressionPosition(prop);
2107
2108 Literal* key = prop->key()->AsLiteral();
2109 DCHECK(!key->value()->IsSmi());
2110 DCHECK(prop->IsSuperAccess());
2111
2112 __ Push(key->value());
2113 __ CallRuntime(Runtime::kLoadFromSuper);
2114 }
2115
2116
2117 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
2118 // Call keyed load IC. It has register arguments receiver and key.
2119 SetExpressionPosition(prop);
2120
2121 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
2122 __ li(LoadDescriptor::SlotRegister(),
2123 Operand(SmiFromSlot(prop->PropertyFeedbackSlot())));
2124 CallIC(ic);
2125 }
2126
2127
2128 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) {
2129 // Stack: receiver, home_object, key.
2130 SetExpressionPosition(prop);
2131 __ CallRuntime(Runtime::kLoadKeyedFromSuper);
2132 }
2133
2134
2135 void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr, 2077 void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr,
2136 Token::Value op, 2078 Token::Value op,
2137 Expression* left_expr, 2079 Expression* left_expr,
2138 Expression* right_expr) { 2080 Expression* right_expr) {
2139 Label done, smi_case, stub_call; 2081 Label done, smi_case, stub_call;
2140 2082
2141 Register scratch1 = a2; 2083 Register scratch1 = a2;
2142 Register scratch2 = a3; 2084 Register scratch2 = a3;
2143 2085
2144 // Get the arguments. 2086 // Get the arguments.
(...skipping 2136 matching lines...) Expand 10 before | Expand all | Expand 10 after
4281 reinterpret_cast<uint64_t>( 4223 reinterpret_cast<uint64_t>(
4282 isolate->builtins()->OsrAfterStackCheck()->entry())); 4224 isolate->builtins()->OsrAfterStackCheck()->entry()));
4283 return OSR_AFTER_STACK_CHECK; 4225 return OSR_AFTER_STACK_CHECK;
4284 } 4226 }
4285 4227
4286 4228
4287 } // namespace internal 4229 } // namespace internal
4288 } // namespace v8 4230 } // namespace v8
4289 4231
4290 #endif // V8_TARGET_ARCH_MIPS64 4232 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698