Index: src/interpreter/interpreter-assembler.cc |
diff --git a/src/interpreter/interpreter-assembler.cc b/src/interpreter/interpreter-assembler.cc |
index ee5f8be27981f19b63ddf8eb3029729cb147a7fa..637c3ca6a039c1cc8c243a6dc445b95db2896afe 100644 |
--- a/src/interpreter/interpreter-assembler.cc |
+++ b/src/interpreter/interpreter-assembler.cc |
@@ -32,6 +32,7 @@ InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, |
bytecode_(bytecode), |
operand_scale_(operand_scale), |
interpreted_frame_pointer_(this, MachineType::PointerRepresentation()), |
+ bytecode_inner_pointer_(this, MachineType::PointerRepresentation()), |
accumulator_(this, MachineRepresentation::kTagged), |
accumulator_use_(AccumulatorUse::kNone), |
made_call_(false), |
@@ -96,6 +97,14 @@ Node* InterpreterAssembler::BytecodeArrayTaggedPointer() { |
} |
} |
+Node* InterpreterAssembler::BytecodeInnerPointer() { |
+ if (!bytecode_inner_pointer_.IsBound() || made_call_) { |
+ bytecode_inner_pointer_.Bind( |
+ IntPtrAdd(BytecodeArrayTaggedPointer(), BytecodeOffset())); |
+ } |
+ return bytecode_inner_pointer_.value(); |
+} |
+ |
Node* InterpreterAssembler::DispatchTableRawPointer() { |
return Parameter(InterpreterDispatchDescriptor::kDispatchTableParameter); |
} |
@@ -146,8 +155,7 @@ Node* InterpreterAssembler::BytecodeOperandUnsignedByte(int operand_index) { |
DCHECK_EQ(OperandSize::kByte, Bytecodes::GetOperandSize( |
bytecode_, operand_index, operand_scale())); |
Node* operand_offset = OperandOffset(operand_index); |
- return Load(MachineType::Uint8(), BytecodeArrayTaggedPointer(), |
- IntPtrAdd(BytecodeOffset(), operand_offset)); |
+ return Load(MachineType::Uint8(), BytecodeInnerPointer(), operand_offset); |
} |
Node* InterpreterAssembler::BytecodeOperandSignedByte(int operand_index) { |
@@ -155,8 +163,8 @@ Node* InterpreterAssembler::BytecodeOperandSignedByte(int operand_index) { |
DCHECK_EQ(OperandSize::kByte, Bytecodes::GetOperandSize( |
bytecode_, operand_index, operand_scale())); |
Node* operand_offset = OperandOffset(operand_index); |
- Node* load = Load(MachineType::Int8(), BytecodeArrayTaggedPointer(), |
- IntPtrAdd(BytecodeOffset(), operand_offset)); |
+ Node* load = |
+ Load(MachineType::Int8(), BytecodeInnerPointer(), operand_offset); |
// Ensure that we sign extend to full pointer size |
if (kPointerSize == 8) { |
@@ -224,8 +232,8 @@ Node* InterpreterAssembler::BytecodeOperandUnsignedShort(int operand_index) { |
int operand_offset = |
Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); |
if (TargetSupportsUnalignedAccess()) { |
- return Load(MachineType::Uint16(), BytecodeArrayTaggedPointer(), |
- IntPtrAdd(BytecodeOffset(), IntPtrConstant(operand_offset))); |
+ return Load(MachineType::Uint16(), BytecodeInnerPointer(), |
+ IntPtrConstant(operand_offset)); |
} else { |
return BytecodeOperandReadUnaligned(operand_offset, MachineType::Uint16()); |
} |
@@ -240,8 +248,8 @@ Node* InterpreterAssembler::BytecodeOperandSignedShort(int operand_index) { |
Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); |
Node* load; |
if (TargetSupportsUnalignedAccess()) { |
- load = Load(MachineType::Int16(), BytecodeArrayTaggedPointer(), |
- IntPtrAdd(BytecodeOffset(), IntPtrConstant(operand_offset))); |
+ load = Load(MachineType::Int16(), BytecodeInnerPointer(), |
+ IntPtrConstant(operand_offset)); |
} else { |
load = BytecodeOperandReadUnaligned(operand_offset, MachineType::Int16()); |
} |
@@ -260,8 +268,8 @@ Node* InterpreterAssembler::BytecodeOperandUnsignedQuad(int operand_index) { |
int operand_offset = |
Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); |
if (TargetSupportsUnalignedAccess()) { |
- return Load(MachineType::Uint32(), BytecodeArrayTaggedPointer(), |
- IntPtrAdd(BytecodeOffset(), IntPtrConstant(operand_offset))); |
+ return Load(MachineType::Uint32(), BytecodeInnerPointer(), |
+ IntPtrConstant(operand_offset)); |
} else { |
return BytecodeOperandReadUnaligned(operand_offset, MachineType::Uint32()); |
} |
@@ -275,8 +283,8 @@ Node* InterpreterAssembler::BytecodeOperandSignedQuad(int operand_index) { |
Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); |
Node* load; |
if (TargetSupportsUnalignedAccess()) { |
- load = Load(MachineType::Int32(), BytecodeArrayTaggedPointer(), |
- IntPtrAdd(BytecodeOffset(), IntPtrConstant(operand_offset))); |
+ load = Load(MachineType::Int32(), BytecodeInnerPointer(), |
+ IntPtrConstant(operand_offset)); |
} else { |
load = BytecodeOperandReadUnaligned(operand_offset, MachineType::Int32()); |
} |