| Index: src/interpreter/interpreter.cc
|
| diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc
|
| index 5b484cca78e1558c880bbf89b5f219243eb04ee6..3ab1cc3ce4ab2ecb943b072607669f5bee249342 100644
|
| --- a/src/interpreter/interpreter.cc
|
| +++ b/src/interpreter/interpreter.cc
|
| @@ -98,6 +98,11 @@ void Interpreter::InstallBytecodeHandler(Zone* zone, Bytecode bytecode,
|
| BytecodeGeneratorFunc generator) {
|
| if (!Bytecodes::BytecodeHasHandler(bytecode, operand_scale)) return;
|
|
|
| + // TODO(ishell): remove this when code stub assembler graphs verification
|
| + // is enabled for all stubs.
|
| + bool sav_csa_verify = FLAG_csa_verify;
|
| + FLAG_csa_verify = DEBUG_BOOL;
|
| +
|
| InterpreterDispatchDescriptor descriptor(isolate_);
|
| compiler::CodeAssemblerState state(
|
| isolate_, zone, descriptor, Code::ComputeFlags(Code::BYTECODE_HANDLER),
|
| @@ -112,6 +117,7 @@ void Interpreter::InstallBytecodeHandler(Zone* zone, Bytecode bytecode,
|
| CodeEventListener::BYTECODE_HANDLER_TAG,
|
| AbstractCode::cast(*code),
|
| Bytecodes::ToString(bytecode, operand_scale).c_str()));
|
| + FLAG_csa_verify = sav_csa_verify;
|
| }
|
|
|
| Code* Interpreter::GetBytecodeHandler(Bytecode bytecode,
|
| @@ -885,7 +891,8 @@ void Interpreter::DoLdaModuleVariable(InterpreterAssembler* assembler) {
|
| __ LoadObjectField(module, Module::kRegularExportsOffset);
|
| // The actual array index is (cell_index - 1).
|
| Node* export_index = __ IntPtrSub(cell_index, __ IntPtrConstant(1));
|
| - Node* cell = __ LoadFixedArrayElement(regular_exports, export_index);
|
| + Node* cell = __ LoadFixedArrayElement(regular_exports, export_index, 0,
|
| + CodeStubAssembler::INTPTR_PARAMETERS);
|
| __ SetAccumulator(__ LoadObjectField(cell, Cell::kValueOffset));
|
| __ Goto(&end);
|
| }
|
| @@ -896,7 +903,8 @@ void Interpreter::DoLdaModuleVariable(InterpreterAssembler* assembler) {
|
| __ LoadObjectField(module, Module::kRegularImportsOffset);
|
| // The actual array index is (-cell_index - 1).
|
| Node* import_index = __ IntPtrSub(__ IntPtrConstant(-1), cell_index);
|
| - Node* cell = __ LoadFixedArrayElement(regular_imports, import_index);
|
| + Node* cell = __ LoadFixedArrayElement(regular_imports, import_index, 0,
|
| + CodeStubAssembler::INTPTR_PARAMETERS);
|
| __ SetAccumulator(__ LoadObjectField(cell, Cell::kValueOffset));
|
| __ Goto(&end);
|
| }
|
| @@ -928,7 +936,8 @@ void Interpreter::DoStaModuleVariable(InterpreterAssembler* assembler) {
|
| __ LoadObjectField(module, Module::kRegularExportsOffset);
|
| // The actual array index is (cell_index - 1).
|
| Node* export_index = __ IntPtrSub(cell_index, __ IntPtrConstant(1));
|
| - Node* cell = __ LoadFixedArrayElement(regular_exports, export_index);
|
| + Node* cell = __ LoadFixedArrayElement(regular_exports, export_index, 0,
|
| + CodeStubAssembler::INTPTR_PARAMETERS);
|
| __ StoreObjectField(cell, Cell::kValueOffset, value);
|
| __ Goto(&end);
|
| }
|
| @@ -1359,7 +1368,8 @@ void Interpreter::DoAddSmi(InterpreterAssembler* assembler) {
|
| AddWithFeedbackStub stub(__ isolate());
|
| Callable callable =
|
| Callable(stub.GetCode(), AddWithFeedbackStub::Descriptor(__ isolate()));
|
| - Node* args[] = {left, right, slot_index, type_feedback_vector, context};
|
| + Node* args[] = {left, right, __ TruncateWordToWord32(slot_index),
|
| + type_feedback_vector, context};
|
| var_result.Bind(__ CallStubN(callable, args, 1));
|
| __ Goto(&end);
|
| }
|
| @@ -1413,7 +1423,8 @@ void Interpreter::DoSubSmi(InterpreterAssembler* assembler) {
|
| SubtractWithFeedbackStub stub(__ isolate());
|
| Callable callable = Callable(
|
| stub.GetCode(), SubtractWithFeedbackStub::Descriptor(__ isolate()));
|
| - Node* args[] = {left, right, slot_index, type_feedback_vector, context};
|
| + Node* args[] = {left, right, __ TruncateWordToWord32(slot_index),
|
| + type_feedback_vector, context};
|
| var_result.Bind(__ CallStubN(callable, args, 1));
|
| __ Goto(&end);
|
| }
|
| @@ -1704,8 +1715,8 @@ void Interpreter::DoJSCall(InterpreterAssembler* assembler,
|
| Node* receiver_reg = __ BytecodeOperandReg(1);
|
| Node* receiver_arg = __ RegisterLocation(receiver_reg);
|
| Node* receiver_args_count = __ BytecodeOperandCount(2);
|
| - Node* receiver_count = __ Int32Constant(1);
|
| - Node* args_count = __ Int32Sub(receiver_args_count, receiver_count);
|
| + Node* receiver_count = __ IntPtrConstant(1);
|
| + Node* args_count = __ IntPtrSub(receiver_args_count, receiver_count);
|
| Node* slot_id = __ BytecodeOperandIdx(3);
|
| Node* type_feedback_vector = __ LoadTypeFeedbackVector();
|
| Node* context = __ GetContext();
|
| @@ -1813,8 +1824,8 @@ void Interpreter::DoCallJSRuntime(InterpreterAssembler* assembler) {
|
| Node* receiver_reg = __ BytecodeOperandReg(1);
|
| Node* first_arg = __ RegisterLocation(receiver_reg);
|
| Node* receiver_args_count = __ BytecodeOperandCount(2);
|
| - Node* receiver_count = __ Int32Constant(1);
|
| - Node* args_count = __ Int32Sub(receiver_args_count, receiver_count);
|
| + Node* receiver_count = __ IntPtrConstant(1);
|
| + Node* args_count = __ IntPtrSub(receiver_args_count, receiver_count);
|
|
|
| // Get the function to call from the native context.
|
| Node* context = __ GetContext();
|
| @@ -1841,7 +1852,7 @@ void Interpreter::DoNewWithSpread(InterpreterAssembler* assembler) {
|
| Node* context = __ GetContext();
|
|
|
| // Call into Runtime function NewWithSpread which does everything.
|
| - Node* runtime_function = __ Int32Constant(Runtime::kNewWithSpread);
|
| + Node* runtime_function = __ IntPtrConstant(Runtime::kNewWithSpread);
|
| Node* result =
|
| __ CallRuntimeN(runtime_function, context, first_arg, args_count);
|
| __ SetAccumulator(result);
|
| @@ -2226,7 +2237,7 @@ void Interpreter::DoJumpLoop(InterpreterAssembler* assembler) {
|
| // Check if OSR points at the given {loop_depth} are armed by comparing it to
|
| // the current {osr_level} loaded from the header of the BytecodeArray.
|
| Label ok(assembler), osr_armed(assembler, Label::kDeferred);
|
| - Node* condition = __ Int32GreaterThanOrEqual(loop_depth, osr_level);
|
| + Node* condition = __ IntPtrGreaterThanOrEqual(loop_depth, osr_level);
|
| __ Branch(condition, &ok, &osr_armed);
|
|
|
| __ Bind(&ok);
|
| @@ -2274,10 +2285,9 @@ void Interpreter::DoCreateArrayLiteral(InterpreterAssembler* assembler) {
|
|
|
| Label fast_shallow_clone(assembler),
|
| call_runtime(assembler, Label::kDeferred);
|
| - Node* use_fast_shallow_clone = __ Word32And(
|
| - bytecode_flags,
|
| - __ Int32Constant(CreateArrayLiteralFlags::FastShallowCloneBit::kMask));
|
| - __ Branch(use_fast_shallow_clone, &fast_shallow_clone, &call_runtime);
|
| + __ Branch(__ IsSetWord<CreateArrayLiteralFlags::FastShallowCloneBit>(
|
| + bytecode_flags),
|
| + &fast_shallow_clone, &call_runtime);
|
|
|
| __ Bind(&fast_shallow_clone);
|
| {
|
| @@ -2291,10 +2301,8 @@ void Interpreter::DoCreateArrayLiteral(InterpreterAssembler* assembler) {
|
|
|
| __ Bind(&call_runtime);
|
| {
|
| - STATIC_ASSERT(CreateArrayLiteralFlags::FlagsBits::kShift == 0);
|
| - Node* flags_raw = __ Word32And(
|
| - bytecode_flags,
|
| - __ Int32Constant(CreateArrayLiteralFlags::FlagsBits::kMask));
|
| + Node* flags_raw =
|
| + __ DecodeWord<CreateArrayLiteralFlags::FlagsBits>(bytecode_flags);
|
| Node* flags = __ SmiTag(flags_raw);
|
| Node* index = __ BytecodeOperandIdx(0);
|
| Node* constant_elements = __ LoadConstantPoolEntry(index);
|
| @@ -2320,9 +2328,10 @@ void Interpreter::DoCreateObjectLiteral(InterpreterAssembler* assembler) {
|
| Label if_fast_clone(assembler),
|
| if_not_fast_clone(assembler, Label::kDeferred);
|
| Node* fast_clone_properties_count =
|
| - __ DecodeWord32<CreateObjectLiteralFlags::FastClonePropertiesCountBits>(
|
| + __ DecodeWord<CreateObjectLiteralFlags::FastClonePropertiesCountBits>(
|
| bytecode_flags);
|
| - __ Branch(fast_clone_properties_count, &if_fast_clone, &if_not_fast_clone);
|
| + __ Branch(__ WordNotEqual(fast_clone_properties_count, __ IntPtrConstant(0)),
|
| + &if_fast_clone, &if_not_fast_clone);
|
|
|
| __ Bind(&if_fast_clone);
|
| {
|
| @@ -2341,10 +2350,8 @@ void Interpreter::DoCreateObjectLiteral(InterpreterAssembler* assembler) {
|
| Node* constant_elements = __ LoadConstantPoolEntry(index);
|
| Node* context = __ GetContext();
|
|
|
| - STATIC_ASSERT(CreateObjectLiteralFlags::FlagsBits::kShift == 0);
|
| - Node* flags_raw = __ Word32And(
|
| - bytecode_flags,
|
| - __ Int32Constant(CreateObjectLiteralFlags::FlagsBits::kMask));
|
| + Node* flags_raw =
|
| + __ DecodeWord<CreateObjectLiteralFlags::FlagsBits>(bytecode_flags);
|
| Node* flags = __ SmiTag(flags_raw);
|
|
|
| Node* result =
|
| @@ -2367,17 +2374,14 @@ void Interpreter::DoCreateClosure(InterpreterAssembler* assembler) {
|
| Node* context = __ GetContext();
|
|
|
| Label call_runtime(assembler, Label::kDeferred);
|
| - Node* fast_new_closure = __ Word32And(
|
| - flags, __ Int32Constant(CreateClosureFlags::FastNewClosureBit::kMask));
|
| - __ GotoUnless(fast_new_closure, &call_runtime);
|
| + __ GotoUnless(__ IsSetWord<CreateClosureFlags::FastNewClosureBit>(flags),
|
| + &call_runtime);
|
| __ SetAccumulator(FastNewClosureStub::Generate(assembler, shared, context));
|
| __ Dispatch();
|
|
|
| __ Bind(&call_runtime);
|
| {
|
| - STATIC_ASSERT(CreateClosureFlags::PretenuredBit::kShift == 0);
|
| - Node* tenured_raw = __ Word32And(
|
| - flags, __ Int32Constant(CreateClosureFlags::PretenuredBit::kMask));
|
| + Node* tenured_raw = __ DecodeWord<CreateClosureFlags::PretenuredBit>(flags);
|
| Node* tenured = __ SmiTag(tenured_raw);
|
| Node* result = __ CallRuntime(Runtime::kInterpreterNewClosure, context,
|
| shared, tenured);
|
| @@ -2729,7 +2733,8 @@ void Interpreter::DoForInNext(InterpreterAssembler* assembler) {
|
| Node* megamorphic_sentinel =
|
| __ HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate_));
|
| __ StoreFixedArrayElement(type_feedback_vector, vector_index,
|
| - megamorphic_sentinel, SKIP_WRITE_BARRIER);
|
| + megamorphic_sentinel, SKIP_WRITE_BARRIER, 0,
|
| + CodeStubAssembler::INTPTR_PARAMETERS);
|
|
|
| // Need to filter the {key} for the {receiver}.
|
| Node* context = __ GetContext();
|
|
|