Index: src/interpreter/interpreter.cc |
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc |
index 5b484cca78e1558c880bbf89b5f219243eb04ee6..82e5dd72fe02ef6e90c470bc184bba1c4714aa3f 100644 |
--- a/src/interpreter/interpreter.cc |
+++ b/src/interpreter/interpreter.cc |
@@ -98,6 +98,12 @@ 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; |
+ // Enable verification only in mksnapshot. |
+ FLAG_csa_verify = DEBUG_BOOL && FLAG_startup_blob != nullptr; |
+ |
InterpreterDispatchDescriptor descriptor(isolate_); |
compiler::CodeAssemblerState state( |
isolate_, zone, descriptor, Code::ComputeFlags(Code::BYTECODE_HANDLER), |
@@ -112,6 +118,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, |
@@ -321,8 +328,7 @@ void Interpreter::DoLdaZero(InterpreterAssembler* assembler) { |
// |
// Load an integer literal into the accumulator as a Smi. |
void Interpreter::DoLdaSmi(InterpreterAssembler* assembler) { |
- Node* raw_int = __ BytecodeOperandImm(0); |
- Node* smi_int = __ SmiTag(raw_int); |
+ Node* smi_int = __ BytecodeOperandImmSmi(0); |
__ SetAccumulator(smi_int); |
__ Dispatch(); |
} |
@@ -868,7 +874,7 @@ void Interpreter::DoStaDataPropertyInLiteral(InterpreterAssembler* assembler) { |
// identified by <cell_index>. <depth> is the depth of the current context |
// relative to the module context. |
void Interpreter::DoLdaModuleVariable(InterpreterAssembler* assembler) { |
- Node* cell_index = __ BytecodeOperandImm(0); |
+ Node* cell_index = __ BytecodeOperandImmIntPtr(0); |
Node* depth = __ BytecodeOperandUImm(1); |
Node* module_context = __ GetContextAtDepth(__ GetContext(), depth); |
@@ -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); |
} |
@@ -911,7 +919,7 @@ void Interpreter::DoLdaModuleVariable(InterpreterAssembler* assembler) { |
// <depth> is the depth of the current context relative to the module context. |
void Interpreter::DoStaModuleVariable(InterpreterAssembler* assembler) { |
Node* value = __ GetAccumulator(); |
- Node* cell_index = __ BytecodeOperandImm(0); |
+ Node* cell_index = __ BytecodeOperandImmIntPtr(0); |
Node* depth = __ BytecodeOperandUImm(1); |
Node* module_context = __ GetContextAtDepth(__ GetContext(), depth); |
@@ -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); |
} |
@@ -1327,8 +1336,7 @@ void Interpreter::DoAddSmi(InterpreterAssembler* assembler) { |
Node* reg_index = __ BytecodeOperandReg(1); |
Node* left = __ LoadRegister(reg_index); |
- Node* raw_int = __ BytecodeOperandImm(0); |
- Node* right = __ SmiTag(raw_int); |
+ Node* right = __ BytecodeOperandImmSmi(0); |
Node* slot_index = __ BytecodeOperandIdx(2); |
Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
@@ -1359,7 +1367,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); |
} |
@@ -1381,8 +1390,7 @@ void Interpreter::DoSubSmi(InterpreterAssembler* assembler) { |
Node* reg_index = __ BytecodeOperandReg(1); |
Node* left = __ LoadRegister(reg_index); |
- Node* raw_int = __ BytecodeOperandImm(0); |
- Node* right = __ SmiTag(raw_int); |
+ Node* right = __ BytecodeOperandImmSmi(0); |
Node* slot_index = __ BytecodeOperandIdx(2); |
Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
@@ -1413,7 +1421,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); |
} |
@@ -1431,8 +1440,7 @@ void Interpreter::DoSubSmi(InterpreterAssembler* assembler) { |
void Interpreter::DoBitwiseOrSmi(InterpreterAssembler* assembler) { |
Node* reg_index = __ BytecodeOperandReg(1); |
Node* left = __ LoadRegister(reg_index); |
- Node* raw_int = __ BytecodeOperandImm(0); |
- Node* right = __ SmiTag(raw_int); |
+ Node* right = __ BytecodeOperandImmSmi(0); |
Node* context = __ GetContext(); |
Node* slot_index = __ BytecodeOperandIdx(2); |
Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
@@ -1458,8 +1466,7 @@ void Interpreter::DoBitwiseOrSmi(InterpreterAssembler* assembler) { |
void Interpreter::DoBitwiseAndSmi(InterpreterAssembler* assembler) { |
Node* reg_index = __ BytecodeOperandReg(1); |
Node* left = __ LoadRegister(reg_index); |
- Node* raw_int = __ BytecodeOperandImm(0); |
- Node* right = __ SmiTag(raw_int); |
+ Node* right = __ BytecodeOperandImmSmi(0); |
Node* context = __ GetContext(); |
Node* slot_index = __ BytecodeOperandIdx(2); |
Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
@@ -1486,8 +1493,7 @@ void Interpreter::DoBitwiseAndSmi(InterpreterAssembler* assembler) { |
void Interpreter::DoShiftLeftSmi(InterpreterAssembler* assembler) { |
Node* reg_index = __ BytecodeOperandReg(1); |
Node* left = __ LoadRegister(reg_index); |
- Node* raw_int = __ BytecodeOperandImm(0); |
- Node* right = __ SmiTag(raw_int); |
+ Node* right = __ BytecodeOperandImmSmi(0); |
Node* context = __ GetContext(); |
Node* slot_index = __ BytecodeOperandIdx(2); |
Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
@@ -1515,8 +1521,7 @@ void Interpreter::DoShiftLeftSmi(InterpreterAssembler* assembler) { |
void Interpreter::DoShiftRightSmi(InterpreterAssembler* assembler) { |
Node* reg_index = __ BytecodeOperandReg(1); |
Node* left = __ LoadRegister(reg_index); |
- Node* raw_int = __ BytecodeOperandImm(0); |
- Node* right = __ SmiTag(raw_int); |
+ Node* right = __ BytecodeOperandImmSmi(0); |
Node* context = __ GetContext(); |
Node* slot_index = __ BytecodeOperandIdx(2); |
Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
@@ -1974,7 +1979,7 @@ void Interpreter::DoTestUndetectable(InterpreterAssembler* assembler) { |
// |
// Jump by number of bytes represented by the immediate operand |imm|. |
void Interpreter::DoJump(InterpreterAssembler* assembler) { |
- Node* relative_jump = __ BytecodeOperandImm(0); |
+ Node* relative_jump = __ BytecodeOperandImmIntPtr(0); |
__ Jump(relative_jump); |
} |
@@ -1993,7 +1998,7 @@ void Interpreter::DoJumpConstant(InterpreterAssembler* assembler) { |
// accumulator contains true. |
void Interpreter::DoJumpIfTrue(InterpreterAssembler* assembler) { |
Node* accumulator = __ GetAccumulator(); |
- Node* relative_jump = __ BytecodeOperandImm(0); |
+ Node* relative_jump = __ BytecodeOperandImmIntPtr(0); |
Node* true_value = __ BooleanConstant(true); |
__ JumpIfWordEqual(accumulator, true_value, relative_jump); |
} |
@@ -2016,7 +2021,7 @@ void Interpreter::DoJumpIfTrueConstant(InterpreterAssembler* assembler) { |
// accumulator contains false. |
void Interpreter::DoJumpIfFalse(InterpreterAssembler* assembler) { |
Node* accumulator = __ GetAccumulator(); |
- Node* relative_jump = __ BytecodeOperandImm(0); |
+ Node* relative_jump = __ BytecodeOperandImmIntPtr(0); |
Node* false_value = __ BooleanConstant(false); |
__ JumpIfWordEqual(accumulator, false_value, relative_jump); |
} |
@@ -2039,7 +2044,7 @@ void Interpreter::DoJumpIfFalseConstant(InterpreterAssembler* assembler) { |
// referenced by the accumulator is true when the object is cast to boolean. |
void Interpreter::DoJumpIfToBooleanTrue(InterpreterAssembler* assembler) { |
Node* value = __ GetAccumulator(); |
- Node* relative_jump = __ BytecodeOperandImm(0); |
+ Node* relative_jump = __ BytecodeOperandImmIntPtr(0); |
Label if_true(assembler), if_false(assembler); |
__ BranchIfToBooleanIsTrue(value, &if_true, &if_false); |
__ Bind(&if_true); |
@@ -2072,7 +2077,7 @@ void Interpreter::DoJumpIfToBooleanTrueConstant( |
// referenced by the accumulator is false when the object is cast to boolean. |
void Interpreter::DoJumpIfToBooleanFalse(InterpreterAssembler* assembler) { |
Node* value = __ GetAccumulator(); |
- Node* relative_jump = __ BytecodeOperandImm(0); |
+ Node* relative_jump = __ BytecodeOperandImmIntPtr(0); |
Label if_true(assembler), if_false(assembler); |
__ BranchIfToBooleanIsTrue(value, &if_true, &if_false); |
__ Bind(&if_true); |
@@ -2106,7 +2111,7 @@ void Interpreter::DoJumpIfToBooleanFalseConstant( |
void Interpreter::DoJumpIfNull(InterpreterAssembler* assembler) { |
Node* accumulator = __ GetAccumulator(); |
Node* null_value = __ HeapConstant(isolate_->factory()->null_value()); |
- Node* relative_jump = __ BytecodeOperandImm(0); |
+ Node* relative_jump = __ BytecodeOperandImmIntPtr(0); |
__ JumpIfWordEqual(accumulator, null_value, relative_jump); |
} |
@@ -2130,7 +2135,7 @@ void Interpreter::DoJumpIfUndefined(InterpreterAssembler* assembler) { |
Node* accumulator = __ GetAccumulator(); |
Node* undefined_value = |
__ HeapConstant(isolate_->factory()->undefined_value()); |
- Node* relative_jump = __ BytecodeOperandImm(0); |
+ Node* relative_jump = __ BytecodeOperandImmIntPtr(0); |
__ JumpIfWordEqual(accumulator, undefined_value, relative_jump); |
} |
@@ -2153,7 +2158,7 @@ void Interpreter::DoJumpIfUndefinedConstant(InterpreterAssembler* assembler) { |
// referenced by the accumulator is a JSReceiver. |
void Interpreter::DoJumpIfJSReceiver(InterpreterAssembler* assembler) { |
Node* accumulator = __ GetAccumulator(); |
- Node* relative_jump = __ BytecodeOperandImm(0); |
+ Node* relative_jump = __ BytecodeOperandImmIntPtr(0); |
Label if_object(assembler), if_notobject(assembler, Label::kDeferred), |
if_notsmi(assembler); |
@@ -2197,7 +2202,7 @@ void Interpreter::DoJumpIfJSReceiverConstant(InterpreterAssembler* assembler) { |
void Interpreter::DoJumpIfNotHole(InterpreterAssembler* assembler) { |
Node* accumulator = __ GetAccumulator(); |
Node* the_hole_value = __ HeapConstant(isolate_->factory()->the_hole_value()); |
- Node* relative_jump = __ BytecodeOperandImm(0); |
+ Node* relative_jump = __ BytecodeOperandImmIntPtr(0); |
__ JumpIfWordNotEqual(accumulator, the_hole_value, relative_jump); |
} |
@@ -2219,7 +2224,7 @@ void Interpreter::DoJumpIfNotHoleConstant(InterpreterAssembler* assembler) { |
// performs a loop nesting check and potentially triggers OSR in case the |
// current OSR level matches (or exceeds) the specified |loop_depth|. |
void Interpreter::DoJumpLoop(InterpreterAssembler* assembler) { |
- Node* relative_jump = __ BytecodeOperandImm(0); |
+ Node* relative_jump = __ BytecodeOperandImmIntPtr(0); |
Node* loop_depth = __ BytecodeOperandImm(1); |
Node* osr_level = __ LoadOSRNestingLevel(); |
@@ -2249,10 +2254,8 @@ void Interpreter::DoJumpLoop(InterpreterAssembler* assembler) { |
void Interpreter::DoCreateRegExpLiteral(InterpreterAssembler* assembler) { |
Node* index = __ BytecodeOperandIdx(0); |
Node* pattern = __ LoadConstantPoolEntry(index); |
- Node* literal_index_raw = __ BytecodeOperandIdx(1); |
- Node* literal_index = __ SmiTag(literal_index_raw); |
- Node* flags_raw = __ BytecodeOperandFlag(2); |
- Node* flags = __ SmiTag(flags_raw); |
+ Node* literal_index = __ BytecodeOperandIdxSmi(1); |
+ Node* flags = __ SmiFromWord32(__ BytecodeOperandFlag(2)); |
Node* closure = __ LoadRegister(Register::function_closure()); |
Node* context = __ GetContext(); |
Node* result = FastCloneRegExpStub::Generate( |
@@ -2266,18 +2269,16 @@ void Interpreter::DoCreateRegExpLiteral(InterpreterAssembler* assembler) { |
// Creates an array literal for literal index <literal_idx> with |
// CreateArrayLiteral flags <flags> and constant elements in <element_idx>. |
void Interpreter::DoCreateArrayLiteral(InterpreterAssembler* assembler) { |
- Node* literal_index_raw = __ BytecodeOperandIdx(1); |
- Node* literal_index = __ SmiTag(literal_index_raw); |
+ Node* literal_index = __ BytecodeOperandIdxSmi(1); |
Node* closure = __ LoadRegister(Register::function_closure()); |
Node* context = __ GetContext(); |
Node* bytecode_flags = __ BytecodeOperandFlag(2); |
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(__ IsSetWord32<CreateArrayLiteralFlags::FastShallowCloneBit>( |
+ bytecode_flags), |
+ &fast_shallow_clone, &call_runtime); |
__ Bind(&fast_shallow_clone); |
{ |
@@ -2291,10 +2292,9 @@ 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 = |
+ __ DecodeWordFromWord32<CreateArrayLiteralFlags::FlagsBits>( |
+ bytecode_flags); |
Node* flags = __ SmiTag(flags_raw); |
Node* index = __ BytecodeOperandIdx(0); |
Node* constant_elements = __ LoadConstantPoolEntry(index); |
@@ -2311,18 +2311,17 @@ void Interpreter::DoCreateArrayLiteral(InterpreterAssembler* assembler) { |
// Creates an object literal for literal index <literal_idx> with |
// CreateObjectLiteralFlags <flags> and constant elements in <element_idx>. |
void Interpreter::DoCreateObjectLiteral(InterpreterAssembler* assembler) { |
- Node* literal_index_raw = __ BytecodeOperandIdx(1); |
- Node* literal_index = __ SmiTag(literal_index_raw); |
+ Node* literal_index = __ BytecodeOperandIdxSmi(1); |
Node* bytecode_flags = __ BytecodeOperandFlag(2); |
Node* closure = __ LoadRegister(Register::function_closure()); |
// Check if we can do a fast clone or have to call the runtime. |
Label if_fast_clone(assembler), |
if_not_fast_clone(assembler, Label::kDeferred); |
- Node* fast_clone_properties_count = |
- __ DecodeWord32<CreateObjectLiteralFlags::FastClonePropertiesCountBits>( |
- bytecode_flags); |
- __ Branch(fast_clone_properties_count, &if_fast_clone, &if_not_fast_clone); |
+ Node* fast_clone_properties_count = __ DecodeWordFromWord32< |
+ CreateObjectLiteralFlags::FastClonePropertiesCountBits>(bytecode_flags); |
+ __ Branch(__ WordNotEqual(fast_clone_properties_count, __ IntPtrConstant(0)), |
+ &if_fast_clone, &if_not_fast_clone); |
__ Bind(&if_fast_clone); |
{ |
@@ -2341,10 +2340,9 @@ 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 = |
+ __ DecodeWordFromWord32<CreateObjectLiteralFlags::FlagsBits>( |
+ bytecode_flags); |
Node* flags = __ SmiTag(flags_raw); |
Node* result = |
@@ -2367,17 +2365,15 @@ 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(__ IsSetWord32<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 = |
+ __ DecodeWordFromWord32<CreateClosureFlags::PretenuredBit>(flags); |
Node* tenured = __ SmiTag(tenured_raw); |
Node* result = __ CallRuntime(Runtime::kInterpreterNewClosure, context, |
shared, tenured); |
@@ -2729,7 +2725,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(); |