Chromium Code Reviews| 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/base/adapters.h" | 5 #include "src/base/adapters.h" |
| 6 #include "src/base/bits.h" | 6 #include "src/base/bits.h" |
| 7 #include "src/compiler/instruction-selector-impl.h" | 7 #include "src/compiler/instruction-selector-impl.h" |
| 8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
| 9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
| 10 | 10 |
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 388 } | 388 } |
| 389 } | 389 } |
| 390 VisitRRO(this, kMipsShr, node); | 390 VisitRRO(this, kMipsShr, node); |
| 391 } | 391 } |
| 392 | 392 |
| 393 | 393 |
| 394 void InstructionSelector::VisitWord32Sar(Node* node) { | 394 void InstructionSelector::VisitWord32Sar(Node* node) { |
| 395 VisitRRO(this, kMipsSar, node); | 395 VisitRRO(this, kMipsSar, node); |
| 396 } | 396 } |
| 397 | 397 |
| 398 void InstructionSelector::VisitInt32PairAdd(Node* node) { UNIMPLEMENTED(); } | 398 void InstructionSelector::VisitInt32PairAdd(Node* node) { |
| 399 MipsOperandGenerator g(this); | |
| 399 | 400 |
| 400 void InstructionSelector::VisitInt32PairSub(Node* node) { UNIMPLEMENTED(); } | 401 // We use UseUniqueRegister here to avoid register sharing with the output |
| 402 // register. | |
| 403 InstructionOperand inputs[] = {g.UseUniqueRegister(node->InputAt(0)), | |
| 404 g.UseUniqueRegister(node->InputAt(1)), | |
| 405 g.UseUniqueRegister(node->InputAt(2)), | |
| 406 g.UseUniqueRegister(node->InputAt(3))}; | |
| 407 InstructionOperand outputs[] = { | |
| 408 g.DefineAsRegister(node), | |
| 409 g.DefineAsRegister(NodeProperties::FindProjection(node, 1))}; | |
| 410 Emit(kMipsAddPair, 2, outputs, 4, inputs); | |
| 411 } | |
| 412 | |
| 413 void InstructionSelector::VisitInt32PairSub(Node* node) { | |
| 414 MipsOperandGenerator g(this); | |
| 415 | |
| 416 // We use UseUniqueRegister here to avoid register sharing with the output | |
| 417 // register. | |
| 418 InstructionOperand inputs[] = {g.UseUniqueRegister(node->InputAt(0)), | |
| 419 g.UseUniqueRegister(node->InputAt(1)), | |
| 420 g.UseUniqueRegister(node->InputAt(2)), | |
| 421 g.UseUniqueRegister(node->InputAt(3))}; | |
| 422 InstructionOperand outputs[] = { | |
| 423 g.DefineAsRegister(node), | |
| 424 g.DefineAsRegister(NodeProperties::FindProjection(node, 1))}; | |
| 425 Emit(kMipsSubPair, 2, outputs, 4, inputs); | |
| 426 } | |
|
balazs.kilvady
2016/04/05 11:13:16
I like the VisitWord32PairShift() refactoring belo
Marija Antic
2016/04/05 12:28:34
Done.
| |
| 401 | 427 |
| 402 void InstructionSelector::VisitInt32PairMul(Node* node) { UNIMPLEMENTED(); } | 428 void InstructionSelector::VisitInt32PairMul(Node* node) { UNIMPLEMENTED(); } |
| 403 | 429 |
| 404 void InstructionSelector::VisitWord32PairShl(Node* node) { UNIMPLEMENTED(); } | 430 // Shared routine for multiple shift operations. |
| 431 static void VisitWord32PairShift(InstructionSelector* selector, | |
| 432 InstructionCode opcode, Node* node) { | |
| 433 MipsOperandGenerator g(selector); | |
| 434 Int32Matcher m(node->InputAt(2)); | |
| 435 InstructionOperand shift_operand; | |
| 436 if (m.HasValue()) { | |
| 437 shift_operand = g.UseImmediate(m.node()); | |
| 438 } else { | |
| 439 shift_operand = g.UseUniqueRegister(m.node()); | |
| 440 } | |
| 405 | 441 |
| 406 void InstructionSelector::VisitWord32PairShr(Node* node) { UNIMPLEMENTED(); } | 442 // We use UseUniqueRegister here to avoid register sharing with the output |
| 443 // register. | |
| 444 InstructionOperand inputs[] = {g.UseUniqueRegister(node->InputAt(0)), | |
| 445 g.UseUniqueRegister(node->InputAt(1)), | |
| 446 shift_operand}; | |
| 407 | 447 |
| 408 void InstructionSelector::VisitWord32PairSar(Node* node) { UNIMPLEMENTED(); } | 448 InstructionOperand outputs[] = { |
| 449 g.DefineAsRegister(node), | |
| 450 g.DefineAsRegister(NodeProperties::FindProjection(node, 1))}; | |
| 451 | |
| 452 selector->Emit(opcode, 2, outputs, 3, inputs); | |
| 453 } | |
| 454 | |
| 455 void InstructionSelector::VisitWord32PairShl(Node* node) { | |
| 456 VisitWord32PairShift(this, kMipsShlPair, node); | |
| 457 } | |
| 458 | |
| 459 void InstructionSelector::VisitWord32PairShr(Node* node) { | |
| 460 VisitWord32PairShift(this, kMipsShrPair, node); | |
| 461 } | |
| 462 | |
| 463 void InstructionSelector::VisitWord32PairSar(Node* node) { | |
| 464 VisitWord32PairShift(this, kMipsSarPair, node); | |
| 465 } | |
| 409 | 466 |
| 410 void InstructionSelector::VisitWord32Ror(Node* node) { | 467 void InstructionSelector::VisitWord32Ror(Node* node) { |
| 411 VisitRRO(this, kMipsRor, node); | 468 VisitRRO(this, kMipsRor, node); |
| 412 } | 469 } |
| 413 | 470 |
| 414 | 471 |
| 415 void InstructionSelector::VisitWord32Clz(Node* node) { | 472 void InstructionSelector::VisitWord32Clz(Node* node) { |
| 416 VisitRR(this, kMipsClz, node); | 473 VisitRR(this, kMipsClz, node); |
| 417 } | 474 } |
| 418 | 475 |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 979 : g.UseRegister(length) | 1036 : g.UseRegister(length) |
| 980 : g.UseRegister(length); | 1037 : g.UseRegister(length); |
| 981 | 1038 |
| 982 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), | 1039 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), |
| 983 offset_operand, length_operand, g.UseRegister(value), | 1040 offset_operand, length_operand, g.UseRegister(value), |
| 984 g.UseRegister(buffer)); | 1041 g.UseRegister(buffer)); |
| 985 } | 1042 } |
| 986 | 1043 |
| 987 | 1044 |
| 988 namespace { | 1045 namespace { |
| 989 | |
| 990 // Shared routine for multiple compare operations. | 1046 // Shared routine for multiple compare operations. |
| 991 static void VisitCompare(InstructionSelector* selector, InstructionCode opcode, | 1047 static void VisitCompare(InstructionSelector* selector, InstructionCode opcode, |
| 992 InstructionOperand left, InstructionOperand right, | 1048 InstructionOperand left, InstructionOperand right, |
| 993 FlagsContinuation* cont) { | 1049 FlagsContinuation* cont) { |
| 994 MipsOperandGenerator g(selector); | 1050 MipsOperandGenerator g(selector); |
| 995 opcode = cont->Encode(opcode); | 1051 opcode = cont->Encode(opcode); |
| 996 if (cont->IsBranch()) { | 1052 if (cont->IsBranch()) { |
| 997 selector->Emit(opcode, g.NoOutput(), left, right, | 1053 selector->Emit(opcode, g.NoOutput(), left, right, |
| 998 g.Label(cont->true_block()), g.Label(cont->false_block())); | 1054 g.Label(cont->true_block()), g.Label(cont->false_block())); |
| 999 } else if (cont->IsDeoptimize()) { | 1055 } else if (cont->IsDeoptimize()) { |
| (...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1398 MachineOperatorBuilder::kFloat32Max | | 1454 MachineOperatorBuilder::kFloat32Max | |
| 1399 MachineOperatorBuilder::kFloat32RoundDown | | 1455 MachineOperatorBuilder::kFloat32RoundDown | |
| 1400 MachineOperatorBuilder::kFloat32RoundUp | | 1456 MachineOperatorBuilder::kFloat32RoundUp | |
| 1401 MachineOperatorBuilder::kFloat32RoundTruncate | | 1457 MachineOperatorBuilder::kFloat32RoundTruncate | |
| 1402 MachineOperatorBuilder::kFloat32RoundTiesEven; | 1458 MachineOperatorBuilder::kFloat32RoundTiesEven; |
| 1403 } | 1459 } |
| 1404 | 1460 |
| 1405 } // namespace compiler | 1461 } // namespace compiler |
| 1406 } // namespace internal | 1462 } // namespace internal |
| 1407 } // namespace v8 | 1463 } // namespace v8 |
| OLD | NEW |