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

Side by Side Diff: src/compiler/mips64/code-generator-mips64.cc

Issue 2446543002: [turbofan] Support variable size argument popping in TF-generated functions (Closed)
Patch Set: Fix tests and arm64 Created 4 years, 1 month 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/compiler/mips/code-generator-mips.cc ('k') | src/compiler/raw-machine-assembler.h » ('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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/compiler/code-generator.h" 5 #include "src/compiler/code-generator.h"
6 #include "src/compilation-info.h" 6 #include "src/compilation-info.h"
7 #include "src/compiler/code-generator-impl.h" 7 #include "src/compiler/code-generator-impl.h"
8 #include "src/compiler/gap-resolver.h" 8 #include "src/compiler/gap-resolver.h"
9 #include "src/compiler/node-matchers.h" 9 #include "src/compiler/node-matchers.h"
10 #include "src/compiler/osr.h" 10 #include "src/compiler/osr.h"
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 int deopt_state_id = 712 int deopt_state_id =
713 BuildTranslation(instr, -1, 0, OutputFrameStateCombine::Ignore()); 713 BuildTranslation(instr, -1, 0, OutputFrameStateCombine::Ignore());
714 Deoptimizer::BailoutType bailout_type = 714 Deoptimizer::BailoutType bailout_type =
715 Deoptimizer::BailoutType(MiscField::decode(instr->opcode())); 715 Deoptimizer::BailoutType(MiscField::decode(instr->opcode()));
716 CodeGenResult result = AssembleDeoptimizerCall( 716 CodeGenResult result = AssembleDeoptimizerCall(
717 deopt_state_id, bailout_type, current_source_position_); 717 deopt_state_id, bailout_type, current_source_position_);
718 if (result != kSuccess) return result; 718 if (result != kSuccess) return result;
719 break; 719 break;
720 } 720 }
721 case kArchRet: 721 case kArchRet:
722 AssembleReturn(); 722 AssembleReturn(instr->InputAt(0));
723 break; 723 break;
724 case kArchStackPointer: 724 case kArchStackPointer:
725 __ mov(i.OutputRegister(), sp); 725 __ mov(i.OutputRegister(), sp);
726 break; 726 break;
727 case kArchFramePointer: 727 case kArchFramePointer:
728 __ mov(i.OutputRegister(), fp); 728 __ mov(i.OutputRegister(), fp);
729 break; 729 break;
730 case kArchParentFramePointer: 730 case kArchParentFramePointer:
731 if (frame_access_state()->has_frame()) { 731 if (frame_access_state()->has_frame()) {
732 __ ld(i.OutputRegister(), MemOperand(fp, 0)); 732 __ ld(i.OutputRegister(), MemOperand(fp, 0));
(...skipping 1538 matching lines...) Expand 10 before | Expand all | Expand 10 after
2271 } 2271 }
2272 2272
2273 const RegList saves = descriptor->CalleeSavedRegisters(); 2273 const RegList saves = descriptor->CalleeSavedRegisters();
2274 if (saves != 0) { 2274 if (saves != 0) {
2275 // Save callee-saved registers. 2275 // Save callee-saved registers.
2276 __ MultiPush(saves); 2276 __ MultiPush(saves);
2277 DCHECK(kNumCalleeSaved == base::bits::CountPopulation32(saves) + 1); 2277 DCHECK(kNumCalleeSaved == base::bits::CountPopulation32(saves) + 1);
2278 } 2278 }
2279 } 2279 }
2280 2280
2281 2281 void CodeGenerator::AssembleReturn(InstructionOperand* pop) {
2282 void CodeGenerator::AssembleReturn() {
2283 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); 2282 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
2284 2283
2285 // Restore GP registers. 2284 // Restore GP registers.
2286 const RegList saves = descriptor->CalleeSavedRegisters(); 2285 const RegList saves = descriptor->CalleeSavedRegisters();
2287 if (saves != 0) { 2286 if (saves != 0) {
2288 __ MultiPop(saves); 2287 __ MultiPop(saves);
2289 } 2288 }
2290 2289
2291 // Restore FPU registers. 2290 // Restore FPU registers.
2292 const RegList saves_fpu = descriptor->CalleeSavedFPRegisters(); 2291 const RegList saves_fpu = descriptor->CalleeSavedFPRegisters();
2293 if (saves_fpu != 0) { 2292 if (saves_fpu != 0) {
2294 __ MultiPopFPU(saves_fpu); 2293 __ MultiPopFPU(saves_fpu);
2295 } 2294 }
2296 2295
2296 MipsOperandConverter g(this, nullptr);
2297 if (descriptor->IsCFunctionCall()) { 2297 if (descriptor->IsCFunctionCall()) {
2298 AssembleDeconstructFrame(); 2298 AssembleDeconstructFrame();
2299 } else if (frame_access_state()->has_frame()) { 2299 } else if (frame_access_state()->has_frame()) {
2300 // Canonicalize JSFunction return sites for now. 2300 // Canonicalize JSFunction return sites for now unless they have an variable
2301 if (return_label_.is_bound()) { 2301 // number of stack slot pops.
2302 __ Branch(&return_label_); 2302 if (pop->IsImmediate() && g.ToConstant(pop).ToInt32() == 0) {
2303 return; 2303 if (return_label_.is_bound()) {
2304 __ Branch(&return_label_);
2305 return;
2306 } else {
2307 __ bind(&return_label_);
2308 AssembleDeconstructFrame();
2309 }
2304 } else { 2310 } else {
2305 __ bind(&return_label_);
2306 AssembleDeconstructFrame(); 2311 AssembleDeconstructFrame();
2307 } 2312 }
2308 } 2313 }
2309 int pop_count = static_cast<int>(descriptor->StackParameterCount()); 2314 int pop_count = static_cast<int>(descriptor->StackParameterCount());
2315 if (pop->IsImmediate()) {
2316 DCHECK_EQ(Constant::kInt32, g.ToConstant(pop).type());
2317 pop_count += g.ToConstant(pop).ToInt32();
2318 } else {
2319 Register pop_reg = g.ToRegister(pop);
2320 __ dsll(pop_reg, pop_reg, kPointerSizeLog2);
2321 __ Daddu(sp, sp, pop_reg);
2322 }
2310 if (pop_count != 0) { 2323 if (pop_count != 0) {
2311 __ DropAndRet(pop_count); 2324 __ DropAndRet(pop_count);
2312 } else { 2325 } else {
2313 __ Ret(); 2326 __ Ret();
2314 } 2327 }
2315 } 2328 }
2316 2329
2317 2330
2318 void CodeGenerator::AssembleMove(InstructionOperand* source, 2331 void CodeGenerator::AssembleMove(InstructionOperand* source,
2319 InstructionOperand* destination) { 2332 InstructionOperand* destination) {
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
2526 padding_size -= v8::internal::Assembler::kInstrSize; 2539 padding_size -= v8::internal::Assembler::kInstrSize;
2527 } 2540 }
2528 } 2541 }
2529 } 2542 }
2530 2543
2531 #undef __ 2544 #undef __
2532 2545
2533 } // namespace compiler 2546 } // namespace compiler
2534 } // namespace internal 2547 } // namespace internal
2535 } // namespace v8 2548 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/mips/code-generator-mips.cc ('k') | src/compiler/raw-machine-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698