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

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

Issue 1894063002: [Interpreter] Remove register file register and replace with LoadParentFramePointer. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix gcc Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/interface-descriptors.cc ('k') | src/interpreter/bytecodes.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 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 #include "src/compiler.h" 6 #include "src/compiler.h"
7 #include "src/interpreter/interpreter-intrinsics.h" 7 #include "src/interpreter/interpreter-intrinsics.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 252
253 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, 253 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode,
254 OperandScale operand_scale, 254 OperandScale operand_scale,
255 uint32_t operand0) { 255 uint32_t operand0) {
256 uint32_t operands[] = {operand0}; 256 uint32_t operands[] = {operand0};
257 Output(bytecode, operands, operand_scale); 257 Output(bytecode, operands, operand_scale);
258 } 258 }
259 259
260 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op, 260 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op,
261 Register reg) { 261 Register reg) {
262 OperandScale operand_scale = OperandSizesToScale(SizeForRegisterOperand(reg)); 262 OperandScale operand_scale = OperandSizesToScale(reg.SizeOfOperand());
263 OutputScaled(BytecodeForBinaryOperation(op), operand_scale, 263 OutputScaled(BytecodeForBinaryOperation(op), operand_scale,
264 RegisterOperand(reg)); 264 RegisterOperand(reg));
265 return *this; 265 return *this;
266 } 266 }
267 267
268 BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op) { 268 BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op) {
269 Output(BytecodeForCountOperation(op)); 269 Output(BytecodeForCountOperation(op));
270 return *this; 270 return *this;
271 } 271 }
272 272
273 273
274 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { 274 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() {
275 Output(Bytecode::kLogicalNot); 275 Output(Bytecode::kLogicalNot);
276 return *this; 276 return *this;
277 } 277 }
278 278
279 279
280 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { 280 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() {
281 Output(Bytecode::kTypeOf); 281 Output(Bytecode::kTypeOf);
282 return *this; 282 return *this;
283 } 283 }
284 284
285 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op, 285 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op,
286 Register reg) { 286 Register reg) {
287 OperandScale operand_scale = OperandSizesToScale(SizeForRegisterOperand(reg)); 287 OperandScale operand_scale = OperandSizesToScale(reg.SizeOfOperand());
288 OutputScaled(BytecodeForCompareOperation(op), operand_scale, 288 OutputScaled(BytecodeForCompareOperation(op), operand_scale,
289 RegisterOperand(reg)); 289 RegisterOperand(reg));
290 return *this; 290 return *this;
291 } 291 }
292 292
293 293
294 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( 294 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(
295 v8::internal::Smi* smi) { 295 v8::internal::Smi* smi) {
296 int32_t raw_smi = smi->value(); 296 int32_t raw_smi = smi->value();
297 if (raw_smi == 0) { 297 if (raw_smi == 0) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 340
341 341
342 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadFalse() { 342 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadFalse() {
343 Output(Bytecode::kLdaFalse); 343 Output(Bytecode::kLdaFalse);
344 return *this; 344 return *this;
345 } 345 }
346 346
347 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister( 347 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister(
348 Register reg) { 348 Register reg) {
349 if (!IsRegisterInAccumulator(reg)) { 349 if (!IsRegisterInAccumulator(reg)) {
350 OperandScale operand_scale = 350 OperandScale operand_scale = OperandSizesToScale(reg.SizeOfOperand());
351 OperandSizesToScale(SizeForRegisterOperand(reg));
352 OutputScaled(Bytecode::kLdar, operand_scale, RegisterOperand(reg)); 351 OutputScaled(Bytecode::kLdar, operand_scale, RegisterOperand(reg));
353 } 352 }
354 return *this; 353 return *this;
355 } 354 }
356 355
357 356
358 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( 357 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister(
359 Register reg) { 358 Register reg) {
360 if (!IsRegisterInAccumulator(reg)) { 359 if (!IsRegisterInAccumulator(reg)) {
361 OperandScale operand_scale = 360 OperandScale operand_scale = OperandSizesToScale(reg.SizeOfOperand());
362 OperandSizesToScale(SizeForRegisterOperand(reg));
363 OutputScaled(Bytecode::kStar, operand_scale, RegisterOperand(reg)); 361 OutputScaled(Bytecode::kStar, operand_scale, RegisterOperand(reg));
364 } 362 }
365 return *this; 363 return *this;
366 } 364 }
367 365
368 366
369 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, 367 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from,
370 Register to) { 368 Register to) {
371 DCHECK(from != to); 369 DCHECK(from != to);
372 OperandScale operand_scale = OperandSizesToScale(SizeForRegisterOperand(from), 370 OperandScale operand_scale =
373 SizeForRegisterOperand(to)); 371 OperandSizesToScale(from.SizeOfOperand(), to.SizeOfOperand());
374 OutputScaled(Bytecode::kMov, operand_scale, RegisterOperand(from), 372 OutputScaled(Bytecode::kMov, operand_scale, RegisterOperand(from),
375 RegisterOperand(to)); 373 RegisterOperand(to));
376 return *this; 374 return *this;
377 } 375 }
378 376
379 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal( 377 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal(
380 const Handle<String> name, int feedback_slot, TypeofMode typeof_mode) { 378 const Handle<String> name, int feedback_slot, TypeofMode typeof_mode) {
381 // TODO(rmcilroy): Potentially store typeof information in an 379 // TODO(rmcilroy): Potentially store typeof information in an
382 // operand rather than having extra bytecodes. 380 // operand rather than having extra bytecodes.
383 Bytecode bytecode = BytecodeForLoadGlobal(typeof_mode); 381 Bytecode bytecode = BytecodeForLoadGlobal(typeof_mode);
(...skipping 15 matching lines...) Expand all
399 SizeForUnsignedOperand(feedback_slot)); 397 SizeForUnsignedOperand(feedback_slot));
400 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index), 398 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index),
401 UnsignedOperand(feedback_slot)); 399 UnsignedOperand(feedback_slot));
402 return *this; 400 return *this;
403 } 401 }
404 402
405 403
406 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context, 404 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context,
407 int slot_index) { 405 int slot_index) {
408 OperandScale operand_scale = OperandSizesToScale( 406 OperandScale operand_scale = OperandSizesToScale(
409 SizeForRegisterOperand(context), SizeForUnsignedOperand(slot_index)); 407 context.SizeOfOperand(), SizeForUnsignedOperand(slot_index));
410 OutputScaled(Bytecode::kLdaContextSlot, operand_scale, 408 OutputScaled(Bytecode::kLdaContextSlot, operand_scale,
411 RegisterOperand(context), UnsignedOperand(slot_index)); 409 RegisterOperand(context), UnsignedOperand(slot_index));
412 return *this; 410 return *this;
413 } 411 }
414 412
415 413
416 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context, 414 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context,
417 int slot_index) { 415 int slot_index) {
418 OperandScale operand_scale = OperandSizesToScale( 416 OperandScale operand_scale = OperandSizesToScale(
419 SizeForRegisterOperand(context), SizeForUnsignedOperand(slot_index)); 417 context.SizeOfOperand(), SizeForUnsignedOperand(slot_index));
420 OutputScaled(Bytecode::kStaContextSlot, operand_scale, 418 OutputScaled(Bytecode::kStaContextSlot, operand_scale,
421 RegisterOperand(context), UnsignedOperand(slot_index)); 419 RegisterOperand(context), UnsignedOperand(slot_index));
422 return *this; 420 return *this;
423 } 421 }
424 422
425 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupSlot( 423 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupSlot(
426 const Handle<String> name, TypeofMode typeof_mode) { 424 const Handle<String> name, TypeofMode typeof_mode) {
427 Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF) 425 Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF)
428 ? Bytecode::kLdaLookupSlotInsideTypeof 426 ? Bytecode::kLdaLookupSlotInsideTypeof
429 : Bytecode::kLdaLookupSlot; 427 : Bytecode::kLdaLookupSlot;
(...skipping 11 matching lines...) Expand all
441 OperandScale operand_scale = 439 OperandScale operand_scale =
442 OperandSizesToScale(SizeForUnsignedOperand(name_index)); 440 OperandSizesToScale(SizeForUnsignedOperand(name_index));
443 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index)); 441 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index));
444 return *this; 442 return *this;
445 } 443 }
446 444
447 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty( 445 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty(
448 Register object, const Handle<Name> name, int feedback_slot) { 446 Register object, const Handle<Name> name, int feedback_slot) {
449 size_t name_index = GetConstantPoolEntry(name); 447 size_t name_index = GetConstantPoolEntry(name);
450 OperandScale operand_scale = OperandSizesToScale( 448 OperandScale operand_scale = OperandSizesToScale(
451 SizeForRegisterOperand(object), SizeForUnsignedOperand(name_index), 449 object.SizeOfOperand(), SizeForUnsignedOperand(name_index),
452 SizeForUnsignedOperand(feedback_slot)); 450 SizeForUnsignedOperand(feedback_slot));
453 OutputScaled(Bytecode::kLoadIC, operand_scale, RegisterOperand(object), 451 OutputScaled(Bytecode::kLoadIC, operand_scale, RegisterOperand(object),
454 UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); 452 UnsignedOperand(name_index), UnsignedOperand(feedback_slot));
455 return *this; 453 return *this;
456 } 454 }
457 455
458 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( 456 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty(
459 Register object, int feedback_slot) { 457 Register object, int feedback_slot) {
460 OperandScale operand_scale = OperandSizesToScale( 458 OperandScale operand_scale = OperandSizesToScale(
461 SizeForRegisterOperand(object), SizeForUnsignedOperand(feedback_slot)); 459 object.SizeOfOperand(), SizeForUnsignedOperand(feedback_slot));
462 OutputScaled(Bytecode::kKeyedLoadIC, operand_scale, RegisterOperand(object), 460 OutputScaled(Bytecode::kKeyedLoadIC, operand_scale, RegisterOperand(object),
463 UnsignedOperand(feedback_slot)); 461 UnsignedOperand(feedback_slot));
464 return *this; 462 return *this;
465 } 463 }
466 464
467 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( 465 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty(
468 Register object, const Handle<Name> name, int feedback_slot, 466 Register object, const Handle<Name> name, int feedback_slot,
469 LanguageMode language_mode) { 467 LanguageMode language_mode) {
470 Bytecode bytecode = BytecodeForStoreIC(language_mode); 468 Bytecode bytecode = BytecodeForStoreIC(language_mode);
471 size_t name_index = GetConstantPoolEntry(name); 469 size_t name_index = GetConstantPoolEntry(name);
472 OperandScale operand_scale = OperandSizesToScale( 470 OperandScale operand_scale = OperandSizesToScale(
473 SizeForRegisterOperand(object), SizeForUnsignedOperand(name_index), 471 object.SizeOfOperand(), SizeForUnsignedOperand(name_index),
474 SizeForUnsignedOperand(feedback_slot)); 472 SizeForUnsignedOperand(feedback_slot));
475 OutputScaled(bytecode, operand_scale, RegisterOperand(object), 473 OutputScaled(bytecode, operand_scale, RegisterOperand(object),
476 UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); 474 UnsignedOperand(name_index), UnsignedOperand(feedback_slot));
477 return *this; 475 return *this;
478 } 476 }
479 477
480 478
481 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( 479 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty(
482 Register object, Register key, int feedback_slot, 480 Register object, Register key, int feedback_slot,
483 LanguageMode language_mode) { 481 LanguageMode language_mode) {
484 Bytecode bytecode = BytecodeForKeyedStoreIC(language_mode); 482 Bytecode bytecode = BytecodeForKeyedStoreIC(language_mode);
485 OperandScale operand_scale = OperandSizesToScale( 483 OperandScale operand_scale =
486 SizeForRegisterOperand(object), SizeForRegisterOperand(key), 484 OperandSizesToScale(object.SizeOfOperand(), key.SizeOfOperand(),
487 SizeForUnsignedOperand(feedback_slot)); 485 SizeForUnsignedOperand(feedback_slot));
488 OutputScaled(bytecode, operand_scale, RegisterOperand(object), 486 OutputScaled(bytecode, operand_scale, RegisterOperand(object),
489 RegisterOperand(key), UnsignedOperand(feedback_slot)); 487 RegisterOperand(key), UnsignedOperand(feedback_slot));
490 return *this; 488 return *this;
491 } 489 }
492 490
493 491
494 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure( 492 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure(
495 Handle<SharedFunctionInfo> shared_info, PretenureFlag tenured) { 493 Handle<SharedFunctionInfo> shared_info, PretenureFlag tenured) {
496 size_t entry = GetConstantPoolEntry(shared_info); 494 size_t entry = GetConstantPoolEntry(shared_info);
497 OperandScale operand_scale = 495 OperandScale operand_scale =
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 SizeForUnsignedOperand(constant_properties_entry), 544 SizeForUnsignedOperand(constant_properties_entry),
547 SizeForUnsignedOperand(literal_index), SizeForUnsignedOperand(flags)); 545 SizeForUnsignedOperand(literal_index), SizeForUnsignedOperand(flags));
548 OutputScaled(Bytecode::kCreateObjectLiteral, operand_scale, 546 OutputScaled(Bytecode::kCreateObjectLiteral, operand_scale,
549 UnsignedOperand(constant_properties_entry), 547 UnsignedOperand(constant_properties_entry),
550 UnsignedOperand(literal_index), UnsignedOperand(flags)); 548 UnsignedOperand(literal_index), UnsignedOperand(flags));
551 return *this; 549 return *this;
552 } 550 }
553 551
554 552
555 BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) { 553 BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) {
556 OperandScale operand_scale = 554 OperandScale operand_scale = OperandSizesToScale(context.SizeOfOperand());
557 OperandSizesToScale(SizeForRegisterOperand(context));
558 OutputScaled(Bytecode::kPushContext, operand_scale, RegisterOperand(context)); 555 OutputScaled(Bytecode::kPushContext, operand_scale, RegisterOperand(context));
559 return *this; 556 return *this;
560 } 557 }
561 558
562 559
563 BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) { 560 BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) {
564 OperandScale operand_scale = 561 OperandScale operand_scale = OperandSizesToScale(context.SizeOfOperand());
565 OperandSizesToScale(SizeForRegisterOperand(context));
566 OutputScaled(Bytecode::kPopContext, operand_scale, RegisterOperand(context)); 562 OutputScaled(Bytecode::kPopContext, operand_scale, RegisterOperand(context));
567 return *this; 563 return *this;
568 } 564 }
569 565
570 566
571 bool BytecodeArrayBuilder::NeedToBooleanCast() { 567 bool BytecodeArrayBuilder::NeedToBooleanCast() {
572 if (!LastBytecodeInSameBlock()) { 568 if (!LastBytecodeInSameBlock()) {
573 return true; 569 return true;
574 } 570 }
575 PreviousBytecodeHelper previous_bytecode(*this); 571 PreviousBytecodeHelper previous_bytecode(*this);
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 } 898 }
903 899
904 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() { 900 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() {
905 Output(Bytecode::kDebugger); 901 Output(Bytecode::kDebugger);
906 return *this; 902 return *this;
907 } 903 }
908 904
909 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare( 905 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare(
910 Register cache_info_triple) { 906 Register cache_info_triple) {
911 OperandScale operand_scale = 907 OperandScale operand_scale =
912 OperandSizesToScale(SizeForRegisterOperand(cache_info_triple)); 908 OperandSizesToScale(cache_info_triple.SizeOfOperand());
913 OutputScaled(Bytecode::kForInPrepare, operand_scale, 909 OutputScaled(Bytecode::kForInPrepare, operand_scale,
914 RegisterOperand(cache_info_triple)); 910 RegisterOperand(cache_info_triple));
915 return *this; 911 return *this;
916 } 912 }
917 913
918 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index, 914 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index,
919 Register cache_length) { 915 Register cache_length) {
920 OperandScale operand_scale = OperandSizesToScale( 916 OperandScale operand_scale =
921 SizeForRegisterOperand(index), SizeForRegisterOperand(cache_length)); 917 OperandSizesToScale(index.SizeOfOperand(), cache_length.SizeOfOperand());
922 OutputScaled(Bytecode::kForInDone, operand_scale, RegisterOperand(index), 918 OutputScaled(Bytecode::kForInDone, operand_scale, RegisterOperand(index),
923 RegisterOperand(cache_length)); 919 RegisterOperand(cache_length));
924 return *this; 920 return *this;
925 } 921 }
926 922
927 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext( 923 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext(
928 Register receiver, Register index, Register cache_type_array_pair, 924 Register receiver, Register index, Register cache_type_array_pair,
929 int feedback_slot) { 925 int feedback_slot) {
930 OperandScale operand_scale = OperandSizesToScale( 926 OperandScale operand_scale =
931 SizeForRegisterOperand(receiver), SizeForRegisterOperand(index), 927 OperandSizesToScale(receiver.SizeOfOperand(), index.SizeOfOperand(),
932 SizeForRegisterOperand(cache_type_array_pair), 928 cache_type_array_pair.SizeOfOperand(),
933 SizeForUnsignedOperand(feedback_slot)); 929 SizeForUnsignedOperand(feedback_slot));
934 OutputScaled(Bytecode::kForInNext, operand_scale, RegisterOperand(receiver), 930 OutputScaled(Bytecode::kForInNext, operand_scale, RegisterOperand(receiver),
935 RegisterOperand(index), RegisterOperand(cache_type_array_pair), 931 RegisterOperand(index), RegisterOperand(cache_type_array_pair),
936 UnsignedOperand(feedback_slot)); 932 UnsignedOperand(feedback_slot));
937 return *this; 933 return *this;
938 } 934 }
939 935
940 936
941 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) { 937 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) {
942 OperandScale operand_scale = 938 OperandScale operand_scale = OperandSizesToScale(index.SizeOfOperand());
943 OperandSizesToScale(SizeForRegisterOperand(index));
944 OutputScaled(Bytecode::kForInStep, operand_scale, RegisterOperand(index)); 939 OutputScaled(Bytecode::kForInStep, operand_scale, RegisterOperand(index));
945 return *this; 940 return *this;
946 } 941 }
947 942
948 943
949 BytecodeArrayBuilder& BytecodeArrayBuilder::MarkHandler(int handler_id, 944 BytecodeArrayBuilder& BytecodeArrayBuilder::MarkHandler(int handler_id,
950 bool will_catch) { 945 bool will_catch) {
951 handler_table_builder()->SetHandlerTarget(handler_id, bytecodes()->size()); 946 handler_table_builder()->SetHandlerTarget(handler_id, bytecodes()->size());
952 handler_table_builder()->SetPrediction(handler_id, will_catch); 947 handler_table_builder()->SetPrediction(handler_id, will_catch);
953 return *this; 948 return *this;
(...skipping 27 matching lines...) Expand all
981 DCHECK(exit_seen_in_block_); 976 DCHECK(exit_seen_in_block_);
982 } 977 }
983 978
984 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, 979 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable,
985 Register receiver_args, 980 Register receiver_args,
986 size_t receiver_args_count, 981 size_t receiver_args_count,
987 int feedback_slot, 982 int feedback_slot,
988 TailCallMode tail_call_mode) { 983 TailCallMode tail_call_mode) {
989 Bytecode bytecode = BytecodeForCall(tail_call_mode); 984 Bytecode bytecode = BytecodeForCall(tail_call_mode);
990 OperandScale operand_scale = OperandSizesToScale( 985 OperandScale operand_scale = OperandSizesToScale(
991 SizeForRegisterOperand(callable), SizeForRegisterOperand(receiver_args), 986 callable.SizeOfOperand(), receiver_args.SizeOfOperand(),
992 SizeForUnsignedOperand(receiver_args_count), 987 SizeForUnsignedOperand(receiver_args_count),
993 SizeForUnsignedOperand(feedback_slot)); 988 SizeForUnsignedOperand(feedback_slot));
994 OutputScaled(bytecode, operand_scale, RegisterOperand(callable), 989 OutputScaled(bytecode, operand_scale, RegisterOperand(callable),
995 RegisterOperand(receiver_args), 990 RegisterOperand(receiver_args),
996 UnsignedOperand(receiver_args_count), 991 UnsignedOperand(receiver_args_count),
997 UnsignedOperand(feedback_slot)); 992 UnsignedOperand(feedback_slot));
998 return *this; 993 return *this;
999 } 994 }
1000 995
1001 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor, 996 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor,
1002 Register first_arg, 997 Register first_arg,
1003 size_t arg_count) { 998 size_t arg_count) {
1004 if (!first_arg.is_valid()) { 999 if (!first_arg.is_valid()) {
1005 DCHECK_EQ(0u, arg_count); 1000 DCHECK_EQ(0u, arg_count);
1006 first_arg = Register(0); 1001 first_arg = Register(0);
1007 } 1002 }
1008 OperandScale operand_scale = OperandSizesToScale( 1003 OperandScale operand_scale = OperandSizesToScale(
1009 SizeForRegisterOperand(constructor), SizeForRegisterOperand(first_arg), 1004 constructor.SizeOfOperand(), first_arg.SizeOfOperand(),
1010 SizeForUnsignedOperand(arg_count)); 1005 SizeForUnsignedOperand(arg_count));
1011 OutputScaled(Bytecode::kNew, operand_scale, RegisterOperand(constructor), 1006 OutputScaled(Bytecode::kNew, operand_scale, RegisterOperand(constructor),
1012 RegisterOperand(first_arg), UnsignedOperand(arg_count)); 1007 RegisterOperand(first_arg), UnsignedOperand(arg_count));
1013 return *this; 1008 return *this;
1014 } 1009 }
1015 1010
1016 1011
1017 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( 1012 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime(
1018 Runtime::FunctionId function_id, Register first_arg, size_t arg_count) { 1013 Runtime::FunctionId function_id, Register first_arg, size_t arg_count) {
1019 DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size); 1014 DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size);
1020 DCHECK(SizeForUnsignedOperand(function_id) <= OperandSize::kShort); 1015 DCHECK(SizeForUnsignedOperand(function_id) <= OperandSize::kShort);
1021 if (!first_arg.is_valid()) { 1016 if (!first_arg.is_valid()) {
1022 DCHECK_EQ(0u, arg_count); 1017 DCHECK_EQ(0u, arg_count);
1023 first_arg = Register(0); 1018 first_arg = Register(0);
1024 } 1019 }
1025 Bytecode bytecode = IntrinsicsHelper::IsSupported(function_id) 1020 Bytecode bytecode = IntrinsicsHelper::IsSupported(function_id)
1026 ? Bytecode::kInvokeIntrinsic 1021 ? Bytecode::kInvokeIntrinsic
1027 : Bytecode::kCallRuntime; 1022 : Bytecode::kCallRuntime;
1028 OperandScale operand_scale = OperandSizesToScale( 1023 OperandScale operand_scale = OperandSizesToScale(
1029 SizeForRegisterOperand(first_arg), SizeForUnsignedOperand(arg_count)); 1024 first_arg.SizeOfOperand(), SizeForUnsignedOperand(arg_count));
1030 OutputScaled(bytecode, operand_scale, static_cast<uint16_t>(function_id), 1025 OutputScaled(bytecode, operand_scale, static_cast<uint16_t>(function_id),
1031 RegisterOperand(first_arg), UnsignedOperand(arg_count)); 1026 RegisterOperand(first_arg), UnsignedOperand(arg_count));
1032 return *this; 1027 return *this;
1033 } 1028 }
1034 1029
1035 1030
1036 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair( 1031 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair(
1037 Runtime::FunctionId function_id, Register first_arg, size_t arg_count, 1032 Runtime::FunctionId function_id, Register first_arg, size_t arg_count,
1038 Register first_return) { 1033 Register first_return) {
1039 DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size); 1034 DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size);
1040 DCHECK(SizeForUnsignedOperand(function_id) <= OperandSize::kShort); 1035 DCHECK(SizeForUnsignedOperand(function_id) <= OperandSize::kShort);
1041 if (!first_arg.is_valid()) { 1036 if (!first_arg.is_valid()) {
1042 DCHECK_EQ(0u, arg_count); 1037 DCHECK_EQ(0u, arg_count);
1043 first_arg = Register(0); 1038 first_arg = Register(0);
1044 } 1039 }
1045 OperandScale operand_scale = OperandSizesToScale( 1040 OperandScale operand_scale = OperandSizesToScale(
1046 SizeForRegisterOperand(first_arg), SizeForUnsignedOperand(arg_count), 1041 first_arg.SizeOfOperand(), SizeForUnsignedOperand(arg_count),
1047 SizeForRegisterOperand(first_return)); 1042 first_return.SizeOfOperand());
1048 OutputScaled(Bytecode::kCallRuntimeForPair, operand_scale, 1043 OutputScaled(Bytecode::kCallRuntimeForPair, operand_scale,
1049 static_cast<uint16_t>(function_id), RegisterOperand(first_arg), 1044 static_cast<uint16_t>(function_id), RegisterOperand(first_arg),
1050 UnsignedOperand(arg_count), RegisterOperand(first_return)); 1045 UnsignedOperand(arg_count), RegisterOperand(first_return));
1051 return *this; 1046 return *this;
1052 } 1047 }
1053 1048
1054 BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime( 1049 BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime(
1055 int context_index, Register receiver_args, size_t receiver_args_count) { 1050 int context_index, Register receiver_args, size_t receiver_args_count) {
1056 OperandScale operand_scale = 1051 OperandScale operand_scale = OperandSizesToScale(
1057 OperandSizesToScale(SizeForUnsignedOperand(context_index), 1052 SizeForUnsignedOperand(context_index), receiver_args.SizeOfOperand(),
1058 SizeForRegisterOperand(receiver_args), 1053 SizeForUnsignedOperand(receiver_args_count));
1059 SizeForUnsignedOperand(receiver_args_count));
1060 OutputScaled(Bytecode::kCallJSRuntime, operand_scale, 1054 OutputScaled(Bytecode::kCallJSRuntime, operand_scale,
1061 UnsignedOperand(context_index), RegisterOperand(receiver_args), 1055 UnsignedOperand(context_index), RegisterOperand(receiver_args),
1062 UnsignedOperand(receiver_args_count)); 1056 UnsignedOperand(receiver_args_count));
1063 return *this; 1057 return *this;
1064 } 1058 }
1065 1059
1066 1060
1067 BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object, 1061 BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object,
1068 LanguageMode language_mode) { 1062 LanguageMode language_mode) {
1069 OperandScale operand_scale = 1063 OperandScale operand_scale = OperandSizesToScale(object.SizeOfOperand());
1070 OperandSizesToScale(SizeForRegisterOperand(object));
1071 OutputScaled(BytecodeForDelete(language_mode), operand_scale, 1064 OutputScaled(BytecodeForDelete(language_mode), operand_scale,
1072 RegisterOperand(object)); 1065 RegisterOperand(object));
1073 return *this; 1066 return *this;
1074 } 1067 }
1075 1068
1076 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { 1069 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) {
1077 return constant_array_builder()->Insert(object); 1070 return constant_array_builder()->Insert(object);
1078 } 1071 }
1079 1072
1080 void BytecodeArrayBuilder::SetReturnPosition() { 1073 void BytecodeArrayBuilder::SetReturnPosition() {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 } 1123 }
1131 } // Fall-through 1124 } // Fall-through
1132 case OperandType::kFlag8: 1125 case OperandType::kFlag8:
1133 case OperandType::kIdx: 1126 case OperandType::kIdx:
1134 case OperandType::kRuntimeId: 1127 case OperandType::kRuntimeId:
1135 case OperandType::kImm: { 1128 case OperandType::kImm: {
1136 size_t unsigned_value = static_cast<size_t>(operand_value); 1129 size_t unsigned_value = static_cast<size_t>(operand_value);
1137 return SizeForUnsignedOperand(unsigned_value) <= operand_size; 1130 return SizeForUnsignedOperand(unsigned_value) <= operand_size;
1138 } 1131 }
1139 case OperandType::kMaybeReg: 1132 case OperandType::kMaybeReg:
1140 if (operand_value == 0) { 1133 if (RegisterFromOperand(operand_value) == Register(0)) {
1141 return true; 1134 return true;
1142 } 1135 }
1143 // Fall-through to kReg case. 1136 // Fall-through to kReg case.
1144 case OperandType::kReg: 1137 case OperandType::kReg:
1145 case OperandType::kRegOut: { 1138 case OperandType::kRegOut: {
1146 Register reg = RegisterFromOperand(operand_value); 1139 Register reg = RegisterFromOperand(operand_value);
1147 return RegisterIsValid(reg, operand_size); 1140 return RegisterIsValid(reg, operand_size);
1148 } 1141 }
1149 case OperandType::kRegOutPair: 1142 case OperandType::kRegOutPair:
1150 case OperandType::kRegPair: { 1143 case OperandType::kRegPair: {
(...skipping 16 matching lines...) Expand all
1167 UNREACHABLE(); 1160 UNREACHABLE();
1168 return false; 1161 return false;
1169 } 1162 }
1170 1163
1171 bool BytecodeArrayBuilder::RegisterIsValid(Register reg, 1164 bool BytecodeArrayBuilder::RegisterIsValid(Register reg,
1172 OperandSize reg_size) const { 1165 OperandSize reg_size) const {
1173 if (!reg.is_valid()) { 1166 if (!reg.is_valid()) {
1174 return false; 1167 return false;
1175 } 1168 }
1176 1169
1177 if (SizeForRegisterOperand(reg) > reg_size) { 1170 if (reg.SizeOfOperand() > reg_size) {
1178 return false; 1171 return false;
1179 } 1172 }
1180 1173
1181 if (reg.is_current_context() || reg.is_function_closure() || 1174 if (reg.is_current_context() || reg.is_function_closure() ||
1182 reg.is_new_target()) { 1175 reg.is_new_target()) {
1183 return true; 1176 return true;
1184 } else if (reg.is_parameter()) { 1177 } else if (reg.is_parameter()) {
1185 int parameter_index = reg.ToParameterIndex(parameter_count()); 1178 int parameter_index = reg.ToParameterIndex(parameter_count());
1186 return parameter_index >= 0 && parameter_index < parameter_count(); 1179 return parameter_index >= 0 && parameter_index < parameter_count();
1187 } else if (reg.index() < fixed_register_count()) { 1180 } else if (reg.index() < fixed_register_count()) {
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
1385 return Bytecode::kCall; 1378 return Bytecode::kCall;
1386 case TailCallMode::kAllow: 1379 case TailCallMode::kAllow:
1387 return Bytecode::kTailCall; 1380 return Bytecode::kTailCall;
1388 default: 1381 default:
1389 UNREACHABLE(); 1382 UNREACHABLE();
1390 } 1383 }
1391 return Bytecode::kIllegal; 1384 return Bytecode::kIllegal;
1392 } 1385 }
1393 1386
1394 // static 1387 // static
1395 OperandSize BytecodeArrayBuilder::SizeForRegisterOperand(Register value) {
1396 if (value.is_byte_operand()) {
1397 return OperandSize::kByte;
1398 } else if (value.is_short_operand()) {
1399 return OperandSize::kShort;
1400 } else {
1401 return OperandSize::kQuad;
1402 }
1403 }
1404
1405 // static
1406 OperandSize BytecodeArrayBuilder::SizeForSignedOperand(int value) { 1388 OperandSize BytecodeArrayBuilder::SizeForSignedOperand(int value) {
1407 if (kMinInt8 <= value && value <= kMaxInt8) { 1389 if (kMinInt8 <= value && value <= kMaxInt8) {
1408 return OperandSize::kByte; 1390 return OperandSize::kByte;
1409 } else if (kMinInt16 <= value && value <= kMaxInt16) { 1391 } else if (kMinInt16 <= value && value <= kMaxInt16) {
1410 return OperandSize::kShort; 1392 return OperandSize::kShort;
1411 } else { 1393 } else {
1412 return OperandSize::kQuad; 1394 return OperandSize::kQuad;
1413 } 1395 }
1414 } 1396 }
1415 1397
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1489 } 1471 }
1490 1472
1491 uint32_t BytecodeArrayBuilder::UnsignedOperand(size_t value) { 1473 uint32_t BytecodeArrayBuilder::UnsignedOperand(size_t value) {
1492 DCHECK_LE(value, kMaxUInt32); 1474 DCHECK_LE(value, kMaxUInt32);
1493 return static_cast<uint32_t>(value); 1475 return static_cast<uint32_t>(value);
1494 } 1476 }
1495 1477
1496 } // namespace interpreter 1478 } // namespace interpreter
1497 } // namespace internal 1479 } // namespace internal
1498 } // namespace v8 1480 } // namespace v8
OLDNEW
« no previous file with comments | « src/interface-descriptors.cc ('k') | src/interpreter/bytecodes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698