Index: src/compiler/interpreter-assembler.cc |
diff --git a/src/compiler/interpreter-assembler.cc b/src/compiler/interpreter-assembler.cc |
index 43ef6db4f436530a1c643f04fb7aac1f97b0d783..3f5cf9a71eb048182da1cc5675f65bccc8520dde 100644 |
--- a/src/compiler/interpreter-assembler.cc |
+++ b/src/compiler/interpreter-assembler.cc |
@@ -126,17 +126,25 @@ Node* InterpreterAssembler::StoreRegister(Node* value, Node* reg_index) { |
Node* InterpreterAssembler::BytecodeOperand(int operand_index) { |
DCHECK_LT(operand_index, interpreter::Bytecodes::NumberOfOperands(bytecode_)); |
+ DCHECK_EQ(interpreter::OperandSize::kByte, |
+ interpreter::Bytecodes::GetOperandSize(bytecode_, operand_index)); |
return raw_assembler_->Load( |
kMachUint8, BytecodeArrayTaggedPointer(), |
- IntPtrAdd(BytecodeOffset(), Int32Constant(1 + operand_index))); |
+ IntPtrAdd(BytecodeOffset(), |
+ Int32Constant(interpreter::Bytecodes::GetOperandOffset( |
+ bytecode_, operand_index)))); |
} |
Node* InterpreterAssembler::BytecodeOperandSignExtended(int operand_index) { |
DCHECK_LT(operand_index, interpreter::Bytecodes::NumberOfOperands(bytecode_)); |
+ DCHECK_EQ(interpreter::OperandSize::kByte, |
+ interpreter::Bytecodes::GetOperandSize(bytecode_, operand_index)); |
Node* load = raw_assembler_->Load( |
kMachInt8, BytecodeArrayTaggedPointer(), |
- IntPtrAdd(BytecodeOffset(), Int32Constant(1 + operand_index))); |
+ IntPtrAdd(BytecodeOffset(), |
+ Int32Constant(interpreter::Bytecodes::GetOperandOffset( |
+ bytecode_, operand_index)))); |
// Ensure that we sign extend to full pointer size |
if (kPointerSize == 8) { |
load = raw_assembler_->ChangeInt32ToInt64(load); |
@@ -145,8 +153,40 @@ Node* InterpreterAssembler::BytecodeOperandSignExtended(int operand_index) { |
} |
-Node* InterpreterAssembler::BytecodeOperandCount(int operand_index) { |
- DCHECK_EQ(interpreter::OperandType::kCount, |
+Node* InterpreterAssembler::BytecodeOperandShort(int operand_index) { |
+ DCHECK_LT(operand_index, interpreter::Bytecodes::NumberOfOperands(bytecode_)); |
+ DCHECK_EQ(interpreter::OperandSize::kShort, |
+ interpreter::Bytecodes::GetOperandSize(bytecode_, operand_index)); |
+ if (TargetSupportsUnalignedAccess()) { |
+ return raw_assembler_->Load( |
+ kMachUint16, BytecodeArrayTaggedPointer(), |
+ IntPtrAdd(BytecodeOffset(), |
+ Int32Constant(interpreter::Bytecodes::GetOperandOffset( |
+ bytecode_, operand_index)))); |
+ } else { |
+ int offset = |
+ interpreter::Bytecodes::GetOperandOffset(bytecode_, operand_index); |
+ Node* first_byte = raw_assembler_->Load( |
+ kMachUint8, BytecodeArrayTaggedPointer(), |
+ IntPtrAdd(BytecodeOffset(), Int32Constant(offset))); |
+ Node* second_byte = raw_assembler_->Load( |
+ kMachUint8, BytecodeArrayTaggedPointer(), |
+ IntPtrAdd(BytecodeOffset(), Int32Constant(offset + 1))); |
+#if V8_TARGET_LITTLE_ENDIAN |
+ return raw_assembler_->WordOr(WordShl(second_byte, kBitsPerByte), |
+ first_byte); |
+#elif V8_TARGET_BIG_ENDIAN |
+ return raw_assembler_->WordOr(WordShl(first_byte, kBitsPerByte), |
+ second_byte); |
+#else |
+#error "Unknown Architecture" |
+#endif |
+ } |
+} |
+ |
+ |
+Node* InterpreterAssembler::BytecodeOperandCount8(int operand_index) { |
+ DCHECK_EQ(interpreter::OperandType::kCount8, |
interpreter::Bytecodes::GetOperandType(bytecode_, operand_index)); |
return BytecodeOperand(operand_index); |
} |
@@ -159,20 +199,27 @@ Node* InterpreterAssembler::BytecodeOperandImm8(int operand_index) { |
} |
-Node* InterpreterAssembler::BytecodeOperandIdx(int operand_index) { |
- DCHECK_EQ(interpreter::OperandType::kIdx, |
+Node* InterpreterAssembler::BytecodeOperandIdx8(int operand_index) { |
+ DCHECK_EQ(interpreter::OperandType::kIdx8, |
interpreter::Bytecodes::GetOperandType(bytecode_, operand_index)); |
return BytecodeOperand(operand_index); |
} |
-Node* InterpreterAssembler::BytecodeOperandReg(int operand_index) { |
- DCHECK_EQ(interpreter::OperandType::kReg, |
+Node* InterpreterAssembler::BytecodeOperandReg8(int operand_index) { |
+ DCHECK_EQ(interpreter::OperandType::kReg8, |
interpreter::Bytecodes::GetOperandType(bytecode_, operand_index)); |
return BytecodeOperandSignExtended(operand_index); |
} |
+Node* InterpreterAssembler::BytecodeOperandIdx16(int operand_index) { |
+ DCHECK_EQ(interpreter::OperandType::kIdx16, |
+ interpreter::Bytecodes::GetOperandType(bytecode_, operand_index)); |
+ return BytecodeOperandShort(operand_index); |
+} |
+ |
+ |
Node* InterpreterAssembler::Int32Constant(int value) { |
return raw_assembler_->Int32Constant(value); |
} |
@@ -432,6 +479,20 @@ void InterpreterAssembler::End() { |
} |
+// static |
+bool InterpreterAssembler::TargetSupportsUnalignedAccess() { |
+#if V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 |
+ return false; |
+#elif V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_PPC |
+ return CpuFeatures::IsSupported(UNALIGNED_ACCESSES); |
+#elif V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X87 |
+ return true; |
+#else |
+#error "Unknown Architecture" |
+#endif |
+} |
+ |
+ |
// RawMachineAssembler delegate helpers: |
Isolate* InterpreterAssembler::isolate() { return raw_assembler_->isolate(); } |