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

Side by Side Diff: src/compiler/machine-operator.cc

Issue 680313003: Move input/output counts directly into Operators, simplying OperatorProperties. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: yes Created 6 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « src/compiler/machine-operator.h ('k') | src/compiler/opcodes.h » ('j') | 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/machine-operator.h" 5 #include "src/compiler/machine-operator.h"
6 6
7 #include "src/base/lazy-instance.h" 7 #include "src/base/lazy-instance.h"
8 #include "src/compiler/opcodes.h" 8 #include "src/compiler/opcodes.h"
9 #include "src/compiler/operator.h" 9 #include "src/compiler/operator.h"
10 10
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 } 46 }
47 47
48 48
49 StoreRepresentation const& StoreRepresentationOf(Operator const* op) { 49 StoreRepresentation const& StoreRepresentationOf(Operator const* op) {
50 DCHECK_EQ(IrOpcode::kStore, op->opcode()); 50 DCHECK_EQ(IrOpcode::kStore, op->opcode());
51 return OpParameter<StoreRepresentation>(op); 51 return OpParameter<StoreRepresentation>(op);
52 } 52 }
53 53
54 54
55 #define PURE_OP_LIST(V) \ 55 #define PURE_OP_LIST(V) \
56 V(Word32And, Operator::kAssociative | Operator::kCommutative, 2, 1) \ 56 V(Word32And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
57 V(Word32Or, Operator::kAssociative | Operator::kCommutative, 2, 1) \ 57 V(Word32Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
58 V(Word32Xor, Operator::kAssociative | Operator::kCommutative, 2, 1) \ 58 V(Word32Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
59 V(Word32Shl, Operator::kNoProperties, 2, 1) \ 59 V(Word32Shl, Operator::kNoProperties, 2, 0, 1) \
60 V(Word32Shr, Operator::kNoProperties, 2, 1) \ 60 V(Word32Shr, Operator::kNoProperties, 2, 0, 1) \
61 V(Word32Sar, Operator::kNoProperties, 2, 1) \ 61 V(Word32Sar, Operator::kNoProperties, 2, 0, 1) \
62 V(Word32Ror, Operator::kNoProperties, 2, 1) \ 62 V(Word32Ror, Operator::kNoProperties, 2, 0, 1) \
63 V(Word32Equal, Operator::kCommutative, 2, 1) \ 63 V(Word32Equal, Operator::kCommutative, 2, 0, 1) \
64 V(Word64And, Operator::kAssociative | Operator::kCommutative, 2, 1) \ 64 V(Word64And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
65 V(Word64Or, Operator::kAssociative | Operator::kCommutative, 2, 1) \ 65 V(Word64Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
66 V(Word64Xor, Operator::kAssociative | Operator::kCommutative, 2, 1) \ 66 V(Word64Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
67 V(Word64Shl, Operator::kNoProperties, 2, 1) \ 67 V(Word64Shl, Operator::kNoProperties, 2, 0, 1) \
68 V(Word64Shr, Operator::kNoProperties, 2, 1) \ 68 V(Word64Shr, Operator::kNoProperties, 2, 0, 1) \
69 V(Word64Sar, Operator::kNoProperties, 2, 1) \ 69 V(Word64Sar, Operator::kNoProperties, 2, 0, 1) \
70 V(Word64Ror, Operator::kNoProperties, 2, 1) \ 70 V(Word64Ror, Operator::kNoProperties, 2, 0, 1) \
71 V(Word64Equal, Operator::kCommutative, 2, 1) \ 71 V(Word64Equal, Operator::kCommutative, 2, 0, 1) \
72 V(Int32Add, Operator::kAssociative | Operator::kCommutative, 2, 1) \ 72 V(Int32Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
73 V(Int32AddWithOverflow, Operator::kAssociative | Operator::kCommutative, 2, \ 73 V(Int32AddWithOverflow, Operator::kAssociative | Operator::kCommutative, 2, \
74 2) \ 74 0, 2) \
75 V(Int32Sub, Operator::kNoProperties, 2, 1) \ 75 V(Int32Sub, Operator::kNoProperties, 2, 0, 1) \
76 V(Int32SubWithOverflow, Operator::kNoProperties, 2, 2) \ 76 V(Int32SubWithOverflow, Operator::kNoProperties, 2, 0, 2) \
77 V(Int32Mul, Operator::kAssociative | Operator::kCommutative, 2, 1) \ 77 V(Int32Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
78 V(Int32MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 1) \ 78 V(Int32MulHigh, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
79 V(Int32Div, Operator::kNoProperties, 2, 1) \ 79 V(Int32Div, Operator::kNoProperties, 2, 1, 1) \
80 V(Int32Mod, Operator::kNoProperties, 2, 1) \ 80 V(Int32Mod, Operator::kNoProperties, 2, 1, 1) \
81 V(Int32LessThan, Operator::kNoProperties, 2, 1) \ 81 V(Int32LessThan, Operator::kNoProperties, 2, 0, 1) \
82 V(Int32LessThanOrEqual, Operator::kNoProperties, 2, 1) \ 82 V(Int32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
83 V(Uint32Div, Operator::kNoProperties, 2, 1) \ 83 V(Uint32Div, Operator::kNoProperties, 2, 1, 1) \
84 V(Uint32LessThan, Operator::kNoProperties, 2, 1) \ 84 V(Uint32LessThan, Operator::kNoProperties, 2, 0, 1) \
85 V(Uint32LessThanOrEqual, Operator::kNoProperties, 2, 1) \ 85 V(Uint32LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
86 V(Uint32Mod, Operator::kNoProperties, 2, 1) \ 86 V(Uint32Mod, Operator::kNoProperties, 2, 1, 1) \
87 V(Int64Add, Operator::kAssociative | Operator::kCommutative, 2, 1) \ 87 V(Int64Add, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
88 V(Int64Sub, Operator::kNoProperties, 2, 1) \ 88 V(Int64Sub, Operator::kNoProperties, 2, 0, 1) \
89 V(Int64Mul, Operator::kAssociative | Operator::kCommutative, 2, 1) \ 89 V(Int64Mul, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
90 V(Int64Div, Operator::kNoProperties, 2, 1) \ 90 V(Int64Div, Operator::kNoProperties, 2, 0, 1) \
91 V(Int64Mod, Operator::kNoProperties, 2, 1) \ 91 V(Int64Mod, Operator::kNoProperties, 2, 0, 1) \
92 V(Int64LessThan, Operator::kNoProperties, 2, 1) \ 92 V(Int64LessThan, Operator::kNoProperties, 2, 0, 1) \
93 V(Int64LessThanOrEqual, Operator::kNoProperties, 2, 1) \ 93 V(Int64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
94 V(Uint64Div, Operator::kNoProperties, 2, 1) \ 94 V(Uint64Div, Operator::kNoProperties, 2, 0, 1) \
95 V(Uint64LessThan, Operator::kNoProperties, 2, 1) \ 95 V(Uint64LessThan, Operator::kNoProperties, 2, 0, 1) \
96 V(Uint64Mod, Operator::kNoProperties, 2, 1) \ 96 V(Uint64Mod, Operator::kNoProperties, 2, 0, 1) \
97 V(ChangeFloat32ToFloat64, Operator::kNoProperties, 1, 1) \ 97 V(ChangeFloat32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
98 V(ChangeFloat64ToInt32, Operator::kNoProperties, 1, 1) \ 98 V(ChangeFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \
99 V(ChangeFloat64ToUint32, Operator::kNoProperties, 1, 1) \ 99 V(ChangeFloat64ToUint32, Operator::kNoProperties, 1, 0, 1) \
100 V(ChangeInt32ToFloat64, Operator::kNoProperties, 1, 1) \ 100 V(ChangeInt32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
101 V(ChangeInt32ToInt64, Operator::kNoProperties, 1, 1) \ 101 V(ChangeInt32ToInt64, Operator::kNoProperties, 1, 0, 1) \
102 V(ChangeUint32ToFloat64, Operator::kNoProperties, 1, 1) \ 102 V(ChangeUint32ToFloat64, Operator::kNoProperties, 1, 0, 1) \
103 V(ChangeUint32ToUint64, Operator::kNoProperties, 1, 1) \ 103 V(ChangeUint32ToUint64, Operator::kNoProperties, 1, 0, 1) \
104 V(TruncateFloat64ToFloat32, Operator::kNoProperties, 1, 1) \ 104 V(TruncateFloat64ToFloat32, Operator::kNoProperties, 1, 0, 1) \
105 V(TruncateFloat64ToInt32, Operator::kNoProperties, 1, 1) \ 105 V(TruncateFloat64ToInt32, Operator::kNoProperties, 1, 0, 1) \
106 V(TruncateInt64ToInt32, Operator::kNoProperties, 1, 1) \ 106 V(TruncateInt64ToInt32, Operator::kNoProperties, 1, 0, 1) \
107 V(Float64Add, Operator::kCommutative, 2, 1) \ 107 V(Float64Add, Operator::kCommutative, 2, 0, 1) \
108 V(Float64Sub, Operator::kNoProperties, 2, 1) \ 108 V(Float64Sub, Operator::kNoProperties, 2, 0, 1) \
109 V(Float64Mul, Operator::kCommutative, 2, 1) \ 109 V(Float64Mul, Operator::kCommutative, 2, 0, 1) \
110 V(Float64Div, Operator::kNoProperties, 2, 1) \ 110 V(Float64Div, Operator::kNoProperties, 2, 0, 1) \
111 V(Float64Mod, Operator::kNoProperties, 2, 1) \ 111 V(Float64Mod, Operator::kNoProperties, 2, 0, 1) \
112 V(Float64Sqrt, Operator::kNoProperties, 1, 1) \ 112 V(Float64Sqrt, Operator::kNoProperties, 1, 0, 1) \
113 V(Float64Ceil, Operator::kNoProperties, 1, 1) \ 113 V(Float64Ceil, Operator::kNoProperties, 1, 0, 1) \
114 V(Float64Floor, Operator::kNoProperties, 1, 1) \ 114 V(Float64Floor, Operator::kNoProperties, 1, 0, 1) \
115 V(Float64RoundTruncate, Operator::kNoProperties, 1, 1) \ 115 V(Float64RoundTruncate, Operator::kNoProperties, 1, 0, 1) \
116 V(Float64RoundTiesAway, Operator::kNoProperties, 1, 1) \ 116 V(Float64RoundTiesAway, Operator::kNoProperties, 1, 0, 1) \
117 V(Float64Equal, Operator::kCommutative, 2, 1) \ 117 V(Float64Equal, Operator::kCommutative, 2, 0, 1) \
118 V(Float64LessThan, Operator::kNoProperties, 2, 1) \ 118 V(Float64LessThan, Operator::kNoProperties, 2, 0, 1) \
119 V(Float64LessThanOrEqual, Operator::kNoProperties, 2, 1) \ 119 V(Float64LessThanOrEqual, Operator::kNoProperties, 2, 0, 1) \
120 V(LoadStackPointer, Operator::kNoProperties, 0, 1) 120 V(LoadStackPointer, Operator::kNoProperties, 0, 0, 1)
121 121
122 122
123 #define MACHINE_TYPE_LIST(V) \ 123 #define MACHINE_TYPE_LIST(V) \
124 V(MachFloat32) \ 124 V(MachFloat32) \
125 V(MachFloat64) \ 125 V(MachFloat64) \
126 V(MachInt8) \ 126 V(MachInt8) \
127 V(MachUint8) \ 127 V(MachUint8) \
128 V(MachInt16) \ 128 V(MachInt16) \
129 V(MachUint16) \ 129 V(MachUint16) \
130 V(MachInt32) \ 130 V(MachInt32) \
131 V(MachUint32) \ 131 V(MachUint32) \
132 V(MachInt64) \ 132 V(MachInt64) \
133 V(MachUint64) \ 133 V(MachUint64) \
134 V(MachAnyTagged) \ 134 V(MachAnyTagged) \
135 V(RepBit) \ 135 V(RepBit) \
136 V(RepWord8) \ 136 V(RepWord8) \
137 V(RepWord16) \ 137 V(RepWord16) \
138 V(RepWord32) \ 138 V(RepWord32) \
139 V(RepWord64) \ 139 V(RepWord64) \
140 V(RepFloat32) \ 140 V(RepFloat32) \
141 V(RepFloat64) \ 141 V(RepFloat64) \
142 V(RepTagged) 142 V(RepTagged)
143 143
144 144
145 struct MachineOperatorBuilderImpl { 145 struct MachineOperatorGlobalCache {
146 #define PURE(Name, properties, input_count, output_count) \ 146 #define PURE(Name, properties, value_input_count, control_input_count, \
147 struct Name##Operator FINAL : public SimpleOperator { \ 147 output_count) \
148 Name##Operator() \ 148 struct Name##Operator FINAL : public Operator { \
149 : SimpleOperator(IrOpcode::k##Name, Operator::kPure | properties, \ 149 Name##Operator() \
150 input_count, output_count, #Name) {} \ 150 : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \
151 }; \ 151 value_input_count, 0, control_input_count, output_count, 0, \
152 0) {} \
153 }; \
152 Name##Operator k##Name; 154 Name##Operator k##Name;
153 PURE_OP_LIST(PURE) 155 PURE_OP_LIST(PURE)
154 #undef PURE 156 #undef PURE
155 157
156 #define LOAD(Type) \ 158 #define LOAD(Type) \
157 struct Load##Type##Operator FINAL : public Operator1<LoadRepresentation> { \ 159 struct Load##Type##Operator FINAL : public Operator1<LoadRepresentation> { \
158 Load##Type##Operator() \ 160 Load##Type##Operator() \
159 : Operator1<LoadRepresentation>( \ 161 : Operator1<LoadRepresentation>( \
160 IrOpcode::kLoad, Operator::kNoThrow | Operator::kNoWrite, 2, 1, \ 162 IrOpcode::kLoad, Operator::kNoThrow | Operator::kNoWrite, \
161 "Load", k##Type) {} \ 163 "Load", 2, 1, 1, 1, 1, 0, k##Type) {} \
162 }; \ 164 }; \
163 Load##Type##Operator k##Load##Type; 165 Load##Type##Operator k##Load##Type;
164 MACHINE_TYPE_LIST(LOAD) 166 MACHINE_TYPE_LIST(LOAD)
165 #undef LOAD 167 #undef LOAD
166 168
167 #define STORE(Type) \ 169 #define STORE(Type) \
168 struct Store##Type##Operator : public Operator1<StoreRepresentation> { \ 170 struct Store##Type##Operator : public Operator1<StoreRepresentation> { \
169 explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind) \ 171 explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind) \
170 : Operator1<StoreRepresentation>( \ 172 : Operator1<StoreRepresentation>( \
171 IrOpcode::kStore, Operator::kNoRead | Operator::kNoThrow, 3, 0, \ 173 IrOpcode::kStore, Operator::kNoRead | Operator::kNoThrow, \
172 "Store", StoreRepresentation(k##Type, write_barrier_kind)) {} \ 174 "Store", 3, 1, 1, 0, 1, 0, \
173 }; \ 175 StoreRepresentation(k##Type, write_barrier_kind)) {} \
174 struct Store##Type##NoWriteBarrier##Operator FINAL \ 176 }; \
175 : public Store##Type##Operator { \ 177 struct Store##Type##NoWriteBarrier##Operator FINAL \
176 Store##Type##NoWriteBarrier##Operator() \ 178 : public Store##Type##Operator { \
177 : Store##Type##Operator(kNoWriteBarrier) {} \ 179 Store##Type##NoWriteBarrier##Operator() \
178 }; \ 180 : Store##Type##Operator(kNoWriteBarrier) {} \
179 struct Store##Type##FullWriteBarrier##Operator FINAL \ 181 }; \
180 : public Store##Type##Operator { \ 182 struct Store##Type##FullWriteBarrier##Operator FINAL \
181 Store##Type##FullWriteBarrier##Operator() \ 183 : public Store##Type##Operator { \
182 : Store##Type##Operator(kFullWriteBarrier) {} \ 184 Store##Type##FullWriteBarrier##Operator() \
183 }; \ 185 : Store##Type##Operator(kFullWriteBarrier) {} \
184 Store##Type##NoWriteBarrier##Operator k##Store##Type##NoWriteBarrier; \ 186 }; \
187 Store##Type##NoWriteBarrier##Operator k##Store##Type##NoWriteBarrier; \
185 Store##Type##FullWriteBarrier##Operator k##Store##Type##FullWriteBarrier; 188 Store##Type##FullWriteBarrier##Operator k##Store##Type##FullWriteBarrier;
186 MACHINE_TYPE_LIST(STORE) 189 MACHINE_TYPE_LIST(STORE)
187 #undef STORE 190 #undef STORE
188 }; 191 };
189 192
190 193
191 static base::LazyInstance<MachineOperatorBuilderImpl>::type kImpl = 194 static base::LazyInstance<MachineOperatorGlobalCache>::type kCache =
192 LAZY_INSTANCE_INITIALIZER; 195 LAZY_INSTANCE_INITIALIZER;
193 196
194 197
195 MachineOperatorBuilder::MachineOperatorBuilder(MachineType word, Flags flags) 198 MachineOperatorBuilder::MachineOperatorBuilder(MachineType word, Flags flags)
196 : impl_(kImpl.Get()), word_(word), flags_(flags) { 199 : cache_(kCache.Get()), word_(word), flags_(flags) {
197 DCHECK(word == kRepWord32 || word == kRepWord64); 200 DCHECK(word == kRepWord32 || word == kRepWord64);
198 } 201 }
199 202
200 203
201 #define PURE(Name, properties, input_count, output_count) \ 204 #define PURE(Name, properties, value_input_count, control_input_count, \
202 const Operator* MachineOperatorBuilder::Name() { return &impl_.k##Name; } 205 output_count) \
206 const Operator* MachineOperatorBuilder::Name() { return &cache_.k##Name; }
203 PURE_OP_LIST(PURE) 207 PURE_OP_LIST(PURE)
204 #undef PURE 208 #undef PURE
205 209
206 210
207 const Operator* MachineOperatorBuilder::Load(LoadRepresentation rep) { 211 const Operator* MachineOperatorBuilder::Load(LoadRepresentation rep) {
208 switch (rep) { 212 switch (rep) {
209 #define LOAD(Type) \ 213 #define LOAD(Type) \
210 case k##Type: \ 214 case k##Type: \
211 return &impl_.k##Load##Type; 215 return &cache_.k##Load##Type;
212 MACHINE_TYPE_LIST(LOAD) 216 MACHINE_TYPE_LIST(LOAD)
213 #undef LOAD 217 #undef LOAD
214 218
215 default: 219 default:
216 break; 220 break;
217 } 221 }
218 UNREACHABLE(); 222 UNREACHABLE();
219 return NULL; 223 return NULL;
220 } 224 }
221 225
222 226
223 const Operator* MachineOperatorBuilder::Store(StoreRepresentation rep) { 227 const Operator* MachineOperatorBuilder::Store(StoreRepresentation rep) {
224 switch (rep.machine_type()) { 228 switch (rep.machine_type()) {
225 #define STORE(Type) \ 229 #define STORE(Type) \
226 case k##Type: \ 230 case k##Type: \
227 switch (rep.write_barrier_kind()) { \ 231 switch (rep.write_barrier_kind()) { \
228 case kNoWriteBarrier: \ 232 case kNoWriteBarrier: \
229 return &impl_.k##Store##Type##NoWriteBarrier; \ 233 return &cache_.k##Store##Type##NoWriteBarrier; \
230 case kFullWriteBarrier: \ 234 case kFullWriteBarrier: \
231 return &impl_.k##Store##Type##FullWriteBarrier; \ 235 return &cache_.k##Store##Type##FullWriteBarrier; \
232 } \ 236 } \
233 break; 237 break;
234 MACHINE_TYPE_LIST(STORE) 238 MACHINE_TYPE_LIST(STORE)
235 #undef STORE 239 #undef STORE
236 240
237 default: 241 default:
238 break; 242 break;
239 } 243 }
240 UNREACHABLE(); 244 UNREACHABLE();
241 return NULL; 245 return NULL;
242 } 246 }
243 } // namespace compiler 247 } // namespace compiler
244 } // namespace internal 248 } // namespace internal
245 } // namespace v8 249 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/machine-operator.h ('k') | src/compiler/opcodes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698