| Index: src/interpreter/bytecode-array-builder.cc
|
| diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc
|
| index b6683cfd0eaf75dd0c7cfad58279694fec195f8a..d8698fe9595a62e796d27f6b0dffd59e04ed1e84 100644
|
| --- a/src/interpreter/bytecode-array-builder.cc
|
| +++ b/src/interpreter/bytecode-array-builder.cc
|
| @@ -28,7 +28,7 @@ BytecodeArrayBuilder::BytecodeArrayBuilder(
|
| parameter_count_(parameter_count),
|
| local_register_count_(locals_count),
|
| context_register_count_(context_count),
|
| - temporary_allocator_(zone, fixed_register_count()),
|
| + register_allocator_(fixed_register_count()),
|
| bytecode_array_writer_(zone, &constant_array_builder_,
|
| source_position_mode),
|
| pipeline_(&bytecode_array_writer_) {
|
| @@ -46,7 +46,8 @@ BytecodeArrayBuilder::BytecodeArrayBuilder(
|
|
|
| if (FLAG_ignition_reo) {
|
| pipeline_ = new (zone) BytecodeRegisterOptimizer(
|
| - zone, &temporary_allocator_, parameter_count, pipeline_);
|
| + zone, ®ister_allocator_, fixed_register_count(), parameter_count,
|
| + pipeline_);
|
| }
|
|
|
| return_position_ =
|
| @@ -69,10 +70,6 @@ Register BytecodeArrayBuilder::Parameter(int parameter_index) const {
|
| return Register::FromParameterIndex(parameter_index, parameter_count());
|
| }
|
|
|
| -bool BytecodeArrayBuilder::RegisterIsParameterOrLocal(Register reg) const {
|
| - return reg.is_parameter() || reg.index() < locals_count();
|
| -}
|
| -
|
| Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray(Isolate* isolate) {
|
| DCHECK(return_seen_in_block_);
|
| DCHECK(!bytecode_generated_);
|
| @@ -80,8 +77,7 @@ Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray(Isolate* isolate) {
|
|
|
| Handle<FixedArray> handler_table =
|
| handler_table_builder()->ToHandlerTable(isolate);
|
| - return pipeline_->ToBytecodeArray(isolate,
|
| - fixed_and_temporary_register_count(),
|
| + return pipeline_->ToBytecodeArray(isolate, total_register_count(),
|
| parameter_count(), handler_table);
|
| }
|
|
|
| @@ -729,45 +725,38 @@ void BytecodeArrayBuilder::EnsureReturn() {
|
| }
|
|
|
| BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable,
|
| - Register receiver_args,
|
| - size_t receiver_args_count,
|
| + RegisterList args,
|
| int feedback_slot,
|
| TailCallMode tail_call_mode) {
|
| if (tail_call_mode == TailCallMode::kDisallow) {
|
| Output(Bytecode::kCall, RegisterOperand(callable),
|
| - RegisterOperand(receiver_args), UnsignedOperand(receiver_args_count),
|
| + RegisterOperand(args.first_register()),
|
| + UnsignedOperand(args.register_count()),
|
| UnsignedOperand(feedback_slot));
|
| } else {
|
| DCHECK(tail_call_mode == TailCallMode::kAllow);
|
| Output(Bytecode::kTailCall, RegisterOperand(callable),
|
| - RegisterOperand(receiver_args), UnsignedOperand(receiver_args_count),
|
| + RegisterOperand(args.first_register()),
|
| + UnsignedOperand(args.register_count()),
|
| UnsignedOperand(feedback_slot));
|
| }
|
| return *this;
|
| }
|
|
|
| BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor,
|
| - Register first_arg,
|
| - size_t arg_count,
|
| + RegisterList args,
|
| int feedback_slot_id) {
|
| - if (!first_arg.is_valid()) {
|
| - DCHECK_EQ(0u, arg_count);
|
| - first_arg = Register(0);
|
| - }
|
| Output(Bytecode::kNew, RegisterOperand(constructor),
|
| - RegisterOperand(first_arg), UnsignedOperand(arg_count),
|
| + RegisterOperand(args.first_register()),
|
| + UnsignedOperand(args.register_count()),
|
| UnsignedOperand(feedback_slot_id));
|
| return *this;
|
| }
|
|
|
| BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime(
|
| - Runtime::FunctionId function_id, Register first_arg, size_t arg_count) {
|
| + Runtime::FunctionId function_id, RegisterList args) {
|
| DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size);
|
| DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort);
|
| - if (!first_arg.is_valid()) {
|
| - DCHECK_EQ(0u, arg_count);
|
| - first_arg = Register(0);
|
| - }
|
| Bytecode bytecode;
|
| uint32_t id;
|
| if (IntrinsicsHelper::IsSupported(function_id)) {
|
| @@ -777,29 +766,42 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime(
|
| bytecode = Bytecode::kCallRuntime;
|
| id = static_cast<uint32_t>(function_id);
|
| }
|
| - Output(bytecode, id, RegisterOperand(first_arg), UnsignedOperand(arg_count));
|
| + Output(bytecode, id, RegisterOperand(args.first_register()),
|
| + UnsignedOperand(args.register_count()));
|
| return *this;
|
| }
|
|
|
| +BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime(
|
| + Runtime::FunctionId function_id, Register arg) {
|
| + return CallRuntime(function_id, RegisterList(arg.index(), 1));
|
| +}
|
| +
|
| +BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime(
|
| + Runtime::FunctionId function_id) {
|
| + return CallRuntime(function_id, RegisterList());
|
| +}
|
| +
|
| BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair(
|
| - Runtime::FunctionId function_id, Register first_arg, size_t arg_count,
|
| - Register first_return) {
|
| + Runtime::FunctionId function_id, RegisterList args, Register first_return) {
|
| DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size);
|
| DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort);
|
| - if (!first_arg.is_valid()) {
|
| - DCHECK_EQ(0u, arg_count);
|
| - first_arg = Register(0);
|
| - }
|
| Output(Bytecode::kCallRuntimeForPair, static_cast<uint16_t>(function_id),
|
| - RegisterOperand(first_arg), UnsignedOperand(arg_count),
|
| - RegisterOperand(first_return));
|
| + RegisterOperand(args.first_register()),
|
| + UnsignedOperand(args.register_count()), RegisterOperand(first_return));
|
| return *this;
|
| }
|
|
|
| -BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime(
|
| - int context_index, Register receiver_args, size_t receiver_args_count) {
|
| +BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair(
|
| + Runtime::FunctionId function_id, Register arg, Register first_return) {
|
| + return CallRuntimeForPair(function_id, RegisterList(arg.index(), 1),
|
| + first_return);
|
| +}
|
| +
|
| +BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime(int context_index,
|
| + RegisterList args) {
|
| Output(Bytecode::kCallJSRuntime, UnsignedOperand(context_index),
|
| - RegisterOperand(receiver_args), UnsignedOperand(receiver_args_count));
|
| + RegisterOperand(args.first_register()),
|
| + UnsignedOperand(args.register_count()));
|
| return *this;
|
| }
|
|
|
| @@ -832,10 +834,6 @@ void BytecodeArrayBuilder::SetReturnPosition() {
|
| latest_source_info_.MakeStatementPosition(return_position_);
|
| }
|
|
|
| -bool BytecodeArrayBuilder::TemporaryRegisterIsLive(Register reg) const {
|
| - return temporary_register_allocator()->RegisterIsLive(reg);
|
| -}
|
| -
|
| bool BytecodeArrayBuilder::RegisterIsValid(Register reg) const {
|
| if (!reg.is_valid()) {
|
| return false;
|
| @@ -850,7 +848,7 @@ bool BytecodeArrayBuilder::RegisterIsValid(Register reg) const {
|
| } else if (reg.index() < fixed_register_count()) {
|
| return true;
|
| } else {
|
| - return TemporaryRegisterIsLive(reg);
|
| + return register_allocator()->RegisterIsLive(reg);
|
| }
|
| }
|
|
|
|
|