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

Side by Side Diff: test/cctest/compiler/test-gap-resolver.cc

Issue 1075863002: [turbofan] Make AllocatedOperand an InstructionOperand::Kind. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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 | « src/compiler/register-allocator.cc ('k') | 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 "src/compiler/gap-resolver.h" 5 #include "src/compiler/gap-resolver.h"
6 6
7 #include "src/base/utils/random-number-generator.h" 7 #include "src/base/utils/random-number-generator.h"
8 #include "test/cctest/cctest.h" 8 #include "test/cctest/cctest.h"
9 9
10 using namespace v8::internal; 10 using namespace v8::internal;
(...skipping 14 matching lines...) Expand all
25 25
26 bool operator==(const InterpreterState& other) const { 26 bool operator==(const InterpreterState& other) const {
27 return values_ == other.values_; 27 return values_ == other.values_;
28 } 28 }
29 29
30 bool operator!=(const InterpreterState& other) const { 30 bool operator!=(const InterpreterState& other) const {
31 return values_ != other.values_; 31 return values_ != other.values_;
32 } 32 }
33 33
34 private: 34 private:
35 struct Key {
36 bool is_constant;
37 AllocatedOperand::AllocatedKind kind;
38 int index;
39
40 bool operator<(const Key& other) const {
41 if (this->is_constant != other.is_constant) {
42 return this->is_constant;
43 }
44 if (this->kind != other.kind) {
45 return this->kind < other.kind;
46 }
47 return this->index < other.index;
48 }
49
50 bool operator==(const Key& other) const {
51 return this->is_constant == other.is_constant &&
52 this->kind == other.kind && this->index == other.index;
53 }
54 };
55
35 // Internally, the state is a normalized permutation of (kind,index) pairs. 56 // Internally, the state is a normalized permutation of (kind,index) pairs.
36 typedef std::pair<InstructionOperand::Kind, int> Key;
37 typedef Key Value; 57 typedef Key Value;
38 typedef std::map<Key, Value> OperandMap; 58 typedef std::map<Key, Value> OperandMap;
39 59
40 Value read(const InstructionOperand* op) const { 60 Value read(const InstructionOperand* op) const {
41 OperandMap::const_iterator it = values_.find(KeyFor(op)); 61 OperandMap::const_iterator it = values_.find(KeyFor(op));
42 return (it == values_.end()) ? ValueFor(op) : it->second; 62 return (it == values_.end()) ? ValueFor(op) : it->second;
43 } 63 }
44 64
45 void write(const InstructionOperand* op, Value v) { 65 void write(const InstructionOperand* op, Value v) {
46 if (v == ValueFor(op)) { 66 if (v == ValueFor(op)) {
47 values_.erase(KeyFor(op)); 67 values_.erase(KeyFor(op));
48 } else { 68 } else {
49 values_[KeyFor(op)] = v; 69 values_[KeyFor(op)] = v;
50 } 70 }
51 } 71 }
52 72
53 static Key KeyFor(const InstructionOperand* op) { 73 static Key KeyFor(const InstructionOperand* op) {
54 int v = op->IsConstant() ? ConstantOperand::cast(op)->virtual_register() 74 bool is_constant = op->IsConstant();
55 : AllocatedOperand::cast(op)->index(); 75 AllocatedOperand::AllocatedKind kind;
56 return Key(op->kind(), v); 76 int index;
77 if (!is_constant) {
78 index = AllocatedOperand::cast(op)->index();
79 kind = AllocatedOperand::cast(op)->allocated_kind();
80 } else {
81 index = ConstantOperand::cast(op)->virtual_register();
82 kind = AllocatedOperand::REGISTER;
83 }
84 Key key = {is_constant, kind, index};
85 return key;
57 } 86 }
58 87
59 static Value ValueFor(const InstructionOperand* op) { 88 static Value ValueFor(const InstructionOperand* op) { return KeyFor(op); }
60 int v = op->IsConstant() ? ConstantOperand::cast(op)->virtual_register()
61 : AllocatedOperand::cast(op)->index();
62 return Value(op->kind(), v);
63 }
64 89
65 static InstructionOperand FromKey(Key key) { 90 static InstructionOperand FromKey(Key key) {
66 if (key.first == InstructionOperand::CONSTANT) { 91 if (key.is_constant) {
67 return ConstantOperand(key.second); 92 return ConstantOperand(key.index);
68 } 93 }
69 return AllocatedOperand(key.first, key.second); 94 return AllocatedOperand(key.kind, key.index);
70 } 95 }
71 96
72 friend std::ostream& operator<<(std::ostream& os, 97 friend std::ostream& operator<<(std::ostream& os,
73 const InterpreterState& is) { 98 const InterpreterState& is) {
74 for (OperandMap::const_iterator it = is.values_.begin(); 99 for (OperandMap::const_iterator it = is.values_.begin();
75 it != is.values_.end(); ++it) { 100 it != is.values_.end(); ++it) {
76 if (it != is.values_.begin()) os << " "; 101 if (it != is.values_.begin()) os << " ";
77 InstructionOperand source = FromKey(it->first); 102 InstructionOperand source = FromKey(it->first);
78 InstructionOperand destination = FromKey(it->second); 103 InstructionOperand destination = FromKey(it->second);
79 MoveOperands mo(&source, &destination); 104 MoveOperands mo(&source, &destination);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 mi1.AssembleParallelMove(pm); 203 mi1.AssembleParallelMove(pm);
179 204
180 MoveInterpreter mi2; 205 MoveInterpreter mi2;
181 GapResolver resolver(&mi2); 206 GapResolver resolver(&mi2);
182 resolver.Resolve(pm); 207 resolver.Resolve(pm);
183 208
184 CHECK(mi1.state() == mi2.state()); 209 CHECK(mi1.state() == mi2.state());
185 } 210 }
186 } 211 }
187 } 212 }
OLDNEW
« no previous file with comments | « src/compiler/register-allocator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698