OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/interpreter/bytecode-array-builder.h" | 7 #include "src/interpreter/bytecode-array-builder.h" |
8 #include "src/interpreter/bytecode-array-iterator.h" | 8 #include "src/interpreter/bytecode-array-iterator.h" |
9 #include "src/interpreter/bytecode-label.h" | 9 #include "src/interpreter/bytecode-label.h" |
10 #include "src/interpreter/bytecode-register-allocator.h" | 10 #include "src/interpreter/bytecode-register-allocator.h" |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 builder.CallRuntime(Runtime::kInlineIsArray, reg, 1) | 367 builder.CallRuntime(Runtime::kInlineIsArray, reg, 1) |
368 .CallRuntime(Runtime::kInlineIsArray, wide, 1); | 368 .CallRuntime(Runtime::kInlineIsArray, wide, 1); |
369 | 369 |
370 builder.Debugger(); | 370 builder.Debugger(); |
371 for (size_t i = 0; i < arraysize(end); i++) { | 371 for (size_t i = 0; i < arraysize(end); i++) { |
372 builder.Bind(&end[i]); | 372 builder.Bind(&end[i]); |
373 } | 373 } |
374 builder.Return(); | 374 builder.Return(); |
375 | 375 |
376 // Generate BytecodeArray. | 376 // Generate BytecodeArray. |
377 Handle<BytecodeArray> the_array = builder.ToBytecodeArray(); | 377 Handle<BytecodeArray> the_array = builder.ToBytecodeArray(isolate()); |
378 CHECK_EQ(the_array->frame_size(), | 378 CHECK_EQ(the_array->frame_size(), |
379 builder.fixed_and_temporary_register_count() * kPointerSize); | 379 builder.fixed_and_temporary_register_count() * kPointerSize); |
380 | 380 |
381 // Build scorecard of bytecodes encountered in the BytecodeArray. | 381 // Build scorecard of bytecodes encountered in the BytecodeArray. |
382 std::vector<int> scorecard(Bytecodes::ToByte(Bytecode::kLast) + 1); | 382 std::vector<int> scorecard(Bytecodes::ToByte(Bytecode::kLast) + 1); |
383 | 383 |
384 Bytecode final_bytecode = Bytecode::kLdaZero; | 384 Bytecode final_bytecode = Bytecode::kLdaZero; |
385 int i = 0; | 385 int i = 0; |
386 while (i < the_array->length()) { | 386 while (i < the_array->length()) { |
387 uint8_t code = the_array->get(i); | 387 uint8_t code = the_array->get(i); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 builder.StoreAccumulatorInRegister(temporaries.NewRegister()); | 456 builder.StoreAccumulatorInRegister(temporaries.NewRegister()); |
457 } | 457 } |
458 if (temps > 0) { | 458 if (temps > 0) { |
459 // Ensure temporaries are used so not optimized away by the | 459 // Ensure temporaries are used so not optimized away by the |
460 // register optimizer. | 460 // register optimizer. |
461 builder.New(Register(locals + contexts), Register(locals + contexts), | 461 builder.New(Register(locals + contexts), Register(locals + contexts), |
462 static_cast<size_t>(temps)); | 462 static_cast<size_t>(temps)); |
463 } | 463 } |
464 builder.Return(); | 464 builder.Return(); |
465 | 465 |
466 Handle<BytecodeArray> the_array = builder.ToBytecodeArray(); | 466 Handle<BytecodeArray> the_array = builder.ToBytecodeArray(isolate()); |
467 int total_registers = locals + contexts + temps; | 467 int total_registers = locals + contexts + temps; |
468 CHECK_EQ(the_array->frame_size(), total_registers * kPointerSize); | 468 CHECK_EQ(the_array->frame_size(), total_registers * kPointerSize); |
469 } | 469 } |
470 } | 470 } |
471 } | 471 } |
472 } | 472 } |
473 | 473 |
474 | 474 |
475 TEST_F(BytecodeArrayBuilderTest, RegisterValues) { | 475 TEST_F(BytecodeArrayBuilderTest, RegisterValues) { |
476 CanonicalHandleScope canonical(isolate()); | 476 CanonicalHandleScope canonical(isolate()); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 Handle<Object> large_smi(Smi::FromInt(0x12345678), isolate()); | 529 Handle<Object> large_smi(Smi::FromInt(0x12345678), isolate()); |
530 Handle<HeapObject> heap_num_2_copy(*heap_num_2); | 530 Handle<HeapObject> heap_num_2_copy(*heap_num_2); |
531 builder.LoadLiteral(heap_num_1) | 531 builder.LoadLiteral(heap_num_1) |
532 .LoadLiteral(heap_num_2) | 532 .LoadLiteral(heap_num_2) |
533 .LoadLiteral(large_smi) | 533 .LoadLiteral(large_smi) |
534 .LoadLiteral(heap_num_1) | 534 .LoadLiteral(heap_num_1) |
535 .LoadLiteral(heap_num_1) | 535 .LoadLiteral(heap_num_1) |
536 .LoadLiteral(heap_num_2_copy) | 536 .LoadLiteral(heap_num_2_copy) |
537 .Return(); | 537 .Return(); |
538 | 538 |
539 Handle<BytecodeArray> array = builder.ToBytecodeArray(); | 539 Handle<BytecodeArray> array = builder.ToBytecodeArray(isolate()); |
540 // Should only have one entry for each identical constant. | 540 // Should only have one entry for each identical constant. |
541 CHECK_EQ(array->constant_pool()->length(), 3); | 541 CHECK_EQ(array->constant_pool()->length(), 3); |
542 } | 542 } |
543 | 543 |
544 static Bytecode PeepholeToBoolean(Bytecode jump_bytecode) { | 544 static Bytecode PeepholeToBoolean(Bytecode jump_bytecode) { |
545 return FLAG_ignition_peephole | 545 return FLAG_ignition_peephole |
546 ? Bytecodes::GetJumpWithoutToBoolean(jump_bytecode) | 546 ? Bytecodes::GetJumpWithoutToBoolean(jump_bytecode) |
547 : jump_bytecode; | 547 : jump_bytecode; |
548 } | 548 } |
549 | 549 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 .BinaryOperation(Token::Value::ADD, reg, 3) | 582 .BinaryOperation(Token::Value::ADD, reg, 3) |
583 .JumpIfTrue(&far3) | 583 .JumpIfTrue(&far3) |
584 .BinaryOperation(Token::Value::ADD, reg, 4) | 584 .BinaryOperation(Token::Value::ADD, reg, 4) |
585 .JumpIfFalse(&far4); | 585 .JumpIfFalse(&far4); |
586 for (int i = 0; i < kFarJumpDistance - 20; i++) { | 586 for (int i = 0; i < kFarJumpDistance - 20; i++) { |
587 builder.Debugger(); | 587 builder.Debugger(); |
588 } | 588 } |
589 builder.Bind(&far0).Bind(&far1).Bind(&far2).Bind(&far3).Bind(&far4); | 589 builder.Bind(&far0).Bind(&far1).Bind(&far2).Bind(&far3).Bind(&far4); |
590 builder.Return(); | 590 builder.Return(); |
591 | 591 |
592 Handle<BytecodeArray> array = builder.ToBytecodeArray(); | 592 Handle<BytecodeArray> array = builder.ToBytecodeArray(isolate()); |
593 DCHECK_EQ(array->length(), 40 + kFarJumpDistance - 20 + 1); | 593 DCHECK_EQ(array->length(), 40 + kFarJumpDistance - 20 + 1); |
594 | 594 |
595 BytecodeArrayIterator iterator(array); | 595 BytecodeArrayIterator iterator(array); |
596 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); | 596 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
597 CHECK_EQ(iterator.GetImmediateOperand(0), 20); | 597 CHECK_EQ(iterator.GetImmediateOperand(0), 20); |
598 iterator.Advance(); | 598 iterator.Advance(); |
599 | 599 |
600 // Ignore compare operation. | 600 // Ignore compare operation. |
601 iterator.Advance(); | 601 iterator.Advance(); |
602 | 602 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 | 702 |
703 builder.BinaryOperation(Token::Value::ADD, reg, 1).JumpIfFalse(&label4); | 703 builder.BinaryOperation(Token::Value::ADD, reg, 1).JumpIfFalse(&label4); |
704 builder.BinaryOperation(Token::Value::ADD, reg, 2).JumpIfTrue(&label3); | 704 builder.BinaryOperation(Token::Value::ADD, reg, 2).JumpIfTrue(&label3); |
705 builder.CompareOperation(Token::Value::EQ, reg).JumpIfFalse(&label2); | 705 builder.CompareOperation(Token::Value::EQ, reg).JumpIfFalse(&label2); |
706 builder.CompareOperation(Token::Value::EQ, reg).JumpIfTrue(&label1); | 706 builder.CompareOperation(Token::Value::EQ, reg).JumpIfTrue(&label1); |
707 builder.Jump(&label0); | 707 builder.Jump(&label0); |
708 BytecodeLabel end; | 708 BytecodeLabel end; |
709 builder.Bind(&end); | 709 builder.Bind(&end); |
710 builder.Return(); | 710 builder.Return(); |
711 | 711 |
712 Handle<BytecodeArray> array = builder.ToBytecodeArray(); | 712 Handle<BytecodeArray> array = builder.ToBytecodeArray(isolate()); |
713 BytecodeArrayIterator iterator(array); | 713 BytecodeArrayIterator iterator(array); |
714 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); | 714 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
715 CHECK_EQ(iterator.GetImmediateOperand(0), 0); | 715 CHECK_EQ(iterator.GetImmediateOperand(0), 0); |
716 iterator.Advance(); | 716 iterator.Advance(); |
717 // Ignore compare operation. | 717 // Ignore compare operation. |
718 iterator.Advance(); | 718 iterator.Advance(); |
719 CHECK_EQ(iterator.current_bytecode(), | 719 CHECK_EQ(iterator.current_bytecode(), |
720 PeepholeToBoolean(Bytecode::kJumpIfToBooleanTrue)); | 720 PeepholeToBoolean(Bytecode::kJumpIfToBooleanTrue)); |
721 CHECK_EQ(iterator.current_operand_scale(), OperandScale::kSingle); | 721 CHECK_EQ(iterator.current_operand_scale(), OperandScale::kSingle); |
722 CHECK_EQ(iterator.GetImmediateOperand(0), -2); | 722 CHECK_EQ(iterator.GetImmediateOperand(0), -2); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 BytecodeLabel label, after_jump0, after_jump1; | 797 BytecodeLabel label, after_jump0, after_jump1; |
798 | 798 |
799 builder.Jump(&label) | 799 builder.Jump(&label) |
800 .Bind(&label) | 800 .Bind(&label) |
801 .Jump(&label) | 801 .Jump(&label) |
802 .Bind(&after_jump0) | 802 .Bind(&after_jump0) |
803 .Jump(&label) | 803 .Jump(&label) |
804 .Bind(&after_jump1) | 804 .Bind(&after_jump1) |
805 .Return(); | 805 .Return(); |
806 | 806 |
807 Handle<BytecodeArray> array = builder.ToBytecodeArray(); | 807 Handle<BytecodeArray> array = builder.ToBytecodeArray(isolate()); |
808 BytecodeArrayIterator iterator(array); | 808 BytecodeArrayIterator iterator(array); |
809 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); | 809 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
810 CHECK_EQ(iterator.GetImmediateOperand(0), 2); | 810 CHECK_EQ(iterator.GetImmediateOperand(0), 2); |
811 iterator.Advance(); | 811 iterator.Advance(); |
812 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); | 812 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
813 CHECK_EQ(iterator.GetImmediateOperand(0), 0); | 813 CHECK_EQ(iterator.GetImmediateOperand(0), 0); |
814 iterator.Advance(); | 814 iterator.Advance(); |
815 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); | 815 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
816 CHECK_EQ(iterator.GetImmediateOperand(0), -2); | 816 CHECK_EQ(iterator.GetImmediateOperand(0), -2); |
817 iterator.Advance(); | 817 iterator.Advance(); |
(...skipping 12 matching lines...) Expand all Loading... |
830 BytecodeLabel label, after_jump0, after_jump1; | 830 BytecodeLabel label, after_jump0, after_jump1; |
831 builder.Jump(&label) | 831 builder.Jump(&label) |
832 .Bind(&label) | 832 .Bind(&label) |
833 .Jump(&label) | 833 .Jump(&label) |
834 .Bind(&after_jump0) | 834 .Bind(&after_jump0) |
835 .Jump(&label) | 835 .Jump(&label) |
836 .Bind(&after_jump1); | 836 .Bind(&after_jump1); |
837 } | 837 } |
838 builder.Return(); | 838 builder.Return(); |
839 | 839 |
840 Handle<BytecodeArray> array = builder.ToBytecodeArray(); | 840 Handle<BytecodeArray> array = builder.ToBytecodeArray(isolate()); |
841 BytecodeArrayIterator iterator(array); | 841 BytecodeArrayIterator iterator(array); |
842 for (int i = 0; i < kRepeats; i++) { | 842 for (int i = 0; i < kRepeats; i++) { |
843 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); | 843 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
844 CHECK_EQ(iterator.GetImmediateOperand(0), 2); | 844 CHECK_EQ(iterator.GetImmediateOperand(0), 2); |
845 iterator.Advance(); | 845 iterator.Advance(); |
846 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); | 846 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
847 CHECK_EQ(iterator.GetImmediateOperand(0), 0); | 847 CHECK_EQ(iterator.GetImmediateOperand(0), 0); |
848 iterator.Advance(); | 848 iterator.Advance(); |
849 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); | 849 CHECK_EQ(iterator.current_bytecode(), Bytecode::kJump); |
850 CHECK_EQ(iterator.GetImmediateOperand(0), -2); | 850 CHECK_EQ(iterator.GetImmediateOperand(0), -2); |
851 iterator.Advance(); | 851 iterator.Advance(); |
852 } | 852 } |
853 CHECK_EQ(iterator.current_bytecode(), Bytecode::kReturn); | 853 CHECK_EQ(iterator.current_bytecode(), Bytecode::kReturn); |
854 iterator.Advance(); | 854 iterator.Advance(); |
855 CHECK(iterator.done()); | 855 CHECK(iterator.done()); |
856 } | 856 } |
857 | 857 |
858 } // namespace interpreter | 858 } // namespace interpreter |
859 } // namespace internal | 859 } // namespace internal |
860 } // namespace v8 | 860 } // namespace v8 |
OLD | NEW |