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

Side by Side Diff: src/interpreter/bytecode-array-builder.cc

Issue 2041913002: [interpreter] Remove OperandScale from front stages of pipeline. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Minor clean-up. Created 4 years, 6 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/interpreter/bytecode-array-builder.h" 5 #include "src/interpreter/bytecode-array-builder.h"
6 6
7 #include "src/compiler.h" 7 #include "src/compiler.h"
8 #include "src/interpreter/bytecode-array-writer.h" 8 #include "src/interpreter/bytecode-array-writer.h"
9 #include "src/interpreter/bytecode-label.h" 9 #include "src/interpreter/bytecode-label.h"
10 #include "src/interpreter/bytecode-peephole-optimizer.h" 10 #include "src/interpreter/bytecode-peephole-optimizer.h"
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 latest_source_info_.set_invalid(); 85 latest_source_info_.set_invalid();
86 } 86 }
87 } 87 }
88 88
89 void BytecodeArrayBuilder::Output(Bytecode bytecode) { 89 void BytecodeArrayBuilder::Output(Bytecode bytecode) {
90 BytecodeNode node(bytecode); 90 BytecodeNode node(bytecode);
91 AttachSourceInfo(&node); 91 AttachSourceInfo(&node);
92 pipeline()->Write(&node); 92 pipeline()->Write(&node);
93 } 93 }
94 94
95 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, 95 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0,
96 OperandScale operand_scale, 96 uint32_t operand1, uint32_t operand2,
97 uint32_t operand0, uint32_t operand1, 97 uint32_t operand3) {
98 uint32_t operand2, uint32_t operand3) { 98 BytecodeNode node(bytecode, operand0, operand1, operand2, operand3);
99 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0));
100 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1));
101 DCHECK(OperandIsValid(bytecode, operand_scale, 2, operand2));
102 DCHECK(OperandIsValid(bytecode, operand_scale, 3, operand3));
103 BytecodeNode node(bytecode, operand0, operand1, operand2, operand3,
104 operand_scale);
105 AttachSourceInfo(&node); 99 AttachSourceInfo(&node);
106 pipeline()->Write(&node); 100 pipeline()->Write(&node);
107 } 101 }
108 102
109 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, 103 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0,
110 OperandScale operand_scale, 104 uint32_t operand1, uint32_t operand2) {
111 uint32_t operand0, uint32_t operand1, 105 BytecodeNode node(bytecode, operand0, operand1, operand2);
112 uint32_t operand2) {
113 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0));
114 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1));
115 DCHECK(OperandIsValid(bytecode, operand_scale, 2, operand2));
116 BytecodeNode node(bytecode, operand0, operand1, operand2, operand_scale);
117 AttachSourceInfo(&node); 106 AttachSourceInfo(&node);
118 pipeline()->Write(&node); 107 pipeline()->Write(&node);
119 } 108 }
120 109
121 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, 110 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0,
122 OperandScale operand_scale, 111 uint32_t operand1) {
123 uint32_t operand0, uint32_t operand1) { 112 BytecodeNode node(bytecode, operand0, operand1);
124 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0));
125 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1));
126 BytecodeNode node(bytecode, operand0, operand1, operand_scale);
127 AttachSourceInfo(&node); 113 AttachSourceInfo(&node);
128 pipeline()->Write(&node); 114 pipeline()->Write(&node);
129 } 115 }
130 116
131 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, 117 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0) {
132 OperandScale operand_scale, 118 BytecodeNode node(bytecode, operand0);
133 uint32_t operand0) {
134 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0));
135 BytecodeNode node(bytecode, operand0, operand_scale);
136 AttachSourceInfo(&node); 119 AttachSourceInfo(&node);
137 pipeline()->Write(&node); 120 pipeline()->Write(&node);
138 } 121 }
139 122
140 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op, 123 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op,
141 Register reg) { 124 Register reg) {
142 OperandScale operand_scale = 125 Output(BytecodeForBinaryOperation(op), RegisterOperand(reg));
143 Bytecodes::OperandSizesToScale(reg.SizeOfOperand());
144 OutputScaled(BytecodeForBinaryOperation(op), operand_scale,
145 RegisterOperand(reg));
146 return *this; 126 return *this;
147 } 127 }
148 128
149 BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op) { 129 BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op) {
150 Output(BytecodeForCountOperation(op)); 130 Output(BytecodeForCountOperation(op));
151 return *this; 131 return *this;
152 } 132 }
153 133
154 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { 134 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() {
155 Output(Bytecode::kToBooleanLogicalNot); 135 Output(Bytecode::kToBooleanLogicalNot);
156 return *this; 136 return *this;
157 } 137 }
158 138
159 139
160 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { 140 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() {
161 Output(Bytecode::kTypeOf); 141 Output(Bytecode::kTypeOf);
162 return *this; 142 return *this;
163 } 143 }
164 144
165 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op, 145 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op,
166 Register reg) { 146 Register reg) {
167 OperandScale operand_scale = 147 Output(BytecodeForCompareOperation(op), RegisterOperand(reg));
168 Bytecodes::OperandSizesToScale(reg.SizeOfOperand());
169 OutputScaled(BytecodeForCompareOperation(op), operand_scale,
170 RegisterOperand(reg));
171 return *this; 148 return *this;
172 } 149 }
173 150
174 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( 151 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(
175 v8::internal::Smi* smi) { 152 v8::internal::Smi* smi) {
176 int32_t raw_smi = smi->value(); 153 int32_t raw_smi = smi->value();
177 if (raw_smi == 0) { 154 if (raw_smi == 0) {
178 Output(Bytecode::kLdaZero); 155 Output(Bytecode::kLdaZero);
179 } else { 156 } else {
180 OperandSize operand_size = Bytecodes::SizeForSignedOperand(raw_smi); 157 Output(Bytecode::kLdaSmi, SignedOperand(raw_smi));
181 OperandScale operand_scale = Bytecodes::OperandSizesToScale(operand_size);
182 OutputScaled(Bytecode::kLdaSmi, operand_scale,
183 SignedOperand(raw_smi, operand_size));
184 } 158 }
185 return *this; 159 return *this;
186 } 160 }
187 161
188 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(Handle<Object> object) { 162 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(Handle<Object> object) {
189 size_t entry = GetConstantPoolEntry(object); 163 size_t entry = GetConstantPoolEntry(object);
190 OperandScale operand_scale = 164 Output(Bytecode::kLdaConstant, UnsignedOperand(entry));
191 Bytecodes::OperandSizesToScale(Bytecodes::SizeForUnsignedOperand(entry));
192 OutputScaled(Bytecode::kLdaConstant, operand_scale, UnsignedOperand(entry));
193 return *this; 165 return *this;
194 } 166 }
195 167
196 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadUndefined() { 168 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadUndefined() {
197 Output(Bytecode::kLdaUndefined); 169 Output(Bytecode::kLdaUndefined);
198 return *this; 170 return *this;
199 } 171 }
200 172
201 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNull() { 173 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNull() {
202 Output(Bytecode::kLdaNull); 174 Output(Bytecode::kLdaNull);
(...skipping 10 matching lines...) Expand all
213 return *this; 185 return *this;
214 } 186 }
215 187
216 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadFalse() { 188 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadFalse() {
217 Output(Bytecode::kLdaFalse); 189 Output(Bytecode::kLdaFalse);
218 return *this; 190 return *this;
219 } 191 }
220 192
221 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister( 193 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister(
222 Register reg) { 194 Register reg) {
223 OperandScale operand_scale = 195 Output(Bytecode::kLdar, RegisterOperand(reg));
224 Bytecodes::OperandSizesToScale(reg.SizeOfOperand());
225 OutputScaled(Bytecode::kLdar, operand_scale, RegisterOperand(reg));
226 return *this; 196 return *this;
227 } 197 }
228 198
229 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( 199 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister(
230 Register reg) { 200 Register reg) {
231 OperandScale operand_scale = 201 Output(Bytecode::kStar, RegisterOperand(reg));
232 Bytecodes::OperandSizesToScale(reg.SizeOfOperand());
233 OutputScaled(Bytecode::kStar, operand_scale, RegisterOperand(reg));
234 return *this; 202 return *this;
235 } 203 }
236 204
237 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, 205 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from,
238 Register to) { 206 Register to) {
239 DCHECK(from != to); 207 DCHECK(from != to);
240 OperandScale operand_scale = 208 Output(Bytecode::kMov, RegisterOperand(from), RegisterOperand(to));
241 Bytecodes::OperandSizesToScale(from.SizeOfOperand(), to.SizeOfOperand());
242 OutputScaled(Bytecode::kMov, operand_scale, RegisterOperand(from),
243 RegisterOperand(to));
244 return *this; 209 return *this;
245 } 210 }
246 211
247 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal( 212 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal(
248 const Handle<String> name, int feedback_slot, TypeofMode typeof_mode) { 213 const Handle<String> name, int feedback_slot, TypeofMode typeof_mode) {
249 // TODO(rmcilroy): Potentially store typeof information in an 214 // TODO(rmcilroy): Potentially store typeof information in an
250 // operand rather than having extra bytecodes. 215 // operand rather than having extra bytecodes.
251 Bytecode bytecode = BytecodeForLoadGlobal(typeof_mode); 216 Bytecode bytecode = BytecodeForLoadGlobal(typeof_mode);
252 size_t name_index = GetConstantPoolEntry(name); 217 size_t name_index = GetConstantPoolEntry(name);
253 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 218 Output(bytecode, UnsignedOperand(name_index), UnsignedOperand(feedback_slot));
254 Bytecodes::SizeForUnsignedOperand(name_index),
255 Bytecodes::SizeForUnsignedOperand(feedback_slot));
256 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index),
257 UnsignedOperand(feedback_slot));
258 return *this; 219 return *this;
259 } 220 }
260 221
261 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreGlobal( 222 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreGlobal(
262 const Handle<String> name, int feedback_slot, LanguageMode language_mode) { 223 const Handle<String> name, int feedback_slot, LanguageMode language_mode) {
263 Bytecode bytecode = BytecodeForStoreGlobal(language_mode); 224 Bytecode bytecode = BytecodeForStoreGlobal(language_mode);
264 size_t name_index = GetConstantPoolEntry(name); 225 size_t name_index = GetConstantPoolEntry(name);
265 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 226 Output(bytecode, UnsignedOperand(name_index), UnsignedOperand(feedback_slot));
266 Bytecodes::SizeForUnsignedOperand(name_index),
267 Bytecodes::SizeForUnsignedOperand(feedback_slot));
268 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index),
269 UnsignedOperand(feedback_slot));
270 return *this; 227 return *this;
271 } 228 }
272 229
273 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context, 230 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context,
274 int slot_index) { 231 int slot_index) {
275 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 232 Output(Bytecode::kLdaContextSlot, RegisterOperand(context),
276 context.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(slot_index)); 233 UnsignedOperand(slot_index));
277 OutputScaled(Bytecode::kLdaContextSlot, operand_scale,
278 RegisterOperand(context), UnsignedOperand(slot_index));
279 return *this; 234 return *this;
280 } 235 }
281 236
282 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context, 237 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context,
283 int slot_index) { 238 int slot_index) {
284 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 239 Output(Bytecode::kStaContextSlot, RegisterOperand(context),
285 context.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(slot_index)); 240 UnsignedOperand(slot_index));
286 OutputScaled(Bytecode::kStaContextSlot, operand_scale,
287 RegisterOperand(context), UnsignedOperand(slot_index));
288 return *this; 241 return *this;
289 } 242 }
290 243
291 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupSlot( 244 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupSlot(
292 const Handle<String> name, TypeofMode typeof_mode) { 245 const Handle<String> name, TypeofMode typeof_mode) {
293 Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF) 246 Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF)
294 ? Bytecode::kLdaLookupSlotInsideTypeof 247 ? Bytecode::kLdaLookupSlotInsideTypeof
295 : Bytecode::kLdaLookupSlot; 248 : Bytecode::kLdaLookupSlot;
296 size_t name_index = GetConstantPoolEntry(name); 249 size_t name_index = GetConstantPoolEntry(name);
297 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 250 Output(bytecode, UnsignedOperand(name_index));
298 Bytecodes::SizeForUnsignedOperand(name_index));
299 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index));
300 return *this; 251 return *this;
301 } 252 }
302 253
303 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreLookupSlot( 254 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreLookupSlot(
304 const Handle<String> name, LanguageMode language_mode) { 255 const Handle<String> name, LanguageMode language_mode) {
305 Bytecode bytecode = BytecodeForStoreLookupSlot(language_mode); 256 Bytecode bytecode = BytecodeForStoreLookupSlot(language_mode);
306 size_t name_index = GetConstantPoolEntry(name); 257 size_t name_index = GetConstantPoolEntry(name);
307 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 258 Output(bytecode, UnsignedOperand(name_index));
308 Bytecodes::SizeForUnsignedOperand(name_index));
309 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index));
310 return *this; 259 return *this;
311 } 260 }
312 261
313 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty( 262 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty(
314 Register object, const Handle<Name> name, int feedback_slot) { 263 Register object, const Handle<Name> name, int feedback_slot) {
315 size_t name_index = GetConstantPoolEntry(name); 264 size_t name_index = GetConstantPoolEntry(name);
316 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 265 Output(Bytecode::kLdaNamedProperty, RegisterOperand(object),
317 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(name_index), 266 UnsignedOperand(name_index), UnsignedOperand(feedback_slot));
318 Bytecodes::SizeForUnsignedOperand(feedback_slot));
319 OutputScaled(Bytecode::kLdaNamedProperty, operand_scale,
320 RegisterOperand(object), UnsignedOperand(name_index),
321 UnsignedOperand(feedback_slot));
322 return *this; 267 return *this;
323 } 268 }
324 269
325 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( 270 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty(
326 Register object, int feedback_slot) { 271 Register object, int feedback_slot) {
327 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 272 Output(Bytecode::kLdaKeyedProperty, RegisterOperand(object),
328 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(feedback_slot)); 273 UnsignedOperand(feedback_slot));
329 OutputScaled(Bytecode::kLdaKeyedProperty, operand_scale,
330 RegisterOperand(object), UnsignedOperand(feedback_slot));
331 return *this; 274 return *this;
332 } 275 }
333 276
334 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( 277 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty(
335 Register object, const Handle<Name> name, int feedback_slot, 278 Register object, const Handle<Name> name, int feedback_slot,
336 LanguageMode language_mode) { 279 LanguageMode language_mode) {
337 Bytecode bytecode = BytecodeForStoreNamedProperty(language_mode); 280 Bytecode bytecode = BytecodeForStoreNamedProperty(language_mode);
338 size_t name_index = GetConstantPoolEntry(name); 281 size_t name_index = GetConstantPoolEntry(name);
339 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 282 Output(bytecode, RegisterOperand(object), UnsignedOperand(name_index),
340 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(name_index), 283 UnsignedOperand(feedback_slot));
341 Bytecodes::SizeForUnsignedOperand(feedback_slot));
342 OutputScaled(bytecode, operand_scale, RegisterOperand(object),
343 UnsignedOperand(name_index), UnsignedOperand(feedback_slot));
344 return *this; 284 return *this;
345 } 285 }
346 286
347 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( 287 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty(
348 Register object, Register key, int feedback_slot, 288 Register object, Register key, int feedback_slot,
349 LanguageMode language_mode) { 289 LanguageMode language_mode) {
350 Bytecode bytecode = BytecodeForStoreKeyedProperty(language_mode); 290 Bytecode bytecode = BytecodeForStoreKeyedProperty(language_mode);
351 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 291 Output(bytecode, RegisterOperand(object), RegisterOperand(key),
352 object.SizeOfOperand(), key.SizeOfOperand(), 292 UnsignedOperand(feedback_slot));
353 Bytecodes::SizeForUnsignedOperand(feedback_slot));
354 OutputScaled(bytecode, operand_scale, RegisterOperand(object),
355 RegisterOperand(key), UnsignedOperand(feedback_slot));
356 return *this; 293 return *this;
357 } 294 }
358 295
359 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure( 296 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure(
360 Handle<SharedFunctionInfo> shared_info, PretenureFlag tenured) { 297 Handle<SharedFunctionInfo> shared_info, PretenureFlag tenured) {
361 size_t entry = GetConstantPoolEntry(shared_info); 298 size_t entry = GetConstantPoolEntry(shared_info);
362 OperandScale operand_scale = 299 Output(Bytecode::kCreateClosure, UnsignedOperand(entry),
363 Bytecodes::OperandSizesToScale(Bytecodes::SizeForUnsignedOperand(entry)); 300 UnsignedOperand(static_cast<size_t>(tenured)));
364 OutputScaled(Bytecode::kCreateClosure, operand_scale, UnsignedOperand(entry),
365 UnsignedOperand(static_cast<size_t>(tenured)));
366 return *this; 301 return *this;
367 } 302 }
368 303
369 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArguments( 304 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArguments(
370 CreateArgumentsType type) { 305 CreateArgumentsType type) {
371 // TODO(rmcilroy): Consider passing the type as a bytecode operand rather 306 // TODO(rmcilroy): Consider passing the type as a bytecode operand rather
372 // than having two different bytecodes once we have better support for 307 // than having two different bytecodes once we have better support for
373 // branches in the InterpreterAssembler. 308 // branches in the InterpreterAssembler.
374 Bytecode bytecode = BytecodeForCreateArguments(type); 309 Bytecode bytecode = BytecodeForCreateArguments(type);
375 Output(bytecode); 310 Output(bytecode);
376 return *this; 311 return *this;
377 } 312 }
378 313
379 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateRegExpLiteral( 314 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateRegExpLiteral(
380 Handle<String> pattern, int literal_index, int flags) { 315 Handle<String> pattern, int literal_index, int flags) {
381 size_t pattern_entry = GetConstantPoolEntry(pattern); 316 size_t pattern_entry = GetConstantPoolEntry(pattern);
382 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 317 Output(Bytecode::kCreateRegExpLiteral, UnsignedOperand(pattern_entry),
383 Bytecodes::SizeForUnsignedOperand(pattern_entry), 318 UnsignedOperand(literal_index), UnsignedOperand(flags));
384 Bytecodes::SizeForUnsignedOperand(literal_index),
385 Bytecodes::SizeForUnsignedOperand(flags));
386 OutputScaled(Bytecode::kCreateRegExpLiteral, operand_scale,
387 UnsignedOperand(pattern_entry), UnsignedOperand(literal_index),
388 UnsignedOperand(flags));
389 return *this; 319 return *this;
390 } 320 }
391 321
392 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArrayLiteral( 322 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArrayLiteral(
393 Handle<FixedArray> constant_elements, int literal_index, int flags) { 323 Handle<FixedArray> constant_elements, int literal_index, int flags) {
394 size_t constant_elements_entry = GetConstantPoolEntry(constant_elements); 324 size_t constant_elements_entry = GetConstantPoolEntry(constant_elements);
395 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 325 Output(Bytecode::kCreateArrayLiteral,
396 Bytecodes::SizeForUnsignedOperand(constant_elements_entry), 326 UnsignedOperand(constant_elements_entry),
397 Bytecodes::SizeForUnsignedOperand(literal_index), 327 UnsignedOperand(literal_index), UnsignedOperand(flags));
398 Bytecodes::SizeForUnsignedOperand(flags));
399 OutputScaled(Bytecode::kCreateArrayLiteral, operand_scale,
400 UnsignedOperand(constant_elements_entry),
401 UnsignedOperand(literal_index), UnsignedOperand(flags));
402 return *this; 328 return *this;
403 } 329 }
404 330
405 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateObjectLiteral( 331 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateObjectLiteral(
406 Handle<FixedArray> constant_properties, int literal_index, int flags) { 332 Handle<FixedArray> constant_properties, int literal_index, int flags) {
407 size_t constant_properties_entry = GetConstantPoolEntry(constant_properties); 333 size_t constant_properties_entry = GetConstantPoolEntry(constant_properties);
408 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 334 Output(Bytecode::kCreateObjectLiteral,
409 Bytecodes::SizeForUnsignedOperand(constant_properties_entry), 335 UnsignedOperand(constant_properties_entry),
410 Bytecodes::SizeForUnsignedOperand(literal_index), 336 UnsignedOperand(literal_index), UnsignedOperand(flags));
411 Bytecodes::SizeForUnsignedOperand(flags));
412 OutputScaled(Bytecode::kCreateObjectLiteral, operand_scale,
413 UnsignedOperand(constant_properties_entry),
414 UnsignedOperand(literal_index), UnsignedOperand(flags));
415 return *this; 337 return *this;
416 } 338 }
417 339
418 BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) { 340 BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) {
419 OperandScale operand_scale = 341 Output(Bytecode::kPushContext, RegisterOperand(context));
420 Bytecodes::OperandSizesToScale(context.SizeOfOperand());
421 OutputScaled(Bytecode::kPushContext, operand_scale, RegisterOperand(context));
422 return *this; 342 return *this;
423 } 343 }
424 344
425 BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) { 345 BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) {
426 OperandScale operand_scale = 346 Output(Bytecode::kPopContext, RegisterOperand(context));
427 Bytecodes::OperandSizesToScale(context.SizeOfOperand());
428 OutputScaled(Bytecode::kPopContext, operand_scale, RegisterOperand(context));
429 return *this; 347 return *this;
430 } 348 }
431 349
432 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToJSObject() { 350 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToJSObject() {
433 Output(Bytecode::kToObject); 351 Output(Bytecode::kToObject);
434 return *this; 352 return *this;
435 } 353 }
436 354
437 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() { 355 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() {
438 Output(Bytecode::kToName); 356 Output(Bytecode::kToName);
(...skipping 13 matching lines...) Expand all
452 370
453 BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(const BytecodeLabel& target, 371 BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(const BytecodeLabel& target,
454 BytecodeLabel* label) { 372 BytecodeLabel* label) {
455 pipeline_->BindLabel(target, label); 373 pipeline_->BindLabel(target, label);
456 LeaveBasicBlock(); 374 LeaveBasicBlock();
457 return *this; 375 return *this;
458 } 376 }
459 377
460 BytecodeArrayBuilder& BytecodeArrayBuilder::OutputJump(Bytecode jump_bytecode, 378 BytecodeArrayBuilder& BytecodeArrayBuilder::OutputJump(Bytecode jump_bytecode,
461 BytecodeLabel* label) { 379 BytecodeLabel* label) {
462 BytecodeNode node(jump_bytecode, 0, OperandScale::kSingle); 380 BytecodeNode node(jump_bytecode, 0);
463 AttachSourceInfo(&node); 381 AttachSourceInfo(&node);
464 pipeline_->WriteJump(&node, label); 382 pipeline_->WriteJump(&node, label);
465 LeaveBasicBlock(); 383 LeaveBasicBlock();
466 return *this; 384 return *this;
467 } 385 }
468 386
469 BytecodeArrayBuilder& BytecodeArrayBuilder::Jump(BytecodeLabel* label) { 387 BytecodeArrayBuilder& BytecodeArrayBuilder::Jump(BytecodeLabel* label) {
470 return OutputJump(Bytecode::kJump, label); 388 return OutputJump(Bytecode::kJump, label);
471 } 389 }
472 390
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 return *this; 440 return *this;
523 } 441 }
524 442
525 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() { 443 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() {
526 Output(Bytecode::kDebugger); 444 Output(Bytecode::kDebugger);
527 return *this; 445 return *this;
528 } 446 }
529 447
530 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare( 448 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare(
531 Register cache_info_triple) { 449 Register cache_info_triple) {
532 OperandScale operand_scale = 450 Output(Bytecode::kForInPrepare, RegisterOperand(cache_info_triple));
533 Bytecodes::OperandSizesToScale(cache_info_triple.SizeOfOperand());
534 OutputScaled(Bytecode::kForInPrepare, operand_scale,
535 RegisterOperand(cache_info_triple));
536 return *this; 451 return *this;
537 } 452 }
538 453
539 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index, 454 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index,
540 Register cache_length) { 455 Register cache_length) {
541 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 456 Output(Bytecode::kForInDone, RegisterOperand(index),
542 index.SizeOfOperand(), cache_length.SizeOfOperand()); 457 RegisterOperand(cache_length));
543 OutputScaled(Bytecode::kForInDone, operand_scale, RegisterOperand(index),
544 RegisterOperand(cache_length));
545 return *this; 458 return *this;
546 } 459 }
547 460
548 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext( 461 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext(
549 Register receiver, Register index, Register cache_type_array_pair, 462 Register receiver, Register index, Register cache_type_array_pair,
550 int feedback_slot) { 463 int feedback_slot) {
551 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 464 Output(Bytecode::kForInNext, RegisterOperand(receiver),
552 receiver.SizeOfOperand(), index.SizeOfOperand(), 465 RegisterOperand(index), RegisterOperand(cache_type_array_pair),
553 cache_type_array_pair.SizeOfOperand(), 466 UnsignedOperand(feedback_slot));
554 Bytecodes::SizeForUnsignedOperand(feedback_slot));
555 OutputScaled(Bytecode::kForInNext, operand_scale, RegisterOperand(receiver),
556 RegisterOperand(index), RegisterOperand(cache_type_array_pair),
557 UnsignedOperand(feedback_slot));
558 return *this; 467 return *this;
559 } 468 }
560 469
561 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) { 470 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) {
562 OperandScale operand_scale = 471 Output(Bytecode::kForInStep, RegisterOperand(index));
563 Bytecodes::OperandSizesToScale(index.SizeOfOperand());
564 OutputScaled(Bytecode::kForInStep, operand_scale, RegisterOperand(index));
565 return *this; 472 return *this;
566 } 473 }
567 474
568 BytecodeArrayBuilder& BytecodeArrayBuilder::SuspendGenerator( 475 BytecodeArrayBuilder& BytecodeArrayBuilder::SuspendGenerator(
569 Register generator) { 476 Register generator) {
570 OperandScale operand_scale = 477 Output(Bytecode::kSuspendGenerator, RegisterOperand(generator));
571 Bytecodes::OperandSizesToScale(generator.SizeOfOperand());
572 OutputScaled(Bytecode::kSuspendGenerator, operand_scale,
573 RegisterOperand(generator));
574 return *this; 478 return *this;
575 } 479 }
576 480
577 BytecodeArrayBuilder& BytecodeArrayBuilder::ResumeGenerator( 481 BytecodeArrayBuilder& BytecodeArrayBuilder::ResumeGenerator(
578 Register generator) { 482 Register generator) {
579 OperandScale operand_scale = 483 Output(Bytecode::kResumeGenerator, RegisterOperand(generator));
580 Bytecodes::OperandSizesToScale(generator.SizeOfOperand());
581 OutputScaled(Bytecode::kResumeGenerator, operand_scale,
582 RegisterOperand(generator));
583 return *this; 484 return *this;
584 } 485 }
585 486
586 BytecodeArrayBuilder& BytecodeArrayBuilder::MarkHandler(int handler_id, 487 BytecodeArrayBuilder& BytecodeArrayBuilder::MarkHandler(int handler_id,
587 bool will_catch) { 488 bool will_catch) {
588 BytecodeLabel handler; 489 BytecodeLabel handler;
589 Bind(&handler); 490 Bind(&handler);
590 handler_table_builder()->SetHandlerTarget(handler_id, handler.offset()); 491 handler_table_builder()->SetHandlerTarget(handler_id, handler.offset());
591 handler_table_builder()->SetPrediction(handler_id, will_catch); 492 handler_table_builder()->SetPrediction(handler_id, will_catch);
592 return *this; 493 return *this;
(...skipping 23 matching lines...) Expand all
616 } 517 }
617 DCHECK(return_seen_in_block_); 518 DCHECK(return_seen_in_block_);
618 } 519 }
619 520
620 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, 521 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable,
621 Register receiver_args, 522 Register receiver_args,
622 size_t receiver_args_count, 523 size_t receiver_args_count,
623 int feedback_slot, 524 int feedback_slot,
624 TailCallMode tail_call_mode) { 525 TailCallMode tail_call_mode) {
625 Bytecode bytecode = BytecodeForCall(tail_call_mode); 526 Bytecode bytecode = BytecodeForCall(tail_call_mode);
626 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 527 Output(bytecode, RegisterOperand(callable), RegisterOperand(receiver_args),
627 callable.SizeOfOperand(), receiver_args.SizeOfOperand(), 528 UnsignedOperand(receiver_args_count), UnsignedOperand(feedback_slot));
628 Bytecodes::SizeForUnsignedOperand(receiver_args_count),
629 Bytecodes::SizeForUnsignedOperand(feedback_slot));
630 OutputScaled(bytecode, operand_scale, RegisterOperand(callable),
631 RegisterOperand(receiver_args),
632 UnsignedOperand(receiver_args_count),
633 UnsignedOperand(feedback_slot));
634 return *this; 529 return *this;
635 } 530 }
636 531
637 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor, 532 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor,
638 Register first_arg, 533 Register first_arg,
639 size_t arg_count) { 534 size_t arg_count) {
640 if (!first_arg.is_valid()) { 535 if (!first_arg.is_valid()) {
641 DCHECK_EQ(0u, arg_count); 536 DCHECK_EQ(0u, arg_count);
642 first_arg = Register(0); 537 first_arg = Register(0);
643 } 538 }
644 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 539 Output(Bytecode::kNew, RegisterOperand(constructor),
645 constructor.SizeOfOperand(), first_arg.SizeOfOperand(), 540 RegisterOperand(first_arg), UnsignedOperand(arg_count));
646 Bytecodes::SizeForUnsignedOperand(arg_count));
647 OutputScaled(Bytecode::kNew, operand_scale, RegisterOperand(constructor),
648 RegisterOperand(first_arg), UnsignedOperand(arg_count));
649 return *this; 541 return *this;
650 } 542 }
651 543
652 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( 544 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime(
653 Runtime::FunctionId function_id, Register first_arg, size_t arg_count) { 545 Runtime::FunctionId function_id, Register first_arg, size_t arg_count) {
654 DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size); 546 DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size);
655 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); 547 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort);
656 if (!first_arg.is_valid()) { 548 if (!first_arg.is_valid()) {
657 DCHECK_EQ(0u, arg_count); 549 DCHECK_EQ(0u, arg_count);
658 first_arg = Register(0); 550 first_arg = Register(0);
659 } 551 }
660 Bytecode bytecode = IntrinsicsHelper::IsSupported(function_id) 552 Bytecode bytecode = IntrinsicsHelper::IsSupported(function_id)
661 ? Bytecode::kInvokeIntrinsic 553 ? Bytecode::kInvokeIntrinsic
662 : Bytecode::kCallRuntime; 554 : Bytecode::kCallRuntime;
663 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 555 Output(bytecode, static_cast<uint16_t>(function_id),
664 first_arg.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(arg_count)); 556 RegisterOperand(first_arg), UnsignedOperand(arg_count));
665 OutputScaled(bytecode, operand_scale, static_cast<uint16_t>(function_id),
666 RegisterOperand(first_arg), UnsignedOperand(arg_count));
667 return *this; 557 return *this;
668 } 558 }
669 559
670 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair( 560 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair(
671 Runtime::FunctionId function_id, Register first_arg, size_t arg_count, 561 Runtime::FunctionId function_id, Register first_arg, size_t arg_count,
672 Register first_return) { 562 Register first_return) {
673 DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size); 563 DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size);
674 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); 564 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort);
675 if (!first_arg.is_valid()) { 565 if (!first_arg.is_valid()) {
676 DCHECK_EQ(0u, arg_count); 566 DCHECK_EQ(0u, arg_count);
677 first_arg = Register(0); 567 first_arg = Register(0);
678 } 568 }
679 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 569 Output(Bytecode::kCallRuntimeForPair, static_cast<uint16_t>(function_id),
680 first_arg.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(arg_count), 570 RegisterOperand(first_arg), UnsignedOperand(arg_count),
681 first_return.SizeOfOperand()); 571 RegisterOperand(first_return));
682 OutputScaled(Bytecode::kCallRuntimeForPair, operand_scale,
683 static_cast<uint16_t>(function_id), RegisterOperand(first_arg),
684 UnsignedOperand(arg_count), RegisterOperand(first_return));
685 return *this; 572 return *this;
686 } 573 }
687 574
688 BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime( 575 BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime(
689 int context_index, Register receiver_args, size_t receiver_args_count) { 576 int context_index, Register receiver_args, size_t receiver_args_count) {
690 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 577 Output(Bytecode::kCallJSRuntime, UnsignedOperand(context_index),
691 Bytecodes::SizeForUnsignedOperand(context_index), 578 RegisterOperand(receiver_args), UnsignedOperand(receiver_args_count));
692 receiver_args.SizeOfOperand(),
693 Bytecodes::SizeForUnsignedOperand(receiver_args_count));
694 OutputScaled(Bytecode::kCallJSRuntime, operand_scale,
695 UnsignedOperand(context_index), RegisterOperand(receiver_args),
696 UnsignedOperand(receiver_args_count));
697 return *this; 579 return *this;
698 } 580 }
699 581
700 BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object, 582 BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object,
701 LanguageMode language_mode) { 583 LanguageMode language_mode) {
702 OperandScale operand_scale = 584 Output(BytecodeForDelete(language_mode), RegisterOperand(object));
703 Bytecodes::OperandSizesToScale(object.SizeOfOperand());
704 OutputScaled(BytecodeForDelete(language_mode), operand_scale,
705 RegisterOperand(object));
706 return *this; 585 return *this;
707 } 586 }
708 587
709 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { 588 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) {
710 return constant_array_builder()->Insert(object); 589 return constant_array_builder()->Insert(object);
711 } 590 }
712 591
713 void BytecodeArrayBuilder::SetReturnPosition() { 592 void BytecodeArrayBuilder::SetReturnPosition() {
714 if (return_position_ == RelocInfo::kNoPosition) return; 593 if (return_position_ == RelocInfo::kNoPosition) return;
715 latest_source_info_.Update({return_position_, true}); 594 latest_source_info_.Update({return_position_, true});
(...skipping 11 matching lines...) Expand all
727 606
728 void BytecodeArrayBuilder::SetExpressionAsStatementPosition(Expression* expr) { 607 void BytecodeArrayBuilder::SetExpressionAsStatementPosition(Expression* expr) {
729 if (expr->position() == RelocInfo::kNoPosition) return; 608 if (expr->position() == RelocInfo::kNoPosition) return;
730 latest_source_info_.Update({expr->position(), true}); 609 latest_source_info_.Update({expr->position(), true});
731 } 610 }
732 611
733 bool BytecodeArrayBuilder::TemporaryRegisterIsLive(Register reg) const { 612 bool BytecodeArrayBuilder::TemporaryRegisterIsLive(Register reg) const {
734 return temporary_register_allocator()->RegisterIsLive(reg); 613 return temporary_register_allocator()->RegisterIsLive(reg);
735 } 614 }
736 615
737 bool BytecodeArrayBuilder::OperandIsValid(Bytecode bytecode,
738 OperandScale operand_scale,
739 int operand_index,
740 uint32_t operand_value) const {
741 OperandSize operand_size =
742 Bytecodes::GetOperandSize(bytecode, operand_index, operand_scale);
743 OperandType operand_type = Bytecodes::GetOperandType(bytecode, operand_index);
744 switch (operand_type) {
745 case OperandType::kNone:
746 return false;
747 case OperandType::kRegCount: {
748 if (operand_index > 0) {
749 OperandType previous_operand_type =
750 Bytecodes::GetOperandType(bytecode, operand_index - 1);
751 if (previous_operand_type != OperandType::kMaybeReg &&
752 previous_operand_type != OperandType::kReg) {
753 return false;
754 }
755 }
756 } // Fall-through
757 case OperandType::kFlag8:
758 case OperandType::kIdx:
759 case OperandType::kRuntimeId:
760 case OperandType::kImm: {
761 size_t unsigned_value = static_cast<size_t>(operand_value);
762 return Bytecodes::SizeForUnsignedOperand(unsigned_value) <= operand_size;
763 }
764 case OperandType::kMaybeReg:
765 if (RegisterFromOperand(operand_value) == Register(0)) {
766 return true;
767 }
768 // Fall-through to kReg case.
769 case OperandType::kReg:
770 case OperandType::kRegOut: {
771 Register reg = RegisterFromOperand(operand_value);
772 return RegisterIsValid(reg, operand_size);
773 }
774 case OperandType::kRegOutPair:
775 case OperandType::kRegPair: {
776 Register reg0 = RegisterFromOperand(operand_value);
777 Register reg1 = Register(reg0.index() + 1);
778 // The size of reg1 is immaterial.
779 return RegisterIsValid(reg0, operand_size) &&
780 RegisterIsValid(reg1, OperandSize::kQuad);
781 }
782 case OperandType::kRegOutTriple: {
783 Register reg0 = RegisterFromOperand(operand_value);
784 Register reg1 = Register(reg0.index() + 1);
785 Register reg2 = Register(reg0.index() + 2);
786 // The size of reg1 and reg2 is immaterial.
787 return RegisterIsValid(reg0, operand_size) &&
788 RegisterIsValid(reg1, OperandSize::kQuad) &&
789 RegisterIsValid(reg2, OperandSize::kQuad);
790 }
791 }
792 UNREACHABLE();
793 return false;
794 }
795
796 bool BytecodeArrayBuilder::RegisterIsValid(Register reg,
797 OperandSize reg_size) const {
798 if (!reg.is_valid()) {
799 return false;
800 }
801
802 if (reg.SizeOfOperand() > reg_size) {
803 return false;
804 }
805
806 if (reg.is_current_context() || reg.is_function_closure() ||
807 reg.is_new_target()) {
808 return true;
809 } else if (reg.is_parameter()) {
810 int parameter_index = reg.ToParameterIndex(parameter_count());
811 return parameter_index >= 0 && parameter_index < parameter_count();
812 } else if (reg.index() < fixed_register_count()) {
813 return true;
814 } else {
815 return TemporaryRegisterIsLive(reg);
816 }
817 }
818
819 // static 616 // static
820 Bytecode BytecodeArrayBuilder::BytecodeForBinaryOperation(Token::Value op) { 617 Bytecode BytecodeArrayBuilder::BytecodeForBinaryOperation(Token::Value op) {
821 switch (op) { 618 switch (op) {
822 case Token::Value::ADD: 619 case Token::Value::ADD:
823 return Bytecode::kAdd; 620 return Bytecode::kAdd;
824 case Token::Value::SUB: 621 case Token::Value::SUB:
825 return Bytecode::kSub; 622 return Bytecode::kSub;
826 case Token::Value::MUL: 623 case Token::Value::MUL:
827 return Bytecode::kMul; 624 return Bytecode::kMul;
828 case Token::Value::DIV: 625 case Token::Value::DIV:
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
991 } 788 }
992 789
993 uint32_t BytecodeArrayBuilder::RegisterOperand(Register reg) { 790 uint32_t BytecodeArrayBuilder::RegisterOperand(Register reg) {
994 return static_cast<uint32_t>(reg.ToOperand()); 791 return static_cast<uint32_t>(reg.ToOperand());
995 } 792 }
996 793
997 Register BytecodeArrayBuilder::RegisterFromOperand(uint32_t operand) { 794 Register BytecodeArrayBuilder::RegisterFromOperand(uint32_t operand) {
998 return Register::FromOperand(static_cast<int32_t>(operand)); 795 return Register::FromOperand(static_cast<int32_t>(operand));
999 } 796 }
1000 797
1001 uint32_t BytecodeArrayBuilder::SignedOperand(int value, OperandSize size) { 798 uint32_t BytecodeArrayBuilder::SignedOperand(int value) {
1002 switch (size) { 799 return static_cast<uint32_t>(value);
1003 case OperandSize::kByte:
1004 return static_cast<uint8_t>(value & 0xff);
1005 case OperandSize::kShort:
1006 return static_cast<uint16_t>(value & 0xffff);
1007 case OperandSize::kQuad:
1008 return static_cast<uint32_t>(value);
1009 case OperandSize::kNone:
1010 UNREACHABLE();
1011 }
1012 return 0;
1013 } 800 }
1014 801
1015 uint32_t BytecodeArrayBuilder::UnsignedOperand(int value) { 802 uint32_t BytecodeArrayBuilder::UnsignedOperand(int value) {
1016 DCHECK_GE(value, 0); 803 DCHECK_GE(value, 0);
1017 return static_cast<uint32_t>(value); 804 return static_cast<uint32_t>(value);
1018 } 805 }
1019 806
1020 uint32_t BytecodeArrayBuilder::UnsignedOperand(size_t value) { 807 uint32_t BytecodeArrayBuilder::UnsignedOperand(size_t value) {
1021 DCHECK_LE(value, kMaxUInt32); 808 DCHECK_LE(value, kMaxUInt32);
1022 return static_cast<uint32_t>(value); 809 return static_cast<uint32_t>(value);
1023 } 810 }
1024 811
1025 } // namespace interpreter 812 } // namespace interpreter
1026 } // namespace internal 813 } // namespace internal
1027 } // namespace v8 814 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698