Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(705)

Unified Diff: src/interpreter/bytecode-array-builder.cc

Issue 1370893002: [Interpreter] Add support for short (16 bit) operands. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix Win bots. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/interpreter/bytecode-array-builder.cc
diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc
index e0bc03c9f997a26691c728df7a374ae12ba4969d..b4615a557f61335e9ffd8119c584b3bc9bbcf978 100644
--- a/src/interpreter/bytecode-array-builder.cc
+++ b/src/interpreter/bytecode-array-builder.cc
@@ -75,40 +75,54 @@ Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() {
template <size_t N>
-void BytecodeArrayBuilder::Output(uint8_t(&bytes)[N]) {
- DCHECK_EQ(Bytecodes::NumberOfOperands(Bytecodes::FromByte(bytes[0])),
- static_cast<int>(N) - 1);
+void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t(&operands)[N]) {
+ DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), N);
last_bytecode_start_ = bytecodes()->size();
- for (int i = 1; i < static_cast<int>(N); i++) {
- DCHECK(OperandIsValid(Bytecodes::FromByte(bytes[0]), i - 1, bytes[i]));
+ bytecodes()->push_back(Bytecodes::ToByte(bytecode));
+ for (int i = 0; i < static_cast<int>(N); i++) {
+ DCHECK(OperandIsValid(bytecode, i, operands[i]));
+ switch (Bytecodes::SizeOfOperand(Bytecodes::GetOperandType(bytecode, i))) {
+ case OperandSize::kNone:
+ UNREACHABLE();
+ case OperandSize::kByte:
+ bytecodes()->push_back(static_cast<uint8_t>(operands[i]));
+ break;
+ case OperandSize::kWide: {
+ uint8_t operand_bytes[2];
+ Bytecodes::WideOperandToBytes(operands[i], operand_bytes);
+ bytecodes()->insert(bytecodes()->end(), operand_bytes,
+ operand_bytes + 2);
+ break;
+ }
+ }
}
- bytecodes()->insert(bytecodes()->end(), bytes, bytes + N);
}
-void BytecodeArrayBuilder::Output(Bytecode bytecode, uint8_t operand0,
- uint8_t operand1, uint8_t operand2) {
- uint8_t bytes[] = {Bytecodes::ToByte(bytecode), operand0, operand1, operand2};
- Output(bytes);
+void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0,
+ uint32_t operand1, uint32_t operand2) {
+ uint32_t operands[] = {operand0, operand1, operand2};
+ Output(bytecode, operands);
}
-void BytecodeArrayBuilder::Output(Bytecode bytecode, uint8_t operand0,
- uint8_t operand1) {
- uint8_t bytes[] = {Bytecodes::ToByte(bytecode), operand0, operand1};
- Output(bytes);
+void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0,
+ uint32_t operand1) {
+ uint32_t operands[] = {operand0, operand1};
+ Output(bytecode, operands);
}
-void BytecodeArrayBuilder::Output(Bytecode bytecode, uint8_t operand0) {
- uint8_t bytes[] = {Bytecodes::ToByte(bytecode), operand0};
- Output(bytes);
+void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0) {
+ uint32_t operands[] = {operand0};
+ Output(bytecode, operands);
}
void BytecodeArrayBuilder::Output(Bytecode bytecode) {
- uint8_t bytes[] = {Bytecodes::ToByte(bytecode)};
- Output(bytes);
+ DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 0);
+ last_bytecode_start_ = bytecodes()->size();
+ bytecodes()->push_back(Bytecodes::ToByte(bytecode));
}
@@ -294,11 +308,14 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToBoolean() {
case Bytecode::kTestGreaterThanEqual:
case Bytecode::kTestInstanceOf:
case Bytecode::kTestIn:
- break;
+ return *this;
default:
- Output(Bytecode::kToBoolean);
+ // Fall through to output kToBoolean.
+ break;
}
}
+ Output(Bytecode::kToBoolean);
+
oth 2015/09/28 09:21:25 Nit - empty line.
rmcilroy 2015/10/01 14:09:14 Done.
return *this;
}
@@ -495,17 +512,19 @@ void BytecodeArrayBuilder::ReturnTemporaryRegister(int reg_index) {
bool BytecodeArrayBuilder::OperandIsValid(Bytecode bytecode, int operand_index,
- uint8_t operand_value) const {
+ uint32_t operand_value) const {
OperandType operand_type = Bytecodes::GetOperandType(bytecode, operand_index);
switch (operand_type) {
case OperandType::kNone:
return false;
+ case OperandType::kWideIdx:
+ return static_cast<uint16_t>(operand_value) == operand_value;
case OperandType::kCount:
case OperandType::kImm8:
case OperandType::kIdx:
- return true;
+ return static_cast<uint8_t>(operand_value) == operand_value;
case OperandType::kReg: {
- Register reg = Register::FromOperand(operand_value);
+ Register reg = Register::FromOperand(static_cast<uint8_t>(operand_value));
if (reg.is_parameter()) {
int parameter_index = reg.ToParameterIndex(parameter_count_);
return parameter_index >= 0 && parameter_index < parameter_count_;

Powered by Google App Engine
This is Rietveld 408576698