Index: src/interpreter/interpreter.cc |
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc |
index 53c610a218758476fedd80d8c59471ca19d9d926..4aa14b5c15ec1c479c3d1c96140e53c49b7e1038 100644 |
--- a/src/interpreter/interpreter.cc |
+++ b/src/interpreter/interpreter.cc |
@@ -23,7 +23,7 @@ using compiler::Node; |
#define __ assembler-> |
Interpreter::Interpreter(Isolate* isolate) : isolate_(isolate) { |
- memset(&dispatch_table_, 0, sizeof(dispatch_table_)); |
+ memset(dispatch_table_, 0, sizeof(dispatch_table_)); |
} |
void Interpreter::Initialize() { |
@@ -32,24 +32,65 @@ void Interpreter::Initialize() { |
Zone zone; |
HandleScope scope(isolate_); |
-#define GENERATE_CODE(Name, ...) \ |
- { \ |
- InterpreterAssembler assembler(isolate_, &zone, Bytecode::k##Name); \ |
- Do##Name(&assembler); \ |
- Handle<Code> code = assembler.GenerateCode(); \ |
- dispatch_table_[Bytecodes::ToByte(Bytecode::k##Name)] = *code; \ |
- TraceCodegen(code); \ |
- LOG_CODE_EVENT(isolate_, \ |
- CodeCreateEvent(Logger::BYTECODE_HANDLER_TAG, \ |
- AbstractCode::cast(*code), #Name)); \ |
+ // Generate bytecode handlers for all bytecodes and scales. |
+ for (OperandScale operand_scale = OperandScale::kSingle; |
+ operand_scale <= OperandScale::kMaxValid; |
+ operand_scale = Bytecodes::NextOperandScale(operand_scale)) { |
+#define GENERATE_CODE(Name, ...) \ |
+ { \ |
+ if (BytecodeHasHandler(Bytecode::k##Name, operand_scale)) { \ |
+ InterpreterAssembler assembler(isolate_, &zone, Bytecode::k##Name, \ |
+ operand_scale); \ |
+ Do##Name(&assembler); \ |
+ Handle<Code> code = assembler.GenerateCode(); \ |
+ size_t index = GetDispatchTableIndex(Bytecode::k##Name, operand_scale); \ |
+ dispatch_table_[index] = *code; \ |
+ TraceCodegen(code); \ |
+ LOG_CODE_EVENT(isolate_, \ |
+ CodeCreateEvent(Logger::BYTECODE_HANDLER_TAG, \ |
+ AbstractCode::cast(*code), #Name)); \ |
+ } \ |
} |
- BYTECODE_LIST(GENERATE_CODE) |
+ BYTECODE_LIST(GENERATE_CODE) |
#undef GENERATE_CODE |
+ } |
+ |
+ // Fill unused entries will the illegal bytecode handler. |
+ size_t illegal_index = |
+ GetDispatchTableIndex(Bytecode::kIllegal, OperandScale::kSingle); |
+ for (size_t index = 0; index < arraysize(dispatch_table_); ++index) { |
+ if (dispatch_table_[index] == nullptr) { |
+ dispatch_table_[index] = dispatch_table_[illegal_index]; |
+ } |
+ } |
} |
-Code* Interpreter::GetBytecodeHandler(Bytecode bytecode) { |
+Code* Interpreter::GetBytecodeHandler(Bytecode bytecode, |
+ OperandScale operand_scale) { |
DCHECK(IsDispatchTableInitialized()); |
- return dispatch_table_[Bytecodes::ToByte(bytecode)]; |
+ DCHECK(BytecodeHasHandler(bytecode, operand_scale)); |
+ size_t index = GetDispatchTableIndex(bytecode, operand_scale); |
+ return dispatch_table_[index]; |
+} |
+ |
+// static |
+size_t Interpreter::GetDispatchTableIndex(Bytecode bytecode, |
+ OperandScale operand_scale) { |
+ static const size_t kEntriesPerOperandScale = 1u << kBitsPerByte; |
+ size_t index = static_cast<size_t>(bytecode); |
+ OperandScale current_scale = OperandScale::kSingle; |
+ while (current_scale != operand_scale) { |
+ index += kEntriesPerOperandScale; |
+ current_scale = Bytecodes::NextOperandScale(current_scale); |
+ } |
+ return index; |
+} |
+ |
+// static |
+bool Interpreter::BytecodeHasHandler(Bytecode bytecode, |
+ OperandScale operand_scale) { |
+ return operand_scale == OperandScale::kSingle || |
+ Bytecodes::IsBytecodeWithScalableOperands(bytecode); |
} |
void Interpreter::IterateDispatchTable(ObjectVisitor* v) { |
@@ -149,11 +190,10 @@ void Interpreter::DoLdaZero(InterpreterAssembler* assembler) { |
__ Dispatch(); |
} |
- |
-// LdaSmi8 <imm8> |
+// LdaSmi <imm> |
// |
-// Load an 8-bit integer literal into the accumulator as a Smi. |
-void Interpreter::DoLdaSmi8(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); |
__ SetAccumulator(smi_int); |
@@ -175,15 +215,6 @@ void Interpreter::DoLdaConstant(InterpreterAssembler* assembler) { |
DoLoadConstant(assembler); |
} |
- |
-// LdaConstantWide <idx> |
-// |
-// Load constant literal at |idx| in the constant pool into the accumulator. |
-void Interpreter::DoLdaConstantWide(InterpreterAssembler* assembler) { |
- DoLoadConstant(assembler); |
-} |
- |
- |
// LdaUndefined |
// |
// Load Undefined into the accumulator. |
@@ -269,13 +300,6 @@ void Interpreter::DoMov(InterpreterAssembler* assembler) { |
} |
-// MovWide <src> <dst> |
-// |
-// Stores the value of register <src> to register <dst>. |
-void Interpreter::DoMovWide(InterpreterAssembler* assembler) { |
- DoMov(assembler); |
-} |
- |
void Interpreter::DoLoadGlobal(Callable ic, InterpreterAssembler* assembler) { |
// Get the global object. |
Node* context = __ GetContext(); |
@@ -316,27 +340,6 @@ void Interpreter::DoLdaGlobalInsideTypeof(InterpreterAssembler* assembler) { |
DoLoadGlobal(ic, assembler); |
} |
-// LdaGlobalWide <name_index> <slot> |
-// |
-// Load the global with name in constant pool entry <name_index> into the |
-// accumulator using FeedBackVector slot <slot> outside of a typeof. |
-void Interpreter::DoLdaGlobalWide(InterpreterAssembler* assembler) { |
- Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
- UNINITIALIZED); |
- DoLoadGlobal(ic, assembler); |
-} |
- |
-// LdaGlobalInsideTypeofWide <name_index> <slot> |
-// |
-// Load the global with name in constant pool entry <name_index> into the |
-// accumulator using FeedBackVector slot <slot> inside of a typeof. |
-void Interpreter::DoLdaGlobalInsideTypeofWide(InterpreterAssembler* assembler) { |
- Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, INSIDE_TYPEOF, |
- UNINITIALIZED); |
- DoLoadGlobal(ic, assembler); |
-} |
- |
- |
void Interpreter::DoStoreGlobal(Callable ic, InterpreterAssembler* assembler) { |
// Get the global object. |
Node* context = __ GetContext(); |
@@ -354,7 +357,6 @@ void Interpreter::DoStoreGlobal(Callable ic, InterpreterAssembler* assembler) { |
Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
__ CallStub(ic.descriptor(), code_target, context, global, name, value, |
smi_slot, type_feedback_vector); |
- |
__ Dispatch(); |
} |
@@ -380,29 +382,6 @@ void Interpreter::DoStaGlobalStrict(InterpreterAssembler* assembler) { |
DoStoreGlobal(ic, assembler); |
} |
- |
-// StaGlobalSloppyWide <name_index> <slot> |
-// |
-// Store the value in the accumulator into the global with name in constant pool |
-// entry <name_index> using FeedBackVector slot <slot> in sloppy mode. |
-void Interpreter::DoStaGlobalSloppyWide(InterpreterAssembler* assembler) { |
- Callable ic = |
- CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
- DoStoreGlobal(ic, assembler); |
-} |
- |
- |
-// StaGlobalStrictWide <name_index> <slot> |
-// |
-// Store the value in the accumulator into the global with name in constant pool |
-// entry <name_index> using FeedBackVector slot <slot> in strict mode. |
-void Interpreter::DoStaGlobalStrictWide(InterpreterAssembler* assembler) { |
- Callable ic = |
- CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
- DoStoreGlobal(ic, assembler); |
-} |
- |
- |
// LdaContextSlot <context> <slot_index> |
// |
// Load the object in |slot_index| of |context| into the accumulator. |
@@ -415,15 +394,6 @@ void Interpreter::DoLdaContextSlot(InterpreterAssembler* assembler) { |
__ Dispatch(); |
} |
- |
-// LdaContextSlotWide <context> <slot_index> |
-// |
-// Load the object in |slot_index| of |context| into the accumulator. |
-void Interpreter::DoLdaContextSlotWide(InterpreterAssembler* assembler) { |
- DoLdaContextSlot(assembler); |
-} |
- |
- |
// StaContextSlot <context> <slot_index> |
// |
// Stores the object in the accumulator into |slot_index| of |context|. |
@@ -436,14 +406,6 @@ void Interpreter::DoStaContextSlot(InterpreterAssembler* assembler) { |
__ Dispatch(); |
} |
- |
-// StaContextSlot <context> <slot_index> |
-// |
-// Stores the object in the accumulator into |slot_index| of |context|. |
-void Interpreter::DoStaContextSlotWide(InterpreterAssembler* assembler) { |
- DoStaContextSlot(assembler); |
-} |
- |
void Interpreter::DoLoadLookupSlot(Runtime::FunctionId function_id, |
InterpreterAssembler* assembler) { |
Node* index = __ BytecodeOperandIdx(0); |
@@ -454,7 +416,6 @@ void Interpreter::DoLoadLookupSlot(Runtime::FunctionId function_id, |
__ Dispatch(); |
} |
- |
// LdaLookupSlot <name_index> |
// |
// Lookup the object with the name in constant pool entry |name_index| |
@@ -463,7 +424,6 @@ void Interpreter::DoLdaLookupSlot(InterpreterAssembler* assembler) { |
DoLoadLookupSlot(Runtime::kLoadLookupSlot, assembler); |
} |
- |
// LdaLookupSlotInsideTypeof <name_index> |
// |
// Lookup the object with the name in constant pool entry |name_index| |
@@ -472,25 +432,6 @@ void Interpreter::DoLdaLookupSlotInsideTypeof(InterpreterAssembler* assembler) { |
DoLoadLookupSlot(Runtime::kLoadLookupSlotInsideTypeof, assembler); |
} |
- |
-// LdaLookupSlotWide <name_index> |
-// |
-// Lookup the object with the name in constant pool entry |name_index| |
-// dynamically. |
-void Interpreter::DoLdaLookupSlotWide(InterpreterAssembler* assembler) { |
- DoLdaLookupSlot(assembler); |
-} |
- |
- |
-// LdaLookupSlotInsideTypeofWide <name_index> |
-// |
-// Lookup the object with the name in constant pool entry |name_index| |
-// dynamically without causing a NoReferenceError. |
-void Interpreter::DoLdaLookupSlotInsideTypeofWide( |
- InterpreterAssembler* assembler) { |
- DoLdaLookupSlotInsideTypeof(assembler); |
-} |
- |
void Interpreter::DoStoreLookupSlot(LanguageMode language_mode, |
InterpreterAssembler* assembler) { |
Node* value = __ GetAccumulator(); |
@@ -505,7 +446,6 @@ void Interpreter::DoStoreLookupSlot(LanguageMode language_mode, |
__ Dispatch(); |
} |
- |
// StaLookupSlotSloppy <name_index> |
// |
// Store the object in accumulator to the object with the name in constant |
@@ -523,24 +463,6 @@ void Interpreter::DoStaLookupSlotStrict(InterpreterAssembler* assembler) { |
DoStoreLookupSlot(LanguageMode::STRICT, assembler); |
} |
- |
-// StaLookupSlotSloppyWide <name_index> |
-// |
-// Store the object in accumulator to the object with the name in constant |
-// pool entry |name_index| in sloppy mode. |
-void Interpreter::DoStaLookupSlotSloppyWide(InterpreterAssembler* assembler) { |
- DoStaLookupSlotSloppy(assembler); |
-} |
- |
- |
-// StaLookupSlotStrictWide <name_index> |
-// |
-// Store the object in accumulator to the object with the name in constant |
-// pool entry |name_index| in strict mode. |
-void Interpreter::DoStaLookupSlotStrictWide(InterpreterAssembler* assembler) { |
- DoStaLookupSlotStrict(assembler); |
-} |
- |
void Interpreter::DoLoadIC(Callable ic, InterpreterAssembler* assembler) { |
Node* code_target = __ HeapConstant(ic.code()); |
Node* register_index = __ BytecodeOperandReg(0); |
@@ -567,17 +489,6 @@ void Interpreter::DoLoadIC(InterpreterAssembler* assembler) { |
DoLoadIC(ic, assembler); |
} |
-// LoadICWide <object> <name_index> <slot> |
-// |
-// Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name at |
-// constant pool entry <name_index>. |
-void Interpreter::DoLoadICWide(InterpreterAssembler* assembler) { |
- Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
- UNINITIALIZED); |
- DoLoadIC(ic, assembler); |
-} |
- |
- |
void Interpreter::DoKeyedLoadIC(Callable ic, InterpreterAssembler* assembler) { |
Node* code_target = __ HeapConstant(ic.code()); |
Node* reg_index = __ BytecodeOperandReg(0); |
@@ -603,17 +514,6 @@ void Interpreter::DoKeyedLoadIC(InterpreterAssembler* assembler) { |
DoKeyedLoadIC(ic, assembler); |
} |
-// KeyedLoadICWide <object> <slot> |
-// |
-// Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key |
-// in the accumulator. |
-void Interpreter::DoKeyedLoadICWide(InterpreterAssembler* assembler) { |
- Callable ic = |
- CodeFactory::KeyedLoadICInOptimizedCode(isolate_, UNINITIALIZED); |
- DoKeyedLoadIC(ic, assembler); |
-} |
- |
- |
void Interpreter::DoStoreIC(Callable ic, InterpreterAssembler* assembler) { |
Node* code_target = __ HeapConstant(ic.code()); |
Node* object_reg_index = __ BytecodeOperandReg(0); |
@@ -654,30 +554,6 @@ void Interpreter::DoStoreICStrict(InterpreterAssembler* assembler) { |
DoStoreIC(ic, assembler); |
} |
- |
-// StoreICSloppyWide <object> <name_index> <slot> |
-// |
-// Calls the sloppy mode StoreIC at FeedBackVector slot <slot> for <object> and |
-// the name in constant pool entry <name_index> with the value in the |
-// accumulator. |
-void Interpreter::DoStoreICSloppyWide(InterpreterAssembler* assembler) { |
- Callable ic = |
- CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
- DoStoreIC(ic, assembler); |
-} |
- |
- |
-// StoreICStrictWide <object> <name_index> <slot> |
-// |
-// Calls the strict mode StoreIC at FeedBackVector slot <slot> for <object> and |
-// the name in constant pool entry <name_index> with the value in the |
-// accumulator. |
-void Interpreter::DoStoreICStrictWide(InterpreterAssembler* assembler) { |
- Callable ic = |
- CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
- DoStoreIC(ic, assembler); |
-} |
- |
void Interpreter::DoKeyedStoreIC(Callable ic, InterpreterAssembler* assembler) { |
Node* code_target = __ HeapConstant(ic.code()); |
Node* object_reg_index = __ BytecodeOperandReg(0); |
@@ -716,28 +592,6 @@ void Interpreter::DoKeyedStoreICStrict(InterpreterAssembler* assembler) { |
DoKeyedStoreIC(ic, assembler); |
} |
- |
-// KeyedStoreICSloppyWide <object> <key> <slot> |
-// |
-// Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object> |
-// and the key <key> with the value in the accumulator. |
-void Interpreter::DoKeyedStoreICSloppyWide(InterpreterAssembler* assembler) { |
- Callable ic = |
- CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
- DoKeyedStoreIC(ic, assembler); |
-} |
- |
- |
-// KeyedStoreICStoreWide <object> <key> <slot> |
-// |
-// Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object> |
-// and the key <key> with the value in the accumulator. |
-void Interpreter::DoKeyedStoreICStrictWide(InterpreterAssembler* assembler) { |
- Callable ic = |
- CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
- DoKeyedStoreIC(ic, assembler); |
-} |
- |
// PushContext <context> |
// |
// Saves the current context in <context>, and pushes the accumulator as the |
@@ -1011,15 +865,6 @@ void Interpreter::DoCall(InterpreterAssembler* assembler) { |
DoJSCall(assembler, TailCallMode::kDisallow); |
} |
- |
-// CallWide <callable> <receiver> <arg_count> |
-// |
-// Call a JSfunction or Callable in |callable| with the |receiver| and |
-// |arg_count| arguments in subsequent registers. |
-void Interpreter::DoCallWide(InterpreterAssembler* assembler) { |
- DoJSCall(assembler, TailCallMode::kDisallow); |
-} |
- |
// TailCall <callable> <receiver> <arg_count> |
// |
// Tail call a JSfunction or Callable in |callable| with the |receiver| and |
@@ -1028,16 +873,8 @@ void Interpreter::DoTailCall(InterpreterAssembler* assembler) { |
DoJSCall(assembler, TailCallMode::kAllow); |
} |
-// TailCallWide <callable> <receiver> <arg_count> |
-// |
-// Tail call a JSfunction or Callable in |callable| with the |receiver| and |
-// |arg_count| arguments in subsequent registers. |
-void Interpreter::DoTailCallWide(InterpreterAssembler* assembler) { |
- DoJSCall(assembler, TailCallMode::kAllow); |
-} |
- |
void Interpreter::DoCallRuntimeCommon(InterpreterAssembler* assembler) { |
- Node* function_id = __ BytecodeOperandIdx(0); |
+ Node* function_id = __ BytecodeOperandRuntimeId(0); |
Node* first_arg_reg = __ BytecodeOperandReg(1); |
Node* first_arg = __ RegisterLocation(first_arg_reg); |
Node* args_count = __ BytecodeOperandCount(2); |
@@ -1057,19 +894,9 @@ void Interpreter::DoCallRuntime(InterpreterAssembler* assembler) { |
DoCallRuntimeCommon(assembler); |
} |
- |
-// CallRuntime <function_id> <first_arg> <arg_count> |
-// |
-// Call the runtime function |function_id| with the first argument in |
-// register |first_arg| and |arg_count| arguments in subsequent |
-// registers. |
-void Interpreter::DoCallRuntimeWide(InterpreterAssembler* assembler) { |
- DoCallRuntimeCommon(assembler); |
-} |
- |
void Interpreter::DoCallRuntimeForPairCommon(InterpreterAssembler* assembler) { |
// Call the runtime function. |
- Node* function_id = __ BytecodeOperandIdx(0); |
+ Node* function_id = __ BytecodeOperandRuntimeId(0); |
Node* first_arg_reg = __ BytecodeOperandReg(1); |
Node* first_arg = __ RegisterLocation(first_arg_reg); |
Node* args_count = __ BytecodeOperandCount(2); |
@@ -1098,17 +925,6 @@ void Interpreter::DoCallRuntimeForPair(InterpreterAssembler* assembler) { |
DoCallRuntimeForPairCommon(assembler); |
} |
- |
-// CallRuntimeForPairWide <function_id> <first_arg> <arg_count> <first_return> |
-// |
-// Call the runtime function |function_id| which returns a pair, with the |
-// first argument in register |first_arg| and |arg_count| arguments in |
-// subsequent registers. Returns the result in <first_return> and |
-// <first_return + 1> |
-void Interpreter::DoCallRuntimeForPairWide(InterpreterAssembler* assembler) { |
- DoCallRuntimeForPairCommon(assembler); |
-} |
- |
void Interpreter::DoCallJSRuntimeCommon(InterpreterAssembler* assembler) { |
Node* context_index = __ BytecodeOperandIdx(0); |
Node* receiver_reg = __ BytecodeOperandReg(1); |
@@ -1139,15 +955,6 @@ void Interpreter::DoCallJSRuntime(InterpreterAssembler* assembler) { |
DoCallJSRuntimeCommon(assembler); |
} |
- |
-// CallJSRuntimeWide <context_index> <receiver> <arg_count> |
-// |
-// Call the JS runtime function that has the |context_index| with the receiver |
-// in register |receiver| and |arg_count| arguments in subsequent registers. |
-void Interpreter::DoCallJSRuntimeWide(InterpreterAssembler* assembler) { |
- DoCallJSRuntimeCommon(assembler); |
-} |
- |
void Interpreter::DoCallConstruct(InterpreterAssembler* assembler) { |
Callable ic = CodeFactory::InterpreterPushArgsAndConstruct(isolate_); |
Node* new_target = __ GetAccumulator(); |
@@ -1174,18 +981,6 @@ void Interpreter::DoNew(InterpreterAssembler* assembler) { |
DoCallConstruct(assembler); |
} |
- |
-// NewWide <constructor> <first_arg> <arg_count> |
-// |
-// Call operator new with |constructor| and the first argument in |
-// register |first_arg| and |arg_count| arguments in subsequent |
-// registers. The new.target is in the accumulator. |
-// |
-void Interpreter::DoNewWide(InterpreterAssembler* assembler) { |
- DoCallConstruct(assembler); |
-} |
- |
- |
// TestEqual <src> |
// |
// Test if the value in the <src> register equals the accumulator. |
@@ -1295,19 +1090,17 @@ void Interpreter::DoToObject(InterpreterAssembler* assembler) { |
DoTypeConversionOp(CodeFactory::ToObject(isolate_), assembler); |
} |
- |
-// Jump <imm8> |
+// Jump <imm> |
// |
-// Jump by number of bytes represented by the immediate operand |imm8|. |
+// Jump by number of bytes represented by the immediate operand |imm|. |
void Interpreter::DoJump(InterpreterAssembler* assembler) { |
Node* relative_jump = __ BytecodeOperandImm(0); |
__ Jump(relative_jump); |
} |
- |
-// JumpConstant <idx8> |
+// JumpConstant <idx> |
// |
-// Jump by number of bytes in the Smi in the |idx8| entry in the constant pool. |
+// Jump by number of bytes in the Smi in the |idx| entry in the constant pool. |
void Interpreter::DoJumpConstant(InterpreterAssembler* assembler) { |
Node* index = __ BytecodeOperandIdx(0); |
Node* constant = __ LoadConstantPoolEntry(index); |
@@ -1315,17 +1108,7 @@ void Interpreter::DoJumpConstant(InterpreterAssembler* assembler) { |
__ Jump(relative_jump); |
} |
- |
-// JumpConstantWide <idx16> |
-// |
-// Jump by number of bytes in the Smi in the |idx16| entry in the |
-// constant pool. |
-void Interpreter::DoJumpConstantWide(InterpreterAssembler* assembler) { |
- DoJumpConstant(assembler); |
-} |
- |
- |
-// JumpIfTrue <imm8> |
+// JumpIfTrue <imm> |
// |
// Jump by number of bytes represented by an immediate operand if the |
// accumulator contains true. |
@@ -1336,10 +1119,9 @@ void Interpreter::DoJumpIfTrue(InterpreterAssembler* assembler) { |
__ JumpIfWordEqual(accumulator, true_value, relative_jump); |
} |
- |
-// JumpIfTrueConstant <idx8> |
+// JumpIfTrueConstant <idx> |
// |
-// Jump by number of bytes in the Smi in the |idx8| entry in the constant pool |
+// Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
// if the accumulator contains true. |
void Interpreter::DoJumpIfTrueConstant(InterpreterAssembler* assembler) { |
Node* accumulator = __ GetAccumulator(); |
@@ -1350,17 +1132,7 @@ void Interpreter::DoJumpIfTrueConstant(InterpreterAssembler* assembler) { |
__ JumpIfWordEqual(accumulator, true_value, relative_jump); |
} |
- |
-// JumpIfTrueConstantWide <idx16> |
-// |
-// Jump by number of bytes in the Smi in the |idx16| entry in the constant pool |
-// if the accumulator contains true. |
-void Interpreter::DoJumpIfTrueConstantWide(InterpreterAssembler* assembler) { |
- DoJumpIfTrueConstant(assembler); |
-} |
- |
- |
-// JumpIfFalse <imm8> |
+// JumpIfFalse <imm> |
// |
// Jump by number of bytes represented by an immediate operand if the |
// accumulator contains false. |
@@ -1371,10 +1143,9 @@ void Interpreter::DoJumpIfFalse(InterpreterAssembler* assembler) { |
__ JumpIfWordEqual(accumulator, false_value, relative_jump); |
} |
- |
-// JumpIfFalseConstant <idx8> |
+// JumpIfFalseConstant <idx> |
// |
-// Jump by number of bytes in the Smi in the |idx8| entry in the constant pool |
+// Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
// if the accumulator contains false. |
void Interpreter::DoJumpIfFalseConstant(InterpreterAssembler* assembler) { |
Node* accumulator = __ GetAccumulator(); |
@@ -1385,17 +1156,7 @@ void Interpreter::DoJumpIfFalseConstant(InterpreterAssembler* assembler) { |
__ JumpIfWordEqual(accumulator, false_value, relative_jump); |
} |
- |
-// JumpIfFalseConstant <idx16> |
-// |
-// Jump by number of bytes in the Smi in the |idx16| entry in the constant pool |
-// if the accumulator contains false. |
-void Interpreter::DoJumpIfFalseConstantWide(InterpreterAssembler* assembler) { |
- DoJumpIfFalseConstant(assembler); |
-} |
- |
- |
-// JumpIfToBooleanTrue <imm8> |
+// JumpIfToBooleanTrue <imm> |
// |
// Jump by number of bytes represented by an immediate operand if the object |
// referenced by the accumulator is true when the object is cast to boolean. |
@@ -1411,10 +1172,9 @@ void Interpreter::DoJumpIfToBooleanTrue(InterpreterAssembler* assembler) { |
__ JumpIfWordEqual(to_boolean_value, true_value, relative_jump); |
} |
- |
-// JumpIfToBooleanTrueConstant <idx8> |
+// JumpIfToBooleanTrueConstant <idx> |
// |
-// Jump by number of bytes in the Smi in the |idx8| entry in the constant pool |
+// Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
// if the object referenced by the accumulator is true when the object is cast |
// to boolean. |
void Interpreter::DoJumpIfToBooleanTrueConstant( |
@@ -1432,19 +1192,7 @@ void Interpreter::DoJumpIfToBooleanTrueConstant( |
__ JumpIfWordEqual(to_boolean_value, true_value, relative_jump); |
} |
- |
-// JumpIfToBooleanTrueConstantWide <idx16> |
-// |
-// Jump by number of bytes in the Smi in the |idx16| entry in the constant pool |
-// if the object referenced by the accumulator is true when the object is cast |
-// to boolean. |
-void Interpreter::DoJumpIfToBooleanTrueConstantWide( |
- InterpreterAssembler* assembler) { |
- DoJumpIfToBooleanTrueConstant(assembler); |
-} |
- |
- |
-// JumpIfToBooleanFalse <imm8> |
+// JumpIfToBooleanFalse <imm> |
// |
// Jump by number of bytes represented by an immediate operand if the object |
// referenced by the accumulator is false when the object is cast to boolean. |
@@ -1460,10 +1208,9 @@ void Interpreter::DoJumpIfToBooleanFalse(InterpreterAssembler* assembler) { |
__ JumpIfWordEqual(to_boolean_value, false_value, relative_jump); |
} |
- |
-// JumpIfToBooleanFalseConstant <idx8> |
+// JumpIfToBooleanFalseConstant <idx> |
// |
-// Jump by number of bytes in the Smi in the |idx8| entry in the constant pool |
+// Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
// if the object referenced by the accumulator is false when the object is cast |
// to boolean. |
void Interpreter::DoJumpIfToBooleanFalseConstant( |
@@ -1481,19 +1228,7 @@ void Interpreter::DoJumpIfToBooleanFalseConstant( |
__ JumpIfWordEqual(to_boolean_value, false_value, relative_jump); |
} |
- |
-// JumpIfToBooleanFalseConstantWide <idx16> |
-// |
-// Jump by number of bytes in the Smi in the |idx16| entry in the constant pool |
-// if the object referenced by the accumulator is false when the object is cast |
-// to boolean. |
-void Interpreter::DoJumpIfToBooleanFalseConstantWide( |
- InterpreterAssembler* assembler) { |
- DoJumpIfToBooleanFalseConstant(assembler); |
-} |
- |
- |
-// JumpIfNull <imm8> |
+// JumpIfNull <imm> |
// |
// Jump by number of bytes represented by an immediate operand if the object |
// referenced by the accumulator is the null constant. |
@@ -1504,10 +1239,9 @@ void Interpreter::DoJumpIfNull(InterpreterAssembler* assembler) { |
__ JumpIfWordEqual(accumulator, null_value, relative_jump); |
} |
- |
-// JumpIfNullConstant <idx8> |
+// JumpIfNullConstant <idx> |
// |
-// Jump by number of bytes in the Smi in the |idx8| entry in the constant pool |
+// Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
// if the object referenced by the accumulator is the null constant. |
void Interpreter::DoJumpIfNullConstant(InterpreterAssembler* assembler) { |
Node* accumulator = __ GetAccumulator(); |
@@ -1518,16 +1252,7 @@ void Interpreter::DoJumpIfNullConstant(InterpreterAssembler* assembler) { |
__ JumpIfWordEqual(accumulator, null_value, relative_jump); |
} |
- |
-// JumpIfNullConstantWide <idx16> |
-// |
-// Jump by number of bytes in the Smi in the |idx16| entry in the constant pool |
-// if the object referenced by the accumulator is the null constant. |
-void Interpreter::DoJumpIfNullConstantWide(InterpreterAssembler* assembler) { |
- DoJumpIfNullConstant(assembler); |
-} |
- |
-// JumpIfUndefined <imm8> |
+// JumpIfUndefined <imm> |
// |
// Jump by number of bytes represented by an immediate operand if the object |
// referenced by the accumulator is the undefined constant. |
@@ -1539,10 +1264,9 @@ void Interpreter::DoJumpIfUndefined(InterpreterAssembler* assembler) { |
__ JumpIfWordEqual(accumulator, undefined_value, relative_jump); |
} |
- |
-// JumpIfUndefinedConstant <idx8> |
+// JumpIfUndefinedConstant <idx> |
// |
-// Jump by number of bytes in the Smi in the |idx8| entry in the constant pool |
+// Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
// if the object referenced by the accumulator is the undefined constant. |
void Interpreter::DoJumpIfUndefinedConstant(InterpreterAssembler* assembler) { |
Node* accumulator = __ GetAccumulator(); |
@@ -1554,17 +1278,7 @@ void Interpreter::DoJumpIfUndefinedConstant(InterpreterAssembler* assembler) { |
__ JumpIfWordEqual(accumulator, undefined_value, relative_jump); |
} |
- |
-// JumpIfUndefinedConstantWide <idx16> |
-// |
-// Jump by number of bytes in the Smi in the |idx16| entry in the constant pool |
-// if the object referenced by the accumulator is the undefined constant. |
-void Interpreter::DoJumpIfUndefinedConstantWide( |
- InterpreterAssembler* assembler) { |
- DoJumpIfUndefinedConstant(assembler); |
-} |
- |
-// JumpIfNotHole <imm8> |
+// JumpIfNotHole <imm> |
// |
// Jump by number of bytes represented by an immediate operand if the object |
// referenced by the accumulator is the hole. |
@@ -1575,9 +1289,9 @@ void Interpreter::DoJumpIfNotHole(InterpreterAssembler* assembler) { |
__ JumpIfWordNotEqual(accumulator, the_hole_value, relative_jump); |
} |
-// JumpIfNotHoleConstant <idx8> |
+// JumpIfNotHoleConstant <idx> |
// |
-// Jump by number of bytes in the Smi in the |idx8| entry in the constant pool |
+// Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
// if the object referenced by the accumulator is the hole constant. |
void Interpreter::DoJumpIfNotHoleConstant(InterpreterAssembler* assembler) { |
Node* accumulator = __ GetAccumulator(); |
@@ -1588,21 +1302,13 @@ void Interpreter::DoJumpIfNotHoleConstant(InterpreterAssembler* assembler) { |
__ JumpIfWordNotEqual(accumulator, the_hole_value, relative_jump); |
} |
-// JumpIfNotHoleConstantWide <idx16> |
-// |
-// Jump by number of bytes in the Smi in the |idx16| entry in the constant pool |
-// if the object referenced by the accumulator is the hole constant. |
-void Interpreter::DoJumpIfNotHoleConstantWide(InterpreterAssembler* assembler) { |
- DoJumpIfNotHoleConstant(assembler); |
-} |
- |
void Interpreter::DoCreateLiteral(Runtime::FunctionId function_id, |
InterpreterAssembler* assembler) { |
Node* index = __ BytecodeOperandIdx(0); |
Node* constant_elements = __ LoadConstantPoolEntry(index); |
Node* literal_index_raw = __ BytecodeOperandIdx(1); |
Node* literal_index = __ SmiTag(literal_index_raw); |
- Node* flags_raw = __ BytecodeOperandImm(2); |
+ Node* flags_raw = __ BytecodeOperandFlag(2); |
Node* flags = __ SmiTag(flags_raw); |
Node* closure = __ LoadRegister(Register::function_closure()); |
Node* context = __ GetContext(); |
@@ -1624,7 +1330,7 @@ void Interpreter::DoCreateRegExpLiteral(InterpreterAssembler* assembler) { |
Node* pattern = __ LoadConstantPoolEntry(index); |
Node* literal_index_raw = __ BytecodeOperandIdx(1); |
Node* literal_index = __ SmiTag(literal_index_raw); |
- Node* flags_raw = __ BytecodeOperandImm(2); |
+ Node* flags_raw = __ BytecodeOperandFlag(2); |
Node* flags = __ SmiTag(flags_raw); |
Node* closure = __ LoadRegister(Register::function_closure()); |
Node* context = __ GetContext(); |
@@ -1634,16 +1340,6 @@ void Interpreter::DoCreateRegExpLiteral(InterpreterAssembler* assembler) { |
__ Dispatch(); |
} |
- |
-// CreateRegExpLiteralWide <pattern_idx> <literal_idx> <flags> |
-// |
-// Creates a regular expression literal for literal index <literal_idx> with |
-// <flags> and the pattern in <pattern_idx>. |
-void Interpreter::DoCreateRegExpLiteralWide(InterpreterAssembler* assembler) { |
- DoCreateRegExpLiteral(assembler); |
-} |
- |
- |
// CreateArrayLiteral <element_idx> <literal_idx> <flags> |
// |
// Creates an array literal for literal index <literal_idx> with flags <flags> |
@@ -1652,16 +1348,6 @@ void Interpreter::DoCreateArrayLiteral(InterpreterAssembler* assembler) { |
DoCreateLiteral(Runtime::kCreateArrayLiteral, assembler); |
} |
- |
-// CreateArrayLiteralWide <element_idx> <literal_idx> <flags> |
-// |
-// Creates an array literal for literal index <literal_idx> with flags <flags> |
-// and constant elements in <element_idx>. |
-void Interpreter::DoCreateArrayLiteralWide(InterpreterAssembler* assembler) { |
- DoCreateLiteral(Runtime::kCreateArrayLiteral, assembler); |
-} |
- |
- |
// CreateObjectLiteral <element_idx> <literal_idx> <flags> |
// |
// Creates an object literal for literal index <literal_idx> with flags <flags> |
@@ -1670,16 +1356,6 @@ void Interpreter::DoCreateObjectLiteral(InterpreterAssembler* assembler) { |
DoCreateLiteral(Runtime::kCreateObjectLiteral, assembler); |
} |
- |
-// CreateObjectLiteralWide <element_idx> <literal_idx> <flags> |
-// |
-// Creates an object literal for literal index <literal_idx> with flags <flags> |
-// and constant elements in <element_idx>. |
-void Interpreter::DoCreateObjectLiteralWide(InterpreterAssembler* assembler) { |
- DoCreateLiteral(Runtime::kCreateObjectLiteral, assembler); |
-} |
- |
- |
// CreateClosure <index> <tenured> |
// |
// Creates a new closure for SharedFunctionInfo at position |index| in the |
@@ -1689,7 +1365,7 @@ void Interpreter::DoCreateClosure(InterpreterAssembler* assembler) { |
// calling into the runtime. |
Node* index = __ BytecodeOperandIdx(0); |
Node* shared = __ LoadConstantPoolEntry(index); |
- Node* tenured_raw = __ BytecodeOperandImm(1); |
+ Node* tenured_raw = __ BytecodeOperandFlag(1); |
Node* tenured = __ SmiTag(tenured_raw); |
Node* context = __ GetContext(); |
Node* result = |
@@ -1698,16 +1374,6 @@ void Interpreter::DoCreateClosure(InterpreterAssembler* assembler) { |
__ Dispatch(); |
} |
- |
-// CreateClosureWide <index> <tenured> |
-// |
-// Creates a new closure for SharedFunctionInfo at position |index| in the |
-// constant pool and with the PretenureFlag <tenured>. |
-void Interpreter::DoCreateClosureWide(InterpreterAssembler* assembler) { |
- return DoCreateClosure(assembler); |
-} |
- |
- |
// CreateMappedArguments |
// |
// Creates a new mapped arguments object. |
@@ -1829,18 +1495,6 @@ void Interpreter::DoForInPrepare(InterpreterAssembler* assembler) { |
__ Dispatch(); |
} |
- |
-// ForInPrepareWide <cache_info_triple> |
-// |
-// Returns state for for..in loop execution based on the object in the |
-// accumulator. The result is output in registers |cache_info_triple| to |
-// |cache_info_triple + 2|, with the registers holding cache_type, cache_array, |
-// and cache_length respectively. |
-void Interpreter::DoForInPrepareWide(InterpreterAssembler* assembler) { |
- DoForInPrepare(assembler); |
-} |
- |
- |
// ForInNext <receiver> <index> <cache_info_pair> |
// |
// Returns the next enumerable property in the the accumulator. |
@@ -1887,15 +1541,6 @@ void Interpreter::DoForInNext(InterpreterAssembler* assembler) { |
} |
} |
- |
-// ForInNextWide <receiver> <index> <cache_info_pair> |
-// |
-// Returns the next enumerable property in the the accumulator. |
-void Interpreter::DoForInNextWide(InterpreterAssembler* assembler) { |
- return DoForInNext(assembler); |
-} |
- |
- |
// ForInDone <index> <cache_length> |
// |
// Returns true if the end of the enumerable properties has been reached. |
@@ -1912,7 +1557,6 @@ void Interpreter::DoForInDone(InterpreterAssembler* assembler) { |
__ Dispatch(); |
} |
- |
// ForInStep <index> |
// |
// Increments the loop counter in register |index| and stores the result |
@@ -1926,6 +1570,27 @@ void Interpreter::DoForInStep(InterpreterAssembler* assembler) { |
__ Dispatch(); |
} |
+// Wide |
+// |
+// Prefix bytecode indicating next bytecode has wide (16-bit) operands. |
+void Interpreter::DoWide(InterpreterAssembler* assembler) { |
+ __ DispatchWide(OperandScale::kDouble); |
+} |
+ |
+// ExtraWide |
+// |
+// Prefix bytecode indicating next bytecode has extra-wide (32-bit) operands. |
+void Interpreter::DoExtraWide(InterpreterAssembler* assembler) { |
+ __ DispatchWide(OperandScale::kQuadruple); |
+} |
+ |
+// Illegal |
+// |
+// An invalid bytecode aborting execution if dispatched. |
+void Interpreter::DoIllegal(InterpreterAssembler* assembler) { |
+ __ Abort(kInvalidBytecode); |
+} |
+ |
} // namespace interpreter |
} // namespace internal |
} // namespace v8 |