| 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 | 
|---|