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