Index: src/interpreter/bytecode-array-builder.cc |
diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc |
index 4ec2d1264b30f9b04e3c5a7ab40d44d42ca12819..1d6b9e6ea43eee38adc749a7243bd3e4ce949046 100644 |
--- a/src/interpreter/bytecode-array-builder.cc |
+++ b/src/interpreter/bytecode-array-builder.cc |
@@ -379,6 +379,21 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, |
} |
+BytecodeArrayBuilder& BytecodeArrayBuilder::ExchangeRegisters(Register a, |
+ Register b) { |
rmcilroy
2016/01/04 11:54:54
nit - a->lhs b->rhs (like .h file)
oth
2016/01/04 14:01:42
Done.
|
+ if (a != b) { |
rmcilroy
2016/01/04 11:54:54
Should we ever call Exchange when the registers ar
oth
2016/01/04 14:01:42
Done.
|
+ if (FitsInReg8Operand(a)) { |
+ Output(Bytecode::kExchange, a.ToOperand(), b.ToWideOperand()); |
+ } else if (FitsInReg8Operand(b)) { |
+ Output(Bytecode::kExchange, b.ToOperand(), a.ToWideOperand()); |
+ } else { |
+ Output(Bytecode::kExchangeWide, a.ToWideOperand(), b.ToWideOperand()); |
+ } |
+ } |
+ return *this; |
+} |
+ |
+ |
BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal( |
const Handle<String> name, int feedback_slot, LanguageMode language_mode, |
TypeofMode typeof_mode) { |
@@ -1163,6 +1178,25 @@ bool BytecodeArrayBuilder::OperandIsValid(Bytecode bytecode, int operand_index, |
return TemporaryRegisterIsLive(reg); |
} |
} |
+ case OperandType::kReg16: { |
+ if (bytecode != Bytecode::kExchange && |
+ bytecode != Bytecode::kExchangeWide) { |
+ return false; |
+ } |
+ Register reg = |
+ Register::FromWideOperand(static_cast<uint16_t>(operand_value)); |
+ if (reg.is_function_context() || reg.is_function_closure() || |
+ reg.is_new_target()) { |
rmcilroy
2016/01/04 11:54:53
Do we ever want to allow exchanges of these regist
oth
2016/01/04 14:01:42
Done.
|
+ return true; |
+ } else if (reg.is_parameter()) { |
+ int parameter_index = reg.ToParameterIndex(parameter_count_); |
+ return parameter_index >= 0 && parameter_index < parameter_count_; |
+ } else if (reg.index() < fixed_register_count()) { |
+ return true; |
+ } else { |
+ return TemporaryRegisterIsLive(reg); |
+ } |
+ } |
} |
UNREACHABLE(); |
return false; |
@@ -1468,7 +1502,7 @@ bool BytecodeArrayBuilder::FitsInIdx8Operand(size_t value) { |
// static |
bool BytecodeArrayBuilder::FitsInImm8Operand(int value) { |
- return kMinInt8 <= value && value < kMaxInt8; |
+ return kMinInt8 <= value && value <= kMaxInt8; |
} |
@@ -1484,6 +1518,18 @@ bool BytecodeArrayBuilder::FitsInIdx16Operand(size_t value) { |
} |
+// static |
+bool BytecodeArrayBuilder::FitsInReg8Operand(Register value) { |
+ return kMinInt8 <= value.index() && value.index() <= kMaxInt8; |
+} |
+ |
+ |
+// static |
+bool BytecodeArrayBuilder::FitsInReg16Operand(Register value) { |
+ return kMinInt16 <= value.index() && value.index() <= kMaxInt16; |
+} |
+ |
+ |
TemporaryRegisterScope::TemporaryRegisterScope(BytecodeArrayBuilder* builder) |
: builder_(builder), |
allocated_(builder->zone()), |