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

Side by Side Diff: src/compiler/x64/instruction-selector-x64.cc

Issue 1845043004: [x64] Optimize loading SMIs. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Update. Created 4 years, 8 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
« no previous file with comments | « no previous file | no next file » | 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 <algorithm> 5 #include <algorithm>
6 6
7 #include "src/base/adapters.h" 7 #include "src/base/adapters.h"
8 #include "src/compiler/instruction-selector-impl.h" 8 #include "src/compiler/instruction-selector-impl.h"
9 #include "src/compiler/node-matchers.h" 9 #include "src/compiler/node-matchers.h"
10 #include "src/compiler/node-properties.h" 10 #include "src/compiler/node-properties.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 return rep == MachineRepresentation::kWord16; 56 return rep == MachineRepresentation::kWord16;
57 case kX64Cmp8: 57 case kX64Cmp8:
58 case kX64Test8: 58 case kX64Test8:
59 return rep == MachineRepresentation::kWord8; 59 return rep == MachineRepresentation::kWord8;
60 default: 60 default:
61 break; 61 break;
62 } 62 }
63 return false; 63 return false;
64 } 64 }
65 65
66 AddressingMode EnsureHasDisplacement(
67 const BaseWithIndexAndDisplacement64Matcher& matcher,
68 AddressingMode mode) {
69 if (matcher.displacement() != nullptr) {
70 return mode;
71 }
72 DCHECK(mode == kMode_MR || (kMode_MR1 <= mode && mode <= kMode_MR8) ||
Benedikt Meurer 2016/04/01 08:33:00 As discussed offline, please do a switch here. And
epertoso 2016/04/01 09:16:44 Done.
73 (kMode_M4 == mode || kMode_M8 == mode));
74 return mode == kMode_MR ? kMode_MRI : static_cast<AddressingMode>(mode + 4);
75 }
76
66 AddressingMode GenerateMemoryOperandInputs(Node* index, int scale_exponent, 77 AddressingMode GenerateMemoryOperandInputs(Node* index, int scale_exponent,
67 Node* base, Node* displacement, 78 Node* base, Node* displacement,
68 InstructionOperand inputs[], 79 InstructionOperand inputs[],
69 size_t* input_count) { 80 size_t* input_count) {
70 AddressingMode mode = kMode_MRI; 81 AddressingMode mode = kMode_MRI;
71 if (base != nullptr) { 82 if (base != nullptr) {
72 inputs[(*input_count)++] = UseRegister(base); 83 inputs[(*input_count)++] = UseRegister(base);
73 if (index != nullptr) { 84 if (index != nullptr) {
74 DCHECK(scale_exponent >= 0 && scale_exponent <= 3); 85 DCHECK(scale_exponent >= 0 && scale_exponent <= 3);
75 inputs[(*input_count)++] = UseRegister(index); 86 inputs[(*input_count)++] = UseRegister(index);
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 } else if (mleft.right().Is(24) && m.right().Is(24)) { 622 } else if (mleft.right().Is(24) && m.right().Is(24)) {
612 Emit(kX64Movsxbl, g.DefineAsRegister(node), g.Use(mleft.left().node())); 623 Emit(kX64Movsxbl, g.DefineAsRegister(node), g.Use(mleft.left().node()));
613 return; 624 return;
614 } 625 }
615 } 626 }
616 VisitWord32Shift(this, node, kX64Sar32); 627 VisitWord32Shift(this, node, kX64Sar32);
617 } 628 }
618 629
619 630
620 void InstructionSelector::VisitWord64Sar(Node* node) { 631 void InstructionSelector::VisitWord64Sar(Node* node) {
632 X64OperandGenerator g(this);
633 Int64BinopMatcher m(node);
634 if (CanCover(m.node(), m.left().node()) && m.left().IsLoad() &&
635 m.right().Is(32)) {
636 // Just load and sign-extend the interesting 4 bytes instead. This happens,
637 // for example, when we're loading and untagging SMIs.
638 BaseWithIndexAndDisplacement64Matcher mleft(m.left().node(), true);
639 if (mleft.matches() && (mleft.displacement() == nullptr ||
640 g.CanBeImmediate(mleft.displacement()))) {
641 size_t input_count = 0;
642 InstructionOperand inputs[3];
643 AddressingMode mode = g.GetEffectiveAddressMemoryOperand(
644 m.left().node(), inputs, &input_count);
645 mode = g.EnsureHasDisplacement(mleft, mode);
646 if (mleft.displacement() == nullptr) {
647 inputs[input_count++] = ImmediateOperand(ImmediateOperand::INLINE, 4);
648 } else {
649 ImmediateOperand* op = ImmediateOperand::cast(&inputs[input_count - 1]);
650 int32_t displacement = sequence()->GetImmediate(op).ToInt32();
651 *op = ImmediateOperand(ImmediateOperand::INLINE, displacement + 4);
652 }
653 InstructionOperand outputs[] = {g.DefineAsRegister(node)};
654 InstructionCode code = kX64Movsxlq | AddressingModeField::encode(mode);
655 Emit(code, 1, outputs, input_count, inputs);
656 return;
657 }
658 }
621 VisitWord64Shift(this, node, kX64Sar); 659 VisitWord64Shift(this, node, kX64Sar);
622 } 660 }
623 661
624 662
625 void InstructionSelector::VisitWord32Ror(Node* node) { 663 void InstructionSelector::VisitWord32Ror(Node* node) {
626 VisitWord32Shift(this, node, kX64Ror32); 664 VisitWord32Shift(this, node, kX64Ror32);
627 } 665 }
628 666
629 667
630 void InstructionSelector::VisitWord64Ror(Node* node) { 668 void InstructionSelector::VisitWord64Ror(Node* node) {
(...skipping 1341 matching lines...) Expand 10 before | Expand all | Expand 10 after
1972 MachineOperatorBuilder::kFloat64RoundTruncate | 2010 MachineOperatorBuilder::kFloat64RoundTruncate |
1973 MachineOperatorBuilder::kFloat32RoundTiesEven | 2011 MachineOperatorBuilder::kFloat32RoundTiesEven |
1974 MachineOperatorBuilder::kFloat64RoundTiesEven; 2012 MachineOperatorBuilder::kFloat64RoundTiesEven;
1975 } 2013 }
1976 return flags; 2014 return flags;
1977 } 2015 }
1978 2016
1979 } // namespace compiler 2017 } // namespace compiler
1980 } // namespace internal 2018 } // namespace internal
1981 } // namespace v8 2019 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698