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

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: Rebase 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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 } 104 }
105 } 105 }
106 } 106 }
107 107
108 void BytecodeArrayBuilder::Output(Bytecode bytecode) { 108 void BytecodeArrayBuilder::Output(Bytecode bytecode) {
109 BytecodeNode node(bytecode); 109 BytecodeNode node(bytecode);
110 AttachSourceInfo(&node); 110 AttachSourceInfo(&node);
111 pipeline()->Write(&node); 111 pipeline()->Write(&node);
112 } 112 }
113 113
114 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, 114 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0,
115 OperandScale operand_scale, 115 uint32_t operand1, uint32_t operand2,
116 uint32_t operand0, uint32_t operand1, 116 uint32_t operand3) {
117 uint32_t operand2, uint32_t operand3) { 117 BytecodeNode node(bytecode, operand0, operand1, operand2, operand3);
118 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0));
119 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1));
120 DCHECK(OperandIsValid(bytecode, operand_scale, 2, operand2));
121 DCHECK(OperandIsValid(bytecode, operand_scale, 3, operand3));
122 BytecodeNode node(bytecode, operand0, operand1, operand2, operand3,
123 operand_scale);
124 AttachSourceInfo(&node); 118 AttachSourceInfo(&node);
125 pipeline()->Write(&node); 119 pipeline()->Write(&node);
126 } 120 }
127 121
128 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, 122 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0,
129 OperandScale operand_scale, 123 uint32_t operand1, uint32_t operand2) {
130 uint32_t operand0, uint32_t operand1, 124 BytecodeNode node(bytecode, operand0, operand1, operand2);
131 uint32_t operand2) {
132 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0));
133 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1));
134 DCHECK(OperandIsValid(bytecode, operand_scale, 2, operand2));
135 BytecodeNode node(bytecode, operand0, operand1, operand2, operand_scale);
136 AttachSourceInfo(&node); 125 AttachSourceInfo(&node);
137 pipeline()->Write(&node); 126 pipeline()->Write(&node);
138 } 127 }
139 128
140 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, 129 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0,
141 OperandScale operand_scale, 130 uint32_t operand1) {
142 uint32_t operand0, uint32_t operand1) { 131 BytecodeNode node(bytecode, operand0, operand1);
143 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0));
144 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1));
145 BytecodeNode node(bytecode, operand0, operand1, operand_scale);
146 AttachSourceInfo(&node); 132 AttachSourceInfo(&node);
147 pipeline()->Write(&node); 133 pipeline()->Write(&node);
148 } 134 }
149 135
150 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, 136 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0) {
151 OperandScale operand_scale, 137 BytecodeNode node(bytecode, operand0);
152 uint32_t operand0) {
153 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0));
154 BytecodeNode node(bytecode, operand0, operand_scale);
155 AttachSourceInfo(&node); 138 AttachSourceInfo(&node);
156 pipeline()->Write(&node); 139 pipeline()->Write(&node);
157 } 140 }
158 141
159 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op, 142 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op,
160 Register reg) { 143 Register reg) {
161 OperandScale operand_scale = 144 Output(BytecodeForBinaryOperation(op), RegisterOperand(reg));
162 Bytecodes::OperandSizesToScale(reg.SizeOfOperand());
163 OutputScaled(BytecodeForBinaryOperation(op), operand_scale,
164 RegisterOperand(reg));
165 return *this; 145 return *this;
166 } 146 }
167 147
168 BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op) { 148 BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op) {
169 Output(BytecodeForCountOperation(op)); 149 Output(BytecodeForCountOperation(op));
170 return *this; 150 return *this;
171 } 151 }
172 152
173 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { 153 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() {
174 Output(Bytecode::kToBooleanLogicalNot); 154 Output(Bytecode::kToBooleanLogicalNot);
175 return *this; 155 return *this;
176 } 156 }
177 157
178 158
179 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { 159 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() {
180 Output(Bytecode::kTypeOf); 160 Output(Bytecode::kTypeOf);
181 return *this; 161 return *this;
182 } 162 }
183 163
184 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op, 164 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op,
185 Register reg) { 165 Register reg) {
186 OperandScale operand_scale = 166 Output(BytecodeForCompareOperation(op), RegisterOperand(reg));
187 Bytecodes::OperandSizesToScale(reg.SizeOfOperand());
188 OutputScaled(BytecodeForCompareOperation(op), operand_scale,
189 RegisterOperand(reg));
190 return *this; 167 return *this;
191 } 168 }
192 169
193 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( 170 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(
194 v8::internal::Smi* smi) { 171 v8::internal::Smi* smi) {
195 int32_t raw_smi = smi->value(); 172 int32_t raw_smi = smi->value();
196 if (raw_smi == 0) { 173 if (raw_smi == 0) {
197 Output(Bytecode::kLdaZero); 174 Output(Bytecode::kLdaZero);
198 } else { 175 } else {
199 OperandSize operand_size = Bytecodes::SizeForSignedOperand(raw_smi); 176 Output(Bytecode::kLdaSmi, SignedOperand(raw_smi));
200 OperandScale operand_scale = Bytecodes::OperandSizesToScale(operand_size);
201 OutputScaled(Bytecode::kLdaSmi, operand_scale,
202 SignedOperand(raw_smi, operand_size));
203 } 177 }
204 return *this; 178 return *this;
205 } 179 }
206 180
207 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(Handle<Object> object) { 181 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(Handle<Object> object) {
208 size_t entry = GetConstantPoolEntry(object); 182 size_t entry = GetConstantPoolEntry(object);
209 OperandScale operand_scale = 183 Output(Bytecode::kLdaConstant, UnsignedOperand(entry));
210 Bytecodes::OperandSizesToScale(Bytecodes::SizeForUnsignedOperand(entry));
211 OutputScaled(Bytecode::kLdaConstant, operand_scale, UnsignedOperand(entry));
212 return *this; 184 return *this;
213 } 185 }
214 186
215 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadUndefined() { 187 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadUndefined() {
216 Output(Bytecode::kLdaUndefined); 188 Output(Bytecode::kLdaUndefined);
217 return *this; 189 return *this;
218 } 190 }
219 191
220 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNull() { 192 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNull() {
221 Output(Bytecode::kLdaNull); 193 Output(Bytecode::kLdaNull);
(...skipping 10 matching lines...) Expand all
232 return *this; 204 return *this;
233 } 205 }
234 206
235 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadFalse() { 207 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadFalse() {
236 Output(Bytecode::kLdaFalse); 208 Output(Bytecode::kLdaFalse);
237 return *this; 209 return *this;
238 } 210 }
239 211
240 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister( 212 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister(
241 Register reg) { 213 Register reg) {
242 OperandScale operand_scale = 214 Output(Bytecode::kLdar, RegisterOperand(reg));
243 Bytecodes::OperandSizesToScale(reg.SizeOfOperand());
244 OutputScaled(Bytecode::kLdar, operand_scale, RegisterOperand(reg));
245 return *this; 215 return *this;
246 } 216 }
247 217
248 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( 218 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister(
249 Register reg) { 219 Register reg) {
250 OperandScale operand_scale = 220 Output(Bytecode::kStar, RegisterOperand(reg));
251 Bytecodes::OperandSizesToScale(reg.SizeOfOperand());
252 OutputScaled(Bytecode::kStar, operand_scale, RegisterOperand(reg));
253 return *this; 221 return *this;
254 } 222 }
255 223
256 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, 224 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from,
257 Register to) { 225 Register to) {
258 DCHECK(from != to); 226 DCHECK(from != to);
259 OperandScale operand_scale = 227 Output(Bytecode::kMov, RegisterOperand(from), RegisterOperand(to));
260 Bytecodes::OperandSizesToScale(from.SizeOfOperand(), to.SizeOfOperand());
261 OutputScaled(Bytecode::kMov, operand_scale, RegisterOperand(from),
262 RegisterOperand(to));
263 return *this; 228 return *this;
264 } 229 }
265 230
266 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal( 231 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal(
267 const Handle<String> name, int feedback_slot, TypeofMode typeof_mode) { 232 const Handle<String> name, int feedback_slot, TypeofMode typeof_mode) {
268 // TODO(rmcilroy): Potentially store typeof information in an 233 // TODO(rmcilroy): Potentially store typeof information in an
269 // operand rather than having extra bytecodes. 234 // operand rather than having extra bytecodes.
270 Bytecode bytecode = BytecodeForLoadGlobal(typeof_mode); 235 Bytecode bytecode = BytecodeForLoadGlobal(typeof_mode);
271 size_t name_index = GetConstantPoolEntry(name); 236 size_t name_index = GetConstantPoolEntry(name);
272 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 237 Output(bytecode, UnsignedOperand(name_index), UnsignedOperand(feedback_slot));
273 Bytecodes::SizeForUnsignedOperand(name_index),
274 Bytecodes::SizeForUnsignedOperand(feedback_slot));
275 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index),
276 UnsignedOperand(feedback_slot));
277 return *this; 238 return *this;
278 } 239 }
279 240
280 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreGlobal( 241 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreGlobal(
281 const Handle<String> name, int feedback_slot, LanguageMode language_mode) { 242 const Handle<String> name, int feedback_slot, LanguageMode language_mode) {
282 Bytecode bytecode = BytecodeForStoreGlobal(language_mode); 243 Bytecode bytecode = BytecodeForStoreGlobal(language_mode);
283 size_t name_index = GetConstantPoolEntry(name); 244 size_t name_index = GetConstantPoolEntry(name);
284 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 245 Output(bytecode, UnsignedOperand(name_index), UnsignedOperand(feedback_slot));
285 Bytecodes::SizeForUnsignedOperand(name_index),
286 Bytecodes::SizeForUnsignedOperand(feedback_slot));
287 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index),
288 UnsignedOperand(feedback_slot));
289 return *this; 246 return *this;
290 } 247 }
291 248
292 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context, 249 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context,
293 int slot_index) { 250 int slot_index) {
294 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 251 Output(Bytecode::kLdaContextSlot, RegisterOperand(context),
295 context.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(slot_index)); 252 UnsignedOperand(slot_index));
296 OutputScaled(Bytecode::kLdaContextSlot, operand_scale,
297 RegisterOperand(context), UnsignedOperand(slot_index));
298 return *this; 253 return *this;
299 } 254 }
300 255
301 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context, 256 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context,
302 int slot_index) { 257 int slot_index) {
303 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 258 Output(Bytecode::kStaContextSlot, RegisterOperand(context),
304 context.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(slot_index)); 259 UnsignedOperand(slot_index));
305 OutputScaled(Bytecode::kStaContextSlot, operand_scale,
306 RegisterOperand(context), UnsignedOperand(slot_index));
307 return *this; 260 return *this;
308 } 261 }
309 262
310 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupSlot( 263 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupSlot(
311 const Handle<String> name, TypeofMode typeof_mode) { 264 const Handle<String> name, TypeofMode typeof_mode) {
312 Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF) 265 Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF)
313 ? Bytecode::kLdaLookupSlotInsideTypeof 266 ? Bytecode::kLdaLookupSlotInsideTypeof
314 : Bytecode::kLdaLookupSlot; 267 : Bytecode::kLdaLookupSlot;
315 size_t name_index = GetConstantPoolEntry(name); 268 size_t name_index = GetConstantPoolEntry(name);
316 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 269 Output(bytecode, UnsignedOperand(name_index));
317 Bytecodes::SizeForUnsignedOperand(name_index));
318 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index));
319 return *this; 270 return *this;
320 } 271 }
321 272
322 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreLookupSlot( 273 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreLookupSlot(
323 const Handle<String> name, LanguageMode language_mode) { 274 const Handle<String> name, LanguageMode language_mode) {
324 Bytecode bytecode = BytecodeForStoreLookupSlot(language_mode); 275 Bytecode bytecode = BytecodeForStoreLookupSlot(language_mode);
325 size_t name_index = GetConstantPoolEntry(name); 276 size_t name_index = GetConstantPoolEntry(name);
326 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 277 Output(bytecode, UnsignedOperand(name_index));
327 Bytecodes::SizeForUnsignedOperand(name_index));
328 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index));
329 return *this; 278 return *this;
330 } 279 }
331 280
332 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty( 281 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty(
333 Register object, const Handle<Name> name, int feedback_slot) { 282 Register object, const Handle<Name> name, int feedback_slot) {
334 size_t name_index = GetConstantPoolEntry(name); 283 size_t name_index = GetConstantPoolEntry(name);
335 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 284 Output(Bytecode::kLdaNamedProperty, RegisterOperand(object),
336 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(name_index), 285 UnsignedOperand(name_index), UnsignedOperand(feedback_slot));
337 Bytecodes::SizeForUnsignedOperand(feedback_slot));
338 OutputScaled(Bytecode::kLdaNamedProperty, operand_scale,
339 RegisterOperand(object), UnsignedOperand(name_index),
340 UnsignedOperand(feedback_slot));
341 return *this; 286 return *this;
342 } 287 }
343 288
344 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( 289 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty(
345 Register object, int feedback_slot) { 290 Register object, int feedback_slot) {
346 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 291 Output(Bytecode::kLdaKeyedProperty, RegisterOperand(object),
347 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(feedback_slot)); 292 UnsignedOperand(feedback_slot));
348 OutputScaled(Bytecode::kLdaKeyedProperty, operand_scale,
349 RegisterOperand(object), UnsignedOperand(feedback_slot));
350 return *this; 293 return *this;
351 } 294 }
352 295
353 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( 296 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty(
354 Register object, const Handle<Name> name, int feedback_slot, 297 Register object, const Handle<Name> name, int feedback_slot,
355 LanguageMode language_mode) { 298 LanguageMode language_mode) {
356 Bytecode bytecode = BytecodeForStoreNamedProperty(language_mode); 299 Bytecode bytecode = BytecodeForStoreNamedProperty(language_mode);
357 size_t name_index = GetConstantPoolEntry(name); 300 size_t name_index = GetConstantPoolEntry(name);
358 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 301 Output(bytecode, RegisterOperand(object), UnsignedOperand(name_index),
359 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(name_index), 302 UnsignedOperand(feedback_slot));
360 Bytecodes::SizeForUnsignedOperand(feedback_slot));
361 OutputScaled(bytecode, operand_scale, RegisterOperand(object),
362 UnsignedOperand(name_index), UnsignedOperand(feedback_slot));
363 return *this; 303 return *this;
364 } 304 }
365 305
366 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( 306 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty(
367 Register object, Register key, int feedback_slot, 307 Register object, Register key, int feedback_slot,
368 LanguageMode language_mode) { 308 LanguageMode language_mode) {
369 Bytecode bytecode = BytecodeForStoreKeyedProperty(language_mode); 309 Bytecode bytecode = BytecodeForStoreKeyedProperty(language_mode);
370 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 310 Output(bytecode, RegisterOperand(object), RegisterOperand(key),
371 object.SizeOfOperand(), key.SizeOfOperand(), 311 UnsignedOperand(feedback_slot));
372 Bytecodes::SizeForUnsignedOperand(feedback_slot));
373 OutputScaled(bytecode, operand_scale, RegisterOperand(object),
374 RegisterOperand(key), UnsignedOperand(feedback_slot));
375 return *this; 312 return *this;
376 } 313 }
377 314
378 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure( 315 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure(
379 Handle<SharedFunctionInfo> shared_info, PretenureFlag tenured) { 316 Handle<SharedFunctionInfo> shared_info, PretenureFlag tenured) {
380 size_t entry = GetConstantPoolEntry(shared_info); 317 size_t entry = GetConstantPoolEntry(shared_info);
381 OperandScale operand_scale = 318 Output(Bytecode::kCreateClosure, UnsignedOperand(entry),
382 Bytecodes::OperandSizesToScale(Bytecodes::SizeForUnsignedOperand(entry)); 319 UnsignedOperand(static_cast<size_t>(tenured)));
383 OutputScaled(Bytecode::kCreateClosure, operand_scale, UnsignedOperand(entry),
384 UnsignedOperand(static_cast<size_t>(tenured)));
385 return *this; 320 return *this;
386 } 321 }
387 322
388 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArguments( 323 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArguments(
389 CreateArgumentsType type) { 324 CreateArgumentsType type) {
390 // TODO(rmcilroy): Consider passing the type as a bytecode operand rather 325 // TODO(rmcilroy): Consider passing the type as a bytecode operand rather
391 // than having two different bytecodes once we have better support for 326 // than having two different bytecodes once we have better support for
392 // branches in the InterpreterAssembler. 327 // branches in the InterpreterAssembler.
393 Bytecode bytecode = BytecodeForCreateArguments(type); 328 Bytecode bytecode = BytecodeForCreateArguments(type);
394 Output(bytecode); 329 Output(bytecode);
395 return *this; 330 return *this;
396 } 331 }
397 332
398 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateRegExpLiteral( 333 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateRegExpLiteral(
399 Handle<String> pattern, int literal_index, int flags) { 334 Handle<String> pattern, int literal_index, int flags) {
400 size_t pattern_entry = GetConstantPoolEntry(pattern); 335 size_t pattern_entry = GetConstantPoolEntry(pattern);
401 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 336 Output(Bytecode::kCreateRegExpLiteral, UnsignedOperand(pattern_entry),
402 Bytecodes::SizeForUnsignedOperand(pattern_entry), 337 UnsignedOperand(literal_index), UnsignedOperand(flags));
403 Bytecodes::SizeForUnsignedOperand(literal_index),
404 Bytecodes::SizeForUnsignedOperand(flags));
405 OutputScaled(Bytecode::kCreateRegExpLiteral, operand_scale,
406 UnsignedOperand(pattern_entry), UnsignedOperand(literal_index),
407 UnsignedOperand(flags));
408 return *this; 338 return *this;
409 } 339 }
410 340
411 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArrayLiteral( 341 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArrayLiteral(
412 Handle<FixedArray> constant_elements, int literal_index, int flags) { 342 Handle<FixedArray> constant_elements, int literal_index, int flags) {
413 size_t constant_elements_entry = GetConstantPoolEntry(constant_elements); 343 size_t constant_elements_entry = GetConstantPoolEntry(constant_elements);
414 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 344 Output(Bytecode::kCreateArrayLiteral,
415 Bytecodes::SizeForUnsignedOperand(constant_elements_entry), 345 UnsignedOperand(constant_elements_entry),
416 Bytecodes::SizeForUnsignedOperand(literal_index), 346 UnsignedOperand(literal_index), UnsignedOperand(flags));
417 Bytecodes::SizeForUnsignedOperand(flags));
418 OutputScaled(Bytecode::kCreateArrayLiteral, operand_scale,
419 UnsignedOperand(constant_elements_entry),
420 UnsignedOperand(literal_index), UnsignedOperand(flags));
421 return *this; 347 return *this;
422 } 348 }
423 349
424 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateObjectLiteral( 350 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateObjectLiteral(
425 Handle<FixedArray> constant_properties, int literal_index, int flags) { 351 Handle<FixedArray> constant_properties, int literal_index, int flags) {
426 size_t constant_properties_entry = GetConstantPoolEntry(constant_properties); 352 size_t constant_properties_entry = GetConstantPoolEntry(constant_properties);
427 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 353 Output(Bytecode::kCreateObjectLiteral,
428 Bytecodes::SizeForUnsignedOperand(constant_properties_entry), 354 UnsignedOperand(constant_properties_entry),
429 Bytecodes::SizeForUnsignedOperand(literal_index), 355 UnsignedOperand(literal_index), UnsignedOperand(flags));
430 Bytecodes::SizeForUnsignedOperand(flags));
431 OutputScaled(Bytecode::kCreateObjectLiteral, operand_scale,
432 UnsignedOperand(constant_properties_entry),
433 UnsignedOperand(literal_index), UnsignedOperand(flags));
434 return *this; 356 return *this;
435 } 357 }
436 358
437 BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) { 359 BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) {
438 OperandScale operand_scale = 360 Output(Bytecode::kPushContext, RegisterOperand(context));
439 Bytecodes::OperandSizesToScale(context.SizeOfOperand());
440 OutputScaled(Bytecode::kPushContext, operand_scale, RegisterOperand(context));
441 return *this; 361 return *this;
442 } 362 }
443 363
444 BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) { 364 BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) {
445 OperandScale operand_scale = 365 Output(Bytecode::kPopContext, RegisterOperand(context));
446 Bytecodes::OperandSizesToScale(context.SizeOfOperand());
447 OutputScaled(Bytecode::kPopContext, operand_scale, RegisterOperand(context));
448 return *this; 366 return *this;
449 } 367 }
450 368
451 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToJSObject() { 369 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToJSObject() {
452 Output(Bytecode::kToObject); 370 Output(Bytecode::kToObject);
453 return *this; 371 return *this;
454 } 372 }
455 373
456 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() { 374 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() {
457 Output(Bytecode::kToName); 375 Output(Bytecode::kToName);
(...skipping 13 matching lines...) Expand all
471 389
472 BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(const BytecodeLabel& target, 390 BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(const BytecodeLabel& target,
473 BytecodeLabel* label) { 391 BytecodeLabel* label) {
474 pipeline_->BindLabel(target, label); 392 pipeline_->BindLabel(target, label);
475 LeaveBasicBlock(); 393 LeaveBasicBlock();
476 return *this; 394 return *this;
477 } 395 }
478 396
479 BytecodeArrayBuilder& BytecodeArrayBuilder::OutputJump(Bytecode jump_bytecode, 397 BytecodeArrayBuilder& BytecodeArrayBuilder::OutputJump(Bytecode jump_bytecode,
480 BytecodeLabel* label) { 398 BytecodeLabel* label) {
481 BytecodeNode node(jump_bytecode, 0, OperandScale::kSingle); 399 BytecodeNode node(jump_bytecode, 0);
482 AttachSourceInfo(&node); 400 AttachSourceInfo(&node);
483 pipeline_->WriteJump(&node, label); 401 pipeline_->WriteJump(&node, label);
484 LeaveBasicBlock(); 402 LeaveBasicBlock();
485 return *this; 403 return *this;
486 } 404 }
487 405
488 BytecodeArrayBuilder& BytecodeArrayBuilder::Jump(BytecodeLabel* label) { 406 BytecodeArrayBuilder& BytecodeArrayBuilder::Jump(BytecodeLabel* label) {
489 return OutputJump(Bytecode::kJump, label); 407 return OutputJump(Bytecode::kJump, label);
490 } 408 }
491 409
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 return *this; 459 return *this;
542 } 460 }
543 461
544 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() { 462 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() {
545 Output(Bytecode::kDebugger); 463 Output(Bytecode::kDebugger);
546 return *this; 464 return *this;
547 } 465 }
548 466
549 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare( 467 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare(
550 Register cache_info_triple) { 468 Register cache_info_triple) {
551 OperandScale operand_scale = 469 Output(Bytecode::kForInPrepare, RegisterOperand(cache_info_triple));
552 Bytecodes::OperandSizesToScale(cache_info_triple.SizeOfOperand());
553 OutputScaled(Bytecode::kForInPrepare, operand_scale,
554 RegisterOperand(cache_info_triple));
555 return *this; 470 return *this;
556 } 471 }
557 472
558 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index, 473 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index,
559 Register cache_length) { 474 Register cache_length) {
560 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 475 Output(Bytecode::kForInDone, RegisterOperand(index),
561 index.SizeOfOperand(), cache_length.SizeOfOperand()); 476 RegisterOperand(cache_length));
562 OutputScaled(Bytecode::kForInDone, operand_scale, RegisterOperand(index),
563 RegisterOperand(cache_length));
564 return *this; 477 return *this;
565 } 478 }
566 479
567 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext( 480 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext(
568 Register receiver, Register index, Register cache_type_array_pair, 481 Register receiver, Register index, Register cache_type_array_pair,
569 int feedback_slot) { 482 int feedback_slot) {
570 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 483 Output(Bytecode::kForInNext, RegisterOperand(receiver),
571 receiver.SizeOfOperand(), index.SizeOfOperand(), 484 RegisterOperand(index), RegisterOperand(cache_type_array_pair),
572 cache_type_array_pair.SizeOfOperand(), 485 UnsignedOperand(feedback_slot));
573 Bytecodes::SizeForUnsignedOperand(feedback_slot));
574 OutputScaled(Bytecode::kForInNext, operand_scale, RegisterOperand(receiver),
575 RegisterOperand(index), RegisterOperand(cache_type_array_pair),
576 UnsignedOperand(feedback_slot));
577 return *this; 486 return *this;
578 } 487 }
579 488
580 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) { 489 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) {
581 OperandScale operand_scale = 490 Output(Bytecode::kForInStep, RegisterOperand(index));
582 Bytecodes::OperandSizesToScale(index.SizeOfOperand());
583 OutputScaled(Bytecode::kForInStep, operand_scale, RegisterOperand(index));
584 return *this; 491 return *this;
585 } 492 }
586 493
587 BytecodeArrayBuilder& BytecodeArrayBuilder::SuspendGenerator( 494 BytecodeArrayBuilder& BytecodeArrayBuilder::SuspendGenerator(
588 Register generator) { 495 Register generator) {
589 OperandScale operand_scale = 496 Output(Bytecode::kSuspendGenerator, RegisterOperand(generator));
590 Bytecodes::OperandSizesToScale(generator.SizeOfOperand());
591 OutputScaled(Bytecode::kSuspendGenerator, operand_scale,
592 RegisterOperand(generator));
593 return *this; 497 return *this;
594 } 498 }
595 499
596 BytecodeArrayBuilder& BytecodeArrayBuilder::ResumeGenerator( 500 BytecodeArrayBuilder& BytecodeArrayBuilder::ResumeGenerator(
597 Register generator) { 501 Register generator) {
598 OperandScale operand_scale = 502 Output(Bytecode::kResumeGenerator, RegisterOperand(generator));
599 Bytecodes::OperandSizesToScale(generator.SizeOfOperand());
600 OutputScaled(Bytecode::kResumeGenerator, operand_scale,
601 RegisterOperand(generator));
602 return *this; 503 return *this;
603 } 504 }
604 505
605 BytecodeArrayBuilder& BytecodeArrayBuilder::MarkHandler(int handler_id, 506 BytecodeArrayBuilder& BytecodeArrayBuilder::MarkHandler(int handler_id,
606 bool will_catch) { 507 bool will_catch) {
607 BytecodeLabel handler; 508 BytecodeLabel handler;
608 Bind(&handler); 509 Bind(&handler);
609 handler_table_builder()->SetHandlerTarget(handler_id, handler.offset()); 510 handler_table_builder()->SetHandlerTarget(handler_id, handler.offset());
610 handler_table_builder()->SetPrediction(handler_id, will_catch); 511 handler_table_builder()->SetPrediction(handler_id, will_catch);
611 return *this; 512 return *this;
(...skipping 23 matching lines...) Expand all
635 } 536 }
636 DCHECK(return_seen_in_block_); 537 DCHECK(return_seen_in_block_);
637 } 538 }
638 539
639 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, 540 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable,
640 Register receiver_args, 541 Register receiver_args,
641 size_t receiver_args_count, 542 size_t receiver_args_count,
642 int feedback_slot, 543 int feedback_slot,
643 TailCallMode tail_call_mode) { 544 TailCallMode tail_call_mode) {
644 Bytecode bytecode = BytecodeForCall(tail_call_mode); 545 Bytecode bytecode = BytecodeForCall(tail_call_mode);
645 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 546 Output(bytecode, RegisterOperand(callable), RegisterOperand(receiver_args),
646 callable.SizeOfOperand(), receiver_args.SizeOfOperand(), 547 UnsignedOperand(receiver_args_count), UnsignedOperand(feedback_slot));
647 Bytecodes::SizeForUnsignedOperand(receiver_args_count),
648 Bytecodes::SizeForUnsignedOperand(feedback_slot));
649 OutputScaled(bytecode, operand_scale, RegisterOperand(callable),
650 RegisterOperand(receiver_args),
651 UnsignedOperand(receiver_args_count),
652 UnsignedOperand(feedback_slot));
653 return *this; 548 return *this;
654 } 549 }
655 550
656 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor, 551 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor,
657 Register first_arg, 552 Register first_arg,
658 size_t arg_count) { 553 size_t arg_count) {
659 if (!first_arg.is_valid()) { 554 if (!first_arg.is_valid()) {
660 DCHECK_EQ(0u, arg_count); 555 DCHECK_EQ(0u, arg_count);
661 first_arg = Register(0); 556 first_arg = Register(0);
662 } 557 }
663 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 558 Output(Bytecode::kNew, RegisterOperand(constructor),
664 constructor.SizeOfOperand(), first_arg.SizeOfOperand(), 559 RegisterOperand(first_arg), UnsignedOperand(arg_count));
665 Bytecodes::SizeForUnsignedOperand(arg_count));
666 OutputScaled(Bytecode::kNew, operand_scale, RegisterOperand(constructor),
667 RegisterOperand(first_arg), UnsignedOperand(arg_count));
668 return *this; 560 return *this;
669 } 561 }
670 562
671 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( 563 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime(
672 Runtime::FunctionId function_id, Register first_arg, size_t arg_count) { 564 Runtime::FunctionId function_id, Register first_arg, size_t arg_count) {
673 DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size); 565 DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size);
674 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); 566 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort);
675 if (!first_arg.is_valid()) { 567 if (!first_arg.is_valid()) {
676 DCHECK_EQ(0u, arg_count); 568 DCHECK_EQ(0u, arg_count);
677 first_arg = Register(0); 569 first_arg = Register(0);
678 } 570 }
679 Bytecode bytecode = IntrinsicsHelper::IsSupported(function_id) 571 Bytecode bytecode = IntrinsicsHelper::IsSupported(function_id)
680 ? Bytecode::kInvokeIntrinsic 572 ? Bytecode::kInvokeIntrinsic
681 : Bytecode::kCallRuntime; 573 : Bytecode::kCallRuntime;
682 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 574 Output(bytecode, static_cast<uint16_t>(function_id),
683 first_arg.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(arg_count)); 575 RegisterOperand(first_arg), UnsignedOperand(arg_count));
684 OutputScaled(bytecode, operand_scale, static_cast<uint16_t>(function_id),
685 RegisterOperand(first_arg), UnsignedOperand(arg_count));
686 return *this; 576 return *this;
687 } 577 }
688 578
689 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair( 579 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair(
690 Runtime::FunctionId function_id, Register first_arg, size_t arg_count, 580 Runtime::FunctionId function_id, Register first_arg, size_t arg_count,
691 Register first_return) { 581 Register first_return) {
692 DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size); 582 DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size);
693 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); 583 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort);
694 if (!first_arg.is_valid()) { 584 if (!first_arg.is_valid()) {
695 DCHECK_EQ(0u, arg_count); 585 DCHECK_EQ(0u, arg_count);
696 first_arg = Register(0); 586 first_arg = Register(0);
697 } 587 }
698 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 588 Output(Bytecode::kCallRuntimeForPair, static_cast<uint16_t>(function_id),
699 first_arg.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(arg_count), 589 RegisterOperand(first_arg), UnsignedOperand(arg_count),
700 first_return.SizeOfOperand()); 590 RegisterOperand(first_return));
701 OutputScaled(Bytecode::kCallRuntimeForPair, operand_scale,
702 static_cast<uint16_t>(function_id), RegisterOperand(first_arg),
703 UnsignedOperand(arg_count), RegisterOperand(first_return));
704 return *this; 591 return *this;
705 } 592 }
706 593
707 BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime( 594 BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime(
708 int context_index, Register receiver_args, size_t receiver_args_count) { 595 int context_index, Register receiver_args, size_t receiver_args_count) {
709 OperandScale operand_scale = Bytecodes::OperandSizesToScale( 596 Output(Bytecode::kCallJSRuntime, UnsignedOperand(context_index),
710 Bytecodes::SizeForUnsignedOperand(context_index), 597 RegisterOperand(receiver_args), UnsignedOperand(receiver_args_count));
711 receiver_args.SizeOfOperand(),
712 Bytecodes::SizeForUnsignedOperand(receiver_args_count));
713 OutputScaled(Bytecode::kCallJSRuntime, operand_scale,
714 UnsignedOperand(context_index), RegisterOperand(receiver_args),
715 UnsignedOperand(receiver_args_count));
716 return *this; 598 return *this;
717 } 599 }
718 600
719 BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object, 601 BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object,
720 LanguageMode language_mode) { 602 LanguageMode language_mode) {
721 OperandScale operand_scale = 603 Output(BytecodeForDelete(language_mode), RegisterOperand(object));
722 Bytecodes::OperandSizesToScale(object.SizeOfOperand());
723 OutputScaled(BytecodeForDelete(language_mode), operand_scale,
724 RegisterOperand(object));
725 return *this; 604 return *this;
726 } 605 }
727 606
728 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { 607 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) {
729 return constant_array_builder()->Insert(object); 608 return constant_array_builder()->Insert(object);
730 } 609 }
731 610
732 void BytecodeArrayBuilder::SetReturnPosition() { 611 void BytecodeArrayBuilder::SetReturnPosition() {
733 if (return_position_ == RelocInfo::kNoPosition) return; 612 if (return_position_ == RelocInfo::kNoPosition) return;
734 latest_source_info_.Update({return_position_, true}); 613 latest_source_info_.Update({return_position_, true});
(...skipping 20 matching lines...) Expand all
755 634
756 void BytecodeArrayBuilder::SetExpressionAsStatementPosition(Expression* expr) { 635 void BytecodeArrayBuilder::SetExpressionAsStatementPosition(Expression* expr) {
757 if (expr->position() == RelocInfo::kNoPosition) return; 636 if (expr->position() == RelocInfo::kNoPosition) return;
758 latest_source_info_.Update({expr->position(), true}); 637 latest_source_info_.Update({expr->position(), true});
759 } 638 }
760 639
761 bool BytecodeArrayBuilder::TemporaryRegisterIsLive(Register reg) const { 640 bool BytecodeArrayBuilder::TemporaryRegisterIsLive(Register reg) const {
762 return temporary_register_allocator()->RegisterIsLive(reg); 641 return temporary_register_allocator()->RegisterIsLive(reg);
763 } 642 }
764 643
765 bool BytecodeArrayBuilder::OperandIsValid(Bytecode bytecode,
766 OperandScale operand_scale,
767 int operand_index,
768 uint32_t operand_value) const {
769 OperandSize operand_size =
770 Bytecodes::GetOperandSize(bytecode, operand_index, operand_scale);
771 OperandType operand_type = Bytecodes::GetOperandType(bytecode, operand_index);
772 switch (operand_type) {
773 case OperandType::kNone:
774 return false;
775 case OperandType::kRegCount: {
776 if (operand_index > 0) {
777 OperandType previous_operand_type =
778 Bytecodes::GetOperandType(bytecode, operand_index - 1);
779 if (previous_operand_type != OperandType::kMaybeReg &&
780 previous_operand_type != OperandType::kReg) {
781 return false;
782 }
783 }
784 } // Fall-through
785 case OperandType::kFlag8:
786 case OperandType::kIdx:
787 case OperandType::kRuntimeId:
788 case OperandType::kImm: {
789 size_t unsigned_value = static_cast<size_t>(operand_value);
790 return Bytecodes::SizeForUnsignedOperand(unsigned_value) <= operand_size;
791 }
792 case OperandType::kMaybeReg:
793 if (RegisterFromOperand(operand_value) == Register(0)) {
794 return true;
795 }
796 // Fall-through to kReg case.
797 case OperandType::kReg:
798 case OperandType::kRegOut: {
799 Register reg = RegisterFromOperand(operand_value);
800 return RegisterIsValid(reg, operand_size);
801 }
802 case OperandType::kRegOutPair:
803 case OperandType::kRegPair: {
804 Register reg0 = RegisterFromOperand(operand_value);
805 Register reg1 = Register(reg0.index() + 1);
806 // The size of reg1 is immaterial.
807 return RegisterIsValid(reg0, operand_size) &&
808 RegisterIsValid(reg1, OperandSize::kQuad);
809 }
810 case OperandType::kRegOutTriple: {
811 Register reg0 = RegisterFromOperand(operand_value);
812 Register reg1 = Register(reg0.index() + 1);
813 Register reg2 = Register(reg0.index() + 2);
814 // The size of reg1 and reg2 is immaterial.
815 return RegisterIsValid(reg0, operand_size) &&
816 RegisterIsValid(reg1, OperandSize::kQuad) &&
817 RegisterIsValid(reg2, OperandSize::kQuad);
818 }
819 }
820 UNREACHABLE();
821 return false;
822 }
823
824 bool BytecodeArrayBuilder::RegisterIsValid(Register reg,
825 OperandSize reg_size) const {
826 if (!reg.is_valid()) {
827 return false;
828 }
829
830 if (reg.SizeOfOperand() > reg_size) {
831 return false;
832 }
833
834 if (reg.is_current_context() || reg.is_function_closure() ||
835 reg.is_new_target()) {
836 return true;
837 } else if (reg.is_parameter()) {
838 int parameter_index = reg.ToParameterIndex(parameter_count());
839 return parameter_index >= 0 && parameter_index < parameter_count();
840 } else if (reg.index() < fixed_register_count()) {
841 return true;
842 } else {
843 return TemporaryRegisterIsLive(reg);
844 }
845 }
846
847 // static 644 // static
848 Bytecode BytecodeArrayBuilder::BytecodeForBinaryOperation(Token::Value op) { 645 Bytecode BytecodeArrayBuilder::BytecodeForBinaryOperation(Token::Value op) {
849 switch (op) { 646 switch (op) {
850 case Token::Value::ADD: 647 case Token::Value::ADD:
851 return Bytecode::kAdd; 648 return Bytecode::kAdd;
852 case Token::Value::SUB: 649 case Token::Value::SUB:
853 return Bytecode::kSub; 650 return Bytecode::kSub;
854 case Token::Value::MUL: 651 case Token::Value::MUL:
855 return Bytecode::kMul; 652 return Bytecode::kMul;
856 case Token::Value::DIV: 653 case Token::Value::DIV:
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1011 case TailCallMode::kDisallow: 808 case TailCallMode::kDisallow:
1012 return Bytecode::kCall; 809 return Bytecode::kCall;
1013 case TailCallMode::kAllow: 810 case TailCallMode::kAllow:
1014 return Bytecode::kTailCall; 811 return Bytecode::kTailCall;
1015 default: 812 default:
1016 UNREACHABLE(); 813 UNREACHABLE();
1017 } 814 }
1018 return Bytecode::kIllegal; 815 return Bytecode::kIllegal;
1019 } 816 }
1020 817
1021 uint32_t BytecodeArrayBuilder::RegisterOperand(Register reg) {
1022 return static_cast<uint32_t>(reg.ToOperand());
1023 }
1024
1025 Register BytecodeArrayBuilder::RegisterFromOperand(uint32_t operand) {
1026 return Register::FromOperand(static_cast<int32_t>(operand));
1027 }
1028
1029 uint32_t BytecodeArrayBuilder::SignedOperand(int value, OperandSize size) {
1030 switch (size) {
1031 case OperandSize::kByte:
1032 return static_cast<uint8_t>(value & 0xff);
1033 case OperandSize::kShort:
1034 return static_cast<uint16_t>(value & 0xffff);
1035 case OperandSize::kQuad:
1036 return static_cast<uint32_t>(value);
1037 case OperandSize::kNone:
1038 UNREACHABLE();
1039 }
1040 return 0;
1041 }
1042
1043 uint32_t BytecodeArrayBuilder::UnsignedOperand(int value) {
1044 DCHECK_GE(value, 0);
1045 return static_cast<uint32_t>(value);
1046 }
1047
1048 uint32_t BytecodeArrayBuilder::UnsignedOperand(size_t value) {
1049 DCHECK_LE(value, kMaxUInt32);
1050 return static_cast<uint32_t>(value);
1051 }
1052
1053 } // namespace interpreter 818 } // namespace interpreter
1054 } // namespace internal 819 } // namespace internal
1055 } // namespace v8 820 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698