OLD | NEW |
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/instruction-selector.h" | 5 #include "src/compiler/instruction-selector.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/base/adapters.h" | 9 #include "src/base/adapters.h" |
10 #include "src/compiler/instruction-selector-impl.h" | 10 #include "src/compiler/instruction-selector-impl.h" |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 switch (buffer->descriptor->kind()) { | 329 switch (buffer->descriptor->kind()) { |
330 case CallDescriptor::kCallCodeObject: | 330 case CallDescriptor::kCallCodeObject: |
331 buffer->instruction_args.push_back( | 331 buffer->instruction_args.push_back( |
332 (call_code_immediate && callee->opcode() == IrOpcode::kHeapConstant) | 332 (call_code_immediate && callee->opcode() == IrOpcode::kHeapConstant) |
333 ? g.UseImmediate(callee) | 333 ? g.UseImmediate(callee) |
334 : g.UseRegister(callee)); | 334 : g.UseRegister(callee)); |
335 break; | 335 break; |
336 case CallDescriptor::kCallAddress: | 336 case CallDescriptor::kCallAddress: |
337 buffer->instruction_args.push_back( | 337 buffer->instruction_args.push_back( |
338 (call_address_immediate && | 338 (call_address_immediate && |
339 (callee->opcode() == IrOpcode::kInt32Constant || | 339 callee->opcode() == IrOpcode::kExternalConstant) |
340 callee->opcode() == IrOpcode::kInt64Constant)) | |
341 ? g.UseImmediate(callee) | 340 ? g.UseImmediate(callee) |
342 : g.UseRegister(callee)); | 341 : g.UseRegister(callee)); |
343 break; | 342 break; |
344 case CallDescriptor::kCallJSFunction: | 343 case CallDescriptor::kCallJSFunction: |
345 buffer->instruction_args.push_back( | 344 buffer->instruction_args.push_back( |
346 g.UseLocation(callee, buffer->descriptor->GetInputLocation(0), | 345 g.UseLocation(callee, buffer->descriptor->GetInputLocation(0), |
347 buffer->descriptor->GetInputType(0))); | 346 buffer->descriptor->GetInputType(0))); |
348 break; | 347 break; |
349 } | 348 } |
350 DCHECK_EQ(1u, buffer->instruction_args.size()); | 349 DCHECK_EQ(1u, buffer->instruction_args.size()); |
(...skipping 15 matching lines...) Expand all Loading... |
366 DCHECK(1 + buffer->frame_state_value_count() == | 365 DCHECK(1 + buffer->frame_state_value_count() == |
367 buffer->instruction_args.size()); | 366 buffer->instruction_args.size()); |
368 | 367 |
369 size_t input_count = static_cast<size_t>(buffer->input_count()); | 368 size_t input_count = static_cast<size_t>(buffer->input_count()); |
370 | 369 |
371 // Split the arguments into pushed_nodes and instruction_args. Pushed | 370 // Split the arguments into pushed_nodes and instruction_args. Pushed |
372 // arguments require an explicit push instruction before the call and do | 371 // arguments require an explicit push instruction before the call and do |
373 // not appear as arguments to the call. Everything else ends up | 372 // not appear as arguments to the call. Everything else ends up |
374 // as an InstructionOperand argument to the call. | 373 // as an InstructionOperand argument to the call. |
375 auto iter(call->inputs().begin()); | 374 auto iter(call->inputs().begin()); |
376 int pushed_count = 0; | 375 size_t pushed_count = 0; |
377 for (size_t index = 0; index < input_count; ++iter, ++index) { | 376 for (size_t index = 0; index < input_count; ++iter, ++index) { |
378 DCHECK(iter != call->inputs().end()); | 377 DCHECK(iter != call->inputs().end()); |
379 DCHECK((*iter)->op()->opcode() != IrOpcode::kFrameState); | 378 DCHECK((*iter)->op()->opcode() != IrOpcode::kFrameState); |
380 if (index == 0) continue; // The first argument (callee) is already done. | 379 if (index == 0) continue; // The first argument (callee) is already done. |
381 InstructionOperand op = | 380 InstructionOperand op = |
382 g.UseLocation(*iter, buffer->descriptor->GetInputLocation(index), | 381 g.UseLocation(*iter, buffer->descriptor->GetInputLocation(index), |
383 buffer->descriptor->GetInputType(index)); | 382 buffer->descriptor->GetInputType(index)); |
384 if (UnallocatedOperand::cast(op).HasFixedSlotPolicy()) { | 383 if (UnallocatedOperand::cast(op).HasFixedSlotPolicy()) { |
385 int stack_index = -UnallocatedOperand::cast(op).fixed_slot_index() - 1; | 384 int stack_index = -UnallocatedOperand::cast(op).fixed_slot_index() - 1; |
386 if (static_cast<size_t>(stack_index) >= buffer->pushed_nodes.size()) { | 385 if (static_cast<size_t>(stack_index) >= buffer->pushed_nodes.size()) { |
387 buffer->pushed_nodes.resize(stack_index + 1, NULL); | 386 buffer->pushed_nodes.resize(stack_index + 1, NULL); |
388 } | 387 } |
389 DCHECK(!buffer->pushed_nodes[stack_index]); | 388 DCHECK(!buffer->pushed_nodes[stack_index]); |
390 buffer->pushed_nodes[stack_index] = *iter; | 389 buffer->pushed_nodes[stack_index] = *iter; |
391 pushed_count++; | 390 pushed_count++; |
392 } else { | 391 } else { |
393 buffer->instruction_args.push_back(op); | 392 buffer->instruction_args.push_back(op); |
394 } | 393 } |
395 } | 394 } |
396 CHECK_EQ(pushed_count, static_cast<int>(buffer->pushed_nodes.size())); | 395 DCHECK_EQ(input_count, buffer->instruction_args.size() + pushed_count - |
397 DCHECK(static_cast<size_t>(input_count) == | 396 buffer->frame_state_value_count()); |
398 (buffer->instruction_args.size() + buffer->pushed_nodes.size() - | |
399 buffer->frame_state_value_count())); | |
400 } | 397 } |
401 | 398 |
402 | 399 |
403 void InstructionSelector::VisitBlock(BasicBlock* block) { | 400 void InstructionSelector::VisitBlock(BasicBlock* block) { |
404 DCHECK(!current_block_); | 401 DCHECK(!current_block_); |
405 current_block_ = block; | 402 current_block_ = block; |
406 int current_block_end = static_cast<int>(instructions_.size()); | 403 int current_block_end = static_cast<int>(instructions_.size()); |
407 | 404 |
408 // Generate code for the block control "top down", but schedule the code | 405 // Generate code for the block control "top down", but schedule the code |
409 // "bottom up". | 406 // "bottom up". |
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 MachineOperatorBuilder::Flags | 1152 MachineOperatorBuilder::Flags |
1156 InstructionSelector::SupportedMachineOperatorFlags() { | 1153 InstructionSelector::SupportedMachineOperatorFlags() { |
1157 return MachineOperatorBuilder::Flag::kNoFlags; | 1154 return MachineOperatorBuilder::Flag::kNoFlags; |
1158 } | 1155 } |
1159 | 1156 |
1160 #endif // !V8_TURBOFAN_BACKEND | 1157 #endif // !V8_TURBOFAN_BACKEND |
1161 | 1158 |
1162 } // namespace compiler | 1159 } // namespace compiler |
1163 } // namespace internal | 1160 } // namespace internal |
1164 } // namespace v8 | 1161 } // namespace v8 |
OLD | NEW |