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

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

Issue 1196193014: Do not add extra argument for new.target (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Comment added Created 5 years, 6 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 #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 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 // derived constructors with super calls. 248 // derived constructors with super calls.
249 Variable* this_function_var = scope()->this_function_var(); 249 Variable* this_function_var = scope()->this_function_var();
250 if (this_function_var != nullptr) { 250 if (this_function_var != nullptr) {
251 Comment cmnt(masm_, "[ This function"); 251 Comment cmnt(masm_, "[ This function");
252 SetVar(this_function_var, a1, a2, a3); 252 SetVar(this_function_var, a1, a2, a3);
253 } 253 }
254 254
255 Variable* new_target_var = scope()->new_target_var(); 255 Variable* new_target_var = scope()->new_target_var();
256 if (new_target_var != nullptr) { 256 if (new_target_var != nullptr) {
257 Comment cmnt(masm_, "[ new.target"); 257 Comment cmnt(masm_, "[ new.target");
258 // new.target is parameter -2. 258 // Get the frame pointer for the calling frame.
259 int offset = 2 * kPointerSize + 259 __ ld(a2, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
260 (info_->scope()->num_parameters() + 1) * kPointerSize; 260
261 __ ld(v0, MemOperand(fp, offset)); 261 // Skip the arguments adaptor frame if it exists.
262 Label check_frame_marker;
263 __ ld(a1, MemOperand(a2, StandardFrameConstants::kContextOffset));
264 __ Branch(&check_frame_marker, ne, a1,
265 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
266 __ ld(a2, MemOperand(a2, StandardFrameConstants::kCallerFPOffset));
267
268 // Check the marker in the calling frame.
269 __ bind(&check_frame_marker);
270 __ ld(a1, MemOperand(a2, StandardFrameConstants::kMarkerOffset));
271
272 Label non_construct_frame, done;
273 __ Branch(&non_construct_frame, ne, a1,
274 Operand(Smi::FromInt(StackFrame::CONSTRUCT)));
275
276 __ ld(v0, MemOperand(a2, StandardFrameConstants::kExpressionsOffset -
277 2 * kPointerSize));
278 __ Branch(&done);
279
280 __ bind(&non_construct_frame);
281 __ LoadRoot(v0, Heap::kUndefinedValueRootIndex);
282 __ bind(&done);
283
262 SetVar(new_target_var, v0, a2, a3); 284 SetVar(new_target_var, v0, a2, a3);
263 } 285 }
264 286
265 ArgumentsAccessStub::HasNewTarget has_new_target =
266 IsSubclassConstructor(info->function()->kind())
267 ? ArgumentsAccessStub::HAS_NEW_TARGET
268 : ArgumentsAccessStub::NO_NEW_TARGET;
269
270 // Possibly allocate RestParameters 287 // Possibly allocate RestParameters
271 int rest_index; 288 int rest_index;
272 Variable* rest_param = scope()->rest_parameter(&rest_index); 289 Variable* rest_param = scope()->rest_parameter(&rest_index);
273 if (rest_param) { 290 if (rest_param) {
274 Comment cmnt(masm_, "[ Allocate rest parameter array"); 291 Comment cmnt(masm_, "[ Allocate rest parameter array");
275 292
276 int num_parameters = info->scope()->num_parameters(); 293 int num_parameters = info->scope()->num_parameters();
277 int offset = num_parameters * kPointerSize; 294 int offset = num_parameters * kPointerSize;
278 if (has_new_target == ArgumentsAccessStub::HAS_NEW_TARGET) {
279 --num_parameters;
280 ++rest_index;
281 }
282 295
283 __ Daddu(a3, fp, 296 __ Daddu(a3, fp,
284 Operand(StandardFrameConstants::kCallerSPOffset + offset)); 297 Operand(StandardFrameConstants::kCallerSPOffset + offset));
285 __ li(a2, Operand(Smi::FromInt(num_parameters))); 298 __ li(a2, Operand(Smi::FromInt(num_parameters)));
286 __ li(a1, Operand(Smi::FromInt(rest_index))); 299 __ li(a1, Operand(Smi::FromInt(rest_index)));
287 __ li(a0, Operand(Smi::FromInt(language_mode()))); 300 __ li(a0, Operand(Smi::FromInt(language_mode())));
288 __ Push(a3, a2, a1, a0); 301 __ Push(a3, a2, a1, a0);
289 302
290 RestParamAccessStub stub(isolate()); 303 RestParamAccessStub stub(isolate());
291 __ CallStub(&stub); 304 __ CallStub(&stub);
(...skipping 24 matching lines...) Expand all
316 // The stub will rewrite receiever and parameter count if the previous 329 // The stub will rewrite receiever and parameter count if the previous
317 // stack frame was an arguments adapter frame. 330 // stack frame was an arguments adapter frame.
318 ArgumentsAccessStub::Type type; 331 ArgumentsAccessStub::Type type;
319 if (is_strict(language_mode()) || !is_simple_parameter_list()) { 332 if (is_strict(language_mode()) || !is_simple_parameter_list()) {
320 type = ArgumentsAccessStub::NEW_STRICT; 333 type = ArgumentsAccessStub::NEW_STRICT;
321 } else if (function()->has_duplicate_parameters()) { 334 } else if (function()->has_duplicate_parameters()) {
322 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; 335 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW;
323 } else { 336 } else {
324 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; 337 type = ArgumentsAccessStub::NEW_SLOPPY_FAST;
325 } 338 }
326 ArgumentsAccessStub stub(isolate(), type, has_new_target); 339 ArgumentsAccessStub stub(isolate(), type);
327 __ CallStub(&stub); 340 __ CallStub(&stub);
328 341
329 SetVar(arguments, v0, a1, a2); 342 SetVar(arguments, v0, a1, a2);
330 } 343 }
331 344
332 if (FLAG_trace) { 345 if (FLAG_trace) {
333 __ CallRuntime(Runtime::kTraceEnter, 0); 346 __ CallRuntime(Runtime::kTraceEnter, 0);
334 } 347 }
335 // Visit the declarations and body unless there is an illegal 348 // Visit the declarations and body unless there is an illegal
336 // redeclaration. 349 // redeclaration.
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 // Add a label for checking the size of the code used for returning. 490 // Add a label for checking the size of the code used for returning.
478 Label check_exit_codesize; 491 Label check_exit_codesize;
479 masm_->bind(&check_exit_codesize); 492 masm_->bind(&check_exit_codesize);
480 #endif 493 #endif
481 // Make sure that the constant pool is not emitted inside of the return 494 // Make sure that the constant pool is not emitted inside of the return
482 // sequence. 495 // sequence.
483 { Assembler::BlockTrampolinePoolScope block_trampoline_pool(masm_); 496 { Assembler::BlockTrampolinePoolScope block_trampoline_pool(masm_);
484 // Here we use masm_-> instead of the __ macro to avoid the code coverage 497 // Here we use masm_-> instead of the __ macro to avoid the code coverage
485 // tool from instrumenting as we rely on the code size here. 498 // tool from instrumenting as we rely on the code size here.
486 int32_t arg_count = info_->scope()->num_parameters() + 1; 499 int32_t arg_count = info_->scope()->num_parameters() + 1;
487 if (IsSubclassConstructor(info_->function()->kind())) {
488 arg_count++;
489 }
490 int32_t sp_delta = arg_count * kPointerSize; 500 int32_t sp_delta = arg_count * kPointerSize;
491 CodeGenerator::RecordPositions(masm_, function()->end_position() - 1); 501 CodeGenerator::RecordPositions(masm_, function()->end_position() - 1);
492 __ RecordJSReturn(); 502 __ RecordJSReturn();
493 masm_->mov(sp, fp); 503 masm_->mov(sp, fp);
494 int no_frame_start = masm_->pc_offset(); 504 int no_frame_start = masm_->pc_offset();
495 masm_->MultiPop(static_cast<RegList>(fp.bit() | ra.bit())); 505 masm_->MultiPop(static_cast<RegList>(fp.bit() | ra.bit()));
496 masm_->Daddu(sp, sp, Operand(sp_delta)); 506 masm_->Daddu(sp, sp, Operand(sp_delta));
497 masm_->Jump(ra); 507 masm_->Jump(ra);
498 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset()); 508 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset());
499 } 509 }
(...skipping 3777 matching lines...) Expand 10 before | Expand all | Expand 10 after
4277 // default constructor has no arguments, so no adaptor frame means no args. 4287 // default constructor has no arguments, so no adaptor frame means no args.
4278 __ mov(a0, zero_reg); 4288 __ mov(a0, zero_reg);
4279 __ Branch(&args_set_up); 4289 __ Branch(&args_set_up);
4280 4290
4281 // Copy arguments from adaptor frame. 4291 // Copy arguments from adaptor frame.
4282 { 4292 {
4283 __ bind(&adaptor_frame); 4293 __ bind(&adaptor_frame);
4284 __ ld(a1, MemOperand(a2, ArgumentsAdaptorFrameConstants::kLengthOffset)); 4294 __ ld(a1, MemOperand(a2, ArgumentsAdaptorFrameConstants::kLengthOffset));
4285 __ SmiUntag(a1, a1); 4295 __ SmiUntag(a1, a1);
4286 4296
4287 // Subtract 1 from arguments count, for new.target.
4288 __ Daddu(a1, a1, Operand(-1));
4289 __ mov(a0, a1); 4297 __ mov(a0, a1);
4290 4298
4291 // Get arguments pointer in a2. 4299 // Get arguments pointer in a2.
4292 __ dsll(at, a1, kPointerSizeLog2); 4300 __ dsll(at, a1, kPointerSizeLog2);
4293 __ Daddu(a2, a2, Operand(at)); 4301 __ Daddu(a2, a2, Operand(at));
4294 __ Daddu(a2, a2, Operand(StandardFrameConstants::kCallerSPOffset)); 4302 __ Daddu(a2, a2, Operand(StandardFrameConstants::kCallerSPOffset));
4295 Label loop; 4303 Label loop;
4296 __ bind(&loop); 4304 __ bind(&loop);
4297 // Pre-decrement a2 with kPointerSize on each iteration. 4305 // Pre-decrement a2 with kPointerSize on each iteration.
4298 // Pre-decrement in order to skip receiver. 4306 // Pre-decrement in order to skip receiver.
(...skipping 1261 matching lines...) Expand 10 before | Expand all | Expand 10 after
5560 reinterpret_cast<uint64_t>( 5568 reinterpret_cast<uint64_t>(
5561 isolate->builtins()->OsrAfterStackCheck()->entry())); 5569 isolate->builtins()->OsrAfterStackCheck()->entry()));
5562 return OSR_AFTER_STACK_CHECK; 5570 return OSR_AFTER_STACK_CHECK;
5563 } 5571 }
5564 5572
5565 5573
5566 } // namespace internal 5574 } // namespace internal
5567 } // namespace v8 5575 } // namespace v8
5568 5576
5569 #endif // V8_TARGET_ARCH_MIPS64 5577 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698