Index: src/compiler/instruction.h |
diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h |
index d9009b658039f193960d5ae75cb4ef37f6f82c16..3dda702d6959c92379bca0559a4464b27afac54e 100644 |
--- a/src/compiler/instruction.h |
+++ b/src/compiler/instruction.h |
@@ -72,6 +72,8 @@ class InstructionOperand : public ZoneObject { |
static void TearDownCaches(); |
protected: |
+ // TODO(dcarney): remove. used to construct the Instruction operand array. |
+ InstructionOperand() : value_(0xffffffff) {} |
typedef BitField<Kind, 0, 3> KindField; |
uint32_t value_; |
@@ -263,6 +265,10 @@ class UnallocatedOperand : public InstructionOperand { |
} |
private: |
+ friend class Instruction; |
+ UnallocatedOperand() |
+ : InstructionOperand(), virtual_register_(kInvalidVirtualRegister) {} |
+ |
// TODO(dcarney): this should really be unsigned. |
int32_t virtual_register_; |
}; |
@@ -422,28 +428,37 @@ std::ostream& operator<<(std::ostream& os, const PointerMap& pm); |
class Instruction : public ZoneObject { |
public: |
size_t OutputCount() const { return OutputCountField::decode(bit_field_); } |
- InstructionOperand* OutputAt(size_t i) const { |
+ const InstructionOperand* OutputAt(size_t i) const { |
+ DCHECK(i < OutputCount()); |
+ return &operands_[i]; |
+ } |
+ InstructionOperand* OutputAt(size_t i) { |
DCHECK(i < OutputCount()); |
- return operands_[i]; |
+ return &operands_[i]; |
} |
bool HasOutput() const { return OutputCount() == 1; } |
- InstructionOperand* Output() const { return OutputAt(0); } |
+ const InstructionOperand* Output() const { return OutputAt(0); } |
+ InstructionOperand* Output() { return OutputAt(0); } |
size_t InputCount() const { return InputCountField::decode(bit_field_); } |
- InstructionOperand* InputAt(size_t i) const { |
+ const InstructionOperand* InputAt(size_t i) const { |
DCHECK(i < InputCount()); |
- return operands_[OutputCount() + i]; |
+ return &operands_[OutputCount() + i]; |
} |
- void SetInputAt(size_t i, InstructionOperand* operand) { |
+ InstructionOperand* InputAt(size_t i) { |
DCHECK(i < InputCount()); |
- operands_[OutputCount() + i] = operand; |
+ return &operands_[OutputCount() + i]; |
} |
size_t TempCount() const { return TempCountField::decode(bit_field_); } |
- InstructionOperand* TempAt(size_t i) const { |
+ const InstructionOperand* TempAt(size_t i) const { |
+ DCHECK(i < TempCount()); |
+ return &operands_[OutputCount() + InputCount() + i]; |
+ } |
+ InstructionOperand* TempAt(size_t i) { |
DCHECK(i < TempCount()); |
- return operands_[OutputCount() + InputCount() + i]; |
+ return &operands_[OutputCount() + InputCount() + i]; |
} |
InstructionCode opcode() const { return opcode_; } |
@@ -469,11 +484,11 @@ class Instruction : public ZoneObject { |
DCHECK(output_count == 0 || outputs != NULL); |
DCHECK(input_count == 0 || inputs != NULL); |
DCHECK(temp_count == 0 || temps != NULL); |
- InstructionOperand* none = NULL; |
- USE(none); |
- int size = static_cast<int>(RoundUp(sizeof(Instruction), kPointerSize) + |
- (output_count + input_count + temp_count - 1) * |
- sizeof(none)); |
+ size_t total_extra_ops = output_count + input_count + temp_count; |
+ if (total_extra_ops != 0) total_extra_ops--; |
+ int size = static_cast<int>( |
+ RoundUp(sizeof(Instruction), sizeof(UnallocatedOperand)) + |
+ total_extra_ops * sizeof(UnallocatedOperand)); |
return new (zone->New(size)) Instruction( |
opcode, output_count, outputs, input_count, inputs, temp_count, temps); |
} |
@@ -527,33 +542,11 @@ class Instruction : public ZoneObject { |
} |
protected: |
- explicit Instruction(InstructionCode opcode) |
- : opcode_(opcode), |
- bit_field_(OutputCountField::encode(0) | InputCountField::encode(0) | |
- TempCountField::encode(0) | IsCallField::encode(false) | |
- IsControlField::encode(false)), |
- pointer_map_(NULL) {} |
- |
+ explicit Instruction(InstructionCode opcode); |
Instruction(InstructionCode opcode, size_t output_count, |
InstructionOperand** outputs, size_t input_count, |
InstructionOperand** inputs, size_t temp_count, |
- InstructionOperand** temps) |
- : opcode_(opcode), |
- bit_field_(OutputCountField::encode(output_count) | |
- InputCountField::encode(input_count) | |
- TempCountField::encode(temp_count) | |
- IsCallField::encode(false) | IsControlField::encode(false)), |
- pointer_map_(NULL) { |
- for (size_t i = 0; i < output_count; ++i) { |
- operands_[i] = outputs[i]; |
- } |
- for (size_t i = 0; i < input_count; ++i) { |
- operands_[output_count + i] = inputs[i]; |
- } |
- for (size_t i = 0; i < temp_count; ++i) { |
- operands_[output_count + input_count + i] = temps[i]; |
- } |
- } |
+ InstructionOperand** temps); |
protected: |
typedef BitField<size_t, 0, 8> OutputCountField; |
@@ -565,7 +558,7 @@ class Instruction : public ZoneObject { |
InstructionCode opcode_; |
uint32_t bit_field_; |
PointerMap* pointer_map_; |
- InstructionOperand* operands_[1]; |
+ UnallocatedOperand operands_[1]; |
}; |